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.

sobota, 18 listopada 2017

Testy połączeń platformy, o linuxie i trochę konfigurowania stuffu :)

Okej na początek fotka 
Czas na sprawdzenie teorii w praktyce i pierwszy test układu jezdnego
Dla celów testowych umieszczamy nasze podwozie na czymś co spowoduję niestykanie się rolek napędowych z powierzchnią i demontujemy gąsienice.
Na razie przecież nie chcemy, aby nasza platforma odjechała, tym bardziej, że póki co mamy komputer BeagleBone Black podpięty do komputera przez UART.
Później się będę zastanawiał jak rozwiążę zdalne przesyłanie oprogramowania i ewentualnych modyfikacji do platformy. Na razie szczerze mówiąc nie mam pojęcia jak to zrobić - ale nie pali się:)

Dobra czas na kod. Na początek napisałem prosty skrypt "na cztery koła" nazywając go np. test.py - wy możecie sobie go nazwać jak wam się żywnie podoba:

import Adafruit_BBIO.PWM as PWM

import time
pin1 = "P9_14"
pin2 = "P9_16"
pin3 = "P8_19"

pin4 = "P8_13"

PWM.start(pin1,0)
PWM.start(pin2,0)
PWM.start(pin3,0)
PWM.start(pin4,0)
PWM.set_duty_cycle(pin1, 100)
PWM.set_duty_cycle(pin2, 100)
PWM.set_duty_cycle(pin3, 100)
PWM.set_duty_cycle(pin4, 100)
time.sleep(60)
PWM.stop(pin1)
PWM.stop(pin2)
PWM.stop(pin3)
PWM.stop(pin4)
PWM.cleanup()

Jeśli wszystko jest prawidłowo połączone i zasilane, to koła powinny obracać się parami "ku sobie" przez czas jaki założymy w zmiennej time.sleep() w moim przypadku to np. 60, czyli minuta czasu :)
Pliki programów moim zdaniem najlepiej umiejscowić sobie w następującym katalogu:
/var/lib/cloud9/nazwa_katalogu - ta ostatnia to wg życzenia.
Narzędzie Cloud9 będzie wtedy łatwo znajdowało nasze programy i nie trzeba będzie się kopać po plikach i katalogach. Oczywiście, jak kto jest bardziej biegły w temacie to może to sobie zrobić w inny sposób. Ja zrobiłam jak umiałem :)
Oczywiście pliki te warto sobie co jakiś czas kopiować na PC np. za pomocą programu WinScp, aby w razie jakiejś awarii, konieczności instalacji wszystkiego od nowa mieć kopię zapasową swojej pracy:)

Do poprawnej pracy potrzebujemy jeszcze biblioteki Adarfuit PWM, którą można zainstalować stosując instrukcje zamieszczone tutaj:


lub tutaj:


Adafruit BBIO jest to taki zestaw narzędzi napisanych w Pythonie i ciągle aktualizowanych, które służą do obsługi i dostępu do konfiguracji  pinów  GPIO, PWM, ADC oraz UART w tej platformie.
Nie wiem dokładnie jak funkcjonują wszystkie te narzędzia więc proszę, jeśli ktoś to czyta nie pytajcie mnie o to. Generalnie konfiguracja standardowa, powinna się znaleźć w każdym aktualnym obrazie Debiana wspierającym tą platformę.
Ja osobiście zalecam używanie jak najbardziej aktualnego obrazu Debiana dla tej płytki dostępnego na przykład na Beaglebone.org w zakładce "Latest Software Images".
Do tego obrazu zaleca się instalację jądra w wersji 4.14.x, po to aby włączyć kontrolę nad konfiguracją GPIO i PWM z poziomu innego użytkownika niż /root - ot choćby to to aby móc swobodnie korzystać z platformy programistycznej Cloud9 "wszytej" w ten obraz, która korzysta jedynie z uprawnień standardowego usera.
Na dzień dzisiejszy ja osobiście używam takiego kernela:

