Decodifica señales PPM de receptor RC con Arduino: Guía paso a paso
Componentes y suministros
- Arduino UNO × 1
Aplicaciones y servicios en línea
- Arduino IDE
Sobre el proyecto
Un transmisor RC es muy adecuado para proyectos que requieren un enlace inalámbrico, ya que tiene enlaces encriptados con buen alcance.
Todos los receptores RC están hechos para accionar servomotores. Por eso tienen 3 pines por canal: masa, Vcc y señal. Aquí se usa un tipo especial de señal: envía pulsos a intervalos regulares. Cuando el servo recibe un pulso de 1,5 ms se sitúa a 90°, y variando este valor entre 1‑2 ms el servo va a su mínimo y máximo. (En la foto superior se muestra un receptor de 6 canales con pin PPM).
El método fácil sería medir el ancho de pulso en cada pin y mapear esos datos según necesidad. Pero hay dos problemas:
- Para cada canal del receptor necesitaríamos conectar un cable a un pin de Arduino. Esto no solo requiere muchas conexiones sino que consume muchos pines.
- La mayoría de Arduino solo tienen 2 pines de interrupción; si usamos más de 2 canales hay que añadir retardos al código, lo que puede ser problemático para algunas aplicaciones.
Para resolver esto, muchos receptores traen un pin extra llamado PPM. Este pin PPM transmite los datos de todos los canales en una única señal.
Cómo se compone la señal del pin PPM


Esta señal consiste en paquetes de datos separados por espacios en blanco. El espacio entre picos representa el valor del canal. En este caso usé un receptor de 6 canales, así que hay 7 pulsos.
En nuestro código primero debemos detectar el espacio de separación y luego empezar a registrar datos de los pulsos para cada canal.
Como se ve en la segunda imagen, todos los datos están separados por aproximadamente 11500 microsegundos. Después vienen los 6 valores, uno por canal.
Uso del código

La función read_me() se ejecuta en la interrupción (pin 2 o 3) y toma 15 valores de tiempo almacenándolos en un array.
a = micros();
c = a - b;
b = a;
x[i] = c;
i = i + 1;
if (i == 15) {
for (int j = 0; j < 15; j++) { ch1[j] = x[j]; }
i = 0;
}
La función read_rc() busca cualquier espacio superior a 10000 microsegundos (el espacio de separación), y al detectarlo pasa a la siguiente sección. Tras este espacio, los siguientes 6 valores corresponden a cada posición de canal, almacenados en el array ch[1] … ch[6].
Código
unsigned long int a, b, c;
int x[15], ch1[15], ch[7], i;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), read_me, FALLING); // interrupción en pin 2
}
void loop() {
read_rc();
Serial.print(ch[1]); Serial.print("\t");
Serial.print(ch[2]); Serial.print("\t");
Serial.print(ch[3]); Serial.print("\t");
Serial.print(ch[4]); Serial.print("\t");
Serial.print(ch[5]); Serial.print("\t");
Serial.print(ch[6]); Serial.print("\n");
delay(100);
}
void read_me() {
// Lee valor del receptor RC desde pin PPM (pin 2 o 3)
// Da valores de canal 0‑1000
a = micros(); // almacena tiempo cuando pin cae
c = a - b; // calcula tiempo entre dos picos
b = a;
x[i] = c; // almacena 15 valores en array
i = i + 1;
if (i == 15) {
for (int j = 0; j < 15; j++) { ch1[j] = x[j]; }
i = 0;
}
// copia todos los valores del array temporal a otro array tras 15 lecturas
}
void read_rc() {
int i, j, k = 0;
for (k = 14; k > -1; k--) {
if (ch1[k] > 10000) { j = k; }
} // detecta espacio de separación 10000 µs en el otro array
for (i = 1; i <= 6; i++) {
ch[i] = (ch1[i + j] - 1000);
} // asigna 6 valores de canal tras el espacio de separación
}
Proceso de manufactura
- Monitoriza la temperatura de tu casa con un panel Raspberry Pi
- Construye un Decodificador DTMF Solo con Arduino – Sin CI Externos
- Crea un Impresionante Sistema Ambilight para Monitor con Arduino
- Construye un Dispositivo de Levitación Ultrasónica con Arduino – Guía Paso a Paso
- Programa fácilmente la serie Atmel AT89 con Arduino Uno – Guía paso a paso
- Construye un Voltímetro Inteligente con Arduino y Smartphone – Proyecto DIY Fácil
- Monitor de Frecuencia Cardíaca IoT en Tiempo Real con Arduino y MAX30100
- Servidor Web Arduino Uno WiFi: Controla un LED desde el Navegador
- Contador Inteligente de Plazas de Aparcamiento: Seguimiento en Tiempo Real con Arduino, Processing y PHP
- Visualizador LED de Latidos en Tiempo Real con ECG
- Automatiza el Juego del Dinosaurio de Chrome con Arduino y Python