Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

RC-Empfänger PPM-Signal mit Arduino auslesen – Schritt-für-Schritt

Komponenten

Bauteil Anzahl
Arduino UNO (oder Nano/Pro Mini) 1
RC-Empfänger mit PPM-Ausgang (z. B. 6-Kanal) 1

Software

Grundlagen: PPM-Signal

Ein klassischer RC-Empfänger gibt pro Kanal ein separates PWM-Signal (1–2 ms Pulsweite, 20 ms Periode) aus. Das erfordert pro Kanal einen Arduino-Pin und bei vielen Kanälen mehr Interrupts, als der AVR bietet (nur 2 Hardware-Interrupts beim ATmega328P).

Lösung: Viele Empfänger bieten einen PPM-Ausgang (Pulse Position Modulation): Ein einziges Signal, das alle Kanäle nacheinander in einem Frame überträgt.

PPM-Frame-Aufbau

RC-Empfänger PPM-Signal mit Arduino auslesen – Schritt-für-Schritt RC-Empfänger PPM-Signal mit Arduino auslesen – Schritt-für-Schritt

Auswerte-Algorithmus (Interrupt-basiert)

  1. Interrupt an Pin 2 (INT0) auf fallende Flanke (Ende jedes Pulses).
  2. Im ISR: Zeit seit letzter Flanke messen (micros()) → in Array speichern (15 Werte Puffer).
  3. Im Hauptloop: Nach Pause > 10.000 µs suchen (Sync-Lücke).
  4. Die folgenden 6 Werte = Kanal 1–6 (minus 1000 µs Offset → 0–1000 Skala).

Arduino-Code (Komplett)

unsigned long 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();
  for (int k = 1; k <= 6; k++) {
    Serial.print(ch[k]);
    Serial.print('\t');
  }
  Serial.println();
  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 j = -1;
  for (int k = 14; k >= 0; k--) {
    if (ch1[k] > 10000) { j = k; break; }
  }
  if (j >= 0) {
    for (int k = 1; k <= 6; k++) {
      int idx = (j + k) % 15;
      ch[k] = ch1[idx] - 1000; // 0..1000
    }
  }
}

Erklärung der Funktionen

read_me() (ISR)

read_rc() (Main Loop)

Anwendung & Tipps

Erweiterungsmöglichkeiten

Herstellungsprozess

  1. Heimtemperatur mit Raspberry Pi Dashboard überwachen
  2. DTMF-Decoder mit Arduino bauen – ganz ohne zusätzlichen IC
  3. Monitor-Ambilight selbst bauen mit Arduino Nano & WS2812B LEDs
  4. Ultraschall-Schwebegerät mit Arduino bauen – Akustische Levitation Schritt für Schritt
  5. ATmel AT89-Serie mühelos mit Arduino Uno programmieren – Schritt-für-Schritt-Anleitung
  6. Intelligentes Voltmeter mit Arduino & Smartphone bauen – Einfaches DIY-Projekt
  7. Echtzeit-IoT-Herzfrequenzmonitor mit Arduino & MAX30100
  8. Arduino UNO WiFi Webserver: LED per Browser steuern
  9. Intelligenter Parkplatzzähler: Echtzeit-Fahrzeugverfolgung mit Arduino, Processing & PHP
  10. Echtzeit-Herzschlag-LED-Visualisierung per EKG