私的AI研究会 > ハードウェア2

外装ハードウェア2

キャタピラーロボットの組み立て

各部の配線

● 駆動部分の配線はサイドに設置したブレッドボードを介して上部CPUボックスのGPIOピンに接続。

● モーター駆動用バッテリーは上部BOX内に設置して、スライドスイッチでON/OFFできるようにする。

 

ハードウェア完成

● カメラ基板を正面(鼻の部分)に移動した。センサーとして仕様拡張できる。

● 移動用のケースを3セット作った。

 

テストプログラム

  1. 「Raspberry Pi+AI 電子工作超入門」Chapter6-4 の motor2.py プログラムからテストプログラムを作成する。
     参照: → WiringPi API
    $ vi motor3.py
    
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import wiringpi as pi
    import sys
    import time
    
    class DC_Motor_DRV8835:
        def __init__(self, a_phase, a_enbl):
            pi.wiringPiSetupGpio()
            self.a_phase = a_phase
            self.a_enbl = a_enbl
            
            pi.pinMode(self.a_phase, pi.OUTPUT)
            pi.pinMode(self.a_enbl, pi.OUTPUT)
            
        def fwd(self):
            # 回転(正転)
            pi.digitalWrite(self.a_phase, 1)
            pi.digitalWrite(self.a_enbl, 1)
            
        def back(self):
            # 回転(逆転)
            pi.digitalWrite(self.a_phase, 0)
            pi.digitalWrite(self.a_enbl, 1)
            
        def stop(self):
            # 停止
            pi.digitalWrite(self.a_phase, 0)
            pi.digitalWrite(self.a_enbl, 0)
            
    class LED_LIGHT:
        def __init__(self,  led):
            self.led = led
            pi.pinMode(self.led, pi.OUTPUT)
            
        def led_on(self):
            # ON
            pi.digitalWrite(self.led, 1)
            
        def led_off(self):
            # OFF
            pi.digitalWrite(self.led, 0)
            
    if __name__ == '__main__':
        dcmotor1 = DC_Motor_DRV8835(a_phase=14, a_enbl=23)    # 右モーター
        dcmotor2 = DC_Motor_DRV8835(a_phase=15, a_enbl=24)    # 左モーター
        led_sw = LED_LIGHT(led=16)                            # switch LED
        led_right = LED_LIGHT(led=18)                         # 右LED
        led_left = LED_LIGHT(led=17)                          # 左LED
        duration = sys.argv[2]
        
        if sys.argv[1] in {"stop"}:
            dcmotor1.stop()
            dcmotor2.stop()
            led_right.led_off()
            led_left.led_off()
            led_sw.led_off()
        elif sys.argv[1] in {"forword"}:
            dcmotor1.fwd()
            dcmotor2.fwd()
            led_right.led_on()
            led_left.led_on()
            time.sleep(int(duration))
            dcmotor1.stop()
            dcmotor2.stop()
            led_right.led_off()
            led_left.led_off()
        elif sys.argv[1] in {"back"}:
            dcmotor1.back()
            dcmotor2.back()
            for i in range(int(duration)):
                led_right.led_on()
                led_left.led_on()
                time.sleep(0.5)
                led_right.led_off()
                led_left.led_off()
                time.sleep(0.5)
            dcmotor1.stop()
            dcmotor2.stop()
        elif sys.argv[1] in {"left"}:
            dcmotor1.fwd()
            dcmotor2.back()
            led_left.led_on()
            for i in range(int(duration)):
                led_right.led_on()
                time.sleep(0.5)
                led_right.led_off()
                time.sleep(0.5)
            dcmotor1.stop()
            dcmotor2.stop()
            led_right.led_off()
            led_left.led_off()
        elif sys.argv[1] in {"right"}:
            dcmotor1.back()
            dcmotor2.fwd()
            led_right.led_on()
            for i in range(int(duration)):
                led_left.led_on()
                time.sleep(0.5)
                led_left.led_off()
                time.sleep(0.5)
            dcmotor1.stop()
            dcmotor2.stop()
            led_right.led_off()
            led_left.led_off()
        else:
            print("Need Argument;forword, right, left, back or stop")
    起動方法:python motor3.py [forword|back|left|right|stop] [動作時間(秒)]
     前進:
    $ python motor3.py forword 3
     後退:
    $ python motor3.py back 3
  2. タクトスイッチの入力待ちプログラムwait.py を作る。
    $ vi wait.py
    
    $ cat wait.py
    # -*- cording: utf-8 -*-
    
    import time
    import RPi.GPIO as GPIO
    
    LED = 16
    BUTTON  = 20
    
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED, GPIO.OUT)
    GPIO.setup(BUTTON, GPIO.IN)
    
    GPIO.add_event_detect(BUTTON, GPIO.FALLING)
    
    while True:
        if GPIO.event_detected(BUTTON):
            print ("Switch ON!")
            break
        else:
            GPIO.output(LED, GPIO.HIGH)
            time.sleep(0.5)
            GPIO.output(LED, GPIO.LOW)
            time.sleep(0.5)
     
    GPIO.cleanup()
    print ("Start OK!!!")
    機能:タクトスイッチの入力待ちでLED の点滅を繰り返す。スイッチが押されたらLED を消してプログラム終了。

  3. モーターテストプログラム
    $ vi motortest.sh
    
    #!/bin/bash
    
    cd ~/Programs
    
    while true
    do
        sleep 1
        python wait.py
    
        echo "Motor Test Program Start..."
    
        echo "===== forword ====="
        python motor3.py forword 3
    
        echo "===== back ====="
        python motor3.py back 3
    
        echo "===== left ====="
        python motor3.py left 3
    
        echo "===== right ====="
        python motor3.py right 3
    
        echo "!!!!! stop !!!!!"
        python motor3.py stop 1
    done
    実行権限を付加する。
    $ chmod u+x motortest,sh
    実行してみる。
    $ ./motortest
    機能:タクトスイッチの入力待ちで止まり、スイッチを押すと 前進3秒 → 後退3秒 → 左ターン → 右ターン → 停止 と動き、再入力待ちとなるプログラム。(終了は止まるまでCtrl+C)

自動起動の設定

Raspberry Pi が起動すると自動的にテストプログラムが動作するようにする。

  1. 自動実行ファイルを作成する。
    $ vi motor.service
    
    Description=Motor TEST
    [Service]
    ExecStart=/bin/bash /home/pi/Programs/motortest.sh
    WorkingDirectory=/home/pi/Programs/
    Restart=always
    User=pi
    [Install]
    WantedBy=multi-user.target
  2. 自動起動用のサービスファイルをコピーする。
    $ sudo cp motor.service /etc/systemd/system/
  3. systemdにユニットファイルを追加・更新したことを通知する
    $ sudo systemctl daemon-reload
  4. 自動起動を登録する。
    $ sudo systemctl enable motor.service
    $ sudo systemctl start motor.service
  5. 登録を確認する。
    $ sudo systemctl status motor.service
    active となっていたら登録完了。
     

最終確認

  1. モニターケーブルの接続などをはずしてバッテリーをつなぎ Raspberry Pi を起動する。
  2. スイッチLEDが点滅し入力待ちで止まるとスタンバイ状態。
  3. スイッチを押してプログラムを実行する。 バッテリー駆動で動作するようになった。

参考資料


Last-modified: 2021-06-06 (日) 16:32:12