poniedziałek, 3 września 2018

Nadajnik i odbiornik RC GoolRC TG3 2.4GHz 3CH - obsługa odbiornika RC

Omawiany nadajnik jest przeznaczony do sterowania rozmaitymi pojazdami typu łódki, czy samochody. Mój wybór padł konkretnie na 3-kanałowy nadajnik GoolRC TG3 2.4GHz z racji na korzystny stosunek ceny do możliwości (koszt niewiele ponad 70zł na Aliexpress). Dodatkowo, w zestawie dołączony był jeszcze odbiornik RC. W artykule opisuję jak można odczytać dane odbierane przez odbiornik RC wysyłane z nadajnika. Dane te (sygnały) są przeznaczone do bezpośredniego sterowania serwami. Można je jednak z powodzeniem użyć do sterowania innymi urządzeniami, np. silniczkami DC.

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