不惑にしてまだ何者でもない者のブログ

Arduino関連、Raspberry Pi関連、プログラミング学習

CrowPiレッスン17:チルトセンサーを使用して傾きを検出する

2020-11-11 14:44:25 | CrowPi

Detecting tilt using the Tilt Sensor.

レッスン17"チルトセンサーを使用して傾きを検出する"をやっていく。

概要を引用
チルトセンサーは、CrowPiで私のお気に入りのセンサーの1つです。
チルトセンサーを使用すると、右または左の傾きを検出できます。これは、表面がまっすぐであるか傾斜しているか、また傾斜している場合はどちら側に傾斜しているかを知りたいシナリオで非常に役立ちます。
チルトセンサーは、ロボット工学やその他の業界で使用されており、物がまっすぐに保たれていることを確認します。傾斜センサーを使用してどのようなプロジェクトを選択しますか?

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • チルトセンサーを制御し、右側または左側の傾斜を認識します。

何が必要か

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • はい、右側のスイッチ(ピン番号2)を上に向けてオンにします(センサーの切り替え方法を忘れた場合は、5ページを参照してください)

CrowPi上のチルトセンサーの位置



チルトセンサーの操作

解説を引用
傾斜センサーの操作はかなり簡単です。傾斜センサーが左側に傾くと、GPIO HIGHのINPUT信号を送信する回路がアクティブになります。
センサーを右側に傾けると、回路が開き、入力がGPIO LOWになります。
そうすれば、このデータを使用して、傾斜センサーが左側または右側にある場合にプリントできます。

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/tilt.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# http://elecrow.com/

import time
import RPi.GPIO as GPIO

# define tilt pin
tilt_pin = 22

# set GPIO mode to GPIO.BOARD
GPIO.setmode(GPIO.BCM)
# set puin as input
GPIO.setup(tilt_pin, GPIO.IN)

try:
 while True:
  # positive is tilt to left negative is tilt to right
  if GPIO.input(tilt_pin):
   print("[-] Left Tilt")
  else:
   print("[-] Right Tilt")
  time.sleep(1)
except KeyboardInterrupt:
 # CTRL+C detected, cleaning and quitting the script
 GPIO.cleanup()

例のごとく、GPIO.setmodeとpin番号を修正。

修正後
# define tilt pin
tilt_pin = 15

# set GPIO mode to GPIO.BOARD
GPIO.setmode(GPIO.BOARD)

このスクリプトを実行して、CrowPi本体を左右に傾けると、センサーがそれを検出し、どちらに傾いているかをターミナル上に出力する。

↑おそらくチルトセンサー内に球か何かが入っていて、それがどちらに寄っているかを検出するのだろう。

CrowPiレッスン16:タッチセンサーを使用したタッチの検出

2020-11-11 14:10:29 | CrowPi

Detecting touch using the Touch Sensor

レッスン16"タッチセンサーを使用したタッチの検出"をやっていく。

概要を引用
タッチセンサーは、ボタンの機能に関しては非常に便利です。
通常のボタンを押したくない場合もありますが、携帯電話の画面やiPadと同じようにタッチ動作をしたいと思うことがあります。タッチセンサーはまさにこの目的のために作られました。
タッチセンサーは、できるだけ早くパッドに触れるゲームや、ボタンを押すのではなくタッチで何かをアクティブにしたいゲームで使用されます。
市場に出回っている多くの製品は、ボタンを押す代わりにタッチを使用しているため、そのタイプのセンサーの使用方法を学ぶことは間違いなく大いに役立ちます!

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • タッチセンサー表面のタッチを使用して検出する

何が必要か

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • いいえ

CrowPi上のタッチセンサーの位置



タッチセンサーの操作

