Skocz do zawartości

Zdalne sterowanie, wiele czynności jednocześnie.


MasteR_PuppetS

Pomocna odpowiedź

Zdalne sterowanie ma odbywać się za pomocą modułu bluetooth HC-06.

Dysponuję funkcjami taki jak:

- skręt w lewo (jeden silnik z max predkoscia kreci sie w jedna strone, drugi w druga)

- skret w prawo (-||-)

- jazda na wprost (~ -||-)

- do tylu (-||-)

- obrot "wiezy" lewo/prawo (trzeci silnik kreci sie w lewo/prawo)

- podnies/oposc (inkrementacja/dekrementacja zmiennej odpowiadajacej za wypelnienie PWM sterującym serwem)

- ...

Jedyne co mi obecnie przychodzi do głowy, to zdalne sterowanie za pomocą wysyłanych stringów (najlepiej zapisywanych w tablicy i interpretowanie jako pojedyncze znaki) oraz odpowiednich instrukcji warunkowych - wywołujących poszczególne funkcje.

W związku z tym pytania:

1. Czy realne jest uzyskanie łagodnego skrętu poprzez kombinację właściwych funkcji w odpowiednich proporcjach (częstość wywoływania) z odpowiednio dużą częstotliwością?

2. Sposób podawania stringów umożliwiający najbardziej optymalne sterowania

(z grubsza - chciałbym, aby było to możliwie najbardziej zbliżone do sterowania pojazdem w np. need for speedzie, czy innej gry tego typu), czy jest to w ogóle osiągalne?

3. Alternatywne sposoby zdalnego sterowania z wykorzystaniem modułu bluetooth?

Pozdrawiam.

Link do komentarza
Share on other sites

to co udało mi sie to tej pory wykonac - to sterowanie poprzez wysylanie pojedynczego znaku i przypisywania go do danej zmiennej, nastepnie wykorzystanie instrukcji warunkowej. I mimo iz dziala to poprawnie, to nie jest zbyt efektywne.

docelowo chce, aby wygladalo to w ten sposob, ze: trzymam wcisnieta strzalke do gory - pojazd jedzie do przodu, puszczam strzalke - pojazd zatrzymuje sie.

jezeli UART, to 8 bitow informacji, to czy mozliwe jest zapisywanie informacji w 8 elementowej tablicy zlozonej z zer i jedynek ?

jezeli tak, to kolejnym krokiem powinno byc napisanie aplikacji (na PC), ktora odpowiednio przetwarzałaby "sygnal"

Widze to w ten sposob: wcisnieta strzalka do gory - wysylana jest tablica 8 el., ktorej 1 elementem jest 1, a reszta to 0;

wcisnieta jest strzalka do gory i klawisz A, wysylania jest tablica, ktorej 1 oraz np 5 elementem jest jedynak, a reszta to zera;

nie jest wcisniety zaden klawisz, wszystkie elementy to 0;

Uzyskanie czegos takiego juz by troszke ulatwialo sprawe.

Czy jest to wykonalne?

Link do komentarza
Share on other sites

Oczywiście! UART to 8 bitów w tym sensie że jest to jeden char. Poczytaj sobie o operacjach binarnych, szczególnie o AND, OR, << i >>. Poza tym możesz jednocześnie wysyłać stan 8 różnych komend, na przykład 11001000 to prosto, w lewo i światła, a 00110001 to tył, lewo i wycieraczki.

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

No dobra, ale problemy, które ciągle pozostają nierozwiązane to:

1. Co w przypadku, gdy będę chciał (a prawie na pewno będę chciał) wykorzystać więcej niż 8 funkcji?

2. Funkcja skrętu w lewo ustawia te same piny na inne stany, co funkcja jazdy na wprost (opisałem to w 1 poście). Jak więc w związku z tym uzyskać łagodny skręt w lewo (np. trzymając strzałkę na wprost, i tylko co chwile wciskając strzałkę w lewo).

Oczywiście mogę napisać funkcję, która po prostu będzie zmieniać wypełnienie PWM, ale jak wtedy uzyskać skręt w lewo w miejscu ? Nie mogę dla każdego wariantu pisać osobnej funkcji.

To co przychodzi mi na myśl, to wykonywanie naprzemiennie funkcji "na wprost" i "w lewo" np. dwa razy jedna funkcja, raz druga funkcja, z tym, że musiałoby to się dziać z dość dużą częstotliwością, i nie dość, że nie bardzo mam pomysł jak zrealizować to programowo, to nie wiem też jak wpłynie to na zachowanie silników - nie potrafię tego przewidzieć.

Link do komentarza
Share on other sites

Możesz w jakiś sposób łączyć kilka pakietów w jeden, na przykład najpierw wysyłać 00000000, potem pakiety danych w ustalpnej kolejności, a potem 11111111. Teraz zależy czy masz pewność że wszystkie pakoety przechodzą poprawnie, bo jeśli nie to musisz stworzyć jakąś korekcję błędów.

Link do komentarza
Share on other sites

