Kurde ale trzeba być durniem, żeby pisać blog, który czyta może z pięć osób - porażka...
Dziś przetestowałem układ jezdny. Na razie daleko temu jest do autonomicznego robota ale przy dobrych wiatrach wszystko się może uda... jakoś.
W moim ostatnim poście, próbowałem pokazać Wam drodzy czytelnicy jak można połączyć platformę BeagleBone Black z podwoziem produkowanym przez DAGU, czyli - Rover'em 5.
Do połączenia i sterowania silnikami DC użyłem dedykowanej do tego zestawu elektroniki czyli kontrolera silników DAGU.
Cóż jeszcze - wykonałem krótki test, prostym programikiem napisanym w Pythonie i pomęczyłem się z niedziałającymi obrazami systemu Debian, który w tym komputerku "siedzi" i jego konfiguracją - sporo tego było - niemal miesiąc ślęczenia praktycznie w miejscu i związanej z tym frustracji :(
Jeśli ktoś mnie teraz zapyta czy przyszedł czas na udanie się do "WC dla personelu" to - nie będzie w błędzie. Otóż podczas pisania tego tekstu chorowałem na tak zwaną "jelitówkę" i generalnie oprócz osłabienia, przesiadywałem głównie w "Świątyni dumania", więc miałem sporo czasu na myślenie :-D Pomiędzy posiedzeniami tam gdzie "Król chadza bez korony", wykorzystywałem swój wolny czas (a taki wolny czas jest cenny), bowiem pozwoliło na dalsze prace nad platformą i ostateczne poprawki w napisanym kodzie programu sterującego w Pythonie, oraz programu, który przetestuje moje założenia i mniej więcej jak będzie wyglądało sterowanie robotem.
Zastanawiam się tylko czy nie być "rasowym Cebulakiem" i udostępnić kod pospólstwu i tak chyba zrobię :-)
Każdy wie, że każda maszyna cyfrowa (w tym komputer robota) nie umie nic bez oprogramowania. Należy więc zdefiniować podstawowe ruchy maszyny jak np.: jazda do przodu, do tyłu, skręcanie w prawo i lewo, przyśpieszanie, zwalnianie itd. itp. Oczywiście założyłem, że zmęczę to wszystko w Pythonie, bowiem jest bardzo dużo ciekawych przykładów po sieci i zawsze czegoś nowego się dowiem. :)
W tej części przedstawiam moduł sterujący robotem. Plik dla przykładu nazwałem: rover_beaglebone_v2.py.
Wersja 2 bo przymiarki i kombinacje z tym jak to uruchomić już od nieomal wakacji uskuteczniałem, no i skutkiem tych "prac koncepcyjno - studialnych" => (ale suchar :/) - powstały w sumie trzy wersje tego programu różnie działające, mniej lub bardziej zadawalające mnie. Ta ostatnia "v2" (nie mylić z niemieckimi rakietami do zabijania von Brauna) to efekt właśnie posiedzeń na "batyskafie" w towarzystwie kolegów rotawirusów :)
Wersja 2 bo przymiarki i kombinacje z tym jak to uruchomić już od nieomal wakacji uskuteczniałem, no i skutkiem tych "prac koncepcyjno - studialnych" => (ale suchar :/) - powstały w sumie trzy wersje tego programu różnie działające, mniej lub bardziej zadawalające mnie. Ta ostatnia "v2" (nie mylić z niemieckimi rakietami do zabijania von Brauna) to efekt właśnie posiedzeń na "batyskafie" w towarzystwie kolegów rotawirusów :)
Oczywiście dokładnie też postaram się opisać co i jak działa ale to może już nie w tym poście... tylko w następnym - bo tak i już ha ha :)
Kod programu:
- import Adafruit_BBIO.PWM as PWM
- import Adafruit_BBIO.GPIO as GPIO
- import time
- PIN_SPEED_CH1_Right = "P9_14"
- PIN_SPEED_CH2_Left = "P9_16"
- PIN_SPEED_CH3_Right = "P8_19"
- PIN_SPEED_CH4_Left = "P8_13"
- PIN_DIR_CH1_Right = "P9_27"
- PIN_DIR_CH2_Left = "P9_30"
- PIN_DIR_CH3_Right = "P8_17"
- PIN_DIR_CH4_Left = "P8_15"
- MAX_SPEED = 100
- MIN_SPEED = 23
- CHANGE_RATE = 5
- STOP_SPEED = 0
- FORWARD_DIR = 1
- REVERSE_DIR = 0
- current_speed_CH1_Right = STOP_SPEED
- current_speed_CH2_Left = STOP_SPEED
- current_speed_CH3_Right = STOP_SPEED
- current_speed_CH4_Left = STOP_SPEED
- current_dir_CH1_Right = FORWARD_DIR
- current_dir_CH2_Left = FORWARD_DIR
- current_dir_CH3_Right = FORWARD_DIR
- current_dir_CH4_Left = FORWARD_DIR
- #zainicjowanie ruchu podwozia ROVER ustawienie stanu pinów
- def init_rover():
- PWM.start(PIN_SPEED_CH1_Right, 0)
- PWM.start(PIN_SPEED_CH2_Left, 0)
- PWM.start(PIN_SPEED_CH3_Right, 0)
- PWM.start(PIN_SPEED_CH4_Left, 0)
- GPIO.setup(PIN_DIR_CH1_Right, GPIO.OUT)
- GPIO.setup(PIN_DIR_CH2_Left, GPIO.OUT)
- GPIO.setup(PIN_DIR_CH3_Right, GPIO.OUT)
- GPIO.setup(PIN_DIR_CH4_Left, GPIO.OUT)
- def stop_rover():
- all_stop()
- #funkcja pomocnicza - sprawdza utrzymanie predkosci obrotowej kol
- def check_speed(speed):
- if speed < MIN_SPEED and speed != STOP_SPEED:
- speed = MIN_SPEED
- if speed > MAX_SPEED:
- speed = MAX_SPEED
- return speed
- def fastest_speed_front():
- global current_speed_CH1_Right, current_speed_CH2_Left
- ret_speed_front = current_speed_CH1_Right
- if current_speed_CH2_Left > current_speed_CH1_Right:
- ret_speed_front = current_speed_CH2_Left
- return ret_speed_front
- def fastest_speed_rear():
- global current_speed_CH3_Right, current_speed_CH4_Left
- ret_speed_rear = current_speed_CH3_Right
- if current_speed_CH4_Left > current_speed_CH3_Right:
- ret_speed_rear = current_speed_CH4_Left
- return ret_speed_rear
- def slowest_speed_front():
- global current_speed_CH1_Right, current_speed_CH2_Left
- ret_speed_front = current_speed_CH1_Right
- if current_speed_CH2_Left < current_speed_CH1_Right:
- ret_speed_front = current_speed_CH2_Left
- return ret_speed_front
- def slowest_speed_rear():
- global current_speed_right_CH3_Right, current_speed_CH4_Left
- ret_speed_rear = current_speed_CH3_Right
- if current_speed_CH4_Left < current_speed_CH3_Right:
- ret_speed_rear = current_speed_CH4_Left
- return ret_speed_rear
- #set speed - ustaw predkosci kol
- def set_right_speed_wheel_front(speed): #prawa gasienica kolo przednie
- global current_speed_CH1_Right, current_speed_CH2_Left
- new_speed = check_speed(speed)
- PWM.set_duty_cycle(PIN_SPEED_CH1_Right,new_speed)
- current_speed_CH1_Right = new_speed
- def set_right_speed_wheel_rear(speed): #prawa gasienica kolo tylne
- global current_speed_CH3_Right, current_speed_CH4_Left
- new_speed = check_speed(speed)
- PWM.set_duty_cycle(PIN_SPEED_CH3_Right,new_speed)
- current_speed_CH3_Right = new_speed
- def set_left_speed_wheel_front(speed): #lewa gasienica kolo przednie
- global current_speed_CH1_Right, current_speed_CH2_Left
- new_speed = check_speed(speed)
- PWM.set_duty_cycle(PIN_SPEED_CH2_Left,new_speed)
- current_speed_CH2_Left = new_speed
- def set_left_speed_wheel_rear(speed): #lewa gasienica kolo tylne
- global current_speed_CH3_Right, current_speed_CH4_Left
- new_speed = check_speed(speed)
- PWM.set_duty_cycle(PIN_SPEED_CH4_Left,new_speed)
- current_speed_CH4_left = new_speed
- def set_speed(speed):
- set_right_speed_wheel_front(speed)
- set_right_speed_wheel_rear(speed)
- set_left_speed_wheel_front(speed)
- set_left_speed_wheel_rear(speed)
- #Increase speed - Zwekszenie predkosci
- def increase_right_speed_wheel_front(): #prawa gasienica kolo przednie
- global current_speed_CH1_Right, current_speed_CH2_Left
- set_right_speed_wheel_front(current_speed_CH1_Right + CHANGE_RATE)
- def increase_right_speed_wheel_rear(): #prawa gasienica kolo tylne
- global current_speed_CH3_Right, current_speed_CH4_Left
- set_right_speed_wheel_rear(current_speed_CH3_Right + CHANGE_RATE)
- def increase_left_speed_wheel_front(): #lewa gasienica kolo przednie
- global current_speed_CH1_Right, current_speed_CH2_Left
- set_left_speed_wheel_front(current_speed_CH2_Left + CHANGE_RATE)
- def increase_left_speed_wheel_rear(): #lewa gasienica kolo tylne
- global current_speed_CH3_Right, current_speed_CH4_Left
- set_left_speed_wheel_rear(current_speed_CH4_Left + CHANGE_RATE)
- def increase_speed():
- increase_right_speed_wheel_front()
- increase_right_speed_wheel_rear()
- increase_left_speed_wheel_front()
- increase_left_speed_wheel_rear()
- #Decrease speed - Zmniejszenie predkosci
- def decrease_right_speed_wheel_front(): #prawa gasienica kolo przednie
- global current_speed_CH1_Right, current_speed_CH2_Left
- set_right_speed_wheel_front(current_speed_CH1_Right - CHANGE_RATE)
- def decrease_right_speed_wheel_rear(): #prawa gasienica kolo tylne
- global current_speed_CH3_Right, current_speed_CH4_Left
- set_right_speed_wheel_rear(current_speed_CH3_Right - CHANGE_RATE)
- def decrease_left_speed_wheel_front(): #lewa gasienica kolo przednie
- global current_speed_CH1_Right, current_speed_CH2_Left
- set_left_speed_wheel_front(current_speed_CH2_Left - CHANGE_RATE)
- def decrease_left_speed_wheel_rear(): #lewa gasienica kolo tylne
- global current_speed_CH3_Right, current_speed_CH4_Left
- set_left_speed_wheel_rear(current_speed_CH4_Left - CHANGE_RATE)
- def decrease_speed():
- decrease_right_speed_wheel_front()
- decrease_right_speed_wheel_rear()
- decrease_left_speed_wheel_front()
- decrease_left_speed_wheel_rear()
- #Set direction forward - Ustawianie kierunku do przodu
- def forward_right_dir_wheel_front(): #naprzod przednie kolo prawe
- global current_dir_CH1_Right, current_dir_CH2_Left
- if current_dir_CH1_Right == REVERSE_DIR:
- all_stop()
- GPIO.output(PIN_DIR_CH1_Right, GPIO.HIGH) #LOW
- current_dir_CH1_Right = FORWARD_DIR
- def forward_right_dir_wheel_rear(): #naprzod tylne kolo prawe
- global current_dir_CH3_Right, current_dir_CH4_Left
- if current_dir_CH3_Right == REVERSE_DIR:
- all_stop()
- GPIO.output(PIN_DIR_CH3_Right, GPIO.LOW)
- current_dir_CH3_Right = FORWARD_DIR
- def forward_left_dir_wheel_front(): #naprzod przenie kolo lewe
- global current_dir_CH1_Right, current_dir_CH2_Left
- if current_dir_CH2_Left == REVERSE_DIR:
- all_stop()
- GPIO.output(PIN_DIR_CH2_Left, GPIO.HIGH)
- current_dir_CH2_Left = FORWARD_DIR
- def forward_left_dir_wheel_rear(): #naprzod tylne kolo lewe
- global current_dir_CH3_Right, current_dir_CH4_Left
- if current_dir_CH4_Left == REVERSE_DIR:
- all_stop()
- GPIO.output(PIN_DIR_CH4_Left, GPIO.LOW)
- current_dir_CH4_Left = FORWARD_DIR
- def forward_dir():
- forward_right_dir_wheel_front()
- forward_right_dir_wheel_rear()
- forward_left_dir_wheel_front()
- forward_left_dir_wheel_rear()
- #Set reverse direction - Ustawienie kierunku do tylu
- def reverse_right_dir_wheel_front(): #wstecz przednie kolo prawe
- global current_dir_CH1_Right, current_dir_CH2_Left
- if current_dir_CH1_Right == FORWARD_DIR:
- all_stop()
- GPIO.output(PIN_DIR_CH2_Left, GPIO.LOW) # HIGH
- current_dir_CH1_Right = REVERSE_DIR
- def reverse_right_dir_wheel_rear(): #wstecz tylne kolo prawe
- global current_dir_CH3_Right, current_dir_CH4_Left
- if current_dir_CH3_Right == FORWARD_DIR:
- all_stop()
- GPIO.output(PIN_DIR_CH4_Left, GPIO.HIGH)
- current_dir_CH3_Right = REVERSE_DIR
- def reverse_left_dir_wheel_front(): #wstecz przednie kolo lewe
- global current_dir_CH1_Right, current_dir_CH2_Left
- if current_dir_CH2_Left == FORWARD_DIR:
- all_stop()
- GPIO.output(PIN_DIR_CH1_Right, GPIO.LOW) # HIGH
- current_dir_CH2_Left = REVERSE_DIR
- def reverse_left_dir_wheel_rear(): #wstecz tylne kolo lewe
- global current_dir_CH3_Right, current_dir_CH4_Left
- if current_dir_CH4_Left == FORWARD_DIR:
- all_stop()
- GPIO.output(PIN_DIR_CH3_Right, GPIO.HIGH) #or HIGH
- current_dir_CH4_Left = REVERSE_DIR
- def reverse_dir():
- reverse_right_dir_wheel_front()
- reverse_right_dir_wheel_rear()
- reverse_left_dir_wheel_front()
- reverse_left_dir_wheel_rear()
- #Stop rover - Zatrzymanie rovera
- def stop_left_wheel_front():
- set_left_speed_wheel_front(STOP_SPEED)
- def stop_left_wheel_rear():
- set_left_speed_wheel_rear(STOP_SPEED)
- def stop_right_whell_front():
- set_right_speed_wheel_front(STOP_SPEED)
- def stop_right_wheel_rear():
- set_right_speed_wheel_rear(STOP_SPEED)
- def all_stop():
- stop_left_wheel_front()
- stop_left_wheel_rear()
- stop_right_whell_front()
- stop_right_wheel_rear()
- #Full speed - Cala naprzod
- def full_speed_left_wheel_front():
- set_left_speed_wheel_front(MAX_SPEED)
- def full_speed_left_wheel_rear():
- set_left_speed_wheel_rear(MAX_SPEED)
- def full_speed_right_wheel_front():
- set_right_speed_wheel_front(MAX_SPEED)
- def full_speed_right_wheel_rear():
- set_right_speed_wheel_rear(MAX_SPEED)
- def all_full_speed():
- full_speed_left_wheel_front()
- full_speed_left_wheel_rear()
- full_speed_right_wheel_front()
- full_speed_right_wheel_rear()
- #Spin rover - Obracanie rovera - skrecanie - zawracanie
- def spin_right(speed):
- all_stop()
- forward_dir()
- forward_right_dir_wheel_front()
- forward_right_dir_wheel_rear()
- reverse_left_dir_wheel_front()
- reverse_left_dir_wheel_rear()
- set_right_speed_wheel_front(speed)
- set_right_speed_wheel_rear(speed)
- set_left_speed_wheel_front(speed)
- set_left_speed_wheel_rear(speed)
- def spin_left(speed):
- all_stop()
- forward_dir()
- forward_left_dir_wheel_front()
- forward_left_dir_wheel_rear()
- reverse_right_dir_wheel_front()
- reverse_right_dir_wheel_rear()
- set_right_speed_wheel_front(speed)
- set_right_speed_wheel_rear(speed)
- set_left_speed_wheel_front(speed)
- set_left_speed_wheel_rear(speed)
No to jak rozumiecie i widzicie to wszystko po kolei wyjaśnię:)
Do kontroli pinów z tak zwanych przeze mnie "hederów" P8 i P9 BBB, używam biblioteki Adafruit BBIO omówionej parę postów wcześniej.
Ale ponieważ już nie chce mi się pisać więcej to resztę omówię przy okazji następnego postu.
Łostańcie z Bogiem.