• Die Forumsregeln und Nutzungsbedingungen findet ihr in der Navbar unter Impressum !
    Bitte unbedingt beachten!
    Wie überall im Leben gibt es Spielregeln, so auch hier!
    Die Datenschutzerklärung zum DSGVO findet ihr ebenfalls in der Navbar unter Datenschutzerklärung !
    Hinweis nach DSGVO :
    Es ist hier keinerlei Angabe erforderlich. Alle Angaben in diesem Bereich sind öffentlich sichtbar und werden freiwillig gemacht. Mit einem Eintrag in diesem Bereich erkenne ich dieses an, und bestätige die Datenschutzerklärung zur DSGVO für das Forum gelesen zu haben.

    Danke
  • Hallo Gast, beschränke dich hier bitte auf den Bereich der Elektronik. Die Fahrzeuge oder Gebäude, wo diese Elektronik eingebaut wird bitte in dem passenden Fachbereiich behandeln. Auch wenn Teile des Projektes dadurch im Forum doppelt vorhanden sind! Danke.

Arduino Lichtmodul mit vielen Funktionen, realer Blinker, verzögerungsabhängigem Bremslicht..

Winni

Unterstützt neuen Softwarekauf 2023
Administrator
VIP Unterstützt modelltruck.net 2024
Registriert
19.11.2002
Beiträge
16.503
Zu dem Thema von Bert -Lichtmodul mit Blinker, Bremslicht und Rückfahrwarner- kann ich auch noch was beitragen,
sofern Peter (Gismow) zustimmt, da die Interruptroutine aus Bequemlichkeit von Ihm übernommen wurde.
Mein Code erhebt aber keinen Anspruch auf die ideale Codeversion. Ich bin auch nicht der absolute Profi im Programmieren!
Es handelt sich um eine Version mit folgenden Leistungsmerkmalen.

//-------------Lichtanlage; Programm für den Bulli T2 und VW-Delivery ------------------------------------------------
//
// Werte ausgelegt für Fernsteuerung Multiplex Flex und Lichtanlage auf Arduino Pro Mini ATmega 328 (5V 16MHz)
// Funktionen:
// ----------------------------------------------------------------------------------------------------------------
  • Empfängereingang für Kanal 1 Lenkung, (Zur Blinklichtabschaltungsüberwachung).
  • Empfängereingang für Kanal 2 Gas, für Bremslicht und Rückfahrscheinwerfer Betätigung
  • Empfängereingang für Kanal 4 Beleuchtungen, Zum Betätigen von Standlicht, Fahrlicht, Blinklicht, Warnblinklicht,
    Rundumlicht und Arbeitsscheinwerfern.
  • Blinklicht rechts - links mit Fahrhebel Kanal 4 nach rechts und links ein- und ausschaltbar. Tippfunktion unter 1 Sek. Dauer.
  • Blinklicht Seite bei eingeschaltetem Blinklicht wechselbar. Tippfunktion unter 1 Sek. Dauer.
  • Blinklicht nur durch Blinkerhebel oder Lenkungsrückstellung (wie beim original PKW) ausschaltbar.
    Dazu muss ein Mindestrückstellwert in Richtung geradeaus erfolgen. Bei kleineren Lenkausschlägen bleiben die
    Blinker an.
  • Warnblinkanlage schaltet keine Blinkereinstellung ab. Der Blinkerstatus wird beim Einschalten
    der Warnblinkanlage gespeichert, und nach dem Ausschalten wiederhergestellt.
  • Warnblinkanlage mit Fahrhebel Kanal 4 mehr als 1,0 Sekunden nach links halten jeder Zeit einschaltbar.
  • Warnblinkanlage ausschalten durch erneutes 1,0 Sekunden langes Betätigen des Fahrhebels Kanal 4 nach links.
  • Standlicht als Kombination in einer LED mit dem Fahrlicht oder als eigene LED mit dem Rücklicht anschließbar.
  • Stand- und Rücklicht mit Fahrhebel Kanal 4 mehr als 1,0 Sekunden nach rechts halten jeder Zeit einschaltbar.
  • Fahr- und Rücklicht mit Fahrhebel Kanal 4 mehr als 2,0 Sekunden nach rechts halten jeder Zeit einschaltbar.
  • Fahrlicht ausschalten durch erneutes 1,0 oder 2,0 Sekunden langes Betätigen des Fahrhebels Kanal 4 nach rechts. Standlicht wird eingeschaltet.
  • Stand- und Rücklicht ausschalten durch erneutes 1,0 Sekunden langes Betätigen des Fahrhebels Kanal 4 nach rechts.
  • Realistischer Rückfahrscheinwerfer. Der Rückfahrscheinwerfer geht an sobald der Gas Hebel (Kanal 2) auf Rückwärtsfahrt gezogen wird.
  • Der Rückfahrscheinwerfer geht erst dann wieder aus, wenn der Gashebel in Stellung Vorwärtsfahrt bewegt wird,
    oder mehr als 7 Sekunden in Neutralstellung steht.
  • Bremslicht sowohl als separate LED für das Bremslicht als auch mit einer LED in Kombination mit dem Rücklicht anschließbar.
  • Alle Bremslichtfunktionen funktionieren sowohl bei Vor- als auch bei Rückwärtsfahrt.
    Das Bremslicht wird eingeschaltet, wenn innerhalb einer festgelegten kurzen Zeit ein bestimmter Wert an Gas schnell zurückgenommen wird.
    (Ruckartiges Gas weg nehmen)
    Langsames Gas weg nehmen betätigt dagegen kein Bremslicht.
    Zittern mit dem Gashebel in einer Fahrstellung oder kurze Impulsschwankungen die zu Bremslichtfunktionen führen werden unterdrückt.
    Führt ruckartiges Gas weg nehmen zu einer Bremslichtfunktion bleibt das Bremslicht mindestens 200 Millisekunden an,
    um zu einem sichtbaren Effekt zu führen.
    Erreicht der Gashebel die Neutralstellung wird immer das Bremslicht eingeschaltet. Es sei denn, man nimmt extrem langsam das Gas weg
    (Ausrollfunktion). Wenn der Gashebel 5 Sekunden in Neutralstellung steht, wird das Bremslicht wieder abgeschaltet.
    Wird Der Gasknüppel aus der Neutralstellung in eine Fahrtstellung gebracht wird das Bremslicht sofort wieder ausgeschaltet.
  • Arbeitsscheinwerfer durch mit Fahrhebel Kanal 4 mehr als 3 Sekunden nach rechts halten jeder Zeit einschaltbar.
  • Arbeitsscheinwerfer durch mit Fahrhebel Kanal 4 mehr als 3 Sekunden nach rechts halten jeder Zeit ausschaltbar.
  • Rundumlicht oder andere Funktion mit Fahrhebel Kanal 4 mehr als 2 Sekunden nach links halten jeder Zeit einschaltbar.
  • Rundumlicht oder andere Funktion ausschalten durch erneutes 2 Sekunden langes Betätigen des Fahrhebels Kanal 4 nach links.
  • Automatisches Einschalten von Rundumlicht und Arbeitsscheinwerfer durch andere Modellfunktionen. Schalteingang -5 Volt.
    //------------------------------------------------------------------------------------------------------------------
    // Betriebs- und Anschlusshinweise
    //------------------------------------------------------------------------------------------------------------------
  • Die Lichtplatine wird mit 5 Volt Versorgungsspannung betrieben und der Minuspol muss mit dem Minuspol des Akkus verbunden sein!
    Der maximale Ausgangsstrom je Ausgang beträgt 40 mA !!!! Bei höherer Belastung Treiber benutzen!!
  • Das Modul schalet grundsätzlich die Ausgänge Aktiv-Minus - Verbraucher - gegen Plus.
  • Scheinwerfer-LED werden in Reihe geschaltet und müssen mit passenden Vorwiderständen Zur Akkuspannung versehen werden.
  • Standlicht-LED vorne werden in Reihe geschaltet und müssen mit passenden Vorwiderständen Zur Akkuspannung versehen werden.
  • Alle Licht-LED brauchen den passenden Vorwiderstand für 20 mA (volle Helligkeit)
    Die Helligkeit von Stand- und Rücklicht werden über PWM-Signal gesteuert.
  • Die Blinklicht-LED können durch höhere Widerstandswerte in der Helligkeit angepasst werden.
  • Die Blinklicht-LED sollten vordere und hintere in Reihe geschaltet werden. So ergibt sich je Blinkerseite ein Strom von 20 mA.
    Und so ist es möglich auch noch einen Anhänger mit Blinklichtstrom zu versorgen.
  • Die kombinierten Rück- und Bremslichter werden ebenfalls in Reihe geschaltet.
  • Separate Rücklichter (in Reihe geschaltet) lassen sich mit dem Standlichtausgang zusammenschalten.
    Allerdings steht dann kein Ausgang mehr für Anhängerrücklicht zur Verfügung.
    Soll ein Anhänger angeschlossen werden, ist es sinnvoll sowohl Anhänger als auch Zugfahrzeug mit kombiniertem Rück- und Bremslicht zu versehen.
    //-----------------------------------------------------------------------------------------------------------------
    // Anschluss Belegungen
    //-----------------------------------------------------------------------------------------------------------------
  • Pin 2 Eingang wo das Empfängersignal eingelesen wird! Für RC-Kanal 2 Interrupt (Gas)
  • Pin 3 Eingang wo das Empfängersignal eingelesen wird! Für RC-Kanal 4 Interrupt (Licht)
  • Pin 4 Ausgang für Rückfahrscheinwerfer (max.40 mA)
  • Pin 5 Ausgang für Bremslicht und Rücklicht mit PWM (max.40 mA)
  • Pin 6 Ausgang für Fahrlicht (max.40 mA)
  • Pin 7 Eingang für externe RKL-Einschaltung
  • Pin 8 Eingang Lenkkanal-Impulse (pulseIn)
  • Pin 9 Ausgang für separates Standlicht (max.40 mA)
  • Pin 10 Ausgang Blinker links (max.40 mA)
  • Pin 11 Ausgang Blinker rechts (max.40 mA)
  • Pin 12 Ausgang Rundumkennleuchte bei Bedarf oder andere Funktion (max.40 mA)
  • Pin 13 Ausgang für Arbeitsscheinwerfer (max.40 mA) und Arduino-interne LED (aktiv HIGH)
    //-----------------------------------------------------------------------------------------------------------------

