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

シェアする

Pocket

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

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

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

1.モーター制御の配線

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

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

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

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

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

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

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

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

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

タミヤ 楽しい工作シリーズ No.168 ダブルギヤボックス 左右独立4速タイプ (70168)

新品価格
¥101から
(2019/7/6 22:05時点)

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

(3) 実際の配線

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

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

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

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

2.プログラムの準備

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

(1) 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()

(2) 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

3.実行テスト

手順は、前回やりましたが、それと同様です。

(1) ペアリング開始

前回やったように、それでは、ペアリングを開始します。

① zero WH

受け側で、Bluetoothのペアリングが出来るよう検索可能な状態にします。

② pi3

リモコン側でペアリングします。

(2) プログラム立上げ

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

(3) 実行結果

実行結果は以下の通りです。

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

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

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

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

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

スポンサーリンク

シェアする

フォローする