ラズパイでリモコンタンク製作準備!モーター制御成功!
先日、raspberrypi3 と raspberrypi zero WH を bluetooth で通信し、pi3 側から、zero WH をリモートコントロールすることに挑戦しました(このページ参照)。
その際、pi3 で出した指令を zero WH で受取り、それに応じた処理を実施することが出来ることを確認しました。
この仕組みを利用して、いよいよ、モーター制御に挑戦してみましょう。
この制御が出来れば、リモコンタンクの実現性が増加しますね。
その先にも、いろいろな設定が必要かと思いますが、まずは、一つ一つ課題を克服していきましょう。
それでは、モーター制御の配線から開始します。
ご一緒に、ご覧になってください。
モーター制御の配線
それでは、モーター制御の配線から開始します。この章では、次の順で、実際の配線までを行います。
- モータドライバNJM2070D2使用の配線図
- モータへのジャンパワイヤ接続
- 実際の配線
順に、それぞれの内容を実施していきます。
モータードライバNJM2070D2使用の配線図
モータ制御を行うには様々な方法がありますが、モーター制御用のICを使用するのが一番早いです。
60爺は、「NJM2670D2」というICを使用しました。このICを使えば、二つのモータ制御を簡単に行うことが出来ます。
ラズパイのピンは、18,23,24,25番を使用します。
配線図を以下に示します。
ちなみに、上のモーターが右側、下のモーターが左側です。コンデンサは、0.1μFを2つ使用しています。
ご覧の通り、そんなに難しい配線ではありません。
モータへのジャンパワイヤ接続
使用するモーターは、タミヤのツインモーターギヤボックスに付属のモーターです。そして、このギヤボックスは、2つのモーターの動きを別々に取り出せるギヤボックスです。
製作する戦車は、前後、左右に動かしたいため、このギヤボックスを採用しています。
モーターには、ジャンパワイヤをハンダ付けして、制御しやすいようにしました。
実際の配線
さて、それでは、実際の配線を行います。
今回は手軽に製作するので、ブレッドボードを用いて作り上げます。ジャンパーワイヤ(オス-メス)と同オス-オスを使用します。
配線図は既に示しましたが、それほど難しい配線ではありません。
こんな風に出来上がりました。
プログラムの準備
次に、モータ制御を行うプログラムを準備します。
- pi3側のプログラム
- zero WH側のプログラム
前回の記事でもやったように、送り側(pi3)、受け側(zero WH)それぞれにプログラムを用意します。
pi3 側のプログラム
前回使用したプログラムをそのまま利用しちゃいます。
1から5までの数字を送れますので、以下のような役割を与えます。
- 1:前進
- 2:バック
- 3:ストップ
- 4:右に曲がる
- 5:左に曲がる
#!/usr/bin/python3
# coding: UTF-8
import sys
import bluetooth
import time
address = "B8:27:EB:7F:86:7F"
PORT = 1
sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )
print('PG Start')
sock.connect( ( address , PORT ) )
print('try before')
try:
while True:
a = input('1 から 5 までの数字を入力してください>>')
if a.isdecimal() == True:
if int(a) > 0 and int(a) < 6:
sock.send( str(a) )
print(a)
else:
if int(a) == 6:
sock.send( str(a) )
print(a)
time.sleep(2)
break
else:
print('指定の数字ではありません')
else:
print('入力が数字ではありません')
except KeyboardInterrupt:
sock.close()
zero WH 側のプログラム
こちらのプログラムは、モータ制御を行うものですが、骨格は前回使用のものを利用します。
モータ制御の部分は、それぞれの数字を判定し、それに見合った方向にモータを回してやればいいだけです。
- 1:二つのモータを同じ方向
- 2:二つのモータを1の逆方向
- 3:二つのモータを止める
- 4:右を前進方向、左のモータをバック方向
- 5:右をバック方向、左のモータを前進方向
数字に見合ったピンから、PGIOを使用して、HIGH,LOWを設定することで、上記の動きを制御することが出来ます。
こんな感じですね。
#!/usr/bin/python
# coding: UTF-8
import sys
import time
import bluetooth
import random
import RPi.GPIO as GPIO
address = "B8:27:EB:A1:29:2E"
port = 1
MOTOR_L1 = 18
MOTOR_L2 = 23
MOTOR_R1 = 24
MOTOR_R2 = 25
GPIO.setmode( GPIO.BCM )
GPIO.setup( MOTOR_L1, GPIO.OUT )
GPIO.setup( MOTOR_L2, GPIO.OUT )
GPIO.setup( MOTOR_R1, GPIO.OUT )
GPIO.setup( MOTOR_R2, GPIO.OUT )
def stop_motor():
GPIO.output( MOTOR_L1, GPIO.LOW )
GPIO.output( MOTOR_L2, GPIO.LOW )
GPIO.output( MOTOR_R1, GPIO.LOW )
GPIO.output( MOTOR_R2, GPIO.LOW )
time.sleep(0.05)
stop_motor()
sock = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
sock.bind( ( "", port ) )
sock.listen( 1 )
while ( True ):
try:
print ("Connect....")
sock_client,address = sock.accept()
print("Connected")
break
except bluetooth.BluetoothError :
print ("Connection Failed")
sock = bluetooth.BluetoothSocket( bluetooth.RFCOMM )
time.sleep ( 1 )
while( True ):
try:
data_ = sock_client.recv(16)
data = data_.decode("UTF-8")
for i in data:
if( i == "1" ):
print("Foward")
stop_motor()
GPIO.output( MOTOR_L1, GPIO.HIGH )
GPIO.output( MOTOR_L2, GPIO.LOW )
GPIO.output( MOTOR_R1, GPIO.HIGH )
GPIO.output( MOTOR_R2, GPIO.LOW )
elif( i == "2" ):
print("Back")
stop_motor()
GPIO.output( MOTOR_L1, GPIO.LOW )
GPIO.output( MOTOR_L2, GPIO.HIGH )
GPIO.output( MOTOR_R1, GPIO.LOW )
GPIO.output( MOTOR_R2, GPIO.HIGH )
elif( i == "3" ):
print("Stop")
stop_motor()
elif( i == "4" ):
print("Right")
stop_motor()
GPIO.output( MOTOR_L1, GPIO.HIGH )
GPIO.output( MOTOR_L2, GPIO.LOW )
GPIO.output( MOTOR_R1, GPIO.LOW )
GPIO.output( MOTOR_R2, GPIO.HIGH )
elif( i == "5" ):
print("Left")
stop_motor()
GPIO.output( MOTOR_L1, GPIO.LOW )
GPIO.output( MOTOR_L2, GPIO.HIGH )
GPIO.output( MOTOR_R1, GPIO.HIGH )
GPIO.output( MOTOR_R2, GPIO.LOW )
else:
print("THE END")
GPIO.cleanup()
sock.close()
sock_client.close()
break
except KeyboardInterrupt:
sock.close()
sock_client.close()
break
except:
sock.close()
sock_client.close()
break
実行テスト
手順は、前回やりましたが、それと同様です。
ペアリング開始
前回やったように、それでは、ペアリングを開始します。
- zero WH:受け側で、Bluetoothのペアリングが出来るよう検索可能な状態にする
- pi3:リモコン側でペアリングする
プログラム立上げ
pi3で2画面(bluetooth用、python用)、zeroで2画面(bluetooth用、python用)が必 要になるのは前回でも説明しました。
zero WH プログラム立ち上げ
pi@raspberrypi:~/py_folder $ python3 motor.py
pi3 プログラム立ち上げ
pi@raspberrypi:~/py_folder/blue $ python3 input.py
実行結果
実行結果は以下の通りです。
Pi3での値入力
1 から 5 までの数字を入力してください>>1
1
1 から 5 までの数字を入力してください>>2
2
1 から 5 までの数字を入力してください>>3
3
1 から 5 までの数字を入力してください>>4
4
1 から 5 までの数字を入力してください>>5
5
上記の数値を受けた pi zero WH での出力結果
Foward
Back
Stop
Right
Left
この結果、モーターが数値に合わせて動きました。
- 1を入れると、モータが同方向に回りました。
- 2を入れると、モータが先ほどと逆方向に回りました。
- 3でモータが止まりました。
- 4を入れると、双方のモータが逆方向に回りました。
- 5を入れると、双方のモータが4と逆方向に回りました。
動いているのを確認するため、モータの軸に付箋を付けてわかりやすくしました。
以下の動画を見てください。
60爺にしては、問題も起こらず、すんなりと動きました。すごい、すごい!
ところが、テストを開始した際、順調にモーターが回ったのち、二度目にモーターが動かなくなるアクシデントが発生しました。
かなり焦りましたが、原因はモーター用の電池切れでした。
バッテリには、電光掲示板以来、祟られますなア!
電池を新しいものに変えたら、問題なく動きました。
最後に
ラズパイでリモコンタンク政策を行うため、ラズパイとラズパイzeroの間でのモーター制御に取り組みました。
前回の記事で行ったプログラムをベースに、モーター制御のプログラムを作成しました。
配線を行いモーターを繋いで準備完了!
テストは思いのほかうまく行きました。電池切れには焦りましたけどね。
■思えば「リモコンタンク」の記事も増えてきました。
ディスカッション
コメント一覧
大変興味深く拝見しました。私も、モータードライバー(NJM2670D2)を使って、Fritzingで製作したい
と思っていました。しかし、Fritzingのパーツには、NJM2670D2がありません。貴兄の配線図には、
FritzingでNJM2670D2を使っています。!!!
どのようにして使えるようになるのでしょうか?是非教えて頂きたい。83爺より
83爺様、コメントありがとうございます。
wordpressの調子がいまいちだったため、回答が遅れまして申し訳ありません。
NJM2670D2 ですが、ご指摘の通り、このパーツは Fritzing のパーツには存在しません。
60爺は、以下のパーツで Fritzing 上に配線図を作成し、この配線図を Excel 等に貼り付けた後、名称の部分を図形で上塗りし名称を NJM2670D2 に書き換えています。
U1
AD5206 Digital Potentiometer
ご参考になりますか?