Der Code folgt hier erst nach dem Einverständnis von Peter.
 
Ausgangsstrom auf 500mA erhöhen

Hallo,

genau so ein Programm suche ich!

Dazu kann ich noch folgendes ergänzen: Es gibt einen 16-Pin Verstärker (ULN 2803A STM), mit dem man dann pro Ausgang 500mA schalten kann. Damit sollten alle Stromprobleme erledigt sein. Dann kann man auch auf die Reihenschaltung der LED's an der Zugmaschine verzichten und den Anhänger ebenfalls zusätzlich parallel (wie im echten Leben) anschließen.

Viele Grüße
Holger
 
Moin Winni,

genau dazu habe ich ja den Code veröffentlicht, damit andere ihn nutzen können.... ;)

Ich bin sehr gespannt auf dein Programm und deine Ansätze eine Lichtanlage zu realisieren.

ich hatte auch mal begonnen eine Lichtanlage zu programmieren, das Projekt ist jedoch eingeschlafen.

BTW: Ich nutze gerne einen 337er Transistor um mehr als eine LED pro Ausgang zu schalten. Der Steuerpin wird über einen 1K Widerstand an den Pin gelegt. Es funktioniert prima, damit schalte ich z. B. auch die Eingänge des Beier auf Masse um bei meiner Fahrplatine das Brems- und das Rückfahrlicht zu steuern.
 
Danke für die Info Peter.
Ich werde den Code jetzt mal hier einstellen.
Dauert einen Moment. Ich muss erst mehrere Teile zusammensetzen.
 
So, hier kommt der Code.
Der Code besteht der Übersichtlichkeit halber aus 16 Programmroutinen. Diese müssen alle hintereinander kopiert werden und zusammen als ein Code auf den Arduino hochgeladen werden. Bis auf die letzten 4 Teile ist alles dokumentiert. (Eventuell reiche die Dokumentation ja später noch nach) Wie schon gesagt, ich erhebe keinen Anspruch darauf, dass das ideal programmiert ist.

Ich wünsche viel Spaß beim Ausprobieren und der Benutzung.
Wenn es gefällt, wäre ein wenig Feedback ganz nett.
Für Fragen stehe ich jeder Zeit zur Verfügung. Und für Verbesserungen bin ich dankbar.
Wenn den Code jemand verbessert, oder ändert, erwarte ich, dass er das hier auch veröffentlicht und somit den Modellbaukollegen zur Verfügung stellt.



Den Code kann und darf jeder für sich ändern, solange es eine private Nutzung ist. Der Code wurde nur zum Einsatz in privaten Modellfahrzeugen erstellt. Jede andere Nutzung ist widerrechtlich. Gewerbliche Nutzung des Codes ist untersagt und wird rechtlich verfolgt. Eine gewerbliche Nutzung ist nur gegen Lizenzgebühr möglich. Es wird keine Haftung für Folgeschäden welche sich aus der Nutzung des Codes ergeben könnten übernommen. Der Einsatz erfolgt auf eigene Gefahr und eigenes Risiko. Eine Veröffentlichung in anderen digitalen oder Printmedien außerhalb dieses Forums ist nicht gestattet. Mit der Nutzung diese Codes erklärt sich der Nutzer hiermit einverstanden.
Code:
//-------------Lichtanlage; Programm für den Bulli T2 und andere RC Fahrzeuge 
//
//    Werte Ausgelegt für Multiplex Flex und Arduino Pro Mini At-Mega 328 (5V, 16 MHz)
//    Funktionen:
//    -----------
//    * Empfängereingang für Kanal 1 Lenkung, Zur Blinklichtabschaltungsüberwachung.
//    * Empfängereingang für Kanal 2 Gas, für Bremslicht und Rückfahrscheinwerfer Betätigung
//    * Empfängereingang für Kanal 4 Beleuchtungen, Zum Betätigen von Standlicht, Fahrlicht, Blinklicht, Warnblinklicht,
//      Rundumlicht und Arbeitsscheinwerfern.
//    * Blinklicht rechts - links mit Fahrhebel Kanal 4 nach rechts und links ein- und ausschaltbar. Tippfunktion unter 1 Sek. Dauer.
//    * Blinklicht Seite bei eingeschaltetem Blinklicht wechselbar. Tippfunktion unter 1 Sek. Dauer.
//    * Blinklicht nur durch Blinkerhebel oder Lenkungsrückstellung (wie beim original PKW) ausschaltbar.
//    * Warnblinkanlage schaltet keine Blinkereinstellung ab. Der Blinkerstatus wird beim Einschalten
//      der Warnblinkanlage gespeichert, und nach dem Ausschalten wiederhergestellt.
//    * Warnblinkanlage mit Fahrhebel Kanal 4 mehr als 1,0 Sekunden nach links halten jeder Zeit einschaltbar.
//    * Warnblinkanlage ausschalten durch erneutes 1,0 Sekunden langes Betätigen des Fahrhebels Kanal 4 nach links.
//    * Standlicht als Kombination in einer LED mit dem Fahrlicht oder als eigene LED mit dem Rücklicht anschließbar.
//    * Stand- und Rücklicht mit Fahrhebel Kanal 4 mehr als 1,0 Sekunden nach rechts halten jeder Zeit einschaltbar.
//    * Fahr- und Rücklicht mit Fahrhebel Kanal 4 mehr als 2,0 Sekunden nach rechts halten jeder Zeit einschaltbar.
//    * Fahrlicht ausschalten durch erneutes 1,0 oder 2,0 Sekunden langes Betätigen des Fahrhebels Kanal 4 nach rechts. Standlicht wird eingeschaltet.
//    * Stand- und Rücklicht ausschalten durch erneutes 1,0 Sekunden langes Betätigen des Fahrhebels Kanal 4 nach rechts.
//    * Realistischer Rückfahrscheinwerfer. Der Rückfahrscheinwerfer geht an sobald der Gas Hebel (Kanal 2) auf Rückwärtsfahrt gezogen wird.
//    * Der Rückfahrscheinwerfer geht erst dann wieder aus, wenn der Gashebel in Stellung Vorwärtsfahrt bewegt wird,
//      oder mehr als 7 Sekunden in Neutralstellung steht.
//    * Bremslicht sowohl als separate LED für das Bremslicht als auch mit einer LED in Kombination mit dem Rücklicht anschließbar.
//    * Alle Bremslichtfunktionen funktionieren sowohl bei Vor- als auch bei Rückwärtsfahrt.
//      Das Bremslicht wird eingeschaltet, wenn innerhalb einer festgelegten kurzen Zeit ein bestimmter Wert an Gas schnell zurückgenommen wird.
//      (Ruckartiges Gas weg nehmen)
//      Langsames Gas weg nehmen betätigt dagegen kein Bremslicht.
//      Zittern mit dem Gashebel in einer Fahrstellung oder kurze Impulsschwankungen die zu Bremslichtfunktionen führen werden unterdrückt.
//      Führt ruckartiges Gas weg nehmen zu einer Bremslichtfunktion bleibt das Bremslicht mindestens 200 Millisekunden an,
//      um zu einem sichtbaren Effekt zu führen.
//      Erreicht der Gashebel die Neutralstellung wird immer das Bremslicht eingeschaltet. Es sei denn, man nimmt extrem langsam das Gas weg
//      (Ausrollfunktion). Wenn der Gashebel 5 Sekunden in Neutralstellung steht, wird das Bremslicht wieder abgeschaltet.
//      Wird Der Gasknüppel aus der Neutralstellung in eine Fahrtstellung gebracht wird das Bremslicht sofort wieder ausgeschaltet.
//    * Arbeitsscheinwerfer durch mit Fahrhebel Kanal 4 mehr als 3 Sekunden nach rechts halten jeder Zeit einschaltbar.
//    * Arbeitsscheinwerfer durch mit Fahrhebel Kanal 4 mehr als 3 Sekunden nach rechts halten jeder Zeit ausschaltbar.
//    * Rundumlicht oder andere Funktion mit Fahrhebel Kanal 4 mehr als 2 Sekunden nach links halten jeder Zeit einschaltbar.
//    * Rundumlicht oder andere Funktion ausschalten durch erneutes 2 Sekunden langes Betätigen des Fahrhebels Kanal 4 nach links.
//    * Automatisches Einschalten von Rundumlicht und Arbeitsscheinwerfer durch andere Modellfunktionen. Schalteingang -5 Volt.
//---------------------------------------------------------------------------------------------------------------------------------
//                              Betriebs- und Anschlusshinweise
//---------------------------------------------------------------------------------------------------------------------------------
//    * Die Lichtplatine wird mit 5 Volt Versorgungsspannung betrieben und der Minuspol muss mit dem Minuspol des Akkus verbunden sein!
//    * der maximale Ausgangsstrom je Ausgang beträgt 40 mA !!!!
//    * Scheinwerfer-LED werden in Reihe geschaltet und müssen mit passenden Vorwiderständen Zur Akkuspannung versehen werden.
//    * Standlicht-LED vorne werden in Reihe geschaltet und müssen mit passenden Vorwiderständen Zur Akkuspannung versehen werden.
//    * Alle Licht-LED brauchen den passenden Vorwiderstand für 20 mA (volle Helligkeit) 
//      Die Helligkeit von Stand- und Rücklicht werden über PWM-Signal gesteuert.
//    * Die Blinklicht-LED können durch höhere Widerstandswerte in der Helligkeit angepasst werden.
//    * Die Blinklicht-LED sollten vordere und hintere in Reihe geschaltet werden. So ergibt sich je Blinkerseite ein Strom von 20 mA.
//      Und so ist es möglich auch noch einen Anhänger mit Blinklichtstrom zu versorgen.
//    * Die kombinierten Rück- und Bremslichter werden ebenfalls in Reihe geschaltet.
//    * Separate Rücklichter (in Reihe geschaltet) lassen sich mit dem Standlichtausgang zusammenschalten.
//      Allerdings steht dann kein Ausgang mehr für Anhängerrücklicht zur Verfügung.
//      Soll ein Anhänger angeschlossen werden, ist es sinnvoll sowohl Anhänger als auch Zugfahrzeug mit kombiniertem Rück- und Bremslicht zu versehen.
//---------------------------------------------------------------------------------------------------------------------------------
//                              Anschluss Belegungen
//---------------------------------------------------------------------------------------------------------------------------------
//    * Pin 2 Eingang wo das Empfängersignal eingelesen wird! Für RC-Kanal 2 Interrupt (Gas)
//    * Pin 3 Eingang wo das Empfängersignal eingelesen wird! Für RC-Kanal 4 Interrupt (Licht)
//    * Pin 4 Ausgang für Rückfahrscheinwerfer (max.40 mA)
//    * Pin 5 Ausgang für Bremslicht und Rücklicht mit PWM (max.40 mA)
//    * Pin 6 Ausgang für Fahrlicht (max.40 mA)
//    * Pin 7 Eingang für externe RKL-Einschaltung (max.40 mA)
//    * Pin 8 Eingang Lenkkanal-Impulse (pulseIn) 
//    * Pin 9 Ausgang für Licht (max.40 mA)
//    * Pin 10 Ausgang Blinker links (max.40 mA)
//    * Pin 11 Ausgang Blinker rechts (max.40 mA)
//    * Pin 12 Ausgang Rundumkennleuchte bei Bedarf oder andere Funktion (max.40 mA)
//    * Pin 13 Ausgang für Arbeitsscheinwerfer (max.40 mA) und Arduino-interne LED 
//---------------------------------------------------------------------------------------------------------------------------------



