私的AI研究会 > ハードウェア2
● 駆動部分の配線はサイドに設置したブレッドボードを介して上部CPUボックスのGPIOピンに接続。
● モーター駆動用バッテリーは上部BOX内に設置して、スライドスイッチでON/OFFできるようにする。
● カメラ基板を正面(鼻の部分)に移動した。センサーとして仕様拡張できる。
● 移動用のケースを3セット作った。
$ 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
$ 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 を消してプログラム終了。
$ 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 が起動すると自動的にテストプログラムが動作するようにする。
$ 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
$ sudo cp motor.service /etc/systemd/system/
$ sudo systemctl daemon-reload
$ sudo systemctl enable motor.service $ sudo systemctl start motor.service
$ sudo systemctl status motor.serviceactive となっていたら登録完了。