Fotografia nadajnika RC ze strony sprzedawcy |
Odbiornik RC |
W praktyce, dodając do takiego zestawu jeszcze jakieś serwo (do określania kierunku jazdy pojazdu) i moduł ESC (Electronic Speed Control) do sterowania silnikiem (napęd pojazdu) oraz akumulator Lipo można zbudować jakiś zdalnie sterowany pojazd. Z drugiej strony, użycie Arduino daje dodatkowe możliwości. Na przykład, jak dotąd nie mam pojęcia jak można sterować dwoma silnikami, aby zmieniać kierunek bez użycia Arduino i mostka H (przez ustawianie różnych prędkości na silnikach). Kolejną zaletą jest możliwość użycia tańszego modułu NRF24L01+ zamiast kupowania kolejnego odbiornika RC do kolejnego pojazdu.
Specyfikacja
Nadajnik
- 3 kanały transmisji
- częstotliwość pracy 2,4GHz
- zasilanie 4 x 1.5V AA
- moc wyjściowa: poniżej 20dbm
- ostrzeżenie o niskim napięciu zasilania (mniej niż 4V)
- rozmiary: 225x135x75mm
- waga: 285g
- możliwość dodatkowej regulacji przepustnicy i kierunku, np.:
- regulacja przedziału zmian wartości
- odwrócenie kierunku zmian wartości
Odbiornik
- 3 kanały odbiorcze
- częstotliwość pracy: 2,4GHz
- zasilanie: 4.0 - 6.5V DC
- rozmiary: 30x18x13mm
- waga: 4g
W specyfikacji niestety nie pojawia się żadna wzmianka o zasięgu, co mnie dziwi, bo jest to istotna informacja. W wersji aplikacji mobilnej Aliexpress w zakładce Question List dla tego zestawu pytanie o zasięg pojawiało się wielokrotnie. Zwykle, odpowiedzi to 50 - 100m, raz nawet 500m. Podsumowując lepiej nie przekraczać granicy 100m między nadajnikiem a odbiornikiem, aby nie utracić zasięgu. Zwłaszcza, jeśli sterujemy łódką na dużym jeziorze ;)
Uruchomienie
Jak wspomniałem wcześniej, do uruchomienia skorzystałem z arduino podpiętego pod odbiornik RC. Program czyta wartości z pinów wyjściowych (sterujących) odbiornika. Są one oznaczone literką S na obudowie. Każdy kanał ma w sumie trzy wyjścia: sygnałowe, plus i minus zasilania, co umożliwia bezpośrednie podpięcie i sterowanie trzema serwami.Nie szukałem i nie mam natomiast pomysłu, co robi pin sterujący w rzędzie pinów zasilania.
Przykładowy kod zapożyczyłem z przykładu z artykułu "Reading Remote Control Receiver Values with Arduino" (1). W samym artykule jest jeszcze więcej informacji o temacie odbiorników RC oraz wyjaśnienie użytego niżej kodu. Jedyna zmiana to wycięcie 4-tego kanału z artykułu. Dodatkowo, aby nie dostać oczopląsu, przesyłam na terminal jedynie wartości z jednego kanału, a pozostałe dwa zakomentowałem.
Schemat połączeń |
Bez kręcenia gałkami na nadajniku otrzymałem następujące przedziały zmian wartości na poszczególnych wyjściach odbiornika w oparciu o powyższy przykład.
- CH1 - wartość odpowiada ustawieniu kierownicy
- skrajne lewe położenie: 864
- środek: 1420
- skrajne prawe: 2016
- CH2 - wartość odpowiada ustawieniu gazu/przepustnicy
- położenie spoczynkowe: 1500
- max gaz: 1736 (przepustnica ustawiona maksymalnie w dół w kierunku rękojeści)
- max wstecz: 1284 (przepustnica ustawiona maksymalnie w górę w kierunku od rękojeści)
- CH3 - stan przycisku AUX
- wyłączony: 1104
- włączony: 1968
Kręcenie gałkami ST. TRIM i TH. TRIM przesuwa przedziały wartości dla kanałów CH1 i CH2. Z kolei przełączniki ST (reverse switch steering) i TH (reverse switch throttle) na górze zmieniają/odwracają kierunek zmian wartości. To oznacza, że na przykład dla kierownicy zamiast obecnej zmiany wartości z lewo (864) do prawo (2016) wartości mogą się zmieniać równie dobrze z lewo (2016) do prawo (864) w zależności od ustawienia przełącznika ST.
#include <EnableInterrupt.h> #define SERIAL_PORT_SPEED 9600 #define RC_NUM_CHANNELS 3 #define RC_CH1 0 //koło kierunku => skrajne lewe położenie: 864 - środek: 1420 - skrajne prawe: 2016 #define RC_CH2 1 //przepustnica/gaz => położenie spoczynkowe: 1500, max gaz: 1736, max wstecz: 1284 #define RC_CH3 2 //przycisk AUX => wyłączony: 1104, włączony: 1968 #define RC_CH1_INPUT A0 #define RC_CH2_INPUT A1 #define RC_CH3_INPUT A2 uint16_t rc_values[RC_NUM_CHANNELS]; uint32_t rc_start[RC_NUM_CHANNELS]; volatile uint16_t rc_shared[RC_NUM_CHANNELS]; void rc_read_values() { noInterrupts(); memcpy(rc_values, (const void *)rc_shared, sizeof(rc_shared)); interrupts(); } void calc_input(uint8_t channel, uint8_t input_pin) { if (digitalRead(input_pin) == HIGH) { rc_start[channel] = micros(); } else { uint16_t rc_compare = (uint16_t)(micros() - rc_start[channel]); rc_shared[channel] = rc_compare; } } void calc_ch1() { calc_input(RC_CH1, RC_CH1_INPUT); } void calc_ch2() { calc_input(RC_CH2, RC_CH2_INPUT); } void calc_ch3() { calc_input(RC_CH3, RC_CH3_INPUT); } void setup() { Serial.begin(SERIAL_PORT_SPEED); pinMode(RC_CH1_INPUT, INPUT); pinMode(RC_CH2_INPUT, INPUT); pinMode(RC_CH3_INPUT, INPUT); enableInterrupt(RC_CH1_INPUT, calc_ch1, CHANGE); enableInterrupt(RC_CH2_INPUT, calc_ch2, CHANGE); enableInterrupt(RC_CH3_INPUT, calc_ch3, CHANGE); } void loop() { rc_read_values(); Serial.print("CH1:"); Serial.print(rc_values[RC_CH1]); Serial.print("\t"); //Serial.print("CH2:"); Serial.print(rc_values[RC_CH2]); Serial.print("\t"); //Serial.print("CH3:"); Serial.print(rc_values[RC_CH3]); Serial.print("\t"); delay(200); }
Otrzymane przedziały wartości można mapować na inne przedziały, np przekładające się na wypełnienie sygnału PWM sterującego mostkiem H i silniczkami. Opisywany tu nadajnik i odbiornik wykorzystałem w praktyce przy konstruowaniu zdalnie sterowanej łódki.
Źródła:
1) Reading Remote Control Receiver Values with Arduino
Brak komentarzy:
Prześlij komentarz