//---------------------------------------------------------------------------------------------------------------------------------
//                             Variablen für den Interrupt bei Gasknüppelbetätigung
//---------------------------------------------------------------------------------------------------------------------------------
//---------------------------- Die letzten 8 Werte werden gespeichert um einen Mittelwert zu bilden
volatile  uint16_t  EmpfaengerKanal2Wert[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500};
volatile  uint16_t  EmpfaengerKanal2WertSum   = 12000;                //  Die Summe der letzten 8 Werte
volatile  uint8_t   EmpfaengerKanal2WertIndex = 0;                    //  Der Index des nächsten auszutauschenden Wertes
volatile  uint32_t  LetzterEmpfaengerWert    = micros();              //  Letzter Zeitpunkt des Signalwechsels
volatile  uint16_t  AktuellerEmpfaengerWert = 1500;                   //  Der aktuell als letztes ermittelte Wert
volatile  uint8_t   LetzterInterruptStatus   = PIND;                  //  Interruptstatus des Port D
//------------------------------------------------------------------------------------------------------------------------------------
volatile int RcInValue;                                               // Eingelesener Wert der immer aus dem RAM kommt (w.g. volatile)
volatile int ReceivedLightValues[8] = {1500, 1500, 1500, 1500, 1500, 1500, 1500, 1500}; // Array mit 8 Werten für die gemessenen Werte
volatile int Summe = 12000;                                           // Summe aus dem Array 8x1500, als Anfangswert
volatile int Mittelwert_K4 = 1500;                                    // Mittelwert aus der Summe für RC-Kanal 4
volatile int Zeiger = 0;                                              // Zeiger für das Array, fängt mit 0 an
volatile uint32_t  LastLightChange = micros();
//
//  Die Interrupt Routine wird bei jedem Signalwechsel zwischen HIGH und LOW aufgerufen
//  Die Routine berücksichtigt die HIGH Level und errechnet aus den letzten 8 HIGH Level Werten einen Mittelwert
//  Dies glättet mögliche Ausreißer und beseitigt kleinere Schwankungen.
//
//-------------- Pinbelegung - Constante Variablen Deklaration ----------------------------------------
//
const byte pw = 2;                      //  das ist Interrupt 0 aber Pin 2 wo das Empfängersignal eingelesen wird! Für RC-Kanal 2 (Gas)
const byte PIN_RC = 3;                  //  das ist Interrupt 1 aber Pin 3 wo das Empfängersignal eingelesen wird! Für RC-Kanal 4 (Licht)
const byte rfsch = 4;                   //  Pin für Rückfahrscheinwerfer
const byte brakelight = 5;              //  Pin für Bremslicht und Rücklicht mit PWM
const byte headlight = 6;               //  Pin für Fahrlicht
const byte light = 9;                   //  Pin für Licht
const byte lenk_in = 8;                 //  Eingang Lenkkanal-Impulse
const byte RKL_in = 7;                  //  Eingang für externe RKL-Einschaltung
const byte bl = 10;                     //  Pin Blinker links
const byte br = 11;                     //  Pin Blinker rechts
const byte rkl = 12;                    //  Pin RKL bei Bedarf oder andere Funktion
const byte al = 13;                     //  interne LED und Ausgang für Arbeitsscheinwerfer
//
//------------- Einstellbare Werte - Constante Variablen Deklaration ---------------------------------------
const byte light_pwm = 240;             //  PWM-Wert für Standlicht (hier einstellbar)
const byte Aus = 0;                     //  Zustand Aus auf 0 setzen
const byte gastoleranz = 20;            //  Toleranz für die Knüppelbewegung, bis Bremslichtvorgang eingeleitet wird. (milliseconds)(hier einstellbar)
const byte brakecounter_max = 3;        //  Maximaler Inhalt des Fehlerzählers. (X mal) (hier einstellbar)
const long brakelighttime = 5000;       //  Zeit wie lange das Bremslicht nach Fahrzeugstillstand noch leuchtet. (milliseconds) (hier einstellbar)
const long brakelighttime_min = 200;    //  Zeit wie lange das Bremslicht bei Betätigung mindestens leuchtet. (milliseconds) (hier einstellbar)
const long rfsch_ontime = 7000;         //  Zeit wie lange der Rückfahrscheinwerfer nach Fahrzeugstillstand noch leuchtet. (milliseconds) (hier einstellbar)
const long Zeit_1 = 1000;               //  Überwachte kurze Zeit für Knüppeleinschlag in Millisekunden (hier einstellbar)
const long Zeit_2 = 2000;               //  Überwachte lange Zeit für Knüppeleinschlag in Millisekunden (hier einstellbar)
const long Zeit_3 = 3000;               //  Überwachte lange Zeit für Knüppeleinschlag in Millisekunden (hier einstellbar)
const long retourbeginn = 1600;         //  Knüppelbewegungsweg Kanal 2 ab wann Rückfahrscheinwerfer eingeschaltet wird. (hier einstellbar)
//
//-------------- Byte Variablen Deklaration -----------------------------------
byte vb = 75;                           //  Variable für gemappte Impulse Wert = Mittelstellung Blinker
byte vw = 75;                           //  Variable für gemappte Impulse Wert = Mittelstellung Warnblinker
byte re_li = 0;                         //  Flag Blinker rechts(Wert 01)_links(Wert 10)Warnblinker(Wert 11)
byte ledState = LOW;                    //  Blinker Startstatus auf aus setzen
byte bron = 0;                          //  Blinker rechts ein (Wert 1 bei an - 0 bei aus)
byte brof = 0;                          //  Blinker rechts aus (Wert 1 bei an - 0 bei aus)
byte brofok = 0;                        //  Blinker rechts aus (Wert 1 bestätigt - 0 bei unbestätigt)
byte blon = 0;                          //  Blinker links ein  (Wert 1 bei an - 0 bei aus)
byte blof = 0;                          //  Blinker links aus  (Wert 1 bei an - 0 bei aus)
byte blofok = 0;                        //  Blinker links aus (Wert 1 bestätigt - 0 bei unbestätigt)
byte wbon = 0;                          //  Warnblinker ein
byte rklon = 0;                         //  RKL ein (Rundum-KennLeuchte)
byte rklof = 0;                         //  RKL aus (Rundum-KennLeuchte)
byte alon = 0;                          //  Arbeitscheinwerfer ein
byte alof = 0;                          //  Arbeitscheinwerfer aus
byte headlight_on = 0;                  //  Scheinwerfer ein
byte headlight_of = 0;                  //  Scheinwerfer aus
byte light_on = 0;                      //  Standlicht / Rücklicht ein
byte light_of = 0;                      //  Standlicht / Rücklicht aus
byte reliSave = 00;                     //  Speicher für Blinklicht Status
byte schalterRechts = 0;                //  Flag für Blinkerhebelstellung nach rechts
byte schalterLinks = 0;                 //  Flag für Blinkerhebelstellung nach links
byte sentido = 0;                       //  betätigte Richtung für linken Kreuzknüppel. 1=rechts; 2=links; 3=vorne; 4=hinten
byte rfsch_on = 0;                      //  Rückfahrscheinwerfer (Wert 1 bei an - 0 bei aus)
byte vwf = 0;                           //  Flag für Vorwärtsfahrt
byte brakelight_on = 0;                 //  Flag steht auf "1" wenn Bremslicht leuchtet.

//
//-------------- int Variablen deklaration ----------------------------------------------------------------------------------
int akt_richtung = 0;                   //  Flag für aktuelle Knüppelrichtung: 0 Stand; 1 = Vorwärts; 2 = Rückwärts
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//                                            Der Wert von "akt_richtung" bezieht sich nicht auf die Fahrtrichtung,          //
//                                            sondern die Richtung der Knüppelbewegung.                                           //
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int mem_duration = 0;                   //  Speicher für Empfängerwert Gas
int brakecounter = 0;                   //  Zähler zur Überwachung der Bremsimpulse
int brakelightdaueraus = 0;             //  Flag ob Bremslicht nach mehr als 5 Sec. Stillstand aus bleiben soll . "1" = ja.
int RKLE = HIGH;                        //  Flag RKL-Eingangszustand
//
//-----------------long Variablen Deklaration -------------------------------------------------------------------------------
long time = 0;
//---------------- unsigned long Variablen Deklaration ---------------------------------------------------------------------
unsigned long aktTime = 0;              //  reset Speicher für aktuelle Zeit
unsigned long countMillis = 0;          //  reset Zeitzähler
unsigned long int interval = 700;       //  Zeit für langes halten des Steuerknüppels nach rechts oder links (hier einstellbar)
unsigned long int blinterval = 600;     //  Blinkintervall (hier einstellbar)
unsigned long currentMillis = 0;        //  aktuell gültige Zeit
unsigned long currentbrakeMillis = 0;   //  aktuell gültige Zeit
unsigned long currentrfschMillis = 0;   //  aktuell gültige Zeit
unsigned long previousbrakeMillis = 0;  //  will store last time
unsigned long previousrfschMillis = 0;  //  will store last time
unsigned long previousMillis = 0;       //  zuletzt gespeicherte Zeit
unsigned long lenk;                     //  Lenkeinschlagauswertung vom Empfänger
unsigned long dw;                       //  zur Zeit nicht benutzt Pulse in Kanal 4 Futaba Warnlicht - RKL
unsigned long timeStart = 0;            //  Zeit bei Beginn einer Knüppelbewegung
unsigned long timeStop = 0;             //  Zeit bei Ende einer Knüppelbewegung
unsigned long timeBegin = 0;            //  Zeitbeginn in der Zeitkontrolle
unsigned long duration;                 // Variabele für den vom Interrupt eingelesenen Impuls des Empfängers
//
//


