私的AI研究会? > AIbot Proj.1
#ref(): File not found: "20200408_142232_001s.jpg" at page "画像一覧"
#ref(): File not found: "20200303_080643_001s.jpg" at page "画像一覧"
#ref(): File not found: "20200303_080517_001s.jpg" at page "画像一覧"
#ref(): File not found: "20200310_160731_001s.jpg" at page "画像一覧"
#ref(): File not found: "20200326_132657_001s.jpg" at page "画像一覧"
#ref(): File not found: "raspi_box_s.jpg" at page "画像一覧"
#ref(): File not found: "raspi_case2s.jpg" at page "画像一覧"
#ref(): File not found: "20200308_085842_001s.jpg" at page "画像一覧"
#ref(): File not found: "20200319_081123_001s.jpg" at page "画像一覧"
#ref(): File not found: "20200407_164609_001s.jpg" at page "画像一覧"
#ref(): File not found: "20200407_164632_001s.jpg" at page "画像一覧"
#ref(): File not found: "fig6s.jpg" at page "画像一覧"
#ref(): File not found: "fig9m.jpg" at page "画像一覧"
● fig.6
LED・スイッチ・スピーカー・オーディオアンプ
→ ケースの作成・基板実装・配線?
● fig.9
LED・DCモーター
→ キャタピラーロボットの組み立て?
aibot.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # aibot.py # AI Robot Controle Library on Raspberry Pi4 # # DC motor DRV8835 controle # A-IN1 : GPIO 14 (BCM) B-IN1 : GPIO 15 (BCM) # A-IN2 : 23 B-IN2 : 24 # LED-S : 16 LED-L : 17 # LED-R : 18 # # Tact switch # ext pullup : GPIO 20 # import wiringpi as pi import sys import time class MotorCtrl_base: def __init__(self, a_phase, a_enbl, led): pi.wiringPiSetupGpio() if a_phase > 0: self.a_phase = a_phase pi.pinMode(self.a_phase, pi.OUTPUT) if a_enbl > 0: self.a_enbl = a_enbl pi.pinMode(self.a_enbl, pi.OUTPUT) if led > 0: self.led = led pi.pinMode(self.led, 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) def led_on(self): # ON pi.digitalWrite(self.led, 1) def led_off(self): # OFF pi.digitalWrite(self.led, 0) def reset(self): pi.digitalWrite(self.a_phase, 0) pi.digitalWrite(self.b_phase, 0) pi.digitalWrite(self.led, 0) class MotorCtrl: def __init__(self): self.dcmotor1 = MotorCtrl_base(a_phase=14, a_enbl=23, led=0) # 右モーター self.dcmotor2 = MotorCtrl_base(a_phase=15, a_enbl=24, led=0) # 左モーター self.led_sw = MotorCtrl_base(a_phase=0, a_enbl=0, led=16) # switch LED self.led_right = MotorCtrl_base(a_phase=0, a_enbl=0, led=18) # 右LED self.led_left = MotorCtrl_base(a_phase=0, a_enbl=0, led=17) # 左LED def stop(self): self.dcmotor1.stop() self.dcmotor2.stop() self.led_off() self.led_sw.led_off() def forword(self): self.dcmotor1.fwd() self.dcmotor2.fwd() def wait_forword(self, cn): for i in range(cn): self.fwd_led() def fwd_led(self): self.led_right.led_on() self.led_left.led_on() time.sleep(0.5) def back(self): self.dcmotor1.back() self.dcmotor2.back() def wait_back(self, cn): for i in range(cn): self.back_led() def back_led(self): self.led_right.led_on() self.led_left.led_on() time.sleep(0.25) self.led_right.led_off() self.led_left.led_off() time.sleep(0.25) def turn_left(self): self.dcmotor1.fwd() self.dcmotor2.back() def wait_turn_left(self, cn): for i in range(cn): self.turn_left_led() def turn_left_led(self): self.led_left.led_on() self.led_right.led_on() time.sleep(0.25) self.led_right.led_off() time.sleep(0.25) def turn_right(self): self.dcmotor1.back() self.dcmotor2.fwd() def wait_turn_right(self, cn): for i in range(cn): self.turn_right_led() def turn_right_led(self): self.led_right.led_on() self.led_left.led_on() time.sleep(0.25) self.led_left.led_off() time.sleep(0.25) def left(self): self.dcmotor1.fwd() self.dcmotor2.stop() def wait_left(self, cn): for i in range(cn): self.left_led() def left_led(self): self.led_left.led_off() self.led_right.led_on() time.sleep(0.25) self.led_right.led_off() time.sleep(0.25) def right(self): self.dcmotor1.stop() self.dcmotor2.fwd() def wait_right(self, cn): for i in range(cn): self.right_led() def right_led(self): self.led_right.led_off() self.led_left.led_on() time.sleep(0.25) self.led_left.led_off() time.sleep(0.25) def led_off(self): self.led_left.led_off() self.led_right.led_off() if __name__ == '__main__': motor = MotorCtrl() motor.stop() motor.led_off() args = sys.argv if 2 <= len(args): duration = sys.argv[2] if sys.argv[1] in {"stop"}: motor.stop() elif sys.argv[1] in {"forword"}: motor.forword() motor.wait_forword(int(duration)) motor.stop() elif sys.argv[1] in {"back"}: motor.back() motor.wait_back(int(duration)) motor.stop() elif sys.argv[1] in {"turn-left"}: motor.turn_left() motor.wait_turn_left(int(duration)) motor.stop() elif sys.argv[1] in {"turn-right"}: motor.turn_right() motor.wait_turn_right(int(duration)) motor.stop() elif sys.argv[1] in {"left"}: motor.left() motor.wait_left(int(duration)) motor.stop() elif sys.argv[1] in {"right"}: motor.right() motor.wait_right(int(duration)) motor.stop() else: print("Need Argument;forword, right, left, turn-right, turn-left, back or stop") else: print("Command Format: aibot [forword|right|left|turn-right|turn-left|back|stop] [count(0.5sec)]")
#ref(): File not found: "key_setm.jpg" at page "画像一覧"
aibotrm.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # aibotrm.py <<このソースコードは IDE デバッグはできない>> # AI Robot Remort Program on Raspberry Pi4 # # DC motor DRV8835 controle # A-IN1 : GPIO 14 (BCM) B-IN1 : GPIO 15 (BCM) # A-IN2 : 23 B-IN2 : 24 # LED-S : 16 LED-L : 17 # LED-R : 18 # # Tact switch # ext pullup : GPIO 20 # import wiringpi as pi from kbhit import * import aibot import sys if __name__ == '__main__': atexit.register(set_normal_term) set_curses_term() motor = aibot.MotorCtrl() motor.stop() motor.led_off() ledmod = 0 kb = ' ' print("AIbot Control Ok! 'i,m,j,l,k,,u,o' or 'q'") while 1: # key push check & Motor control if kbhit(): kb = getch() if kb == 'q': print(" ## Break ##") motor.stop() motor.led_off() ledmod = 9 elif kb == 'A' or kb == 'i': print(" ** Forword **") motor.forword() ledmod = 1 elif kb == 'B' or kb == 'm': print(" ** Bsck **") motor.back() ledmod = 2 elif kb == 'C' or kb == 'j': print(" ** Left **") motor.left() ledmod = 3 elif kb == 'D' or kb == 'l': print(" ** Right **") motor.right() ledmod = 4 elif kb == '2' or kb == 'o': print(" ** Right turn **") motor.turn_right() ledmod = 5 elif kb == '1' or kb == 'u': print(" ** Left turn **") motor.turn_left() ledmod = 6 elif kb == 's' or kb == 'k' or kb == ' ': print(" !! Stop !!") motor.stop() ledmod = 0 else: print("AiBot Standby OK !!!!") # LED mode set & wait 0.5sec if ledmod == 0: motor.led_off() elif ledmod == 1: motor.fwd_led() elif ledmod == 2: motor.back_led() elif ledmod == 3: motor.left_led() elif ledmod == 4: motor.right_led() elif ledmod == 5: motor.turn_right_led() elif ledmod == 6: motor.turn_left_led() elif ledmod == 9: break else: pass ledmod = 0 print("Program Finished !!!")
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 ("Raspberry Pi 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 !!!")
aibot_boot.sh
#!/bin/bash cd ~/Programs/aibot python wait.py echo "Motor Test Program Start..." python aibot.py forword 6 python aibot.py back 6 python aibot.py left 4 python aibot.py right 4 python aibot.py turn-left 3 python aibot.py turn-right 3 python motor3.py stop 1 echo "Aibot Start..."
$ chmod u+x aibot_boot,sh
$ ./aibot_boot.sh
1. 自動起動ファイルを作成する。
aibot_boot.service
Description=Aibot boot [Service] ExecStart=/bin/bash /home/pi/Programs/aibot/aibot_boot.sh WorkingDirectory=/home/pi/Programs/aibot/ Restart=always User=pi [Install] WantedBy=multi-user.target
2. 自動起動用のサービスファイルをコピーする。
$ sudo cp aibot_boot.service /etc/systemd/system/
3. systemdにユニットファイルを追加・更新したことを通知する
$ sudo systemctl daemon-reload
4. 自動起動を登録する。
$ sudo systemctl enable aibot_boot.service $ sudo systemctl start aibot_boot.service
5. 登録を確認する。
$ sudo systemctl status aibot_boot.service
active となっていたら登録完了。
$ sudo systemctl stop aibot_boot.service
$ sudo systemctl status aibot_boot.service
$ sudo systemctl stop aibot_boot.service $ sudo systemctl disable aibot_boot.service $ sudo systemctl status aibot_boot.service
$ crontab -e no crontab for pi - using an empty one Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.basic 3. /usr/bin/vim.tiny 4. /bin/ed Choose 1-4 [1]: 2下記を追記する。
@reboot /home/pi/Programs/aibot/aibot_boot.sh起動時にaibot_boot.sh が実行される。
Pythonではreadcharというライブラリを使う。
$ pip install readchar
#!/usr/bin/env python import readchar import sys while 1: kb = readchar.readchar() # sys.stdout.write(kb) print(ord(kb)) if kb == 'q': print("") break
Python error: (25, 'Inappropriate ioctl for device')