Leyendo la emisora Turnigy 9x

mready-01_1__4

Una señal PPM (Pulse Position Modulation) integra todos los canales del receptor y emisor en una sola señal. Así usando sólamente un pin podemos leer los 9 canales de la radio.

La idea es leer las señales de radio con un Arduino.

 

Los transmisores de radio suelen tener dos modos: PPM (Pulse Position Modulation) y PCM (Pulse Code Modulation). Pondremos la emisora en modo ACRO (sin mezclas),  sin TRIM,  no DUAL-RATE y tampoco EXPONENCIAL. Esto es para que las lecturas del equipo no se vean distorsionadas por el software de la emisora.

reciver radio 2.4 GHZ 8Ch V2 cuadricoptero quadrocopter tunirgy
 

La señal PPM del receptor Turnigy 9X 8CH V2 no se puede obtener en ningún sitio de la placa Arduino. Ya que este cuenta con dos micros, uno receptor y el otro decodificador, los cuales se comunican por SPI.

La solución es leer los canales de salida que ya ha separado el receptor. Se corresponden a señales PWM, tantas como canales tiene la emisora. Son las señales que van hacia los servos o los ESC’s de los motores. La ventaja es la no invasión del receptor. Desventaja que tenemos que usar en Arduino tantas entradas digitales como canales tiene la emisora.

Para comprobar la recepción de señal, conectamos las salidas del receptor (8 canales) a nuestro Arduino, solo los canales CH0, CH1, CH2 y CH3 están por defecto programados, los canales CH5,6,7,8 se asignan a diferentes funciones desde el mando.

Con el siguiente programa podemos comprobar los valores recibidos, los pines de lectura serán del 2 al 5

Lector PPM básico Arduino

#define channumber 4 // numero de canales
int channel[channumber]; // Valores de canales leidos

int PPM1 = 2; // nuestro pin de lectura
int PPM2 = 3; // nuestro pin de lectura
int PPM3 = 4; // nuestro pin de lectura
int PPM4 = 5; // nuestro pin de lectura

void setup(){
Serial.begin(9600); //Iniciamos la consola Serial
for(int i = 2; i<=5; i++)
pinMode(i, INPUT);
}

void loop(){
//Espera la senal de sincronización, debe ser > 4 milisegundos
if(pulseIn(PPM1 , HIGH) > 4000){
for(int i = 0; i < channumber; i++){ //lee los pulsos
channel[i]=pulseIn(i+2, HIGH);
}
for(int i = 1; i <= channumber; i++){ //Imprime los valores
Serial.print("CH");
Serial.print(i); // Numero del canal
Serial.print(": ");
Serial.println(channel[i-1]); // Imprime el valor recibido
}
delay(200);
}
}

Los canales en el modo 2 de la emisora corresponden a los siguientes rango de valores:

  • Roll -> canal 1 (CH1):   valores de 1040 (izquierda) a 1850 (derecha)
  • Pitch -> canal 2 (CH2): valores de 1040 (abajo) a 1850 (arriba).
  • Gaz -> canal 3 (CH3):   valores de 1040 (abajo) a 1850 (arriba).
  • Yaw -> canal 4 (CH4):  valores de 1040 (izquierda) a 1850 (derecha)

Captura de pantalla 2023-06-30 a las 6.15.26

Lector PPM básico con filtro Antisalto:

#define channumber 4 // número de canales
#define filter 6 // Filtro anti salto

int channel[channumber]; // Valores de canales
int lastReadChannel[channumber]; //Ultima lectura obtenida
int conta=0;

int PPM1 = 2; // nuestro pin de lectura
int PPM2 = 3; // nuestro pin de lectura
int PPM3 = 4; // nuestro pin de lectura
int PPM4 = 5; // nuestro pin de lectura

void setup(){
Serial.begin(9600); //Iniciamos la consola Serial
for(int i = 2; i<=5; i++)
pinMode(i, INPUT);
}

void loop(){
if(pulseIn(2, HIGH) > 4000){
for(int i = 0; i < channumber; i++){
channel[i]=pulseIn(i+2, HIGH);
}
for(int i = 0; i < channumber; i++){
if((channel[i] > 2000) || (channel[i] <100)){
channel[i]= lastReadChannel[i];
}
else{
channel[i]=(lastReadChannel[i]+channel[i])/2;
conta++; }
}
}
if(conta > filter){
for(int i = 0; i < channumber; i++){
Serial.print("CH");
Serial.print(i+1);
Serial.print(": ");
Serial.println(channel[i]);
lastReadChannel[i]=channel[i];
}
delay(200);
conta=0;
}
}

Para el resto de canales, la correspondencia que se puede asignar es:

  • Hov Pit
  • Hov Thro
  • Pit Trim
  • Thro Hold
  • Gear

controles

Todos con valores similares, entre 1440 y 1850. Así podemos asignar estos controles a leds, servos, buzers,..