void setup()
{
  PCICR  |= (1 << PCIE2);                 //  Interrupt Port D aktivieren
  PCMSK2 |= (1 << PCINT18);               //  Interrupts für Pins 2 aktivieren
  sei();
  attachInterrupt( 1, LightPositionInterrupt, CHANGE);
  //---------------------------------------------------------------------------------------------------------------
  pinMode(pw, INPUT);                     // Pin 2 Input für Interrupt RC-Empfängersignal Kanal 2 (Gas)
  digitalWrite(pw, HIGH);                 // hier wird der interne Pull-up Widerstand an Pin 2 eingeschaltet
  pinMode(PIN_RC, INPUT);                 // Pin 3 Input für Interrupt RC-Empfängersignal Kanal 4 (Licht)
  digitalWrite(PIN_RC, HIGH);             // hier wird der interne Pull-up Widerstand an Pin 3 eingeschaltet
  pinMode(rfsch, OUTPUT);                 // Pin 4 Output für Rückfahrscheinwerfer
  pinMode(brakelight, OUTPUT);            // Pin 5 Output für Bremslicht
  pinMode(headlight, OUTPUT);             // Pin 6 Output für Fahrlicht
  pinMode(light, OUTPUT);                 // Pin 9 Output für Standlicht
  pinMode(lenk_in, INPUT);                // Pin 8 zur Zeit unbenutzt
  digitalWrite(lenk_in, HIGH);            // hier wird der interne Pull-up Widerstand an Pin 8 eingeschaltet
  pinMode(RKL_in, INPUT);                 // Pin 7 externer Einschalteingang für die Rundumkennleuchte
  digitalWrite(RKL_in, HIGH);             // hier wird der interne Pull-up Widerstand an Pin 7 eingeschaltet
  pinMode(bl, OUTPUT);                    // Pin 10 Output für Blinklicht links
  pinMode(br, OUTPUT);                    // Pin 11 Output für Blinklicht rechts
  pinMode(rkl, OUTPUT);                   // Pin 12 Output für Rundumkennleuchten
  pinMode (al, OUTPUT);                   // Pin 13 Output für interne LED und Arbeitsscheinwerfer
  //---------------------------------------------------------------------------------------------------------------
 
 // Serial.begin(57600);                 // Einschaltung des seriellen Monitors Zur Programmkontrolle
  delay(1500);                            // Wartezeit auf Empfänger Initialisierung
  digitalWrite(light, LOW);               // Standlicht im Setup einschalten
  digitalWrite(headlight, LOW);           // Scheinwerfer im Setup einschalten
  digitalWrite(al, LOW);                  // interne LED ausschalten (aktiv HIGH)
  digitalWrite(rkl, LOW);                 // Rundumkennleuchte im Setup einschalten
  digitalWrite(br, LOW);                  // Blinklicht rechts im Setup einschalten
  digitalWrite(bl, LOW);                  // Blinklicht links im Setup einschalten
  digitalWrite(rfsch, LOW);               // Rückfahrscheinwerfer im Setup einschalten
  digitalWrite(brakelight, LOW);          // Bremsleuchten im Setup einschalten
  delay(1000);                            // Eine Sekunde Wartezeit im Setup zur Lampenkontrolle
  digitalWrite(light, HIGH);              // Standlicht nach dem Setup ausschalten
  digitalWrite(headlight, HIGH);          // Scheinwerfer nach dem Setup ausschalten
  digitalWrite(br, HIGH);                 // Blinklicht rechts nach dem Setup ausschalten
  digitalWrite(bl, HIGH);                 // Blinklicht links nach dem Setup ausschalten
  digitalWrite(rfsch, HIGH);              // Rückfahrscheinwerfer nach dem Setup ausschalten
  digitalWrite(brakelight, HIGH);         // Bremsleuchten nach dem Setup ausschalten
  digitalWrite(rkl, HIGH);                // Rundumkennleuchte nach dem Setup ausschalten
}

//---------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------
// Interrupt
//---------------------------------------------------------------------------------------------------------------

ISR(PCINT2_vect)
{
  uint8_t PinStatus  = PIND;                                      //  Aktuellen Status der Interrupts lesen
  uint8_t PinSignalWechsel  = PinStatus ^ LetzterInterruptStatus; //  Mit vorherigem Wert verknüpfen
  //                                                              //  Das Ergebnis ist eine Bitliste der ausgelösten Interrupts
  if (PinSignalWechsel & (1 << PCINT18))                          //  Ist das Bit für Pin 2 gesetzt?
    Interuppt_Kanal2();                                           //  Ja -> Interrupt auswerten
  LetzterInterruptStatus  = PinStatus;                            //  Alte Bitmaske merken
}
//---------------------------------------------------------------------------------------------------------------
// Interrupt Ende
//---------------------------------------------------------------------------------------------------------------



void loop()                                 // Programmschleife
{
  //---------------------------------------------------------------------------------------------------------------
  rkltest();                                // Prüfen ob RKL von extern eingeschaltet ist + eventuell RKL und Arbeitsscheinwerfer einschalten
  //---------------------------------------------------------------------------------------------------------------
  getlenkung();                             // Knüppelstellung für Lenkung (Blinker aus) auslesen
  //---------------------------------------------------------------------------------------------------------------
  Blinkcontrol();                           // Programmteil für die Feststellung ob Blinker abgeschaltet werden darf
  //---------------------------------------------------------------------------------------------------------------
  blinken(blinterval, re_li);               // Im Flag re_li festgelegte Blinker Blinken lasen falls erforderlich
  //---------------------------------------------------------------------------------------------------------------
  lampen_schalten();                        // Lampen schalten mit Übergabe von Lampentyp
  //---------------------------------------------------------------------------------------------------------------
  loop2();                                  // Programmteil zur Brems- und Rückfahrlichtsteuerung
  //---------------------------------------------------------------------------------------------------------------
}                                           // Ende der gesamten Programmschleife
//---------------------------------------------------------------------------------------------------------------

Code:
//////////////////////////////////////////////////////////////////////////////////////////////////
// Programmteil für die Feststellung ob Blinker abgeschaltet werden darf                    //
// Die Variabel "vw" enthält die gemappte Signalauswertung für Kanal 1 - Lenkung      //
//////////////////////////////////////////////////////////////////////////////////////////////////
void Blinkcontrol()
{
  if (lenk != 0)                                     // Fehlerkorrektur für Laufzeitfehler. Bei Wert"0" Routine nicht ausführen.
  {
    if (blon == 1 || bron == 1)                      // Abfrage 1 - Ist Blinker links oder rechts an? Wenn nein Weiter bei Ende Abfrage 1
    { //                                             // wenn ja
      if (vw < 35 || vw > 115)                       // Abfrage 2 - Weg der Lenkbewegung feststellen
      { //                                           // wenn zwischen 35 und 115 dann ist weit genug eingeschlagen
        //                                           // wenn nicht weiter bei Ende Abfrage 2
        blof = 1;                                    // Flag setzen das Blinker links ausgemacht werden kann
        brof = 1;                                    // Flag setzen das Blinker rechts ausgemacht werden kann
        // bron = 0;                                 // ??
      }                                              // Ende - Abfrage 2
    }                                                // Ende - Abfrage 1
    if (blof == 1 || brof == 1)                      // Abfrage 3 - Wenn Blinker aus gemacht werden kann blof = 1 oder brof = 1
    { //                                             // wenn nicht weiter bei Ende Abfrage 3
      if (vw > 60 && vw < 90)                        // Abfrage 4 - Ist weit genug zurück gelenkt? Wenn nicht weiter bei Ende Abfrage 4
      {
        if (wbon == 0)                               // Abfrage 5 - Ist Warnblinker ausgeschaltet? Wenn nicht weiter bei Ende Abfrage 5
        {
          re_li = 00;                                // Flag für beide Blinker aus setzen
          blof = 0;                                  // Flag für Blinker links ausschalten erlaubt wieder auf 0 setzen
          brof = 0;                                  // Flag für Blinker rechts ausschalten erlaubt wieder auf 0 setzen
        }                                            // Ende - Abfrage 5
      }                                              // Ende - Abfrage 4
    }                                                // Ende - Abfrage 3
  }                                                  // Ende Fehlerkorrektur Blinkerabschaltung
}                                                    // Ende der Routine

Code:
// ---------------------------------------------------------------------------------
// -------------------- Kanal für Gas; Vor- Rückwärts; Bremse ----------------------
void Interuppt_Kanal2()
{
  uint32_t    nMicros   = micros();                                                 //  Aktuellen Zeitstempel merken
  uint16_t    nDifference  = (uint16_t)(nMicros - LetzterEmpfaengerWert);           //  Die Differenz zum letzten Aufruf errechnen
  
  if ( (nDifference > 900 ) && ( nDifference < 2100))                               //  Zeiten zwischen 900 und 2100 Mikrosekunden sind das HIGH Signal
  {
    //  --------------    Wert in der 4er Liste austauschen und Mittelwert errechnen. Dies erfolgt indem der alte Wert von der Summe subtrahiert wird
    EmpfaengerKanal2WertSum   -= EmpfaengerKanal2Wert[EmpfaengerKanal2WertIndex];   //  Der neue Wert gemerkt wird
    EmpfaengerKanal2Wert[EmpfaengerKanal2WertIndex]  = nDifference;                 //  Den neuen Wert auf die Summe addieren
    EmpfaengerKanal2WertSum   += nDifference;                                       //  Den Index auf die naechste Position schieben
    EmpfaengerKanal2WertIndex   = ( ( EmpfaengerKanal2WertIndex + 1 ) & 0x07 );     //Index erhoehen und ggf. von 8 auf 0 springen
    //  --------------    Den aktuellen Mittelwert errechnen indem die Summe durch 8 geteilt wird
    AktuellerEmpfaengerWert   = ( EmpfaengerKanal2WertSum >> 3 );                   //durch 8 teilen
  }
  LetzterEmpfaengerWert = nMicros;                                                  //  Zeitstempel für das nächste mal merken
}