root@beaglebone:~# uname -a
Linux beaglebone 4.4.91-ti-r136 #1 SMP Thu Nov 2 02:28:07 UTC 2017 armv7l GNU/Linux

Wziętego stąd:


Jakkolwiek Developerzy zalecają na dzień dzisiejszy Debiana w wersji 9,2 "Stretch" iot z (2017-10-29), ja mam wersję z nieco nowszym kernelem i wszystko działa bez zarzutu - przynajmniej na razie :)

Myliłby się jednak ten kto by sądził, że poszło to wszystko tak pięknie, ładnie i zgrabnie. Zanim udało się odpalić ten prosty programik - test, co jest powyżej, dobry miesiąc testowałem razem z developerami wskazane przez nich różne testy, polecenia i konfiguracje obrazów, zanim pojawił się obraz, który działa sensownie i stabilnie.
Nie będę wszystkiego tu opisywał szczegółowo, bo uczciwie mówiąc nie jestem jakimś Linux'owym guru, ale koniec końców udało się i wszystko działa.

W tym miejscu chciałbym podziękować panom z github.com - Drew Fustini'emuRobertowi C Nelson'owi za pomoc i wyjaśnienie zawiłości oraz wskazanie co i jak zrobić :)
Co jeszcze? Aha, nowe wersje Adafruit_BBIO mogą być kompatybilne wstecznie ale, jak ktoś chce to niech testuje już we własnym zakresie:)

Poniżej przedstawiam film z jednego z pierwszych testów platformy:
To tyle na dziś. Trzymta się ludziska :)

piątek, 17 listopada 2017

Połączenia elektryczne w platformie

Przyszedł czas na zaprezentowanie jak zrobione są połączenia elektryczne w moim projekcie.
Do zasilania zastosowano akumulator (LiPo) Litowo Polimerowy o pojemności 2500mAh (miliamperogodzin) o napięciu 14,8V, czyli czterocelowy (4S1P).
O zasadach użytkowania i bezpieczeństwa przy pracy z tymi akumulatorami napisano już bardzo wiele, ot choćby porządny materiał na Forbot.pl w dziale Akumulatory LiPo - kompendium.
Ponieważ jestem perfekcjonistą i nie toleruję projektów robionych w pudełkach po butach lub na tekturce, platformę moją wykonałem z gustownej sklejki brzozowej (łatwo się ją tnie i obrabia).
W sklejce powycinałem otwory na wiązki przewodów oraz powierciłem niezbędne otwory na słupki dystansowe - nieco wyższe niż te co izolują płytę główną komputera od obudowy i zwarcia, niemniej spełniające tę samą funkcję. Na sam koniec sklejka została wyrównana papierem ściernym i do akcji wkroczyła moja żona, która jest już na etapie "doktoratu" w zakresie powłok bejcowych i lakierniczo farbiarskich :) To ona dokonała dokładnego i precyzyjnego pobejcowania i polakierowania mojej "dechy" w platformie No co ma być estetycznie) :)
Aby uniknąć odkształceń sklejki, powstałych na skutek lakierowania, wykonałem do niej ramkę z kątownika aluminiowego - takiego jak się stosuje na progi podłogowe lub stopnie schodów - do kupienia w każdym markecie budowlanym.
Teraz tak: zasilanie
Na płytce kontrolera silników mamy dwa wejścia zasilające kontroler: jedno 5V do zasilenia logiki płytki kontrolera i drugie do dostarczenia napięcia w zakresie bodaj 4,5V - 12V do zasilania napędu czyli silniczków DC (wartości 12V doradzam nie przekraczać bo ja przekroczyłem i jeden taki kontroler spaliłem - niedacznik!!!).
Nie używam dostarczanego wraz z podwoziem koszyka na baterie, a sposób zasilania wszystkiego opiszę nieco dalej w poście i opatrzę fotografiami.
Na płytce kontrolera silników Dagu mamy dwa złącza śrubowe ARK (chyba tak się ono nazywa), oznaczone odpowiednio "Vbat" i drugie oznaczone jako "VCC". Należy podłączyć napięcie około 7,2V (tyle wymagają silniczki DAGU) do złącza oznaczonego symbolem "Vbat", z kolei do drugiego złącza "VCC" podpinamy napięcie 5V (można je "pożyczyć" z "hedera" Beagle'a: P9_5 lub P9_6 (napięcie 5V) i P9_1 lub 2 GND (Ground) ).
Ja jednak wykonałem to zupełnie inaczej i czas pokaże czy dobrze.
Ponieważ Beaglebone Black potrzebuje 5V i około 1,5A prądu stałego, takie samo napięcie, jak blok logiki sterownika silników, z kolei do zasilania bloku PWM sterownika silników potrzeba w tym projekcie około 7,2V (tak, jak pisałem powyżej i żeby nie spalić sterownika i silniczków DC), trzeba było jakoś te dwa napięcia doprowadzić z akumulatora.
He tylko jak to zrobić mając 14,8V na wyjściu akumulatora?
Nic bardziej prostego - zastosowałem po prostu dwie przetwornice oparte o układ scalony XL4015 - ja zresztą już wspominałem o niej i o zasilaniu nią BBB, w jednym z wcześniejszych moich postów. A widok jej poniżej:



Te małe przetwornice wydają się idealne do takich zastosowań. Owszem ktoś może powiedzieć że powinienem taki układ wykonać sam! Pytanie tylko po co, skoro kosztowało to na Aliexpress dolara z kawałkiem :-)
Przetwornice te mają potencjometry regulacyjne, którymi ustawiamy pożądany prąd i napięcie zasilanego układu i to w zasadzie tyle.
A jak rozdzielić prąd z akumulatora do zasilenia dwóch przetwornic na raz? Nic bardziej prostszego rozdzielacz:



