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

2019年7月23日

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

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

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

この制御が出来れば、リモコンタンクの実現性が増加しますね。

その先にも、いろいろな設定が必要かと思いますが、まずは、一つ一つ課題を克服していきましょう。

それでは、モーター制御の配線から開始します。

ご一緒に、ご覧になってください。

スポンサーリンク

モーター制御の配線

それでは、モーター制御の配線から開始します。この章では、次の順で、実際の配線までを行います。

  1. モータドライバNJM2070D2使用の配線図
  2. モータへのジャンパワイヤ接続
  3. 実際の配線

順に、それぞれの内容を実施していきます。

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

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

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

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

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

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

ご覧の通り、そんなに難しい配線ではありません。


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

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

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

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

実際の配線

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

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

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

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

プログラムの準備

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

  1. pi3側のプログラム
  2. 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の間でのモーター制御に取り組みました。

前回の記事で行ったプログラムをベースに、モーター制御のプログラムを作成しました。

配線を行いモーターを繋いで準備完了!

テストは思いのほかうまく行きました。電池切れには焦りましたけどね。

■思えば「リモコンタンク」の記事も増えてきました。

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

60爺

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