Elektroda.pl
Elektroda.pl
X
PCBway
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Arduino Pro Mini - Zdalne sterowanie RF do samochodu.

23 Mar 2016 16:51 2415 10
  • Poziom 5  
    Witam wszystkich serdecznie,
    od niedawna zacząłem interesować się platformą Arduino. Postanowiłem więc zrealizować projekt samochodu na zdalne sterowanie swojego pomysłu. Zbudowałem więc pilot oraz samochód na początku na płytkach stykowych, oba są oparte na Arduino Pro Mini 16 MHz. W ich skład wchodzą:

    Pilot:
    - moduł joystick analogowy ps3 5V (dwa potencjometry i przycisk),
    - zwykły przycisk,
    - nadajnik radiowy XY-FST 433 MHz

    Samochód:
    - diody led,
    - serwo Tower Pro SG90 9 gramów,
    - silnik DC 5V z przekładnią,
    - mostek H L293D do sterowania silnikiem DC,
    - buzzer,
    - odbiornik radiowy (sprzedawany wraz z nadajnikiem),

    Po wgraniu programów do pilota i samochodu wszystko działa ale nie do końca tak jakbym tego oczekiwał. Problem tkwi w tym, ze w układzie samochodu występują duże opóźnienia w działaniu, tzn. gdy na pilocie wychylam joystick (np. maksymalnie w lewo) odpowiedzialny za skręcanie, to w samochodzie owszem serwo wykonuje ruch ale nie płynny ale skokowy (serwo obraca się o wymagane 90° ale wykonując to w sposób: obrót np. o 15° -> zatrzymanie -> obrót o 15° itd. do 90°) w trakcie takiego ruchu dioda powiadamiająca o odbieraniu sygnału radiowego mruga z mniejszą częstotliwością. Podobnie silniczek zamiast wykonywać ciągły ruch obrotowy wykonuje ruch skokowy zgodnie z częstotliwością mrugania diody. Jeśli natomiast nie wciskam nic na pilocie dioda mruga z większą częstotliwością.

    Kod Pilota (emiter):
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Kod samochodu (odbiornik):
    Kod: c
    Zaloguj się, aby zobaczyć kod


    PWM póki co jest wpisany na sztywno. Miałem pomysł na rozwiązanie problemu taki, żeby przy odebraniu pierwszego sygnału wartości odpowiedzialne za sterowanie zostały zapisane, program działał cięgle wykorzystując je, ale co kilka wykonań pętli void loop żeby były aktualizowane ich wartości. Może to pomogłoby w lagowaniu samochodu, tylko nie wiem jak mógłbym to wykonać. Być może to wina kiepskiej jakości nadajnika i odbiornika, jeśli ktoś już się spotkał z takim problemem to proszę o pomoc. Dodam jeszcze, że wartości uzyskiwane z sygnału są poprawne.
  • PCBway
  • Poziom 24  
    Pomiń nadajnik i odbiornik, łącząc oba moduły arduino za pomocą dwóch przewodów i zobaczysz gdzie leży wina.
  • Poziom 35  
    Spróbuj powyłączać te panele serwisowe po serialu w głównej pętli, bo prawdopodobnie przez to procesor dostaje zadyszki. Osobiście takie transmisje zrobiłbym z interwałem 0,5 - 1s.
  • Poziom 5  
    Dziękuję za szybką odpowiedź.

    Czy w połączeniu arduino dwoma przewodami, z pominięciem modułu radiowego, chodzi o transmisję szeregową (TX z RX i RX z TX) czy o coś innego?

    Po usunięciu panelu serwisowego nie ma praktycznie żadnej różnicy. Zauważyłem natomiast że odłączenie serwo powoduje płynne działanie samochodu (tzn. np włączone światła - LED nie mrugają albo mrugają ale bardzo szybko co sprawia wrażenie ciągłego świecenia) ale tylko do czasu przesunięcia joysticka w osi odpowiedzialnej za ruch silnika do przodu lub do tyłu, gdy znów zaczyna wszystko lagować, przestaje po puszczeniu joysticka.
  • PCBway
  • Poziom 16  
    Gdzieś jest biblioteka ReadHead czy jakoś tak - jest ponoć szybsza i lepsza pod względem zaimplementowanego protokołu. A co do mrugającej diody to sprawdź masy.
  • Poziom 5  
    Jak znajdę trochę czasu to posiedzę nad innymi bibliotekami. Póki co poradziłem sobie trochę inaczej. W pętli odczytującej sygnał stworzyłem funkcje warunkowe zmieniające wartości parametrów sterujących takimi czynnościami jak skręcanie, kierunek jazdy, włączanie świateł i klaksonu. Funkcje sterujące tymi czynnościami wyrzuciłem poza pętlę odczytującą sygnał. Teraz to działa tak, że do póki wartości odczytane z sygnału nie ulegną zmianie to pętla void loop wykonuje funkcje warunkowe wykorzystując ostatnią odczytaną wartość. Usunąłem też całkowicie panel serwisowy. Całe sterowanie już nie laguje.

    KOD samochodu:
    Kod: c
    Zaloguj się, aby zobaczyć kod
  • Poziom 16  
    Sądzę że idziesz dobrym tropem. Ja zauważyłem, że im więcej wysyłasz naraz tym gorzej jest. Proponował bym zastosować również warunki w nadajniku. Powiedzmy przykładowo wysyłasz jazdę i kierunki, a światła i klakson oraz inne osobno tzn. sterowanie wysyłasz np. 123, a klakson jako np. literę 'W' żeby się nie mieszało w odczycie. Po co masz na darmo wysyłać dane klaksonu i świateł jak ich w chwili obecnej nie używasz. Niech nadajnik wysyła cały czas to co ma wyższy dla Ciebie priorytet, a to co ma mniejszy niech wysyła tylko wtedy, gdy jest to potrzebne. Na takim etapie ma zmieniać na wifi? Jest na półmetku. I jeszcze ma generować sobie dodatkowe koszty. RC używa protokołu na podstawie czasu. A w RF Cię to już nie interesuję. Po za tym przyjrzyj się kodowi na Arduino i na ESP.
  • Poziom 16  
    Przecież można ESP na ardu zrobić bez lua. Mniejsza z tym taka tylko moja sugestia. Już się nie wcinam.
  • Pomocny post
    Poziom 16  
    Porobiłem parę testów- statyczne przed pętlą odczytu sygnału wariują, umieszczone w pętli również. Pomogło usunięcie static. Czy u Ciebie w ogóle działa zatrzymanie przy braku odczytu?
    else { //jesi nie odczytuje sygnalu to wylacz silnik
    digitalWrite(pwm, LOW);
    }
    U mnie w ogóle to nie działa, ani na statycznych, ani bez.
    Biblioteka o której pisałem wcześniej. Jeszcze jej nie testowałem.
    http://randomnerdtutorials.com/rf-433mhz-transmitter-receiver-module-with-arduino/
  • Poziom 5  
    Ostatni przesłany przeze mnie kod działał już poprawnie, zrezygnowałem z linijki:

    "else { //jesi nie odczytuje sygnalu to wylacz silnik
    digitalWrite(pwm, LOW);
    }"

    przez nią i przez wcześniejsze umieszenie funkcji sterujących wszystkimi czynnościami w pętli odczytującej sygnał, cały układ lagował. Działało to tak, że sygnał sterujący był wysyłany z pewnym interwałem czasowym, i jeśli odbiornik akurat odczytał sygnał to nadawał wartości wszystkim stałym, jeśli nie to nic nie robił dlatego cały układ lagował. Umieszczenie funkcji sterujących wszystkimi czynnościami poza pętlą odczytu pozwoliło obejść to tak, że stałe, które sterują układem ciągle mają jakąś wartość, natomiast kiedy odbiornik odczyta sygnał to ta wartość jest aktualizowana. Dzięki temu wszystko już zaczęło działać płynnie, tzn, można jednocześnie włączyć obroty silnika do przodu i skręcić a podczas manewru włączyć lub wyłączyć światła. Oczywiście masz rację, że wysyłanie wszystkich informacji z nadajnika nie jest optymalnym rozwiązaniem, ale wysyłanie wszystkiego na raz jest łatwiejsze, poza tym w odbiorniku, jeśli wartość sterująca nie zmienia się w stosunku do swojej wartości z poprzedniej chwili to program w odbiorniku nic z nią nie robi.

    Dzięki za podrzucenie biblioteki, na pewno się przyda ;)

    Jeśli nikt nie ma już nic do dodania to zamknę niedługo temat.