Code:
// ---------------------------------------------------------------------------------
// -------------------- Kanal für Beleuchtungen ------------------------------------
void LightPositionInterrupt()
{
  uint32_t    nMicros   = micros();
  uint16_t    nDifference  = (uint16_t)(nMicros - LastLightChange);

  if ( (nDifference > 900 ) && ( nDifference < 2100))                   //  Zeiten zwischen 900 und 2100 Mikrosekunden sind das HIGH Signal
  {
    //  --------------    Wert in der 4er Liste austauschen und Mittelwert errechnen. Dies erfolgt indem der alte Wert von der Summe subtrahiert wird
    Summe -= ReceivedLightValues[Zeiger];                               //  Der neue Wert gemerkt wird
    ReceivedLightValues[Zeiger] = nDifference;                          //  Den neuen Wert auf die Summe addieren
    Summe += nDifference;                                               //  Den Index auf die nächste Position schieben
    Zeiger = ( ( Zeiger + 1 ) & 0x07 );                                 //  Index erhöhen und ggf. von 8 auf 0 springen
    //  --------------    Den aktuellen Mittelwert errechnen indem die Summe durch 8 geteilt wird
    Mittelwert_K4 = ( Summe >> 3 );                                     //  durch 8 teilen
  }
  LastLightChange = nMicros;                                            //  Zeitstempel für das nächste mal merken
  //
  //---------------------------------------------------------------------------------------------------------------

  if (Mittelwert_K4 < 1200)                        // Wenn Kanal 4 - Knüppel nach rechts betätigt
  {
    sentido = 1;                                   // Richtung rechts 
    if (schalterRechts == 0)                       // wenn Schalter-Flag rechts = "aus"
    {
      timeStart = millis();                        //  aktuell gültige Zeit
      timeBegin = 0;                               //  Startzeit auf 0 setzen
    }
    zeitkontrolle(sentido);                        // gehe zu Unterroutine Zeitkontrolle 
  }
  else if (schalterRechts != 0)                    // sonst wenn Schalter rechts nicht ausgeschaltet ist
  {
    Schalter_Rechts();                             // gehe zu Unterroutine Schalter_Rechts()
  }
  //---------------------------------------------------------------------------------------------------------------

  if (Mittelwert_K4 > 1800)                        // Wenn Kanal 4 - Knüppel nach links betätigt
  {
    sentido = 2;                                   // Richtung links 
    if (schalterLinks == 0)                        // wenn Schalter-Flag links = "aus"
    {
      timeStart = millis();                        // aktuell gültige Zeit in timeStart speichern
      timeBegin = 0;                               // Startzeit auf 0 setzen
    }
    zeitkontrolle(sentido);                        // gehe zu Unterroutine Zeitkontrolle
  }
  else if (schalterLinks != 0)                     // sonst wenn Schalter links nicht ausgeschaltet ist
  {
    Schalter_Links();                              // gehe zu Unterroutine Schalter_Links()
  }
}

Code:
void Licht_aus(int Li)
{
  //digitalWrite (Li, HIGH);

  switch (Li)
  {
    case light:
      digitalWrite (headlight, HIGH);               // Pin 6; Scheinwerfer ausschalten
      digitalWrite (light, HIGH);                   // Pin 9; Standlichtausgang ausschalten
      digitalWrite (brakelight, HIGH);              // Pin 5; Bremslicht ausschalten
      break;
     /*if (light_of == 1)
      {
        analogWrite (brakelight, 255);              // Pin 5; Bremslicht ausschalten.
        brakelight_on = 0;
      }
      else if (light_of == 0)
      {
        analogWrite (brakelight, light_pwm);        // Pin 5; Bremslicht ausschalten und PWM auf Rücklichtwert setzen.
        brakelight_on = 0;
      }*/
    case headlight:
      analogWrite (headlight, light_pwm);           // Pin 6; Scheinwerfer ausschalten und PWM auf Standlichtwert setzen
      analogWrite (light, light_pwm);               // Pin 9; Standlichtausgang einschalten
      analogWrite (brakelight, light_pwm);          // Bremslicht ausschalten und PWM auf Rücklichtwert setzen.
      light_of = 1;                                 // Flag für Licht ausschaltbar wieder auf 1 setzen
      break;
    //
    case rkl:
      digitalWrite (rkl, HIGH);
      rklof = 0;
      rklon = 0;
      break;
    //
    case al:
      digitalWrite (al, HIGH);
      break;
    //
    default:
      // do nothing;
      break;
  }
  //Li = 0;
}

Code:
void Licht_ein(int Li)
{
  switch (Li)                                         // Schalte Licht ein
  {
    case headlight:                                   // falls Wert = 6
      analogWrite (headlight, 0);                     // schalte Pin 6 auf LOW = "ein"
      analogWrite (light, light_pwm);
      analogWrite (brakelight, light_pwm);
      headlight_of = 1;
      break;
    //
    case light:                                       // falls Wert = 9
      analogWrite (brakelight, light_pwm);
      analogWrite (light, light_pwm);
      analogWrite (headlight, light_pwm);
      brakelight_on = 0;
      light_of = 1;
      break;
    //
    case al:                                          // falls Wert = 13
      digitalWrite (al, LOW);
      alof = 1;
      break;
    //
    case rkl:                                         // falls Wert = 12
      digitalWrite (rkl, LOW);
      rklof = 1;
      break;
    //
    default:
      // do nothing;
      break;
  }
}



Code:
void blinken(int takt, int reli)                  // übergibt Taktintervall für Blinklicht und welcher Blinker blinken soll.
//                                                // reli steht für rechts oder links
//                                                // reli = 00 = keiner - beide Blinker aus
//                                                // reli = 01 = rechts
//                                                // reli = 10 = links
//                                                // reli = 11 = beide - Warnblinklicht
//---------------------------------------------------------------------------------------------------------------

{ //                                              // Beginn der Routine "void blinken"
  currentMillis = millis();                       // aktuelle Zeit in Millisekunden speichern
  //---------------------------------------------------------------------------------------------------------------

  if (reli == 00)                                 // wenn kein Blinklicht an sein soll
  { //                                            // nachfolgende Funktion 1 ausführen
    ledState = HIGH;                              // LED Status auf "aus" setzen
    digitalWrite(br, ledState);                   // setzt die LED Blinker-rechts mit dem Status der Variable "ledState" ("aus")
    digitalWrite(bl, ledState);                   // setzt die LED Blinker-links  mit dem Status der Variable "ledState" ("aus")
  }//                                             // Ende der Funktion 1
  //---------------------------------------------------------------------------------------------------------------

  else if (currentMillis - previousMillis > takt) // an sonsten wenn die Aktuelle Zeit minus der vorher gespeicherten Zeit größer alls der Takt ist
  { //                                            // Funktion 2 ausführen
    previousMillis = currentMillis;               // sichert letzte Zeit update LED Status
    switch (ledState)                             // Wechselt LED Zustand ein / aus und umgekehrt (Funktion Blinken)
    {
      case HIGH:                                  // wenn der LED Status = "aus" ist....
        ledState = LOW;                           // wechseln zu LED Status "ein"
        break;
      //---------------------------------------------------------------------------------------------------------------

      case LOW:                                   // sonst
        ledState = HIGH;                          // wechseln zu LED Status "aus"
        break;
      //----------------------------------------------------------------------------------------------------------
      default:
        // do nothing;
        break;
    }//                                           // Ende der Funktion
  }
  //---------------------------------------------------------------------------------------------------------------

  switch (reli)                                 // schalte Blinklichter
  {
    case 01:                                    // falls das rechte Blinklicht an sein soll, nachfolgende Funktionen ausführen
      digitalWrite(br, ledState);               // schaltet die LED "Blinker rechts" mit dem Status der Variable "ledState"
      digitalWrite(bl, HIGH);                   // schaltet die LED "Blinker links" "aus"
      break;                                    // Ende der Funktion
    //---------------------------------------------------------------------------------------------------------------

    case 10:                                    // falls das linke Blinklicht an sein soll, nachfolgende Funktionen ausführen
      digitalWrite(bl, ledState);               // schaltet die LED "Blinker links" mit dem "NOT" Status der Variable "ledState"
      digitalWrite(br, HIGH);                   // schaltet die LED "Blinker rechts" "aus"
      break;                                    // Ende der Funktion
    //---------------------------------------------------------------------------------------------------------------

    case 11:                                    // falls beide Blinklichter an sein sollen (Warnblinker), nachfolgende Funktionen ausführen
      digitalWrite(br, ledState);               // schaltet die LED "Blinker rechts" mit dem Status der Variable "ledState"
      digitalWrite(bl, ledState);               // schaltet die LED "Blinker links"  mit dem Status der Variable "ledState"
      break;                                    // Ende der Funktion
    //-----------------------------------------------------------------------------------------------------------------
    default:
      // do nothing;
      break;
  }//                                             // Ende der Funktion 2
}//                                               // Ende der Routine "void blinken()"

Code:
void bremslicht()
{
  brakecounter ++;                              // Bremszähler zählt wie oft die Routine aufgerufen wurde.
  if (brakecounter == brakecounter_max)                        // Wenn das 2. mal dann
  {
    analogWrite (brakelight, 0);                // Bremslicht einschalten (PWM - 0 = voll an, 255 = aus; wegen aktiv LOW)
    brakelight_on = 1;
    brakecounter = 0;                           // Bremszähler wieder auf "0" setzen - löschen.
    delay(brakelighttime_min);                  // ?? Pause damit bei Microbremsung das Bremslicht z.B. 100 ms leuchtet und nicht nur aufblitzt.
  }
}
//---------------- Der Bremszähler verhindert das bei jeder kleinen Wertschwankung vom Empfänger, oder z.B. unruhiger Knüppelhaltung,
//---------------- das Bremslicht aufblitzt.

