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

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

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で終了させる。

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

CrowPiレッスン12:ステップモーターを使用し、ステップ動作を行う

2020-11-08 16:24:49 | CrowPi

Using the step motor and making step movements.

レッスン12"ステップモーターを使用し、ステップ動作を行う"をやっていく。
ステップモーターを使えるようになれば、ロボットや3Dプリンターなど応用の幅が広がる。

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • ステップモーターを制御し、ステップ動作を行う方法を学びます

何が必要か

  • 初期設定後のCrowPiボード
  • ステップモーター(CrowPiキットに含まれています)

Requires switching modules using the switch

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

CrowPi上のステップモーターモジュールの位置



↑そこにステップモーターを接続

ステップモーターの操作

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

Examples/stepmotor.py
import time
import RPi.GPIO as GPIO
import math

class Stepmotor:

def __init__(self):

 # set GPIO mode
 GPIO.setmode(GPIO.BCM)
 # These are the pins which will be used on the Raspberry Pi
 self.pin_A = 5
 self.pin_B = 6
 self.pin_C = 13
 self.pin_D = 19
 self.interval = 0.010

 # Declare pins as output
 GPIO.setup(self.pin_A,GPIO.OUT)
 GPIO.setup(self.pin_B,GPIO.OUT)
 GPIO.setup(self.pin_C,GPIO.OUT)
 GPIO.setup(self.pin_D,GPIO.OUT)
 GPIO.output(self.pin_A, False)
 GPIO.output(self.pin_B, False)
 GPIO.output(self.pin_C, False)
 GPIO.output(self.pin_D, False)
(省略)
def main():

 print("moving started")
 motor = Stepmotor()
 print("One Step")
 motor.turnSteps(1)
 time.sleep(0.5)
 print("20 Steps")
 motor.turnSteps(20)
 time.sleep(0.5)
 print("quarter turn")
 motor.turnDegrees(90)
 print("moving stopped")
 motor.close()

if __name__ == "__main__":
 main()

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

修正後
 # set GPIO mode
 GPIO.setmode(GPIO.BOARD)
 # These are the pins which will be used on the Raspberry Pi
 self.pin_A = 29
 self.pin_B = 31
 self.pin_C = 33
 self.pin_D = 35

 self.interval = 0.010

このスクリプトを実行すると、ステップモーターがブルブル震え出すが特段何が動く様子はなかった。
てっきり軸の部分が回転するものだと思ってた😅
そもそもステップモーターって何だ?
ロボットとかに使えるんだよね?🤔