¿Qué diferencias hay entre leer la radio mediante PPM o mediante las señales de los servos?
Según Jordi Muñoz, Rendimiento y simplicidad en el código son los motivos para leer en PPM y no en PWM.
Una señal PPM (Pulse Position Modulation) integra todos los canales del receptor/emisor en una sola línea. Así usando sólamente un pin podemos leer los 8 canales de la radio. (Menos cables=menos problemas.)
La idea es leer las señales de radio con un Arduino auxiliar y mandar los datos de radio ya leídos e interpretados por SPI o i2C al Arduino principal.
Si desmontamos el receptor, desechando la carcasa y los pines (10x3= 30 pines) ahorramos alrededor del 70 % del peso. Que no es mucho en este caso,además también ahorra espacio.
click en la imagen para agrandar. |
En el receptor Turnigy 9X 8CH V2 no se puede obtener en ningun sitio de su placa la señal PPM. Ya que este cuenta con dos micros, uno receptor y el otro decodificador, los cuales se comunican por SPI. Aquí una lista de como hackear receptores para sacar la señal PPM enlace.
Si no sabemos donde está nuestra señal PPM podemos cargar este programa (de Jordi) e ir comprobando todos los pines con el Serial Monitor hasta ver valores aleatorios de entre 300 y 9000, lo que significará que ya hemos encontrado el pin PPM. No olvidar interconectar las tierras del receptor y arduino!!
void setup() { Serial.begin(57600); pinMode(3, INPUT); } void loop() { Serial.println(pulseIn(3, LOW)); }
Los programas usados fueron creados por Jordi Muñoz y subidos al blog de Arduino el 1 de Enero de 2008.
#define channumber 6 //Cuantos canales tiene tu radio?/How many channels have your radio? int channel[channumber]; //Valores de canales leidos/ readed Channel values int PPMin = 4; void setup() { Serial.begin(9600); //Iniciamos com serial/ pinMode(PPMin, INPUT); //Patita 4 como entrada / Pin 4 as input } void loop() { //Espera hasta que la senal de sincronizacion llegue, debe ser > 4 milisegundos //waits ultil synchronize arrives > 4 miliseconds if(pulseIn(PPMin , HIGH) > 4000); //Si el pulso del pin 4 es > que 4 msegundos continua /If pulse > 4 miliseconds, continues { for(int i = 1; i <= channumber; i++) //lee los pulsos de los demas canales / Read the pulses of the remainig channels { channel[i-1]=pulseIn(PPMin, HIGH); } for(int i = 1; i <= channumber; i++) //Imprime los valores de todos los canales / Prints all the values readed { Serial.print("CH"); //Canal/Channel Serial.print(i); // Numero del canal / Channel number Serial.print(": "); // que te importa Serial.println(channel[i-1]); // Imprime el valor/ Print the value } delay(200);//Le da tiempo para imprimir los valores en el puerto/ Give time to print values. } } Lector PPM básico con filtro Antisalto:
#define channumber 6 //Cuantos canales tiene tu radio???????/How many channels have your radio??? #define filter 10 // Filtro anti salto/ Glitch Filter int channel[channumber]; //Valores de canales leidos/ readed Channel values int lastReadChannel[channumber]; //Ultima lectura obtenida/ Last values readed int conta=0; //Contador/couter void setup() { Serial.begin(9600); //Iniciamos com serial/ Serial Begin pinMode(4, INPUT); //Patita 4 como entrada / Pin 4 as input pinMode(13, OUTPUT); // Led pin 13 } void loop() { if(pulseIn(4, HIGH) > 3000) //Si el pulso del pin 4 es > 3000 usegundos continua /If pulse > 3000 useconds, continues { for(int i = 0; i <= channumber-1; i++) //lee los pulsos de los canales / Read the pulses of the channels { channel[i]=pulseIn(4, HIGH); } for(int i = 0; i <= channumber-1; i++) //Promedia los pulsos/Average the pulses { if((channel[i] > 2000) || (channel[i] <100))//Si se pasa del rango envia ultimo pulso/ If channel > max range, chage the value to the last pulse { channel[i]= lastReadChannel[i]; } else { channel[i]=(lastReadChannel[i]+channel[i])/2; //Promedio el pulso pasado con el nuevo pulso/Average the last pulse eith the current pulse conta++; //Incrementa el contador/ increment counter } } } if(conta > filter)//Si el contador es mayor al filtro imprime valores/ If counter is > than filter, then prints values { for(int i = 0; i <= channumber-1; i++) //Ciclo para imprimir valores/Cycle to print values { Serial.print("CH"); //Canal/Channel Serial.print(i+1); // Numero del canal / Channel number Serial.print(": "); // que te importa Serial.println(channel[i]); lastReadChannel[i]=channel[i]; } if(channel[4] > 1000) //si el canal 5 tiene un rango mayor a 500 enciende el LED/ If channel 5 is > than 500 turn on the led { digitalWrite(13, HIGH); } else { digitalWrite(13, LOW);//Si no lo apaga/If not turn it off } delay(400); //Delay conta=0;//Reinicia el contador/ Restart couter. } }
PPM and PWM are two different protocols for radio information. The PPM has the advantage that you can get all the channels information through one port only. Some call it PPM sum since it’s the sum of all channels. That helps a lot when you have limit number of connectors to your flightcontroller. So I will use PPM into my flight controller, and then the flight controller will use PWM outputs to the ESCs and to the servos for the camera mount.
By using the PPM input, I can now use 10 PWM outputs from my Open Pilot Copter Control instead of 6 PWM outputs. That is for obvious reasons essential for me, because my camera mount needs two servo outputs plus the 6 ESC outputs.
No hay comentarios:
Publicar un comentario