Skocz do zawartości
Zaloguj się, aby obserwować  
EasyPeasy_

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

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ś?

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
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ę?

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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.

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?

Udostępnij ten post


Link to post
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?

Udostępnij ten post


Link to post
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ę?

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...