Blinker für RC-Auto

simon97:
Später, wenn alles funktioniert, soll das ganze in dem RC-Fahrzeug über einen Multiswitch gesteuert werden. Dieser gibt wie ein Taster nur bei betätigung des entsprechenden Schalters auf der Fernbedienung ein Signal für den jeweilien Kanal aus.
Wenn der Blinker aus ist und gedrückt wird soll er angehen bis wieder gedrückt wird, dann geht er wieder aus.

OK, es kann jetzt sein, dass ich da etwas verwechselt habe, was für ein Signal Du später auswerten möchtest. Ich war davon ausgegangen, Du wolltest mit dem Arduino direkt am RC-Empfänger die Impulse auswerten und danach schalten. Offenbar möchtest Du aber tatsächlich zwischen RC-Empfänger und Arduino noch einen Multiswitch-Decoder dazwischenstecken, der Dir ein bereits decodiertes Signal liefert.

Ich finde es immer schön, wenn ein Programm nach dem EVA-Prinzip strukturiert wird:

  • Eingabe
  • Verarbeitung
  • Ausgabe

Da bei diesem Programm nicht viel zu tun ist, habe ich den Schritt "Verarbeitung" hier mal der "Eingabe" mit zugeschlagen.

Beispiel-Code (ungetestet) anbei.

// Blinker Demo by 'jurs' for German Arduino Forum
#define INPUT_TYPE INPUT_PULLUP  // INPUT oder INPUT_PULLUP
#define BLINKTAKT 500   // in Millisekunden
#define ENTPRELLZEIT 5  // in Millisekunden
byte tasteLinks=2;  // Pins für zwei Taster
byte tasteRechts=3;
byte blinkerLinks=12; // Pins für zwei Blink-LEDs
byte blinkerRechts=13;

boolean linksBlinken=false; // Blinker links gesetzt
boolean rechtsBlinken=false; // Blinker rechts gesetzt

void blinkEingabe()
{
  static unsigned long lastMillis=0;
  static boolean altTasteL=false;
  static boolean altTasteR=false;
  if (millis()-lastMillis<ENTPRELLZEIT) return;
  lastMillis=millis();
  boolean neuTasteL=digitalRead(tasteLinks);
  boolean neuTasteR=digitalRead(tasteRechts);
  if (INPUT_TYPE==INPUT_PULLUP) // vertauschte Tastenlogik bei PullUp
  {
    neuTasteL=!neuTasteL;
    neuTasteR=!neuTasteR;
  }
  if (neuTasteL==HIGH && altTasteL==LOW) linksBlinken=!linksBlinken;
  if (neuTasteR==HIGH && altTasteR==LOW) rechtsBlinken=!rechtsBlinken;
  altTasteL=neuTasteL;
  altTasteR=neuTasteR;
}

void blinkAusgabe()
{
  static unsigned long lastMillis=0;
  static boolean onTakt=false;
  static unsigned long diffMillis=0;
  unsigned long nowMillis=millis();
  diffMillis+=nowMillis-lastMillis;
  if (diffMillis>=BLINKTAKT)
  {
   diffMillis=0;
   onTakt=!onTakt;
   if (onTakt && linksBlinken) digitalWrite(blinkerLinks,HIGH);
   else digitalWrite(blinkerLinks,LOW);
   if (onTakt && rechtsBlinken) digitalWrite(blinkerRechts,HIGH);
   else digitalWrite(blinkerRechts,LOW);

   Serial.print(digitalRead(blinkerRechts));
   Serial.print(digitalRead(blinkerLinks));
   Serial.println();
  }
  lastMillis=nowMillis;
}


void setup() {
  Serial.begin(9600);
  pinMode(tasteLinks,INPUT_TYPE);
  pinMode(tasteRechts,INPUT_TYPE);
  pinMode(blinkerLinks,OUTPUT);
  pinMode(blinkerRechts,OUTPUT);
}

void loop() 
{
  blinkEingabe();
  blinkAusgabe();
}

Je nachdem, ob Du Deine Taster mit PullDown-Widerständen angeschlossen hast oder die internen PullUps des Atmega an den Tastern verwenden möchtest, kannst Du den INPUT_TYPE als entweder "INPUT" oder "INPUT_PULLUP" definieren, abhängig von Deiner Schaltung.

Beide Blinker werden übrigens unabhängig voneinander geschaltet, so dass sich Warnblinken schalten läßt, indem man sowohl den linken als auch den rechten Blinker einschaltet. Also diese Schaltlogik entspricht nicht der Straßenverkehrszulassungsordnung.

Die "Serial" Befehle habe ich übrigens nur zum Debuggen für die Programmentwicklung drin, um mir hier keine Taster und LEDs tatsächlich aufbauen zu müssen, die "Serial" Befehle kannst und solltest Du natürlich für das engültige Programm rauslöschen.