Ja miałem akurat pełno wtyczek XT60 pozostałych z budowy drona, więc akurat takie pokazuję, niemniej taki rozdzielacz można sobie spokojnie wykonać samemu w domowym zaciszu :)
Poniżej zdjęcia jak to wygląda na gotowo:


Pozostało wszystko odpowiednio połączyć ale to wyjdzie w następnych postach co  i jak.
No dobrze tyle na dzisiaj, bo nie chce mi się już pisać. :)

Cześć.

Podłączenie platformy Beaglebone Black do kontrolera silników.

Zanim zacznę znowu truć o "techikaliach"chciałbym złożyć gorące podziękowania przynajmniej dwóm osobom i na dodatek kobietom, którym w ogóle chce się jeszcze czytać tę radosną twórczość. Pierwsza to oczywiście moja żona z równoległego świata blogowego sztukaspodstrzechy oraz tajemniczej, acz bardzo intrygującej mnie Koreance śledzącej moje poczynania tutaj, Lunie Mae. Albowiem są to chyba jedyne dwie kobiety, które są jeszcze w stanie czytać te posty.
Tak, że dzięki dziewczyny i wielkie pozdrawiam i wielkie puss pussy dla Was. Młuuuaaa. :)

Po podłączeniu sterownika do podwozia, przyszedł czas na podłączenia platformy Beaglebone Black do sterownika silników. Oczywiście ze względu na higienę pracy i żeby niczego nie spalić wszystko to o czym piszę wykonujemy przy odłączonym zasilaniu.
Pierwszą rzeczą, którą wykonałem to wydruk wyprowadzeń pinoutów Beagle'a na podstawie genialnej książki Derrek'a Molloy'a - irlandczyka, inżyniera, nauczyciela i badacza, zwłaszcza elektroniki i systemów wbudowanych.
Aha poniżej link do strony Dereka:


Dodatkowo "druknąłem" sobie wszystkie możliwe kombinacje tak zwanych MUXów pinów, bo można je sobie dowolnie konfigurować ale to już temat na inny post. Poniżej "MUXy"

P8 HEADER

P9 HEADER

Po zapoznaniu się z dokumentacją poznajdowałem piny PWM czyli te, które chciałem używać jako sterujące silnikami oraz piny GPIO, których chciałem użyć dla ustawienia kierunku obrotu kół.
I w tym miejscu chciałem podziękować z wspaniałe lekcje kolejnemu nauczycielowi - nieee, nie żadnemu pajacowi z doktoratem z "wyższej" uczelni z Polski - broń Boże.
Podziękowania należą się panu Paul'owi Mcwhorter'owi z bloga toptechboy.com, dzięki któremu złapałem jakiego takiego bakcyla na zabawę z tą platformą.
Lekcje bardzo zachęcająco prowadzone dokładnie, krok po kroku a nie po łebkach, wszystko wyjaśnione i poparte przykładem działającego programu i sprzętu.

Niechbym tylko śmiał skorzystać z takiej elektrody.pl, oojjjj - to zaraz byłbym zaszczuty i zakrzyczany przez "znawców" wszystkiego i wszystkich, na zasadzie "nie znasz podstaw, to po co pytasz o takie rzeczy?! Opanuj podstawy!" - i w tym momencie pada litania tego co powinno zdaniem takowego "oświeconego" być nauczone. Zamiast pomocy i konkretnego rozwiązania - wymyślanie koła od początku.
Ewentualnie jest się blokowanym lub wyrzucanym za własne racje i dążenie do nich - no cóż niektórzy z tak zwanych "moderatorów" ze wsi wyszli, ale wieś z nich nigdy nie wyjdzie, choćby nie wiem jaki pozom wiedzy opanowali. :) Czasem trzeba być człowiekiem a nie prostakiem, i jak mawiał mój dawny kolega "na nic będą doktoraty kiedy człowiek chamowaty" :) Znowu za daleko wybiegłem...
Tak czy siak skorzystałem z porad zagranicznych wykładowców i jestem z tego faktu zadowolony, zupełnie inny poziom rozmowy, jeśli sarkazm to tylko w celach wyjaśnienia, nikt nikogo nie blokuje, nie banuje za wpisy i tyle - ogólnie brak cebulactwa, inna kultura pracy...

Do rzeczy. W moim projekcie podłączyłem piny PWM do płytki kontrolera silników następująco:
P9_14 do pierwszego kanału;
P9_16 do drugiego kanału;
P8_19 do kanału 3;
oraz P8_13 do kanału 4 płytki sterownika silników.
Po czym piny "cyfrowe: GPIO podłączyłem w następujący sposób:
P9_27 - GPIO - kanał 1;
P9_30 - GPIO - Kanał 2;
P8_17 - GPIO - kanał 3;
P8_15 - GPIO - kanał 4.
Poniżej pokazuję to na zdjęciach i tak niebieskie przewody to wyjściowy sygnał sterujący PWM (Pulse Wave Modulation), a fioletowe to cyfrowe piny GPIO do sterowania kierunkiem jazdy maszyny.






Jak więc widać każda para pinów PWM / GPIO odpowiada za sterowanie jednym kanałem, czyli jednym silnikiem DC i enkoderem (no tak jakby jedną nogą).
Myślę, że wyjaśni się to dokładniej kiedy przedstawię przykładowy program do testowania połączeń:)

No i pamiętajcie: pan Paul McWhorter, blog toptechboy.com, bardzo fajne lekcje dla początkujących i bardzo fajnie wytłumaczone.

Jeszcze raz gorąco zachęcam do lekcji prowadzonych przez tego człowieka. Krok po kroku a nie po łebkach jak na polskiej uczelni!!!

Cześć.