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

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ść
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   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.

×
×
  • 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.