Code:
void getlenkung()
{
  lenk = pulseIn(lenk_in, HIGH, 20000);                         //  Kanal 1  938 - 1480 - 2027
  vw = map(lenk, 900, 2100, 0, 150);
  delay(20);
}

Code:
void lampen_schalten()
{
  if (rklon == 1 && rklof == 0)
  {
    rklon = 0;
    Licht_ein(rkl);                                // Rundumkennleuchte einschalten
  }
  //----------------------------------------------------------------------------------------------------
  if (rklon == 1 && rklof == 1)
  {
    rklon = 0;
    rklof = 0;
    Licht_aus(rkl);                                // Rundumkennleuchte ausschalten
  }
  //----------------------------------------------------------------------------------------------------
  if (alon == 1 && alof == 0)
  {
    alon = 0;
    Licht_ein(al);                                 // Arbeitsleuchte einschalten
  }
  //----------------------------------------------------------------------------------------------------
  if (alon == 1 && alof == 1)
  {
    alon = 0;
    alof = 0;
    Licht_aus(al);                                 // Arbeitsleuchte ausschalten
  }
  //----------------------------------------------------------------------------------------------------
  if (headlight_on == 1 && headlight_of == 0)
  {
    headlight_on = 0;
    Licht_ein(headlight);                          // Scheinwerfer einschalten
    light_on = 0;
  }
  //----------------------------------------------------------------------------------------------------
  if (headlight_on == 1 && headlight_of == 1)
  {
    headlight_on = 0;
    headlight_of = 0;
    Licht_aus(headlight);                          // Scheinwerfer ausschalten
  }
  //----------------------------------------------------------------------------------------------------
  if (light_on == 1 && light_of == 0)
  {
    light_on = 0;
    Licht_ein(light);                              // Licht einschalten
  }
  //----------------------------------------------------------------------------------------------------

  if (light_on == 1 && light_of == 1)
  {
    light_on = 0;
    light_of = 0;
    Licht_aus(light);                              // Licht ausschalten
  }
}

Code:
void loop2()
{
  //--------------------------------------------------------------------------------------------------------
  //------------ Hier kann nun mit dem Wert von AktuellerEmpfaengerWert vom Interrupt gearbeitet werden ----
  //--------------------------------------------------------------------------------------------------------
  duration = AktuellerEmpfaengerWert;            // Hier wird die aktuelle Steuerknüppelstellung vom Interrupt übernommen.
  //-----------------------------------------------------------------------------
  //------              Keine Gasknüppelbewegung
  //-----------------------------------------------------------------------------
  if (duration > 1400 && duration < 1550)             // Knüppel befindet sich in Neutralstellung.
  {
    vwf = 0;                                          // Flag für Vorwärtsfahrt wird auf "0" gesetzt
    mem_duration = 0;                                 // Speicher für Knüppelstellung wird auf "0" gesetzt - gelöscht.
    akt_richtung =  0;                                // Flag für aktuelle Knüppelbewegungsrichtung wird auf "0" gesetzt.
    currentbrakeMillis = millis();                    // aktuell gültige Zeit für Bremslicht Zeitablauf beginn.
    currentrfschMillis = millis();                    // aktuell gültige Zeit für Rückfahrlicht Zeitablauf beginn.
  }
  //-----------------------------------------------------------------------------
  //------              Rückwärts Gasknüppelbewegung
  //-----------------------------------------------------------------------------
  if (duration >= retourbeginn)                       // Knüppel auf Rückwärtsfahrstellung.
  {
    if (rfsch_on == 0)                                // Wenn Rückfahrflag auf "aus" steht.
    {
      digitalWrite(rfsch, LOW);                       // Rückfahrscheinwerfer einschalten.
      rfsch_on = 1;                                   // Flag für Rückfahrscheinwerfer auf "ein" setzen.
    }
    if (duration >= mem_duration)                     // Wenn der Wert für die aktuelle Küppelstellung gleich oder größer als der gespeicherte ist.
    {
      akt_richtung =  2;                              // Das Flag für die aktuelle Knüppelbewegungsrichtung wird auf Richtung rückwärts (2) gesetzt.
    }
    if (duration < mem_duration - gastoleranz)        // Wenn der Wert für die aktuelle Knüppelstellung kleiner als der gespeicherte - gastoleranz (50) ist.
    {
      akt_richtung = -2;                              // Das Flag für die aktuelle Knüppelbewegungsrichtung wird auf Richtung vorwärts im Rückwärtsfahrbereich(-2) gesetzt.
    }
    mem_duration = duration;                          // Aktuelle Knüppelstellung speichern.
    //aktmillis = millis();                             // Aktuellen Millisekunden Wert speichern.
  }
  //-----------------------------------------------------------------------------
  //------              Vorwärts Gasknüppelbewegung
  //-----------------------------------------------------------------------------
  if (duration <= 1400)                               // Knüppel in Vorwärtsfahrstellung.
  {
    if (duration <= mem_duration)                     // Wenn der Wert für die aktuelle Küppelstellung gleich oder kleiner als der gespeicherte ist.
    {
      akt_richtung =  1;                              // Das Flag für die aktuelle Knüppelbewegungsrichtung wird auf Richtung vorwärts (1) gesetzt.
    }
    if (duration > mem_duration + gastoleranz)        // Wenn der Wert für die aktuelle Knüppelstellung größer als der gespeicherte + gastoleranz (50) ist.
    {
      akt_richtung = -1;                              // Das Flag für die aktuelle Knüppelbewegungsrichtung wird auf Richtung rückwärts im Vorwärtsfahrbereich(-1) gesetzt.
    }
    if (rfsch_on == 1)                                // Wenn Rückfahrflag auf "ein" steht.
    {
      digitalWrite(rfsch, HIGH);                      // Rückfahrscheinwerfer ausschalten.
      rfsch_on = 0;                                   // Flag für Rückfahrscheinwerfer auf "aus" setzen.
    }
    if (vwf == 0)                                     // Wenn Flag Vorwärtsfahrt = noch auf "0" (Fahrzeug steht)
    {
      vwf = 1;                                        // Flag Vorwärtsfahrt auf "1" setzen  (Vorwärtsfahrt).
    }
    mem_duration = duration;                          // Aktuelle Knüppelstellung speichern.
    //aktmillis = millis();                           // Aktuellen Millisekunden Wert speichern.
  }
  //---------------------------------------------------------------------------------
  //---------Kontrolle ob Bremslicht ein- oder ausgeschaltet wird -------------------
  //---------------------------------------------------------------------------------
  if (akt_richtung == -1 || akt_richtung == -2)       // Knüppelbewegung gegen die Fahrtrichtung erfordert Bremslichtbehandlung.
  {
    bremslicht();                                     // Bremslichtroutine wird aufgerufen.
    //delay(brakelighttime_min);                      // Pause damit bei Microbremsung das Bremslicht z.B. 100 ms leuchtet und nicht nur aufblitzt.
  }

  //-----------------------------------------------------------------------------------
  if (akt_richtung == 0)                              // Knüppel hat Neutralstellung erreicht und erfordert Bremslichtbehandlung.
  {
    if (brakelight_on == 1)
    {
      if (brakelightdaueraus == 0)                      // Wenn das Flag für "Fahrzeug steht länger als 5 Sec." auf "0" steht.
      { //                                             // Also weniger als 5 Sec. Standzeit.
        bremslicht();                                 // Bremslichtroutine wird aufgerufen.
      }
      if (currentbrakeMillis - previousbrakeMillis >= brakelighttime)
      {
        previousbrakeMillis = currentbrakeMillis;     // speichert die letzte Zeit bei Bremslichtbeginn.
        if (light_of == 0)
        {

          analogWrite (brakelight, 255);              // Bremslicht ausschalten.
          brakelight_on = 0;
        }
        else if (light_of == 1)
        {
          analogWrite (brakelight, light_pwm);                // Bremslicht ausschalten und PWM auf Rücklichtwert setzen.
          brakelight_on = 0;
        }
        brakelightdaueraus = 1;                         // Das Flag für Bremslicht dauerhaft ausbleiben wird auf "1" gesetzt. Das Fahrzeug steht länger als 5 Sec.
      }
    }
    if (rfsch_on == 1)                                // Wenn Rückfahrlichtflag auf "ein" steht.
    {
      if (currentrfschMillis - previousrfschMillis >= rfsch_ontime)
      {
        previousrfschMillis = currentrfschMillis;     // speichert die letzte Zeit bei Rückfahrlichtlichtbeginn.
        digitalWrite(rfsch, HIGH);                    // Rückfahrscheinwerfer ausschalten.
        rfsch_on = 0;                                 // Flag für Rückfahrscheinwerfer auf "aus" setzen.
      }
    }
  }
  //----------------------------------------------------------------------------------------------
  if (akt_richtung == 1 || akt_richtung == 2)         // Knüppelbewegung in eine Fahrtrichtung bei leuchtendem Bremslicht erfordert Bremslichtbehandlung.
  {
    brakelightdaueraus = 0;                           // Das Flag für Bremslicht dauerhaft ausbleiben wird auf "0" gesetzt.
    if (light_of == 0)
    {
      analogWrite (brakelight, 255);              // Bremslicht ausschalten.
      brakelight_on = 0;
    }
    else if (light_of == 1)
    {
      analogWrite (brakelight, light_pwm);                // Bremslicht ausschalten und PWM auf Rücklichtwert setzen.
      brakelight_on = 0;
    }
    brakelightdaueraus = 1;                         // Das Flag für Bremslicht dauerhaft ausbleiben wird auf "1" gesetzt. Das Fahrzeug steht länger als 5 Sec.
  }
}
//-----------------------------------------------------------------------------------
//--------------------       Loop2 Ende
//--------------------------------------------------------------------------------

