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

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

CrowPiレッスン19:IRセンサーの制御と使用

2020-11-11 16:58:58 | CrowPi

Controlling and using the IR sensor

レッスン19"IRセンサーの制御と使用"をやっていく。

概要を引用
このレッスンでは、IRレシーバーの使用方法と、ミニIRリモコンから空気でIR(infra red;赤外線)コードを受信する方法を学習します。
この方法を使用すると、IRリモート上のボタンごとに異なるアクションを設定できるため、非常に便利です。 たとえば、ボタンを押すたびに異なるLEDをオンにしたり、サーボの動きを制御したりできます。 アラームをオフにするのはどうですか? このレッスンを学んだ後は、何でも可能です。

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • IRレシーバーを制御し、IRリモートを介して信号を送信します

何が必要か

  • 初期設定後のCrowPiボード
  • IRリモコン(CrowPiキットに付属)


Requires switching modules using the switch

  • いいえ

CrowPi上のIRセンサーの位置

一応これも引用しとくか
DH11センサーの右側でCrowPiロゴのすぐ下にあるIRセンサー。 これは、リモコンがコードを受信するための受信機として使用する3ピンの小さなLEDと見なすことができます。
CrowPiキットに含まれているIRリモコンも必要です。必ず取り出して、レッスンの準備をしてください。

↓受光部を取り付けたところ

レッスンPDFには説明ないけど、レッスンビデオではこう付けてたから問題ないだろ🤔


IRレシーバーの操作

解説の引用
IRレシーバーの操作は、思ったほど難しくはありません。
LIRCやPython-LIRCと呼ばれるライブラリを使用するIRレシーバーは、リモコンを使用して送信するコードを受信し、それらに基づいて特定のアクションを実行します。
Out変数には、押したボタンが含まれています。特定のボタンをクリックしたかどうかを確認するパラメーターを作成し、その情報に基づいてコマンドを実行できます。

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

Examples/IR.py
import socket, signal
import lirc, time, sys
import RPi.GPIO as GPIO
from array import array

GPIO.setmode(11)
GPIO.setup(17, 0)
GPIO.setup(18, 0)
PORT = 42001
HOST = "localhost"
Socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

Lirc = lirc.init("keys")
#lirc.set_blocking(False, Lirc) # Un-Comment to stop nextcode() from waiting for a signal ( will return empty array when no key is pressed )

def handler(signal, frame):
 Socket.close()
 GPIO.cleanup()
 exit(0)

signal.signal(signal.SIGTSTP, handler)

def sendCmd(cmd):
 n = len(cmd)
 a = array('c')
 a.append(chr((n >> 24) & 0xFF))
 a.append(chr((n >> 16) & 0xFF))
 a.append(chr((n >> 8) & 0xFF))
 a.append(chr(n & 0xFF))
 Socket.send(a.tostring() + cmd)

while True:

 Out = lirc.nextcode()
 print(Out[0])

例のごとく、GPIO.setmodeとpin番号を修正。
って思ったら、なんか今までとコードの書き方が違う・・・
GPIO.setup()で直接pin番号を指定しているのはいいとして、
GPIO.setmode(11)の11って何だ?😯
GPIO.BOARDってことでいいのか?

まぁよくわからないが、このスクリプトを実行して、リモコンを押すと
って、あれっ!?反応しない
よくよくリモコンを見てみると電池が入っていないではないかっ!?
輸送の関係で入れられないのか?
それとも単にケチったのか?😒

仕方がないので以前別で買ったラズパイキットに同じようなリモコン付いてたからそちらから電池を拝借


するとちゃんと押したボタンがターミナルに表示されることを確認。

ちなみにもう一方のリモコンでも問題なく反応した。
ほぼ同じリモコンだが、ボタンの押した感じがちょっと異なる。


CrowPiレッスン18:ボタンマトリックスの使用と制御

2020-11-11 15:09:44 | CrowPi

Using and controlling the Button Matrix.

レッスン18"ボタンマトリックスの使用と制御。"をやっていく。

概要を引用
マトリックスボタンは、CrowPiボードの周りに16個の独立したボタンがあるモジュールで、シークレットコードキーパッド、メモリゲーム、または必要なものを制御するなど、幅広いプロジェクトに使用できます。
ボタンの可能性が広いので、どこからでも何でも作れます!

何を学習するか

このレッスンを終了すると、次のことができるようになります。
  • ボタンマトリックスがどのように機能し、GPIOピンを介してそれを制御する方法を理解する

何が必要か

  • 初期設定後のCrowPiボード

Requires switching modules using the switch

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

CrowPi上のボタンマトリックスの位置



ボタンマトリックスの操作

解説の引用
ボタンマトリックスは、それぞれ4つの列と行に組み込まれています。マトリックスの行と列をGPIOピンで構成し、ButtonMatrix()というオブジェクトをボタン変数に初期化します。
その後、ボタンの各ボタンに移動して、クリックされたかどうかを検出できるようになります。
この例では、ボタンが押された場合、activateButton()をアクティブにして、押されたボタン番号を出力します。 このモジュールを変更して、ボタンが押されたかどうかに関係なく、想像できるすべてのことを実行できるようにすることができます。

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

Examples/button_matrix.py
import RPi.GPIO as GPIO
import time

class ButtonMatrix():

 def __init__(self):

  GPIO.setmode(GPIO.BCM)

  # matrix button ids
  self.buttonIDs = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
  # gpio inputs for rows
  self.rowPins = [27,22,5,6]
  # gpio outputs for columns
  self.columnPins = [13,19,26,25]

  # define four inputs with pull up resistor
  for i in range(len(self.rowPins)):
   GPIO.setup(self.rowPins[i], GPIO.IN, pull_up_down = GPIO.PUD_UP)

  # define four outputs and set to high
  for j in range(len(self.columnPins)):
   GPIO.setup(self.columnPins[j], GPIO.OUT)
   GPIO.output(self.columnPins[j], 1)
(以下、省略)

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

修正後
  GPIO.setmode(GPIO.BOARD)

  # matrix button ids
  self.buttonIDs = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]
  # gpio inputs for rows
  self.rowPins = [13,15,29,31]
  # gpio outputs for columns
  self.columnPins = [33,35,37,22]

このスクリプトを実行して、マトリックスボタンを押すと、対応する数値がターミナル上に表示される。

↑ちなみに、上記のスクリプトの場合、ボタンの番号が、右上から左方向に1、2、・・・と割り振られていて、CrowPiボード上に書かれている番号と異なるので、ちょっと変な感じがする。
ボードに書かれた番号に対応させるには、スクリプトの該当部分を以下のように修正する。
  • self.columnPins = [13,19,26,25]


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