とりあえず動画
こんなマニアック記事誰が読むんだ。。
Raspberry Piには、ある分野に特化したHATと呼ばれる拡張基盤がたくさん存在します。
今回、ラズパイでモーターを動かす任務が舞い込んできました。
最初はブレッドボードで頑張っていたのですが、面倒になり、
いやいや、なんかHATを探せばいいやん!!!
というわけで探しにかかりました。
HATの条件
- ラズパイのGPIOが全て生き残ること。
- 電池だけでラズパイ本体の給電もできること。
- 5000円以下
- 2つのモーターのセットが可能
の4点でした。
そして見つけたのがこれ!!
Waveshare製のRPi Motor Driver Boardと呼ばれるHATです。
ラズパイにHATをかぶせても、全てのGPIOが使えるし、
モーターも2つ繋げられ、ラズパイへの給電も可能!!
電池は単三6本使っております。
Pythonでモーターを動かす
例)
import RPi.GPIO as GPIO
from time import sleep
PWMA1 = 6
PWMA2 = 13
PWMB1 = 20
PWMB2 = 21
D1 = 12
D2 = 26
#GPIOのポート番号を使用
GPIO.setmode(GPIO.BCM)
#モーターで使うGPIOをセットアップ
GPIO.setup(PWMA1,GPIO.OUT)
GPIO.setup(PWMA2,GPIO.OUT)
GPIO.setup(PWMB1,GPIO.OUT)
GPIO.setup(PWMB2,GPIO.OUT)
GPIO.setup(D1,GPIO.OUT)
GPIO.setup(D2,GPIO.OUT)
#PWMの設定
motor1 = GPIO.PWM(D1,50)
motor2 = GPIO.PWM(D2,50)
#()内には0~100のスピードを指定
motor1.start(50)
motor2.start(50)
# モーターを動かす。
GPIO.output(PWMA1,1)
GPIO.output(PWMA2,0)
GPIO.output(PWMB1,1)
GPIO.output(PWMB2,0)
# モーターを3秒動かす
sleep(3)
# モーターを停止。
GPIO.output(PWMA1,0)
GPIO.output(PWMA2,0)
GPIO.output(PWMB1,0)
GPIO.output(PWMB2,0)
上記のプログラムでとりあえず3秒間2つのモーターを動かすことが可能です。
上から順にプログラムを見ていきましょう。
ライブラリのインポート
おなじみGPIOと、タイムスリープのライブラリを使用します。
import RPi.GPIO as GPIO
from time import sleep
変数宣言
GPIOのポート番号を宣言します。
PWMA1 = 6
PWMA2 = 13
PWMB1 = 20
PWMB2 = 21
D1 = 12
D2 = 26
Motor Driver Boardはモーターを2つセットでき、
モーター1をポート番号12
モーター2をポート番号26
を使うようです。
さらに電気を流すときには、
モーター1の片方をポート番号6
モーター1の片方をポート番号13
モーター2の片方をポート番号20
モーター2の片方をポート番号21
を使用します。
片方から電流を流し、片方はGNDになる想定ですね。
GPIO使用する宣言
GPIO.setup(PWMA1,GPIO.OUT)
GPIO.setup(PWMA2,GPIO.OUT)
GPIO.setup(PWMB1,GPIO.OUT)
GPIO.setup(PWMB2,GPIO.OUT)
GPIO.setup(D1,GPIO.OUT)
GPIO.setup(D2,GPIO.OUT)
これもお馴染みですね。
モーター制御はPWMを利用
モーターはGPIOのセットアップ後に、PWMの宣言をします。
motor1 = GPIO.PWM(D1,50)
motor2 = GPIO.PWM(D2,50)
- 第1引数にPWMを使用したいポート番号
- 第2引数は周波数となります。(ここでは50とします)
GPIOは本来、デジタル信号の入出力しか対応していません。デジタル信号はオンとオフしかないのです。速度調整やLEDの明るさ調整は、オンとオフだけでは表現できず、アナログ信号を送ってやらなければなりません。
そこでこのPWMの方式で、疑似的に出力電圧をコントロールして制御をしてあげる必要があるのです。
モーターの速度を指定
motor1.start(50)
motor2.start(50)
引数に0~100の速度を指定できます。
モーターに電気を流す
これはお馴染みです。
前回転
GPIO.output(PWMA1,1) #6番ポート
GPIO.output(PWMA2,0) #13番ポート
6番ポートから電流が流れ、13番ポートがGNDとなります。
後回転
GPIO.output(PWMA1,0) #6番ポート
GPIO.output(PWMA2,1) #13番ポート
13番ポートから電流が流れ、6番ポートがGNDとなります。
これによって、モーターの回転が逆になるのです。
モーター2も同様の動きなので割愛
3秒間動かす
お馴染みsleep
sleep(3)
終了
GPIOに流れている電流を全てオフにすることにより、モーターは止まります。
GPIO.output(PWMA1,0)
GPIO.output(PWMA2,0)
GPIO.output(PWMB1,0)
GPIO.output(PWMB2,0)
以上。
こんなマニアックHAT使う人っているのかな。。
いたら是非用途を教えてもらいたいし、情報共有お願いします―!