Code:
void rkltest()
{
  RKLE = digitalRead(RKL_in);                      // Rundumkennleuchten-Eingang abfragen
  if (RKLE == LOW)                                 // Wenn der Eingang LOW ist (Minus auf dem Eingang liegt):
  {
    if (rklof != 1)                                // Wenn die Rundumkennleuchte nicht eingeschaltet ist
    {
      rklon = 0;                                   // RKL-Flag auf aus setzen
      Licht_ein(rkl);                              // Rundumkennleuchte einschalten
      delay(1000);                                 // 1 Sekunde warten (Keine Bedeutung, nur optisch)
      alon = 1;                                    // Flag für Arbeitslicht "ein" auf "ein" setzen
      Licht_ein(al);                               // Arbeitsleuchte einschalten
    }
  }
}

Code:
//--------------- Schalter nach links auswerten---------------------------------------------------------
void Schalter_Links()
{
  if (time < Zeit_1)
  {
    blon = 1;
    if (re_li != 11)
    {
      if (re_li == 10)
      {
        re_li = 00;
      }
      else
      {
        re_li = 10;
      }
    }
    time_delete();
    schalterLinks = 0;
  }
  if (time > Zeit_1 && time < Zeit_2)
  {
    if (wbon == 0)
    {
      wbon = 1;
      if (re_li == 01 || re_li == 10)
      {
        reliSave = re_li;
      }
      re_li = 11;
    }
    else
    {
      wbon = 0;
      re_li = reliSave;
      reliSave = 00;
    }
    time_delete();
    schalterLinks = 0;
  }
  if (time > Zeit_2)    // && time < Zeit_3) 
  {
    rklon = 1;
    time_delete();
    schalterLinks = 0;
  }
}

Code:
//--------------- Schalter nach rechts auswerten---------------------------------------------------------
void Schalter_Rechts()
{
  if (time < Zeit_1)
  {
    bron = 1;
    if (re_li != 11)
    {
      if (re_li == 01)
      {
        re_li = 00;
      }
      else
      {
        re_li = 01;
      }
    }
    time_delete();
    schalterRechts = 0;
  }
  if (time > Zeit_1 && time < Zeit_2)
  {
    light_on = 1;
    time_delete();
    schalterRechts = 0;
  }
  if (time > Zeit_2 && time < Zeit_3 )
  {
    headlight_on = 1;
    time_delete();
    schalterRechts = 0;
  }
  if (time > Zeit_3 )
  {
    alon = 1;
    time_delete();
    schalterRechts = 0;
  }
}

Code:
void time_delete()
{
  time = 0;
  timeBegin = 0;
  aktTime = 0;
  timeStart = 0;
}

Code:
void zeitkontrolle(int direction)
{
  if (timeBegin == 0)
  {
    timeBegin = timeStart;
    switch (direction)
    {
    case 1:
    schalterRechts = 1;
    break;
    case 2:
    schalterLinks = 1;
    break;
    default:
    // do nothing;
    break;
    }
  }
  aktTime = millis();              //  aktuell gültige Zeit
  time = aktTime - timeBegin;      //  festgestellte Zeit = Aktuelle Zeit minus Anfangszeit
}
 
Zuletzt bearbeitet:
Vielen Dank Winni!

Ich finde das toll, das Du genau so ein Programm geschrieben hast, das ich mir so auch überlegt habe. :ok
Werde das ausgiebig testen, allerdings ist meine Verkabelung erst vom Führerhaus fertig und die Rücklichter fehlen noch. Das Standlicht werd ich so nicht umsetzen, da ich die Standlichtled mit einem größeren Widerstand dimme und gleichzeitig mit dem Abblendlicht einschalte.
Was ich eventuell noch anders mache ist das Einschalten vom Licht; überlege dieses per LDR automatisch zu schalten. Dazu kommt noch Tagfahrlicht, das ich dann gegenläufig schalte.

Nochmal zum ULN 2803A; dieser hat den Vorteil das er direkt mit der Eingangsseite auf die Ausgangseite vom Arduino zu löten ist. Dazu noch Masse und fertig.
Ich gebe aber zu das ich bisher auch immer Transistoren verwendet habe; das mit dem ULN 2803A habe ich diesmal das erste Mal umgesetzt.

Viele Grüße
Holger
 
Hallo zusammen.
Ich muss hier noch etwas zu der 12. Routine void rkltest() sagen.

Man könnte sich jetzt fragen wozu eine Testroutine im endgültigen Programmcode.

Aber es ist keine Testroutine in dem Sinne, sondern eine die eine Zustand abfragt und entsprechend reagiert.
Der gesamte Code wurde von mir für meinem T2 (wo sie schon erfolgreich eingebaut und in Betrieb ist, genauso wie im T2 von Roadgamer) und meinen Plateau VW-Delivery geschrieben. Dort kann ich die RKL und auch die Arbeitsleuchten unabhängig voneinander vom Sender aus aus- oder einschalten oder eben automatisch. Wenn ich das Plateau herunterfahre fragt diese Routine ab,
ob die Rundumkennleuchte eingeschaltet ist. Wenn nicht, wird sie jetzt zwangsweise eingeschaltet und die Arbeitsleuchten kurz darauf auch.



@ Holger

Der ULN 2803A ist eine interessante Lösung, die mir bis zu deinem Beitrag nicht bekannt war. :ok
 
Moin Winni,

ich habe mal durch den Code geblättert und ich hätte 2 Vorschläge.

1. Das Ausmessen der Lenkung könnte auch als Interrupt gelöst werden, die pulseIn() Funktion ist blockierend.
2. In der Interrupt Funktion für die Lichtsteuerung hast du neben der Positionsermittlung diverse Prüfungen und Funktionsaufrufe. Interrupt Funktionen sollten möglichst kurz sein, da sie den Progrmmablauf blockieren. Die nachfolgenden Tests würde ich in eine Funktion auslagern, welche dann in loop() aufgerufen wird.

Für den Start habe ich noch folgende Alternative, aktuell wird einfach 1500ms gewartet und dann geht es los egal wie der Status ist:

Variablen:
Code:
volatile	uint8_t		Initialisierung		= 1;
volatile	uint8_t		AnzahlLegaleWerte	= 0;
			uint16_t	GasMittelstellung	= 1500;

Alternative in setup()

Code:
	while ((Initialisierung == 1) && (AnzahlLegaleWerte < 10))
		delay(20);
	Initialisierung	= 0;

Zusatz im Interrupt:

Code:
void Interuppt_Kanal2()
{
	uint32_t    nMicros   = micros();                                                 //  Aktuellen Zeitstempel merken
	uint16_t    nDifference  = (uint16_t)(nMicros - LetzterEmpfaengerWert);           //  Die Differenz zum letzten Aufruf errechnen

	if ( (nDifference > 900 ) && ( nDifference < 2100))                               //  Zeiten zwischen 900 und 2100 Mikrosekunden sind das HIGH Signal
	{
		//  --------------    Wert in der 4er Liste austauschen und Mittelwert errechnen. Dies erfolgt indem der alte Wert von der Summe subtrahiert wird
		EmpfaengerKanal2WertSum   -= EmpfaengerKanal2Wert[EmpfaengerKanal2WertIndex];   //  Der neue Wert gemerkt wird
		EmpfaengerKanal2Wert[EmpfaengerKanal2WertIndex]  = nDifference;                 //  Den neuen Wert auf die Summe addieren
		EmpfaengerKanal2WertSum   += nDifference;                                       //  Den Index auf die naechste Position schieben
		EmpfaengerKanal2WertIndex   = ( ( EmpfaengerKanal2WertIndex + 1 ) & 0x07 );     //Index erhoehen und ggf. von 8 auf 0 springen
																						//  --------------    Den aktuellen Mittelwert errechnen indem die Summe durch 8 geteilt wird
	[B]	AktuellerEmpfaengerWert   = ( EmpfaengerKanal2WertSum >> 3 );                   //durch 8 teilen
		if (Initialisierung == 1)
			AnzahlLegaleWerte++;
[/B]	}
	LetzterEmpfaengerWert = nMicros;                                                  //  Zeitstempel fuer das naechste mal merken
}

Der Vorteil ist dass loop() erst los läuft wenn 10 gültige Servosignale empfangen hat. Weiterhin kann das Programm dann auch schon im best case nach 200ms starten.
 
Hallo,

Gestern habe ich die Beleuchtung von der Kabine fertiggestellt und mit den Rückleuchten angefangen.
Was mir aufgefallen ist:

der Ausgang Arbeitsscheinwerfer wird immer beim Starten des Arduino eingeschaltet und bleibt an, Blinker- Brems- und Rücklicht geht kurz an und dann wieder aus;
der Rückfahrscheinwerfer wird bei Vorwärts-Fahrt eingeschaltet (Kanal steht nicht auf Reverse);
bei den kombinierten Rücklichtern / Bremslichtern wird bei ausgeschaltetem Fahrlicht die Lampe beim Bremsen nicht in allen Situationen mit 100% Leuchtkraft angesteuert sondern gedimmt;
bei mir hängt sich der Arduino nach 2-3min auf, wenn ich keine Befehle mit der Funke sende und alle Lampen aus sind und reagiert anschließend nicht mehr (das Problem kann aber durchaus auch bei mir an der Schaltung liegen).

Viele Grüße
Holger
 
Nabend Holger.

Die Fehler kann ich bei mir nicht nachvollziehen. Es läüft bei mir in zwei Fahrzeugen einwandfrei und ich habe es gerade auf dem Breadboard noch mal ausprobiert.
Der Fehler mit dem, Arbeitsscheinwerfer ergibt sich wahrscheinlich daraus, dass du nicht beachtet hast, dass der Arbeitsscheinwerfer als einziger aktiv High arbeitet . Das habe ich so gemacht, weil ich die LED auf dem Arduino (PIN 13) nur leuchtend haben wollte, wenn der Arbeitsscheinwerfer leuchtet.
Beim Einschalten muss erst der Arbeitsscheinwerfer blinken, dann der Arbeitsscheinwerfer ausgehen und danach alle anderen Lampen Angehen und wieder aus.
Der Rückfahrscheinwerfer leuchtet bei mir nur Rückwärts und mein Sender ist auch nicht auf reverse. Es ist so programiert, dass es mit meiner Multiplex Flex Anlage funktioniert.
Schalte deinen Fahrkanal mal auf reverse dann wirds wahrscheinlich gehen.
Ansonsten musst du das Programm anpsssen.
Dazu suchst du im Programm überall die Programmzeilen digitalWrite(rfsch, WERT); und tauschst HIGH gegen LOW und umgekehrt. Außer an der Stelle wo in Neutralstellung der Wert auf LOW gesetzt wird. Sonst leuchtet er in Neutralstellung immer.

