Skocz do zawartości

Sterowanie silnikami (4WD) poprzez wirtualny joystick - Android.


EasyPeasy_

Pomocna odpowiedź

Kontynuuję rozbudowywanie swojej aplikacji na inżynierkę i w swojej pracy chcę sterować obrotem kamery z Pan/Tiltem z akcelerometru, czyli tam gdzie przechylam telefon tam patrzy kamera, natomiast kierunkiem ruchu pojazdu (silnikami) chcę sterować właśnie wirtualnym joystickiem wygląda on tak na telefonie:

Zwraca on współrzędne w osi X i kąt i dystans od środka joysticka oraz kierunek, czyli jakby te kółko z joystickiem jest podzielone na 8 części (po prostu 8 if'ów z zakresami kątów) i w zależności od tego również zwraca dodatkową informację o kierunku postaci: Left/Up Left/Up/Up Right/Right/Down Right/Down/Down Left

I teraz zastanawiam się jak wymyślić sterowanie tymi 4'oma silnikami tzn. tak bardziej od strony Arduino. I nie wiem czy sterować tylko kierunkiem czy też i uwzględnić różne prędkości silników. No, bo na podstawie współrzędnych X i Y odpada, bo przesyłanie tego przez Bluetooth jest zawodne, musi być ten joystick podzielony na części i wysyłać jedno znakowe komendy do Arduino.

Więc jak myślicie do sterowania tymi silnikami wykorzystać tylko informację zwrotną o kierunku, czyli no te kółko podzielone na 8 części w zależności, w której jest znacznik wysyłam do Arduino liczbę od '1' do '8' i w Arduino:

→ Left '1' PWM_L=0 PWM_R=255

→ Up Left '2' PWM_L=128 PWM_R=255

→ Up '3' PWM_L=255 PWM_R=255

→ Up Right '4' PWM_L=255 PWM_R=128

→ Right '5' PWM_L=255 PWM_R=0

→ Down Right '6' PWM_L=255 PWM_R=128 tyle, że silniki do tyłu

→ Down '7' PWM_L=255 PWM_R=255 tyle, że silniki do tyłu

→ Down Left '8' PWM_L=128 PWM_R=255 tyle, że silniki do tyłu

Czy może jakiś bardziej wymyślny i "wystrzałowy" sposób, w którym wykorzystam cały potencjał joysticka, tylko muszę wspomnieć, że ja mam L298H i steruję parami silnikami po lewej i prawie stronie nie osobno.

Może powinienem uwzględnić i umożliwić jakoś obrót w miejscu żeby lewe silniki kręciły się do przodu z maksymalną mocą, a prawe silniki do tyłu z maksymalną mocą czy dobrze myślę, że wtedy samochód praktycznie obracałby się w miejscu w prawo? Jak to uwzględnić w tym joysticku? Może dać to do Left i Right, żeby w przypadku takiej komendy przeciwne silniki nie miały PWM'a = 0 tylko PWM=255, ale żeby kręciły się w przeciwną stronę. Tylko pytanie czy dobrze później będzie się manewrowało podczas jazdy takim pojazdem.

Chyba, że jeszcze mam taki pomysł, żeby ten joystick podzielić na więcej części i nie tylko ze względu na zakres kątów, ale na mniejsze okręgi, coś jak widok z radaru, chodzi mi o takie coś:

I np. w zależności od tego w jakim obszarze się znacznik znajduje (w którym okręgu) to skalować PWM'a np. dla czarnego okręgu PWM=255*1 dla czerwonego PWM=255*0.6 dla zielonego PWM=255*0.3 ???

____________________________________________________________

I druga kwestia wysyłanie tych komend i realizacja po stronie Arduino, no bo te komendy do Arduino to chyba będę musiał wysyłać cały czas? Żeby była odpowiednio szybka reakcja, chodzi mi o częstotliwość wysyłania komend w przypadku przeciągnięcia znacznika (ruszenia joystickiem) powinna być chyba stała? I z dostateczną częstotliwością żeby Arduino mogło dostatecznie szybko reagować? No, bo jakby nie mogę chyba też sprawić żeby z każdym przeciągnięciem znacznika wysyłała się komenda, bo powiedzmy, będę trzymał w jednym miejscu i tych komend wyśle się multum, tak, że nie zdążą się przesłać do kolejnego przeciągnięcia joysticka i powstanie kolejka w Bluetooth i będzie opóźnienie?

[ Dodano: 10-10-2017, 11:29 ]

Ktoś coś?

Link do komentarza
Share on other sites

Mialem podobny joystick wirtualny na tablecie Manta, programowany pod Androidem. Sterowal po wifi pojazdem gasienicowym. Joystick zwracal polozenie x i y , na podstawie tych wielkosci x i y obliczalem wspolczynniki PWM dla silnikow lewego i prawego. Obrot w miejscu byl realizowany poprzez wychylenie wirtualnego joysticka w lewo (zwrot przez lewa strone) lub prawo (zwrot przez prawa strone), nie do przodu ani do tylu. Wychylenie do przodu lub do tylu powodowalo jazde w przod lub tyl z predkoscia proporcjonalna do wychylenia Joystocka.

Link do komentarza
Share on other sites

Mialem podobny joystick wirtualny na tablecie Manta, programowany pod Androidem. Sterowal po wifi pojazdem gasienicowym. Joystick zwracal polozenie x i y , na podstawie tych wielkosci x i y obliczalem wspolczynniki PWM dla silnikow lewego i prawego. Obrot w miejscu byl realizowany poprzez wychylenie wirtualnego joysticka w lewo (zwrot przez lewa strone) lub prawo (zwrot przez prawa strone), nie do przodu ani do tylu. Wychylenie do przodu lub do tylu powodowalo jazde w przod lub tyl z predkoscia proporcjonalna do wychylenia Joystocka.

A jak to realizowałeś po stronie mikrokontrolera, no bo powiedzmy dałeś joystick na maks w górę pośrodku i Twój mikrokontroler dostawał jakąś komendę przez WiFi na podstawie, której dawał max wartość PWM na oba silniki -> tylko powiedz mi jak długo wykonywał tą operację? Dopóty dopóki nie dostał innej wartości, czy może przez jakiś krótki określony czas? Gdy wychylałeś joystick w górę, to przez WiFi wysyłałeś co jakiś czas tą samą komendę, czy tylko raz, dopóki nie przeciągnąłeś joysticka w inną stronę?

Link do komentarza
Share on other sites

Wszystkie dane (8 bajtow)(w tym 4 bajty to wartosci wychylenia z 2 joystickow), wysylane sa co 1/10 sek. (10 paczek 8-bajtowych na sek). Po stronie odbiorczej procesor odczytuje paczki i wystawia w zaleznosci od wartosci bajtow sygnaly na wyjsciu. Czterem pierwszym odebranym bajtom odpowiada wystawienie 4 sygnalow z odpowiednim PWM. Zmiana wypelnienia PWM nastepuje po odebraniu paczli z innymi wartosciami bajtow. W przypadku urwania transmisji procesor po 4 sek (sprawdza caly czas transmisje) ustawia PWM-y na zero.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Wszystkie dane (8 bajtow)(w tym 4 bajty to wartosci wychylenia z 2 joystickow), wysylane sa co 1/10 sek. (10 paczek 8-bajtowych na sek). Po stronie odbiorczej procesor odczytuje paczki i wystawia w zaleznosci od wartosci bajtow sygnaly na wyjsciu. Czterem pierwszym odebranym bajtom odpowiada wystawienie 4 sygnalow z odpowiednim PWM. Zmiana wypelnienia PWM nastepuje po odebraniu paczli z innymi wartosciami bajtow. W przypadku urwania transmisji procesor po 4 sek (sprawdza caly czas transmisje) ustawia PWM-y na zero.

Ja zrobiłem tak, że w momencie dotknięcia wirtualnego joysticka i przesunięcia go w danym kierunku np. dajmy na to dotykamy wirtualny joystick i przesuwamy go do przodu wysyła się do Arduino tylko raz komenda "w" i dopóki będę trzymał gałkę wirtualnego joysticka w tej samej pozycji (1/8 części koła) dopóty nie wyślę się kolejny raz komenda 'w' wysyła się tylko raz, natomiast jeśli zmienię pozycję np. w prawy górny róg to wtedy wyśle się komenda 'q' też tylko raz i jak wrócę do pozycji góra ponownie raz wyśle się komenda 'w'. Natomiast każdorazowe puszczenie gałki joysticka wiąże się z wysłaniem do Arduino komendy '?'.

I w Arduino mam to tak zrealizowane, że w obsłudze odczytu Bluetooth z telefonu mam 8 if'ów, w których w zależności od odebranego znaku 'w'/'q'/ itd. ustawiam zmienną kierunek jeśli '?' to kierunek = 0, jeśli 'w' to kierunek=1 itd. aż do kierunek=8

I w głównej pętli loop mam if z else if'ami że jeżeli kierunek=0 wywołuje się funkcja stop(), jeśli kierunek=1 to funkcja cała_naprzód() itd., a więc komendy kierunku pojazdu są wykonywane w pętli loop z delay(50), czyli co 50 milisekund i mi to działa tak jak powinno działać. Tak jak pisałem '?' jest wysyłany za każdym razem po puszczeniu joysticka, więc nie ma problemu z zatrzymaniem się pojazdu po tych 50 ms od puszczenia joysticka.

____________________________

Mam tylko problem z zasilaniem, bo bateria 9[V] + dodatkowo Arduino osobno jest zasilane z PowerBanku rozładowała się prawdopodobnie w niecałe 5-10 minut ciągłej jazdy i dodatkowo przy zawracaniu w miejscu, kiedy silniki po jednej stronie osi mają całą naprzód, po drugiej stronie osi mają całą wstecz, były problemy, po prostu silniki wolną się kręciły i nie wiem czym w końcu zasilać te silniki tj. mostek H zamiast baterii 9V, macie jakiś pomysł na coś z większą wydajnością prądową, ale co nie waży zbyt wiele?

To są te silniki: http://www.robotshop.com/en/dfrobot-6v-180-rpm-micro-dc-geared-motor-with-back-shaft.html#Specifications

Ja mam taki mostek H: https://botland.com.pl/arduino-shield-kontrolery-silnikow-i-serw/4914-motor-control-shield-9v06a-sterownik-silnikow-dla-arduino.html i mam podłączone do jednego kanału mostka 2 silniki, i zasilam mostek H z baterii 9V + wyjście 5V z mostka H jest podłączone do Arduino do pinu '5V'.

Czy powinienem zastosować inny mostek H? Bo ten niby ma 2A na kanał (3A chwilowo), a, że są połączone 2 silniki do jednego kanału no to patrząc na specyfikację "Stall current = 2.8 [A]", więc gdy oba dadzą tyle, to jest dużo ponad te 2A. Czy jednak ten mostek H jest dobry? Czym w takim razie go zasilać niby te silniki mają w specyfikacji "• Operating voltage range: 3~7.5V • Rated voltage: 6V" to z czego je zasilać, żeby było odpowiednie napięcie i odpowiednia wydajność prądowa, żeby bateria nie rozładowywała się tak szybko jak ta bateria 9V [5 minut jazdy] i żeby wydajność prądowa była wystarczająca do jednoczesnej jazdy silników z jednej strony w przód i do tyłu z drugiej strony (obrót w miejscu) ??

PS: I mój promotor, które prowadzi większość przedmiotów dotyczących (takich większych) silników elektrycznych, powiedział, że dobrze gdybym mógł mierzyć prądy dawane na dane silniki, żeby jak będzie przeszkoda i prąd będzie rósł, mógł po prostu wyłączyć za w czasu silniki, wiecie jak to zrealizować, jaki mostek H zastosować i jak te prądy mierzyć, da się na tym mostku H co mam, podłączyć jakoś do analogowych pinów na Arduino?

Link do komentarza
Share on other sites

" Natomiast każdorazowe puszczenie gałki joysticka wiąże się z wysłaniem do Arduino komendy '?'." = brzmi niezle, ale co sie stanie w przypadku zaniku transmisji zanim "puscisz" joystick?

Link do komentarza
Share on other sites

" Natomiast każdorazowe puszczenie gałki joysticka wiąże się z wysłaniem do Arduino komendy '?'." = brzmi niezle, ale co sie stanie w przypadku zaniku transmisji zanim "puscisz" joystick?

Fakt o tym nie pomyślałem 😃 Ale sposobu sterowania już nie będę zmieniał, pomyślę raczej jak można to rozwiązać od strony Arduino 😋 Masz jakiś pomysł 😃?

Ewentualnie tak teraz pomyślałem, że mogę cyklicznie wysyłać jakąś wiadomość z aplikacji, która będzie dawała znać o tym, że jest połączenie Bluetooth, jeśli go nie będzie to całe sterowanie zarówno serwami obracającymi kamerą jak i silnikami nie będą działać.

[ Dodano: 18-10-2017, 09:40 ]

W przypadku urwania transmisji procesor po 4 sek (sprawdza caly czas transmisje) ustawia PWM-y na zero.
Bo w Twoim przypadku w jaki sposób Twój procesor sprawdzał transmisję?
Link do komentarza
Share on other sites

Procesor w odbiorniku ma ustawiony timer na 4 sekundy. Gdy zliczy do zera, ustawia PWM-y na zero. Ale w procesie obrobki impulsow wejsciowych (powtarzajacym sie 10 razy na sekunde) umiescilem procedure, ze jesli pakiet 8 bajtow odebrany poprawnie. to ustaw ten timer (ktory juz troche zliczyl) ponownie na 4 sekundy.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.