解説を引用
タッチセンサーは他のボタンモジュールと同じように動作しますが、押すかクリックする代わりにタッチするという1つの違いがあります。
タッチセンサーに触れると、モジュールはGPIO入力をHIGHとして示す回路を閉じます。センサーから指を離すと、GPIOはLowに戻り、現在センサーに何も触れていないことを示します。
タッチセンサーはGPIOBOARD11ピンを使用しています。

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/touch.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# http://elecrow.com/

import RPi.GPIO as GPIO
import time

# define touch pin
touch_pin = 17

# set board mode to GPIO.BOARD
GPIO.setmode(GPIO.BCM)

# set GPIO pin to INPUT
GPIO.setup(touch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
 while True:
  # check if touch detected
  if(GPIO.input(touch_pin)):
   print('Touch Detected')
   time.sleep(0.1)
except KeyboardInterrupt:
 # CTRL+C detected, cleaning and quitting the script
 GPIO.cleanup()

例のごとく、GPIO.setmodeとpin番号を修正。

修正後
# define touch pin
touch_pin = 11

# set board mode to GPIO.BOARD
GPIO.setmode(GPIO.BOARD)

このスクリプトを実行して、タッチセンサーに触れると、ターミナルに"Touch Detected"と表示される。


無限ループしているので、CTRL+Cで終了させる。

CrowPiレッスン15:セグメントディスプレイの制御。

2020-11-10 23:57:58 | CrowPi

Controlling the Segment Display.

レッスン15"セグメントディスプレイの制御。"をやっていく。
※ レッスンPDF等では、”Controlling the 7 Segment Display.”と書いてあるが、7という数字は、単なるセンサーリストの連番が7だっただけで、間違ってコピペされたようだ。7に特に意味はないので、削除した。

概要を引用
セグメントLEDは、数値やデータに関して非常に便利なディスプレイです。
それは私たちに時間を示し、私たちが特定のことをした回数を数え、偽の時限爆弾で友達を怖がらせるために使用されることさえできます!
セグメントLEDは、エレベータなどの多くの産業用ソリューションで使用されています。 そしてそれを使用することは間違いなく将来あなたのために役立つでしょう!

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • セグメントLEDを制御し、さまざまな数値とデータを表示します

何が必要か

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • いいえ

CrowPi上のセグメントディスプレイの位置



RaspberryPiシステムのタイムゾーンの調整

sudo dpkg-reconfigure tzdata
でタイムゾーンを設定する。
初期設定でちゃんと設定していれば、省略可。
レッスン動画だと、
sudo raspi-config
で行うとのこと。
※ 以前言及したが、YouTubeのレッスン動画は、レッスン10とレッスン15のデモ部分が入れ替わっているので、注意が必要である。

セグメントディスプレイの操作

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/segment.py
#!/usr/bin/python

import time
import datetime
from Adafruit_LED_Backpack import SevenSegment

# ===========================================================================
# Clock Example
# ===========================================================================
segment = SevenSegment.SevenSegment(address=0x70)

# Initialize the display. Must be called once before using the display.
segment.begin()

print("Press CTRL+C to exit")

# Continually update the time on a 4 char, 7-segment display
try:
 while(True):
  now = datetime.datetime.now()
  hour = now.hour
  minute = now.minute
  second = now.second

  segment.clear()
  # Set hours
  segment.set_digit(0, int(hour / 10)) # Tens
  segment.set_digit(1, hour % 10) # Ones
  # Set minutes
  segment.set_digit(2, int(minute / 10)) # Tens
  segment.set_digit(3, minute % 10) # Ones
  # Toggle colon
  segment.set_colon(second % 2) # Toggle colon at 1Hz

  # Write the display buffer to the hardware. This must be called to
  # update the actual display LEDs.
  segment.write_display()

  # Wait a quarter second (less than 1 second to prevent colon blinking getting$
  time.sleep(0.25)
 except KeyboardInterrupt:
  segment.clear()
  segment.write_display()

時刻と日付の時刻モジュールを使用してRaspberryPiシステム時刻を取得し、セグメントI2Cアドレスを70に設定してから、segment.write_display()を使用してセグメント表示でシステムの現在時刻を設定します。 関数set_digit()を数字0,1,2,3の番号とともに使用して、番号を表示する場所を設定します。

このスクリプトを実行すると、セグメントディスプレイに時刻が表示される。


無限ループとなるのでCTRL+Cで終了。

CrowPiレッスン14:8x8マトリックスLEDの制御

2020-11-10 23:37:55 | CrowPi

Controlling the 8x8 Matrix LED.

レッスン14"8x8マトリックスLEDの制御"をやっていく。

概要を引用
マトリックスLEDは、点滅するすべてのLEDプロジェクトで重要な役割を果たします。
一見ではそうは見えないかもしれませんが、マトリックスLEDは、赤い光沢のあるLEDの点滅を超えて、情報、テキスト、絵文字、さらには漢字を表示するために使用できます。 楽しくユニークな方法で情報を表示したり、ヘビやカウントダウンタイマーのようなゲームを作ったりするのに最適です!

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • マトリックスLEDの制御、テキストの表示、速度と情報の流れの制御

何が必要か

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

  • いいえ

CrowPi上のマトリックスモジュールの場所


↑白い所が赤く光る。結構明るい。

マトリックスディスプレイの操作

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/matrix_demo.py
# Import all the modules
import re
import time
from luma.led_matrix.device import max7219
from luma.core.interface.serial import spi, noop
from luma.core.render import canvas
from luma.core.virtual import viewport
from luma.core.legacy import text, show_message
from luma.core.legacy.font import proportional, CP437_FONT, TINY_FONT, SINCLAIR_FONT, LCD_FONT

def main(cascaded, block_orientation, rotate):
 # create matrix device
 serial = spi(port=0, device=1, gpio=noop())
 device = max7219(serial, cascaded=cascaded or 1, block_orientation=block_orientation, rotate=rotate or 0)
 # debugging purpose
 print("[-] Matrix initialized")

 # print hello world on the matrix display
 msg = "Hello World"
 # debugging purpose
 print("[-] Printing: %s" % msg)
 show_message(device, msg, fill="white", font=proportional(CP437_FONT), scroll_delay=0.1)

if __name__ == "__main__":
 # cascaded = Number of cascaded MAX7219 LED matrices, default=1
 # block_orientation = choices 0, 90, -90, Corrects block orientation when wired vertically, default=0
 # rotate = choices 0, 1, 2, 3, Rotate display 0=0°, 1=90°, 2=180°, 3=270°, default=0

 try:
  main(cascaded=1, block_orientation=90, rotate=0)
 except KeyboardInterrupt:
  pass

他のモジュールとは異なり、マトリックスLEDは制御対象のSPIインターフェースを使用する。

このスクリプトを実行すると、マトリックスLEDに「Hello World」と表示される。



CrowPiレッスン13:サーボインターフェースを使用してサーボモーターを制御する

2020-11-09 00:11:04 | CrowPi

Controlling servos motors using the servo interfaces.

レッスン13"サーボインターフェースを使用してサーボモーターを制御する"をやっていく。

CrowPi-lessons.pdfに記載された概要の訳を、以下に引用する。

サーボは、デバイスを機械的に制御し、部品を動かすことができる本当にクールなモジュールです。 このようなサーボを使用して、スマートなゴミ箱、スマートな開閉ドア付きのキャンディーボックス、その他多くの興味深いプロジェクトを作成できます。

ステップモーターとは違って、今度こそ動きのあるものが作れるのかな?

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • サーボを複数方向に接続して制御します

何が必要か

  • 初期設定後のCrowPiボード
  • マイクロサーボ(CrowPiに付属)
↑サーボモーターに白い部品を取り付けた

Requires switching modules using the switch

  • はい、右スイッチ-ピン番号7、8-スイッチを入れてオンにします(センサーの切り替え方法を忘れた場合は、5ページを参照してください)

CrowPi上のサーボモジュールの位置

ここは結構重要なので、CrowPi-lessons.pdfに記載された解説の訳を、以下に引用する。

CrowPiには2つのサーボインターフェースが含まれており、どちらもサーボを制御する目的で使用できます。 このチュートリアルでは、「Servo1」とマークされたインターフェース番号1を使用します。
もう一方のインターフェースもいつでも使用できますが、サンプルスクリプトを適切なGPIOピンに変更する必要があります。
サーボには、正、負、データの3つのピンがあります。
プラスのピンは常に赤いケーブルで、マイナスのピンは黒いケーブル(アースとも呼ばれます)であり、データケーブルは通常カラフルなケーブルです。
次のように接続します
  • 赤いケーブル(正)は最初のサーボの真ん中のピンに行きます
  • 黒いケーブル(マイナスはグラウンドとも呼ばれます)は最初のサーボの右側のピンに接続します
  • カラフルなケーブル(青またはオレンジの場合があります)は、最初のサーボの左側にあるGPIOピンに接続します。
って書いているけど、実はCrowPiに同梱されているサーボモーターのコネクタは、「Servo2」と書いている方に接続するようになっており、レッスン動画でも同様であった。


↑右の白いソケット部分がServo2で、その左の黒いピン3つがServo1と書かれている。付属のサーボモーターはServo2の方に接続する。


↑サーボモーターをCrowPiボードに取り付けたところ

ちなみに、Servo1とServo2のBOARDとBCMのピン番号を以下にまとめる。

BOARD
BCM
Servo1
37
26
Servo2
22
25

サーボの操作

このレッスンで使用するPythonスクリプトは以下の通り。

Examples/servo.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Author : Original author WindVoiceVox
# Original Author Github: https://github.com/WindVoiceVox/Raspi_SG90
# http://elecrow.com/

import RPi.GPIO as GPIO
import time
import sys

class sg90:

 def __init__( self, direction):
  self.pin = 25
  GPIO.setmode( GPIO.BCM )
  GPIO.setup( self.pin, GPIO.OUT )
  self.direction = int( direction )
  self.servo = GPIO.PWM( self.pin, 50 )
  self.servo.start(0.0)

 def cleanup( self ):
  self.servo.ChangeDutyCycle(self._henkan(0))
  time.sleep(0.3)
  self.servo.stop()
  GPIO.cleanup()

 def currentdirection( self ):
  return self.direction

 def _henkan( self, value ):
  return 0.05 * value + 7.0

 def setdirection( self, direction, speed ):
  for d in range( self.direction, direction, int(speed) ):
   self.servo.ChangeDutyCycle( self._henkan( d ) )
   self.direction = d
   time.sleep(0.1)
  self.servo.ChangeDutyCycle( self._henkan( direction ) )
  self.direction = direction

def main():
 s = sg90(0)

 try:
  while True:
   print("Turn left ...")
   s.setdirection( 100, 10 )
   time.sleep(0.5)
   print("Turn right ...")
   s.setdirection( -100, -10 )
   time.sleep(0.5)
 except KeyboardInterrupt:
  s.cleanup()

if __name__ == "__main__":
 main()
↑Pythonだからインデントが大事なんだが、いかんせんブログでコードを書く方法を知らないので、いちいち全角スペースで打っていくの大変だな😅
書いてあるコードのインデントを保存したまま、コピーできないのかな?🤔

例のごとく、GPIO.setmodeとpin番号を修正。

修正後
 def __init__( self, direction):
  self.pin = 22
  GPIO.setmode( GPIO.BOARD )

このスクリプトを実行すると、サーボモーターに取り付けた白い部品が左や右にゆっくりと回転する。




スクリプトは無限ループとなっているので、CTRL+Cで終了させる。

動きはカクカクだが、ちゃんと動くので少し感動😂