............
------------------------------------------------
//
// Werte ausgelegt für Fernsteuerung Multiplex Flex und Lichtanlage auf Arduino Pro Mini ATmega 328 (5V 16MHz)
// Funktionen:
// ..................

............
Pin 13 Ausgang für Arbeitsscheinwerfer (max.40 mA) und Arduino-interne LED ( aktiv HIGH )
// ..................
 
Hallo Winni,

ich hab' jetzt mal versucht, den Sketch zu kompilieren bzw. auf einen Arduino hochzuladen.

Dabei macht mir diese Zeile "Kopfschmerzen":

PCICR |= (1 << PCIE2); // Interrupt Port D aktivieren

... denn deswegen bekomme ich folgende Fehlermeldung:


exit status 1
'PCIE2' was not declared in this scope

WAS mache ich falsch???

Herzliche Grüße von
Maik
 
Moin Maik,

schau mal bitte ob du als Board den Arduino Uno ausgewählt hast. Solltest du ein anderes Board verwenden, musst du ein paar Anpassungen machen.
 
Hallo Peter,

"sowas" hatte ich schon befürchtet:
Nein, ich habe keinen Arduino UNO, sondern einen Arduino Mini (= Arduino Leonardo?) dran.
Als ich "es" mit einem Arduino Pro Mini (und einem FTD1323) probiert hatte, kam diese Fehlermeldung nicht.

Was muß ich denn machen, wenn den Arduino Mini mit dem Sketch "füttern" möchte?

Herzliche Grüße von
Maik
 
Moin Maik,

ich muss mir nochmal eben den Code von Winni anschauen, ich melde mich...
 
Moin Maik,

vorab eine Frage: Hast du einen Arduino Mini mit einer 328er oder einem 168er? Ich vermute ein 168er.

die Interrupts auf Pin 2 und 3 bekommt man auch über attachInterrupt(), da muss man nicht über die Register gehen. Die Register sind notwendig wenn man Interrupts and die Pins 4 oder höher legen will.

Mach bitte mal folgende Änderungen und berichte:

Code:
void setup()
{
/*
	PCICR  |= (1 << PCIE2);                 //  Interrupt Port D aktivieren
	PCMSK2 |= (1 << PCINT18);               //  Interrupts fuer Pins 2 aktivieren
	sei();
*/
	attachInterrupt(digitalPinToInterrupt(2), Interuppt_Kanal2, CHANGE);
	attachInterrupt(digitalPinToInterrupt(3), LightPositionInterrupt, CHANGE);
	//---------------------------------------------------------------------------------------------------------------

und die ISR Funktion dann auskommentieren, das gibt sonst Störungen

Code:
//---------------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------------
// Interrupt
//---------------------------------------------------------------------------------------------------------------
/*
ISR(PCINT2_vect)
{
	uint8_t PinStatus  = PIND;                                      //  Aktuellen Stetus der Interrupts lesen
	uint8_t PinSignalWechsel  = PinStatus ^ LetzterInterruptStatus; //  Mit vorherigem Wert verknüpfen
																	//                                                              //  Das Ergebnis ist eine Bitliste der ausgelösten Interrupts
	if (PinSignalWechsel & (1 << PCINT18))                          //  Ist das Bit für Pin 2 gesetzt?
		Interuppt_Kanal2();                                           //  Ja -> Interrupt auswerten
	LetzterInterruptStatus  = PinStatus;                            //  Alte Bitmaske merken
}
*/
//---------------------------------------------------------------------------------------------------------------
// Interrupt Ende
//---------------------------------------------------------------------------------------------------------------

Ich hoffe es klappt damit, ich konnte nur kompilieren aber nicht testen.
 
Hallo Peter,

ganz herzlichen Dank für Deine Bemühungen! :ok

Wie ich an anderer Stelle schon mal geschrieben habe, bin ich bezüglich Arduino im "Nachbauen" schon ganz gut, im Selbst-Schreiben von Sketches aber "Laie".

Ich habe mir vor einer Weile mal diverse Arduinos (bzw. Clones) bestellt: von Uno über Nano, MEGA 2560, Pro Mini bis Pro Micro ist inzwischen alles vorhanden.
Vom Pro Mini sollte eigentlich sogar einmal die 5V und einmal 3,3V Variante vorhanden sein ... - Leider sehen beide identisch aus und hinten auf der Platine ist nicht markiert, welcher WELCHER ist. :heilig

Beim Nachschauen in dem Shop, bei dem ich die "kleinen" Arduinos bestellt hatte, ist mir aufgefallen, daß es sich bei dem verwendeten Arduino auch um einen Arduino Pro Micro https://www.christians-shop.de/Pro-Micro-Entwicklerboard-fuer-Arduino-IDE-ATMEL-ATmega32U4-AVR-Mikrocontroller-5V-16MHz-Christians-Technikshop handeln könnte ... (er hat jedenfalls eine USB Buchse und es ist kein Nano :cool)

Bezüglich des Arduino-Typs bin ich jedenfalls nicht festgelegt, würde aus Platzgründen aber keinen Uno oder Mega 2560 verwenden.

Herzliche Grüße von
Maik
 
Moin Maik,

du kannst die Plastiken auch selbst bauen, dann sind die kleiner wie ein Uno.

Hier eine sehr interessante Seite dazu: Kriwanek.de

Ich nutze die Schaltung für meiner Platinen.
 
Hallo Peter,

ja, daß man die Arduino-Schaltungen auch auf dem Breadboard nachbauen kann, weiß ich.
Bezüglich dem Lichtmodul werde ich nochmal nachsehen, ob in der Arduino-IDE irgendwo "Arduino Pro Micro" angeboten wird; ansonsten versuche ich einfach, den Sketch auf einen Nano zu laden.

Herzliche Grüße von
Maik
 
Hallo Peter,

kurzer "Zwischenbericht" von mir:
Für die Arduino IDE gibt es offenbar ein "Addon" für den Pro Micro, das ich mir jetzt vom Verkäufer angefordert habe.

Mit dem Nano funktioniert es leider auch nicht so, wie gewünscht: Es gibt beim Kompilieren zwar keine Probleme, aber bei Hochladen "meckert" er irgendwas mit :

Arduino: 1.8.1 (Windows 7), Board: "Arduino Nano, ATmega328"

Der Sketch verwendet 5100 Bytes (16%) des Programmspeicherplatzes. Das Maximum sind 30720 Bytes.
Globale Variablen verwenden 153 Bytes (7%) des dynamischen Speichers, 1895 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x77
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x77
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x77
Problem beim Hochladen auf das Board. Hilfestellung dazu unter http://www.arduino.cc/en/Guide/Troubleshooting#upload.
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x77
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x77
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x77
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x77
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x77
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x77
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x77

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Ich hab' mal die komplette Fehlermeldung reinkopiert.

Herzliche Grüße von
Maik
 
Hallo Maik,
so gut kenne ich mich mit der Arduino-Programmierung auch nicht aus, so dass ich mit den Fehlermeldungen viel anfangen könnte. Da ist Peter schon um Längen besser drin als ich.

Bei mir läuft, wie am Anfang schon geschrieben, das Programm auf einem Pro Mini At-Mega 328.
Der ist doch noch kleiner als der Nano.
 
Moin Maik,

es gibt diverse Möglichkeiten:
- ein Treiberproblem
- Der Nano hat keinen Bootloader
- Der Nano ist kaputt
 
Ich habe gerade mal noch was getestet.
Bei einem Arduino Micro bekomme ich auch schon Fehlermeldungen beim kompilieren.

Deine Änderungen habe ich allesamt noch nicht auspropiert, Peter. (Zeitmangel, Rentner ;))
Aber trotzdem vielen Dank für deine Vorschläge. Ich werde mich da bei Gelegenheit noch mal dransetzen.
 
...in meiner IDE (1.8.8) gibt es unter [Werkzeuge] - [Prozessor] noch die Option "ATmega 328 (Bootloader old)
Je nach Nano und dessen Ausgabestand muss ich da auch wechseln

HTH
Martin
--
(der tut nichts - der will nur spielen)
 
Hallo zusammen,

vielen Dank für Eure Bemühungen! :thx

Nun, daran, einen anderen Nano zu verwenden, soll es doch nicht scheitern. - Davon hab' ich doch mehrere. :hfg

Bei den Einstellungen der IDE kann ich auch mal nachschauen, ob ich da was umstellen kann (oder muß). Ich habe allerdings tatsächlich schon einige Sketches erfolgreich auf einen Nano hochgeladen.

... heute Abend komme ich allerdings nicht dazu, es zu testen.

@Winni
Auf einen Pro Mini müßte ich den Sketch eigentlich schon hochgeladen bekommen haben, jedoch weiß ich nicht, ob es eine 3,3V oder 5V Version ist. :frage
Da ich zuvor nur mit den Arduinos gearbeitet hab, die eine eigene USB-Buchse haben, war das Hochladen unter Verwendung des FTD1232 schon etwas "gewöhnungsbedürftig":
Zunächst kam auch dort eine Fehlermeldung, aber nachdem ich auf dem FTD1232 den Jumper umgesteckt habe, scheint das Hochladen funktioniert zu haben. :oops

Herzliche Grüße von
Maik
 
Hallo zusammen!

Ich bin's nochmal: Ich hatte jetzt zwischendurch doch noch ein paar Minuten Zeit und wollte ja auch unbedingt wissen, woran es liegt, daß ich den Sketch nicht hochladen konnte.

Die Lösung ist so einfach, wie ICH blöd bin: Ich hatte einen "falschen" COM-Port gewählt. Die Arduino IDE hatte mir COM1, COM11 und COM16 vorgeschlagen, ich hatte COM16 genommen.
Nachdem heute das Hochladen mit einem anderen Nano auch nicht funktionierte, hab' ich einfach mal COM11 ausprobiert und innerhalb weniger Sekunden war der Sketch hochgeladen.

Nun kann ich in Ruhe die Schaltung aufbauen und ausprobieren.

Herzliche Grüße von
Maik
 

Servonaut
Zurück
Oben Unten