Ta strona używa ciasteczek (plików cookies), dzięki którym może działać lepiej. Dowiedz się więcejRozumiem i akceptuję
PCB.center

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

Autor Wiadomość
EasyPeasy_ 



Posty: 62
Wysłany: 09-10-2017, 13:31   Sterowanie silnikami (4WD) poprzez wirtualny joystick - Android.

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

Ostatnio popularny » Raspberry Pi. Niesamowite projekty. Szalony Geniusz


Ostatnio zmieniony przez EasyPeasy_ 09-10-2017, 13:31, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Marekk 




Posty: 81
Pomógł: 7 razy
Otrzymał 3 piw(a)
Skąd: Wyżyny
Wysłany: 10-10-2017, 13:31   

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.

Postaw piwo autorowi tego posta
 
 
EasyPeasy_ 



Posty: 62
Wysłany: 11-10-2017, 00:31   

Marekk napisał/a:
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ę?

Postaw piwo autorowi tego posta
 
 
Marekk 




Posty: 81
Pomógł: 7 razy
Otrzymał 3 piw(a)
Skąd: Wyżyny
Wysłany: 11-10-2017, 13:32   

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.

Polecany artykuł » Kurs elektroniki - #3 - prawa Ohma i Kirchhoffa


Postaw piwo autorowi tego posta
 
 
EasyPeasy_ 



Posty: 62
Wysłany: 14-10-2017, 20:17   

Marekk napisał/a:
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?

Postaw piwo autorowi tego posta
 
 
Marekk 




Posty: 81
Pomógł: 7 razy
Otrzymał 3 piw(a)
Skąd: Wyżyny
Wysłany: 18-10-2017, 09:09   

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

Postaw piwo autorowi tego posta
 
 
EasyPeasy_ 



Posty: 62
Wysłany: 18-10-2017, 09:19   

Marekk napisał/a:
" 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 :D Ale sposobu sterowania już nie będę zmieniał, pomyślę raczej jak można to rozwiązać od strony Arduino :P Masz jakiś pomysł :D ?

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 ]
Marekk napisał/a:
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ę?

Ostatnio zmieniony przez EasyPeasy_ 18-10-2017, 09:21, w całości zmieniany 1 raz  
Postaw piwo autorowi tego posta
 
 
Marekk 




Posty: 81
Pomógł: 7 razy
Otrzymał 3 piw(a)
Skąd: Wyżyny
Wysłany: 20-10-2017, 14:31   

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.

Postaw piwo autorowi tego posta
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Wersja do druku

Skocz do:  

Nie rozwiązałeś swojego problemu? Zobacz podobne tematy: Zasilanie waldka i k... Tani programowalny r... Sterowanie robotem r... Wykonywanie płytek d...
lub przeszukaj forum po wybranych tagach: 4wd, android., joystick, poprzez, sterowanie silnikami, wirtualny


Powered by phpBB modified by Przemo © 2003 phpBB Group
Popularne kursy: Arduinopodstawy elektroniki