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

Prosta aparatura RC 433MHz na Atmega8 i Attiny2313

prezeswal 09 Maj 2014 14:12 16521 31
  • Prosta aparatura RC 433MHz na Atmega8 i Attiny2313

    Witam.
    Przedstawione rozwiązanie powstało z myślą o zdalnym (radiowym) sterowaniu modelem samochodu. Umożliwia płynne regulacje: kierunku (lewo/prawo) oraz prędkości ruchu (przód/tył). Rozkaz typu "włącz/wyłącz" pozwala np. uruchamiać sygnał dźwiękowy (klakson) lub włączać światła.
    Spośród innych opisanych na Forum prezentowany projekt wyróżnia się tym, że programy (nadajnika i odbiornika) napisałem w Bascomie, bez wstawek asemblerowych. Kody programów udostępniam w całości, co umożliwia ich adaptację i ew. rozbudowę.

    Nadajnik
    Shemat ideowy:
    Prosta aparatura RC 433MHz na Atmega8 i Attiny2313

    Program:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Mam niewielkie doświadczenie w programowaniu µC, więc użyłem standardowych instrukcji języka Bascom. W tym rozwiązani procesor musi posiadać zarówno przetworniki ADC jak i interfejs UART - asynchroniczna transmisja danych jest realizowana z użyciem instrukcji Printbin. Użyłem więc ATmega8.
    Pakiet danych (ramka) zawiera: bajt startu Dane(1), dwa bajty danych o położeniach potencjometrów joysticka R1 i R2 (Dane(2) i Dane(3)) oraz bajt kontrolny Crc8 (Dane(4)).
    Ze względu na prostotę sterowania zastosowałem moduły radiowe TX433MHZ (i RX433MHz w odbiorniku) - nie wymagają one żadnej inicjalizacji. Ich wadą jest niewątpliwie modulacja ASK, która jest bardziej podatna na zakłócenia niż FSK, stosowana w większości "programowalnych" modułów RF.
    Układ zasilany jest akumulatorkami Ni-MH 3xAAA (+Vbat=3,6V).

    Odbiornik.
    Schemat ideowy:
    Prosta aparatura RC 433MHz na Atmega8 i Attiny2313

    Program:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Zastosowałem ATtiny2313, który umożliwia odbiór asynchronicznej transmisji danych - instrukcja Inputbin.
    Po odebraniu bajtu startowego (172 lub 202) wczytywane są kolejne trzy bajty pakietu. Po sprawdzeniu zgodności bajtu kontrolnego (Crc8) przetwarzane są informacje o wychyleniu serwomechanizmu (Dane(2)) oraz prędkości i kierunku ruchu (przód/tył) - Dane(3).
    Serwomechanizm jest sterowany z użyciem polecenia "Config Servos" języka Bascom.
    Prędkość jest regulowana sygnałem PWM (Config Timer1 = Pwm). Sygnał ten poprzez tranzystory T1 i Q1 zasila mostek H (1/2 L293D). Jako Q1 może być zastosowany również tranzystor bipolarny (np. BD140), w tym przypadku R1=10k i R2=680Ω (dla napięcia +Vmot=9÷12V).
    Kierunek obrotów silniczka zależy od stanu wyjść PORTD.3 i PORTD.4 (P_t_1 i P_t_2).
    Wyjście "Klakson" jest ustawiane w zależności od wartości bajtu startowego.
    W przypadku zaniku sygnału silniczek napędu zatrzymuje się (Gaz = 0 i serwomechanizm ustawiany jest w pozycji "neutrum" (Serwo = 150) po czasie określonym w poleceniu Config Watchdog = ...
    Napięcie +4,8V zapewniają akumulatorki Ni-MH 4xAA. Silniczek napędu zailany jest z oddzielnego źródła +Vmot=8,4V.

    Odbiornik nie został jeszcze zamontowany w modelu, ale załączony filmik pokazuje sterowanie serwomechanizmem i silniczkiem DC (jakość filmu i widoczne "skokowe" zmiany położenia mechanizmów wykonawczych wynikają z ograniczonych możliwości mojego sprzętu).

    http://www.youtube.com/watch?v=LlUYeOj5wCs&feature=em-upload_owner

    Pozdrawiam.

    W załączniku - pliki: źródłowe .bas i skompilowane .hex

    Fajne! Ranking DIY
    Potrafisz napisać podobny artykuł? Wyślij do mnie a otrzymasz kartę SD 64GB.
    O autorze
    prezeswal
    VIP Zasłużony dla elektroda
    Offline 
    prezeswal napisał 4989 postów o ocenie 121, pomógł 516 razy. Mieszka w mieście Warszawa. Jest z nami od 2007 roku.
  • IGE-XAO
  • #2
    maciej_333
    Poziom 34  
    W jakim celu zastosowano T1 i Q1 ? Silnik da się zatrzymać ustawiając odpowiednio wyprowadzenia sterujące - jedno i drugie w poziom niski, lub wysoki. Zmniejszenie poboru prądu z tego jest właściwie znikome. Prościej tu wykorzystać wyprowadzenie ENABLE. Mikrokontroler w momencie, gdy nic się nie dzieje można wprowadzić w tryb IDLE, co jest kolejną oszczędnością. Tak wysokie częstotliwości taktowania są zastosowane ze względu na PWM ? Prawdopodobnie da się to zmniejszyć, bo i tak L293 pracuje do 5kHz. Mimo zastosowania UARTU, co i tak jest słabym pomysłem można pomyśleć o taktowaniu przez wewnętrzny oscylator RC. Z moich doświadczeń wynika, że taki UART pracuje dostatecznie dobrze dla takiego zastosowania, tym bardziej, że i tak z tymi modułami 4800b/s to raczej maksymalna przepływność.
  • #3
    prezeswal
    VIP Zasłużony dla elektroda
    maciej_333 napisał:
    W jakim celu zastosowano T1 i Q1 ? Silnik da się zatrzymać ustawiając odpowiednio wyprowadzenia sterujące - jedno i drugie w poziom niski, lub wysoki. Zmniejszenie poboru prądu z tego jest właściwie znikome. Prościej tu wykorzystać wyprowadzenie ENABLE.

    Sprawdzałem rozwiązanie z doprowadzaniem sygnału PWM do wejścia 1-2EN L293D, jednak "charakterystyka regulacji" obrotów silniczka (przynajmniej tego, którego używałem do testów) była mniej liniowa. Może to wynikać z faktu, że podczas używania tego sposobu silnik jest okresowo "szybko hamowany" (stan Fast stop):
    Prosta aparatura RC 433MHz na Atmega8 i Attiny2313
    Nie przeprowadziłem jednak dokładnych pomiarów zależności obrotów lub momentu silnika od wypełnienia i - być może - moja ocena nie jest miarodajna, można próbować sterować silnikiem w ten prostszy sposób.
    Częstotliwość użytego przeze mnie rezonatora kwarcowego umożliwia uzyskanie maksymalnej częstotliwości PWM ok. 22kHZ (przy Timer1 = Pwm , Prescale = 1).
    Zastosowałem UART ze względu na prostotę rozwiązania i - jak Kolega zauważył - wystarczającą dla tego układu poprawność transmisji.
  • #4
    maciej_333
    Poziom 34  
    Może inaczej, ENABLE można zastosować tylko do oszczędzania na poborze prądu, skoro były problemy z tym wejściem. PWM można dołączyć do jednego z wejść sterujących kluczami. Drugie wejście wykorzystać można do zmiany kierunku (zwyczajnie poziom niski/wysoki). Trzeba tylko pamiętać o przeliczeniu PWM przy zmianie kierunku. W takiej sytuacji z 10% zrobi się 90% przy zmianie kierunku i odwrotnie. Dlaczego stosowana jest aż tak wielka częstotliwość PWM do sterowania silnikiem (znaczna bezwładność) ? L293 zgodnie z katalogiem jest na 5kHz.

    UART jest tu trochę nietrafiony, bo byle impuls powoduje, że odbiornik rozpoczyna odbiór.
  • #5
    prezeswal
    VIP Zasłużony dla elektroda
    maciej_333 napisał:
    Dlaczego stosowana jest aż tak wielka częstotliwość PWM

    Przy ustawieniu Timer1, jak w załączonym programie (Prescale = 64) częstotliwość PWM wynosi oczywiście ok. 340Hz.
    W układzie z tranzystorami T1 i Q1 użycie wyższej częstotliwości (nawet 22kHz) nie stwarza żadnych problemów (a przynajmniej ja ich nie stwierdziłem).
    maciej_333 napisał:
    UART jest tu trochę nietrafiony, bo byle impuls powoduje, że odbiornik rozpoczyna odbiór.

    Odbiornik, rozumiany jako moduł radiowy wraz z zaprogramowanym mikroprocesorem, rozpoczyna odbiór danych dopiero po odebraniu bajtu startowego, a wykonuje określone regulacje po sprawdzeniu bajtu kontrolnego (Crc8).
    --------------------------------------------------
    Sprawdziłem sugerowany przez kol.maciej_333 sposób sterowania L293D sygnałem PWM i zmianą kierunku obrotów silnika. Takie rozwiązanie zapewnia poprawną regulację w całym zakresie zmian współczynnika wypełnienia:
    Prosta aparatura RC 433MHz na Atmega8 i Attiny2313

    W załączniku - zmieniony program odbiornika (nadajnik pozostaje bez zmian).
  • #6
    prezeswal
    VIP Zasłużony dla elektroda
    prezeswal napisał:
    Ze względu na prostotę sterowania zastosowałem moduły radiowe TX433MHZ (i RX433MHz w odbiorniku) - nie wymagają one żadnej inicjalizacji. Ich wadą jest niewątpliwie modulacja ASK, która jest bardziej podatna na zakłócenia niż FSK, stosowana w większości "programowalnych" modułów RF.

    Moje obawy, niestety. potwierdziły się - zakłócenia od silniczków elektrycznych poważnie utrudniają pracę odbiornika (ograniczenie zasięu, przerwy w odbiorze,itp.).
    Zbudowałem więc drugą wersję projektu z użyciem modułów RFM01 i RFM02 (modulacja FSK, pasmo 868MHz). Dostępne w sieci procedury obsługi (inicjalizacji) tych modułów są napisane w innnych niż Bascom językach. Pisząc swoją wersję programów korzystałem więc głównie z opisów producenta (noty katalogowe, przykłady aplikacji). Użyteczne były także informacje zawarte w tematach:
    https://www.elektroda.pl/rtvforum/topic1835943.html
    http://bascom-forum.de/showthread.php?1344-RFM-01-02-Testprogramm

    Oto procedury, które zastosowałem w swoich programach:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Różne wersje odbiornika z powodzeniem działają w "łaziku - magic chassis" i modelu pływającym "Atlantic-Pelikan" (modele dwusilnikowe), nadajnik w każdym przypadku jest ten sam.
    http://www.youtube.com/watch?v=-o7mWln3vOE
    http://www.youtube.com/watch?v=1_38_AwUIuI

    W załączniku zamieszczam kody źródłowe Bascom, skompilowane pliki .hex i schematy ideowe.

    PS. Proszę nie pytać o PCB, wszystkie układy zmontowałem na płytkach uniwersalnych ("konstrukcje niedokończone" :D ).
    Moduły TX/RX433MHz zastosuję w innym projekcie, ale to już będzie następny temat.
    Pozdrawiam.
  • IGE-XAO
  • #8
    prezeswal
    VIP Zasłużony dla elektroda
    kulamario napisał:
    Jaki jest bezpieczny zasięg tej aparatury?

    Wersja z RFM01/02 działa poprawnie do ok. 200m na otwartej przestrzeni (na większe odległości - nie sprawdzałem).
  • #9
    77PAGO77
    Poziom 12  
    Witam na czym polega inicjalizacja odbiornika i nadajnika ??
  • #10
    maciej_333
    Poziom 34  
    77PAGO77 napisał:
    Witam na czym polega inicjalizacja odbiornika i nadajnika ??

    Na niczym. To bardzo proste moduły, do tego z modulacją ASK. Zwyczajnie podanie poziomu wysokiego na wejście nadajnika, powoduje otrzymanie poziomu wysokiego na wyjściu odbiornika. Analogicznie dla poziomu niskiego. Pomijając wszelkie błędy transmisji, to jest to "zwykła" komunikacja dwóch mikrokontrolerów przez UART. Jest to zatem coś jakby połączyć je przewodami. Do zabawy polecałbym jednak coś znacznie bardziej zaawansowanego, jak np. CC1101.
  • #11
    77PAGO77
    Poziom 12  
    Czyli wygram kod nadajnika oraz odbiornika do prockow podłącze według schematu i powinno wszystko ruszyć ?
  • #12
    maciej_333
    Poziom 34  
    Nie wiem, czy są tu jakieś kody. Zależy jaki protokół komunikacyjny wymyślił autor tego projektu. Jednak, biorąc pod uwagę daleko idącą prostotę tego rozwiązania, to faktycznie wystarczy zaprogramować właściwie mikrokontrolery. Chodzi o FUSE BITY i zapisanie programu do pamięci FLASH.
  • #13
    prezeswal
    VIP Zasłużony dla elektroda
    77PAGO77 napisał:
    Witam na czym polega inicjalizacja odbiornika i nadajnika ??

    maciej_333 napisał:
    Na niczym. To bardzo proste moduły, do tego z modulacją ASK.

    Proszę przeczytać pierwszy post tematu:
    prezeswal napisał:
    Ze względu na prostotę sterowania zastosowałem moduły radiowe TX433MHZ (i RX433MHz w odbiorniku) - nie wymagają one żadnej inicjalizacji

    Poza tym - pytanie jest nieprecyzyjne, ponieważ:
    prezeswal napisał:
    Zbudowałem więc drugą wersję projektu z użyciem modułów RFM01 i RFM02 (modulacja FSK, pasmo 868MHz).

    W załączniku (post nr 6) zamieściłem kompletne programy źródłowe i pliki .hex.
  • #14
    77PAGO77
    Poziom 12  
    Zastosowałem najpopularniejsze moduły na 433mhz i mam problem gdy nadajnik z odbiornikiem się widzą jest ok ale gdy go zasłonię tj . odbiornik będę miał za plecami a aparaturę trzymał w rekach przed sobą następuje koniec transmisji nawet w odległości 5 metrów , próbowałem dodawać różne anteny według tego co znalazłem na elektrodzie i nic nie pomaga napięcie nadajnika zwiększyłem do 12v i również nic to nie dało :-( czy RFM02 i RFM01 będą bardziej "odporne" na tego typu zakłócenia ??



    Prosta aparatura RC 433MHz na Atmega8 i Attiny2313
  • #15
    RigelInOrion
    Poziom 11  
    @77PAGO77 Ja zbudowałem sterowanie pojazdem na takich modułach i miałem podobny przypadek. Dopóki nadajnik z odbiornikiem leżały obok siebie, wszystko było ok. Gdy tylko oddaliły się komunikacje trafiał szlag i w ogóle jakieś cuda się działy. Może ktoś powie, że to jakieś czary mary, ale u mnie pomogło ustalenie stanów pinów w uC podczas uruchamiania programów. Moduły 433/315 MHz działają prawidłowo bez względu na to czy się widzą, czy nie(oczywiście w granicach swoich możliwości).
  • #16
    77PAGO77
    Poziom 12  
    Czy pod odbiornik tej aparatury mogę jakoś podłączyć regulator modelarski do silników szczotkowych??
  • #17
    Freddy
    Poziom 43  
    77PAGO77 napisał:
    Czy pod odbiornik tej aparatury mogę jakoś podłączyć regulator modelarski do silników szczotkowych??

    Przecież masz na schemacie opisane "serwo".
  • #18
    prezeswal
    VIP Zasłużony dla elektroda
    77PAGO77 napisał:
    Czy pod odbiornik tej aparatury mogę jakoś podłączyć regulator modelarski do silników szczotkowych??

    Kolejne nieprecyzyjne pytanie - jaki typ regulatora i z którym odbiornikiem miałby on współpracować (zamieściłem trzy wersje odbiorników - post nr 6)?
    Prosta aparatura RC 433MHz na Atmega8 i Attiny2313 Prosta aparatura RC 433MHz na Atmega8 i Attiny2313 Prosta aparatura RC 433MHz na Atmega8 i Attiny2313
    Przykładowe przebiegi sygnałów wyjściowych ("SERWO" i "GAZ") dla wersji "samochód" pokzuje obrazek:
    Prosta aparatura RC 433MHz na Atmega8 i Attiny2313
    Impulsy "SERWO" mają czas trwania od 1ms do 2ms i są powtarzane co 20ms.
    "GAZ" to, oczywiście, sygnał PWM o częstotliwości ok. 337Hz (dla Timer1 = Pwm , Prescale = 64).
    Trzeci sygnał P_T ma wartość 0 lub 1 (GND lub VCC) - w zależności od wyboru: jazda do tyłu albo do przodu.
    Mam nadziję, że powyższe uwagi (i analiza programów) są wystarczające dla zrozumienia przyjętych przeze mnie zasad sterowania i umożliwią zainteresowanym modyfikację programów (realizację innych funkcji).
  • #19
    77PAGO77
    Poziom 12  
    Męczę się już z 9 godzin z próbą przerobienia kodu "SAMOCHÓD "odbiornik nadajnik by uzyskać sterowanie 2 serwami . Proszę o pomoc jak to zrobić ? i czy da się uzyskać w prosty sposób sterowanie 4 serwami ?
  • #20
    77PAGO77
    Poziom 12  
    Bardzo proszę o pomoc , nie wiem w ogóle jak ugryźć temat a potrzebuję sterowanie minimum dwoma serwami .
  • #21
    prezeswal
    VIP Zasłużony dla elektroda
    77PAGO77 napisał:
    nie wiem w ogóle jak ugryźć temat a potrzebuję sterowanie minimum dwoma serwami .

    Prosta aparatura RC 433MHz na Atmega8 i Attiny2313
  • #22
    77PAGO77
    Poziom 12  
    2 godziny i nie jestem w stanie nic osiągnąć //
    serwa w odbiorniku mam podłączone pod Servo1 = Portd.5 , Servo2 = Portb.0
    W Nadajniku pod Servo1 = Portc.0 Servo2 = Portc.1

    już po dodaniu kodu : Config Servos = 2 , Mode = Servo , Servo1 = Portd.5 , Servo2 = Portb.0 nie kompiluje się program :-/

    Wydaje mi się że w nadajniku nic nie trzeba zmieniać tylko ten odbiornik doprowadza mnie do łez

    Odbiornik :
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod




    Nadajnik
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    proszę by ktoś to sprawdził i zobaczył co i jak bo mnie już ręce opadają
  • #23
    77PAGO77
    Poziom 12  
    Noc nie przespana ale działa ! prawie jedyny problem że oba serwa działają od połowy tj serwo a działa od 0 do 50 a serwo b od 50 do 100 co może być przyczyną ??
    A raz na jakiś czas serwo_A działa ok a serwo_B działa tak do połowy potencjometru wykonując pełny ruch ..
    Odbiornik :

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod




    Nadajnik
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
  • #24
    prezeswal
    VIP Zasłużony dla elektroda
    W kodzie nadajnika wynik pomiaru ADC2 powinien być przesunięty w prawo o 3, a nie o 2.
    Jest:
    Pomiar = Getadc(2)
    Shift Pomiar , Right , 2

    Powinno być:
    Pomiar = Getadc(2)
    Shift Pomiar , Right , 3
  • #25
    77PAGO77
    Poziom 12  
    :-) działa ! Wielkie dzięki !

    Rozumiem że dla 4 serw było by to ?: Sprawdził bym sam ale właśnie padło mi ostatnie serwo , tak to jest jak się kupuje g..wno z alledrogo

    Pomiar = Getadc(1)
    Shift Pomiar , Right , 3
    Dane(2) = Pomiar
    Pomiar = Getadc(2)
    Shift Pomiar , Right , 3
    Dane(3) = Pomiar
    Pomiar = Getadc(3)
    Shift Pomiar , Right , 3
    Dane(4) = Pomiar
    Pomiar = Getadc(4)
    Shift Pomiar , Right , 3
    Dane(5) = Pomiar
  • #26
    77PAGO77
    Poziom 12  
    Mam taki oto programik i mały problem
    a mianowicie jak zmusić serwa Serwo_c Serwo_d do powrotu na wartość 100 po zakończonej pętli która ustawia je na 200 ??

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod
  • #28
    77PAGO77
    Poziom 12  
    A może coś bardziej na temat ?
  • #29
    77PAGO77
    Poziom 12  
    Czy ktoś jest w stanie mi pomóc :-(
  • #30
    JarekPrzybyl
    Poziom 15  
    Pewno nie o to pytasz, ale czy komenda Servo(x)=100 po wyjściu z pętli nie wystarczyłaby przypadkiem?

    Nawiasem mówiąc, program jest strasznie niechlujny, ciężko się w nim połapać, gdzie jaka pętla bądź warunek się zaczyna, a gdzie kończy, zwrób w nim porządek, a może problemy znikną same :)