Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

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

RC-ontvanger PPM-signalen decoderen met Arduino: Stapsgewijze handleiding
RC-ontvanger PPM-signalen decoderen met Arduino: Stapsgewijze handleiding

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

RC-ontvanger PPM-signalen decoderen met Arduino: Stapsgewijze handleiding

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

  1. Je huis temperatuur monitoren met een Raspberry Pi-dashboard
  2. Een DTMF-decoder bouwen met alleen een Arduino – Geen extra IC's nodig
  3. Bouw een indrukwekkend monitor Ambilight-systeem met Arduino
  4. Bouw een Ultrasonische Zweefapparaat met Arduino – Stap-voor-stap Handleiding
  5. Atmel AT89-serie moeiteloos programmeren met Arduino Uno – Stapsgewijze handleiding
  6. Een slimme voltmeter bouwen met Arduino en smartphone – Eenvoudig DIY-project
  7. Real-time IoT hartslagmonitor met Arduino en MAX30100
  8. Arduino Uno WiFi Webserver: LED aan/uit schakelen via browser
  9. Slimme Parkeer Teller: Real-time Voertuigvolging met Arduino, Processing en PHP
  10. Real-time hartslag LED-visualisator aangedreven door ECG
  11. Bouw een geautomatiseerde Google Chrome Dino Game met Arduino