A ja bym zrobił to tak, że w odbiorniku byłby tylko czysty dekoder nadchodzących danych analogowych na wysterowanie poszczególnych silników. Analogowych, to znaczy że w ramce oznaczonej wyraźnym początkiem i końcem byłyby przesyłane wartości wysterowania poszczególnych silników (np. w zakresie 0-255 plus kierunek, lub w zakresie -128..+127 dwukierunkowo) oraz wartości wyjść dwustanowych.

Przykładowa linia:

*-95,-107,10,90,128\n

Co oznacza:

gwiazdka - początek ramki danych

silnik lewy: prędkość 95 w tył

silnik prawy: prędkość 107 w tył

wieża: prędkość 10 w prawo

serwo: wysterowanie na 90 (skala dowolna, ale zwykle 90 oznacza położenie neutralne, impulsy 1ms)

wyjścia dwustanowe: 128 (czyli 0x80 czyli 0b10000000 czyli najstarszy bit ustawiony co może oznaczać włączenie jakichś świateł czy np. wytwornicy dymu).

Taki odbiornik byłby prosty i niezależny od drugiej strony. Co więcej mógłbyś do jego testowania używać zwykłej klawiatury i terminala znakowego w PC lub smartfonie. Wypisując na ekranie taką linię i wysyłając ją przez port szeregowy BT od razu miałbyś efekt w postaci zmian stany pojazdu. Odbiornik/dekoder natychmiast wprowadzałby w życie otrzymywane dane a jeśli przychodziłyby szybciej (częściej), sterowanie byłoby płynniejsze.

Po stronie nadawczej musiałbyś skanować przyciski i odpowiednio do tego wysyłać wartości w ramkach. Na początek mogłoby to być proste przód-stop-tył każdego silnika niezależnie. Gdybyś się postarał mógłbyś interpretować szybkie wciśnięcia i puszczenia klawisza w lewo podczas jazdy na wprost i miałbyś te swoje łagodne skręty. Nie rozumiem co prawda dlaczego nie chcesz wziąć zwykłych potencjometrów lub drążków z aparatury RC - bo to aż się prosi przy takim sterowaniu, ale wszystko jedno. Mając gotowy "na wszystko" odbiornik mógłbyś dowolnie eksperymentować z nadawaniem tych czy innych wartości na podstawie lepiej lub gorzej rozumianych zamysłów kierowcy.

BT jest szybki, ale ma zauważalne opóźnienia nie związane z prędkością transmisji przez UART, ale z samym przetwarzaniem danych i działaniem protokołów radiowych w module. Jeśli to nie będzie ścigacz a raczej czołg, moim zdaniem jest to do pominięcia.

Link do komentarza
Share on other sites

Taki odbiornik byłby prosty i niezależny od drugiej strony. Co więcej mógłbyś do jego testowania używać zwykłej klawiatury i terminala znakowego w PC lub smartfonie. Wypisując na ekranie taką linię i wysyłając ją przez port szeregowy BT od razu miałbyś efekt w postaci zmian stany pojazdu.

Taką metodą bedą przysyłane znaki w kodowaniu ASCII a nie binarne wartości 0-255.

Po za tym, zamiast tak kombinować, można zastosować już mocno oklepane formaty ramek czyli :

1: komenda

2: opcjonalne - długość ramki danych jeśli nie jest stała

3: parametr 1

4: parametr 2

n: parametr n

n+1: opcjonalne - crc

Link do komentarza
Share on other sites

witam

Jeśli dysponujesz pełnym bajtem danych , to możesz przesyłać ciągiem 255 poleceń dodatnich

lub 127 ujemnych.

Następnie to to kwestia zdekodowania bajtu i rozprowadzenie poleceń po modułach.

i tak :

1 w przód

2 w tył

3 lewo

4 prawo

5 lewy przód

6 prawy przód

....

dodatkowo do obliczeń dodajesz impedancje manetki(przepustnicy gazu), takich kombinacji masz 255, i zero czyli wszystko wygaszone.

dodając kolejny bajt robisz równoległe sterowanie drugim obiektem lub 1 obiekt 2 do 16 kombinacji jw.

pozdro

Link do komentarza
Share on other sites

Najbardziej spodobała mi się koncepcja zaproponowana przez Marka, i to właśnie ją zrealizowałem.

Wygląda to w ten sposób, że z mikro-kontrolera przesyłam dane pochodzące z czujników (przekonwertowane do stringa) do aplikacja, która te dane 'dekoduje', i w zasadzie mogę z nimi zrobić co chcę, wyświetlać na ekranie, w oparciu o nie realizować algorytm, etc.

Następnie realizuję algorytm, w oparciu czy to o sygnały z czujników właśnie, czy też sygnały z klawiatury, czy z czegokolwiek sobie tylko wymyśle - algorytm polega na określeniu stanu każdego z silników - co jest zapisywane za pomocą pojedynczej liczby dla jednego silnika, co następnie jest konwertowane do stringa i wysyłane do mikrokontrolera, który w oparciu o te dane po prostu ustawia silniki zgodnie z zadanymi parametrami (wynikającymi z wartości tych liczb właśnie).

Nie wiem, czy to optymalne rozwiązanie, ale najłatwiej było mi w ten sposób to zrealizować.

Z efektów jestem zadowolony.

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.