RC-ontvanger PPM-signalen decoderen met Arduino: Stapsgewijze handleiding
Onderdelen en benodigdheden
- Arduino UNO (1×)
Apps en online services
- Arduino IDE
Over dit project
Een RC-zender is ideaal voor projecten die een draadloze link nodig hebben (versleuteld, goede bereik). Een standaard RC-ontvanger stuurt servos aan via pulsbreedte-modulatie (1–2 ms puls, 1,5 ms = neutraal). Het nadeel: elke kanaal vereist een aparte draad en Arduino-pin, en de meeste Arduino's hebben maar 2 interrupt-pins.
De oplossing: veel ontvangers hebben een PPM-pin die alle kanalen in één signaal uitzendt (Pulse Position Modulation).
Hoe het PPM-signaal samengesteld is


Het signaal bestaat uit datapakketten gescheiden door een pauze (~11.500 µs). Een 6-kanaals ontvanger levert 7 pulsen: 1 sync-pauze + 6 kanaalwaarden. De tijd tussen pulsen vertegenwoordigt de kanaalwaarde.
De code gebruiken

De code gebruikt een interrupt op pin 2 (FALLING flank) om 15 tijdswaarden te vangen in een array. Vervolgens zoekt read_rc() de pauze >10.000 µs (sync), en de daaropvolgende 6 waarden zijn de kanaalposities (opgeslagen in ch[1]..ch[6]). Waarden worden genormaliseerd door 1000 µs af te trekken (1000–2000 µs → 0–1000).
Code
Volledige sketch voor 6-kanaals PPM-ontvangst:
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);
}
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() {
a = micros();
c = a - b;
b = a;
x[i] = c;
i++;
if (i == 15) {
for (int j = 0; j < 15; j++) ch1[j] = x[j];
i = 0;
}
}
void read_rc() {
int i, j, k = 0;
for (k = 14; k > -1; k--) {
if (ch1[k] > 10000) { j = k; }
}
for (i = 1; i <= 6; i++) {
ch[i] = (ch1[i + j] - 1000);
}
}
Let op: De code verwacht een 6-kanaals ontvanger met ~11,5 ms sync-pauze. Pas de drempel (10000) en array-grootten aan voor andere ontvangers.
Productieproces
- Je huis temperatuur monitoren met een Raspberry Pi-dashboard
- Een DTMF-decoder bouwen met alleen een Arduino – Geen extra IC's nodig
- Bouw een indrukwekkend monitor Ambilight-systeem met Arduino
- Bouw een Ultrasonische Zweefapparaat met Arduino – Stap-voor-stap Handleiding
- Atmel AT89-serie moeiteloos programmeren met Arduino Uno – Stapsgewijze handleiding
- Een slimme voltmeter bouwen met Arduino en smartphone – Eenvoudig DIY-project
- Real-time IoT hartslagmonitor met Arduino en MAX30100
- Arduino Uno WiFi Webserver: LED aan/uit schakelen via browser
- Slimme Parkeer Teller: Real-time Voertuigvolging met Arduino, Processing en PHP
- Real-time hartslag LED-visualisator aangedreven door ECG
- Bouw een geautomatiseerde Google Chrome Dino Game met Arduino