ラズパイでリモコンタンク製作準備!モーター制御成功!

2019年7月23日

先日、raspberrypi3 と raspberrypi zero WH を bluetooth で通信し、pi3 側から、zero WH をリモートコントロールすることに挑戦しました(このページ参照)。

その際、pi3 で出した指令を zero WH で受取り、それに応じた処理を実施することが出来ることを確認しました。

この仕組みを利用して、いよいよ、モーター制御に挑戦してみましょう。

スポンサーリンク

モーター制御の配線

モータードライバNJM2070D2使用の配線図

モータ制御を行うには様々な方法がありますが、モーター制御用のICを使用するのが一番早いです。

60爺は、「NJM2670D2」というICを使用しました。このICを使えば、二つのモータ制御を簡単に 行うことが出来ます。

ラズパイのピンは、18,23,24,25番を使用します。

配線図を以下に示します。

ちなみに、上のモーターが右側、下のモーターが左側です。コンデンサは、0.1μFを2つ使用しています。

そんなに難しい配線ではありません。


モータへのジャンパワイヤ接続

使用するモータは、タミヤのツインモーターギヤボックスに付属のモータです。これは、2つのモーターの動きを別々に取り出せるギヤボックスです。

製作する戦車は、前後、左右に動かしたいため、このギヤボックスを採用しています。

モーターには、ジャンパワイヤをハンダ付けして、制御しやすいようにしました。

実際の配線

さて、それでは、実際の配線を行います。

今回は手軽に製作するので、ブレッドボードを用いて作り上げます。ジャンパーワイヤ(オス-メス)と同オス-オスを使用します。

配線図は既に示しましたが、それほど難しい配線ではありません。

こんな風に出来上がりました。

プログラムの準備

次に、モータ制御を行うプログラムを準備します。

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爺にしては、問題も起こらず、すんなりと動きました。すごい、すごい!

以下の動画を見てください。動いているのを確認するため、モータの軸に付箋を付けてわかりやすくしました。

テストを開始した際、順調にモーターが回ったのち、二度目にモーターが動かなくなるアクシデントが発生しました。

かなり焦りましたが、原因はモーター用の電池切れでした。バッテリには、電光掲示板以来たたられますなア!

電池を新しいものに変えたら、問題なく動きました。

スポンサーリンク

モーター制御からリモコン操作に至る過程の記事です。他の記事もぜひ、ご覧ください。

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら