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.
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.
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)
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
Todos con valores similares, entre 1440 y 1850. Así podemos asignar estos controles a leds, servos, buzers,..