czwartek, 23 listopada 2017

Program sterujący "układu jezdnego" :->

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 :)
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:
  1. import Adafruit_BBIO.PWM as PWM
  2. import Adafruit_BBIO.GPIO as GPIO
  3. import time

  4. PIN_SPEED_CH1_Right = "P9_14"
  5. PIN_SPEED_CH2_Left = "P9_16"
  6. PIN_SPEED_CH3_Right = "P8_19"
  7. PIN_SPEED_CH4_Left = "P8_13"
  8. PIN_DIR_CH1_Right = "P9_27"
  9. PIN_DIR_CH2_Left = "P9_30"
  10. PIN_DIR_CH3_Right = "P8_17"
  11. PIN_DIR_CH4_Left = "P8_15"
  12. MAX_SPEED = 100
  13. MIN_SPEED = 23
  14. CHANGE_RATE = 5
  15. STOP_SPEED = 0
  16. FORWARD_DIR = 1
  17. REVERSE_DIR = 0

  18. current_speed_CH1_Right = STOP_SPEED
  19. current_speed_CH2_Left = STOP_SPEED
  20. current_speed_CH3_Right = STOP_SPEED
  21. current_speed_CH4_Left = STOP_SPEED
  22. current_dir_CH1_Right = FORWARD_DIR
  23. current_dir_CH2_Left = FORWARD_DIR
  24. current_dir_CH3_Right = FORWARD_DIR
  25. current_dir_CH4_Left = FORWARD_DIR

  26. #zainicjowanie ruchu podwozia ROVER ustawienie stanu pinów
  27. def init_rover():
  28. PWM.start(PIN_SPEED_CH1_Right, 0)
  29. PWM.start(PIN_SPEED_CH2_Left, 0)
  30. PWM.start(PIN_SPEED_CH3_Right, 0)
  31. PWM.start(PIN_SPEED_CH4_Left, 0)
  32. GPIO.setup(PIN_DIR_CH1_Right, GPIO.OUT)
  33. GPIO.setup(PIN_DIR_CH2_Left, GPIO.OUT)
  34. GPIO.setup(PIN_DIR_CH3_Right, GPIO.OUT)
  35. GPIO.setup(PIN_DIR_CH4_Left, GPIO.OUT)

  36. def stop_rover():
  37. all_stop()

  38. #funkcja pomocnicza - sprawdza utrzymanie predkosci obrotowej kol

  39. def check_speed(speed):
  40. if speed < MIN_SPEED and speed != STOP_SPEED:
  41. speed = MIN_SPEED
  42. if speed > MAX_SPEED:
  43. speed = MAX_SPEED
  44. return speed

  45. def fastest_speed_front(): 
  46. global current_speed_CH1_Right, current_speed_CH2_Left
  47. ret_speed_front = current_speed_CH1_Right
  48. if current_speed_CH2_Left > current_speed_CH1_Right:
  49. ret_speed_front = current_speed_CH2_Left
  50. return ret_speed_front

  51. def fastest_speed_rear():
  52. global current_speed_CH3_Right, current_speed_CH4_Left
  53. ret_speed_rear = current_speed_CH3_Right
  54. if current_speed_CH4_Left > current_speed_CH3_Right:
  55. ret_speed_rear = current_speed_CH4_Left
  56. return ret_speed_rear

  57. def slowest_speed_front():
  58. global current_speed_CH1_Right, current_speed_CH2_Left
  59. ret_speed_front = current_speed_CH1_Right
  60. if current_speed_CH2_Left < current_speed_CH1_Right:
  61. ret_speed_front = current_speed_CH2_Left
  62. return ret_speed_front

  63. def slowest_speed_rear():
  64. global current_speed_right_CH3_Right, current_speed_CH4_Left
  65. ret_speed_rear = current_speed_CH3_Right
  66. if current_speed_CH4_Left < current_speed_CH3_Right:
  67. ret_speed_rear = current_speed_CH4_Left
  68. return ret_speed_rear

  69. #set speed - ustaw predkosci kol
  70. def set_right_speed_wheel_front(speed): #prawa gasienica kolo przednie
  71. global current_speed_CH1_Right, current_speed_CH2_Left
  72. new_speed = check_speed(speed)
  73. PWM.set_duty_cycle(PIN_SPEED_CH1_Right,new_speed)
  74. current_speed_CH1_Right = new_speed

  75. def set_right_speed_wheel_rear(speed): #prawa gasienica kolo tylne
  76. global current_speed_CH3_Right, current_speed_CH4_Left
  77. new_speed = check_speed(speed)
  78. PWM.set_duty_cycle(PIN_SPEED_CH3_Right,new_speed)
  79. current_speed_CH3_Right = new_speed

  80. def set_left_speed_wheel_front(speed): #lewa gasienica kolo przednie
  81. global current_speed_CH1_Right, current_speed_CH2_Left
  82. new_speed = check_speed(speed)
  83. PWM.set_duty_cycle(PIN_SPEED_CH2_Left,new_speed)
  84. current_speed_CH2_Left = new_speed

  85. def set_left_speed_wheel_rear(speed): #lewa gasienica kolo tylne
  86. global current_speed_CH3_Right, current_speed_CH4_Left
  87. new_speed = check_speed(speed)
  88. PWM.set_duty_cycle(PIN_SPEED_CH4_Left,new_speed)
  89. current_speed_CH4_left = new_speed

  90. def set_speed(speed):
  91. set_right_speed_wheel_front(speed)
  92. set_right_speed_wheel_rear(speed)
  93. set_left_speed_wheel_front(speed)
  94. set_left_speed_wheel_rear(speed)
  95.     
  96. #Increase speed - Zwekszenie predkosci
  97. def increase_right_speed_wheel_front(): #prawa gasienica kolo przednie
  98. global current_speed_CH1_Right, current_speed_CH2_Left
  99. set_right_speed_wheel_front(current_speed_CH1_Right + CHANGE_RATE)

  100. def increase_right_speed_wheel_rear(): #prawa gasienica kolo tylne
  101. global current_speed_CH3_Right, current_speed_CH4_Left
  102. set_right_speed_wheel_rear(current_speed_CH3_Right + CHANGE_RATE)

  103. def increase_left_speed_wheel_front(): #lewa gasienica kolo przednie
  104. global current_speed_CH1_Right, current_speed_CH2_Left
  105. set_left_speed_wheel_front(current_speed_CH2_Left + CHANGE_RATE)

  106. def increase_left_speed_wheel_rear(): #lewa gasienica kolo tylne
  107. global current_speed_CH3_Right, current_speed_CH4_Left
  108. set_left_speed_wheel_rear(current_speed_CH4_Left + CHANGE_RATE)

  109. def increase_speed():
  110. increase_right_speed_wheel_front()
  111. increase_right_speed_wheel_rear()
  112. increase_left_speed_wheel_front()
  113. increase_left_speed_wheel_rear()

  114. #Decrease speed - Zmniejszenie predkosci
  115. def decrease_right_speed_wheel_front(): #prawa gasienica kolo przednie
  116. global current_speed_CH1_Right, current_speed_CH2_Left
  117. set_right_speed_wheel_front(current_speed_CH1_Right - CHANGE_RATE)

  118. def decrease_right_speed_wheel_rear(): #prawa gasienica kolo tylne
  119. global current_speed_CH3_Right, current_speed_CH4_Left
  120. set_right_speed_wheel_rear(current_speed_CH3_Right - CHANGE_RATE)

  121. def decrease_left_speed_wheel_front(): #lewa gasienica kolo przednie
  122. global current_speed_CH1_Right, current_speed_CH2_Left
  123. set_left_speed_wheel_front(current_speed_CH2_Left - CHANGE_RATE)

  124. def decrease_left_speed_wheel_rear(): #lewa gasienica kolo tylne
  125. global current_speed_CH3_Right, current_speed_CH4_Left
  126. set_left_speed_wheel_rear(current_speed_CH4_Left - CHANGE_RATE)

  127. def decrease_speed():
  128. decrease_right_speed_wheel_front()
  129. decrease_right_speed_wheel_rear()
  130. decrease_left_speed_wheel_front()
  131. decrease_left_speed_wheel_rear()

  132. #Set direction forward - Ustawianie kierunku do przodu
  133. def forward_right_dir_wheel_front(): #naprzod przednie kolo prawe
  134. global current_dir_CH1_Right, current_dir_CH2_Left
  135. if current_dir_CH1_Right == REVERSE_DIR:
  136. all_stop()
  137. GPIO.output(PIN_DIR_CH1_Right, GPIO.HIGH) #LOW
  138. current_dir_CH1_Right = FORWARD_DIR

  139. def forward_right_dir_wheel_rear(): #naprzod tylne kolo prawe
  140. global current_dir_CH3_Right, current_dir_CH4_Left
  141. if current_dir_CH3_Right == REVERSE_DIR:
  142. all_stop()
  143. GPIO.output(PIN_DIR_CH3_Right, GPIO.LOW)
  144. current_dir_CH3_Right = FORWARD_DIR

  145. def forward_left_dir_wheel_front(): #naprzod przenie kolo lewe
  146. global current_dir_CH1_Right, current_dir_CH2_Left
  147. if current_dir_CH2_Left == REVERSE_DIR:
  148. all_stop()
  149. GPIO.output(PIN_DIR_CH2_Left, GPIO.HIGH)
  150. current_dir_CH2_Left = FORWARD_DIR

  151. def forward_left_dir_wheel_rear(): #naprzod tylne kolo lewe
  152. global current_dir_CH3_Right, current_dir_CH4_Left
  153. if current_dir_CH4_Left == REVERSE_DIR:
  154. all_stop()
  155. GPIO.output(PIN_DIR_CH4_Left, GPIO.LOW)
  156. current_dir_CH4_Left = FORWARD_DIR

  157. def forward_dir():
  158. forward_right_dir_wheel_front()
  159. forward_right_dir_wheel_rear()
  160. forward_left_dir_wheel_front()
  161. forward_left_dir_wheel_rear()
  162. #Set reverse direction - Ustawienie kierunku do tylu
  163. def reverse_right_dir_wheel_front(): #wstecz przednie kolo prawe
  164. global current_dir_CH1_Right, current_dir_CH2_Left
  165. if current_dir_CH1_Right == FORWARD_DIR:
  166. all_stop()
  167. GPIO.output(PIN_DIR_CH2_Left, GPIO.LOW) # HIGH
  168. current_dir_CH1_Right = REVERSE_DIR

  169. def reverse_right_dir_wheel_rear(): #wstecz tylne kolo prawe
  170. global current_dir_CH3_Right, current_dir_CH4_Left
  171. if current_dir_CH3_Right == FORWARD_DIR:
  172. all_stop()
  173. GPIO.output(PIN_DIR_CH4_Left, GPIO.HIGH)
  174. current_dir_CH3_Right = REVERSE_DIR

  175. def reverse_left_dir_wheel_front(): #wstecz przednie kolo lewe
  176. global current_dir_CH1_Right, current_dir_CH2_Left
  177. if current_dir_CH2_Left == FORWARD_DIR:
  178. all_stop()
  179. GPIO.output(PIN_DIR_CH1_Right, GPIO.LOW) # HIGH
  180. current_dir_CH2_Left = REVERSE_DIR

  181. def reverse_left_dir_wheel_rear(): #wstecz tylne kolo lewe
  182. global current_dir_CH3_Right, current_dir_CH4_Left
  183. if current_dir_CH4_Left == FORWARD_DIR:
  184. all_stop()
  185. GPIO.output(PIN_DIR_CH3_Right, GPIO.HIGH) #or HIGH
  186. current_dir_CH4_Left = REVERSE_DIR

  187. def reverse_dir():
  188. reverse_right_dir_wheel_front()
  189. reverse_right_dir_wheel_rear()
  190. reverse_left_dir_wheel_front()
  191. reverse_left_dir_wheel_rear()

  192. #Stop rover - Zatrzymanie rovera
  193. def stop_left_wheel_front():
  194. set_left_speed_wheel_front(STOP_SPEED)

  195. def stop_left_wheel_rear():
  196. set_left_speed_wheel_rear(STOP_SPEED)

  197. def stop_right_whell_front():
  198. set_right_speed_wheel_front(STOP_SPEED)

  199. def stop_right_wheel_rear():
  200. set_right_speed_wheel_rear(STOP_SPEED)

  201. def all_stop():
  202. stop_left_wheel_front()
  203. stop_left_wheel_rear()
  204. stop_right_whell_front()
  205. stop_right_wheel_rear()

  206. #Full speed - Cala naprzod
  207. def full_speed_left_wheel_front():
  208. set_left_speed_wheel_front(MAX_SPEED)

  209. def full_speed_left_wheel_rear():
  210. set_left_speed_wheel_rear(MAX_SPEED)

  211. def full_speed_right_wheel_front():
  212. set_right_speed_wheel_front(MAX_SPEED)

  213. def full_speed_right_wheel_rear():
  214. set_right_speed_wheel_rear(MAX_SPEED)

  215. def all_full_speed():
  216. full_speed_left_wheel_front()
  217. full_speed_left_wheel_rear()
  218. full_speed_right_wheel_front()
  219. full_speed_right_wheel_rear()

  220. #Spin rover - Obracanie rovera - skrecanie - zawracanie
  221. def spin_right(speed):
  222. all_stop()
  223. forward_dir()
  224. forward_right_dir_wheel_front()
  225. forward_right_dir_wheel_rear()
  226. reverse_left_dir_wheel_front()
  227. reverse_left_dir_wheel_rear()
  228. set_right_speed_wheel_front(speed)
  229. set_right_speed_wheel_rear(speed)
  230. set_left_speed_wheel_front(speed)
  231. set_left_speed_wheel_rear(speed)

  232. def spin_left(speed):
  233. all_stop()
  234. forward_dir()
  235. forward_left_dir_wheel_front()
  236. forward_left_dir_wheel_rear()
  237. reverse_right_dir_wheel_front()
  238. reverse_right_dir_wheel_rear()
  239. set_right_speed_wheel_front(speed)
  240. set_right_speed_wheel_rear(speed)
  241. set_left_speed_wheel_front(speed)
  242. set_left_speed_wheel_rear(speed)
Rozumiecie??? :-D Widzicie??? :-D
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.

Brak komentarzy:

Prześlij komentarz