Zum Inhalt springen

Flugzeugbeleuchtung mit Arduino

    Ich habe von Stephan die Anfrage bekommen, wie man eine Flugzeugbeleuchtung mit Arduino bauen kann. Er schreibt:

    »Hallo, da wir gerade beim Thema blinken sind,  ich suche einen Sketch für eine Flugzeugbeleuchtung (Boeing). Es gäbe im Internet zwar jede Menge für RC Flugzeuge, jedoch helfen die mir nicht, da Signale von der Fernsteuerung ausgelesen werden. Ich möchte ein Standmodell beleuchten. Könnt ihr mir dabei behilflich sein?«

    Stephan

    Tja, da bin ich doch gern dabei. Da ich keine Ahnung davon habe, welche Beleuchtung es an Flugzeugen gibt, habe ich mir das auf YouTube angesehen. Captain Joe erklärt da die Beleuchtung eines Airbusses (https://www.youtube.com/watch?v=A1eqrunJuc0). Ich weiß nicht genau, ob es bei Boeing genau so ist, aber das Prinzip ist es bestimmt. Also:

    Welche Lampen gibt es an einem Flugzeug? 

    Flugzeugbeleuchtung mit Arduino Position der Lampen
    Taxi LightEin 400 Watt Scheinwerfer am Bugfahrwerk (links), der nach vorne strahlt
    Takeoff LightEin 600 Watt Scheinwerfer am Bugfahrwerk (rechts) der für den Start verwendet wird
    Runway Turnoff LightLeicht Links und Rechts abstrahlend am Bugfahrwerk um während des Taxis und Takeoffs die Umgebung zu beleuchten
    Wing & Engine Scan LightVom Rumpf aus beleuchten diese Scheinwerfer die Triebwerke und Tragflächen, sie ermöglichen es, nach Eisbildung zu prüfen
    Anti-Collision BeaconEin heller roter Stroboskop-Blitz unter und / oder auf dem Rumpf
    Landing LightsScheinwerfer (2x 600W), die nach nach vorn strahlen, um die Landebahn zu beleuchten. Sie sind in den Tragflächen eingelassen und fahren nach unten vorn aus (Start und Landung).
    Navigation Lights (Position Lights)Rechts = grün, links = rot, dauerleuchtend im 110° Abstrahlwinkel, hinten weißes Licht 140°, damit können andere Piloten sehen, wohin sich das Flugzeug bewegt
    High Intensity Strobe LightZwei Lichtblitze jeweils am Ende der Tragflächen und eines am Ende des Rumpfes – blitzen jede Sekunde einmal
    Logo LightsIm Stabilisator, sie beleuchten die Rückflosse des Flugzeuges, um für Sichtbarkeit zu sorgen

    Für ein schönes Modell lege ich mal noch zwei weitere Lichtquellen an. Eine für das Cockpit und eine für die Kabinenbeleuchtung.


    Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


    Die Lichtblitz-Intervalle folgen einer speziellen Animation. Die Strobes blitzen zweimal auf, dann gibt es eine Pause, dann blitzt das Anti-Collision Beacon, dann gibt es wieder eine Pause. Ich habe das mal in der folgenden Tabelle aufgeführt:

    Pausenzeiten (ms) ->50505040050400
    Strobe Lights (Tragflächen)HIGHLOWHIGHLOWLOWLOW
    Anti-Collision BeaconLOWLOWLOWLOWHIGHLOW

    Nun scheint es verschiedene Zustände des Flugzeuges zu geben. Ich nenne sie mal: Taxi, Takeoff, Climbing / Landing, In flight.


    All OffGroundedTaxiTakeoffClimbing / LandingIn Flight
    Taxi LightsLOWLOWHIGHHIGHLOWLOW
    Takeoff LightsLOWLOWLOWHIGHLOWLOW
    Runway Turnoff LightsLOWLOWHIGHLOWLOWLOW
    Wing Engine Scan LightsLOWHIGHHIGHHIGHHIGHHIGH
    Anti-Collision BeaconLOWLOWHIGH (Flashing)HIGH (Flashing)HIGH (Flashing)HIGH (Flashing)
    Landing LightsLOWLOWLOWHIGHHIGHLOW
    Navigation LightsLOWHIGHHIGHHIGHHIGHHIGH
    High Intensity Strobe LightsLOWLOWLOWHIGH (Flashing)HIGH (Flashing)HIGH (Flashing)
    Logo-LightsLOWHIGHHIGHHIGHHIGHHIGH
    CockpitLOWHIGHHIGHHIGHHIGHHIGH
    KabineLOWHIGHHIGHLOWHIGHHIGH

    Schaltplan: Flugzeugbeleuchtung mit Arduino

    Flugzeugbeleuchtung mit Arduino Schaltplan

    Die Schaltung besteht aus einer Menge an Reihenschaltungen aus je einer LED und einem Vorwiderstand von 220 Ohm. Für die Blitze sollte man Ultra-Bright-LEDs verwenden. Die drei Navigaion Lights müssen jeweils einen Vorwiderstand bekommen. Das ist nervig, verhindert aber, dass sonst nur die LED mit dem kleinsten Innenwiderstand leuchtet. Bei unterschiedlichen Farben wäre das sonst unvermeidbar. Zusätzlich kommt noch ein Taster in die Schaltung, der dem Durchschalten der Zustände dient. 

    Code

    Gut. Damit lässt sich doch schon mal was anfangen. Im Programm verwende ich eine Status-Variable (myState). Sie merkt sich den Zustand, in dem sich das Flugzeug befindet. Welche Zustände das sind, lässt sich hier unten im Array sehen. Es speichert die Beleuchtungszustände pro Status. Das bedeutet, dass zum Beispiel im Status 4 die ersten drei LEDs ausgeschaltet sein sollen, alle anderen sollen eingeschaltet sein.

    int beleuchtungsZustaende[9][11] = {
      {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // state 0 All Off
      {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1},  // state 1 Grounded
      {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1},  // state 2 Taxi
      {1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0},  // state 3 Takeoff
      {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},  // state 4 Climbing
      {0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1},  // state 5 In Flight
      {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},  // state 6 Landing
      {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1},  // state 7 Taxi
      {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1}   // state 8 Grounded
    };

    Ich füge gleich noch ein paar wiederholende Muster fest (z. B. ist Taxi sowohl State 2 als auch State 7), um eine schöne Abfolge zu erreichen (also vom Start bis zur Landung).

    Alle LED-Pins werden auch in einem Array gespeichert. 

    int ledPins[11] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

    Nun können die LEDs also je nach Zustand ein- und ausgeschaltet werden. Der Status ändert sich, wenn man den Button drückt, der in die Schaltung integriert ist. Damit lassen sich also alle Beleuchtungszustände durchschalten:

      buttonState = digitalRead(buttonPin);
      if ((buttonState != lastButtonState) && (buttonState == LOW)) {
        myState++;
        if (myState >= 9) myState = 0;
      }

    Die Methode zeigeBeleuchtung übernimmt die gesamte Ausgabe. Sie schaltet je nach Status (myState) durch eine for-Schleife die einzelnen LEDs ein- und aus.

    void zeigeBeleuchtung() {
      for (int i = 0; i < 11; i++) {
        digitalWrite(ledPins[i], beleuchtungsZustaende[myState][i]);
      }
    }

    Der gesamte Code sieht dann so aus:

    int ledPins[11] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int buttonPin = 14;  // entspricht dem Analog In 0 (A0)
    
    int beleuchtungsZustaende[9][11] = {
      {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // state 0 All Off
      {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1},  // state 1 Grounded
      {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1},  // state 2 Taxi
      {1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0},  // state 3 Takeoff
      {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},  // state 4 Climbing
      {0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1},  // state 5 In Flight
      {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},  // state 6 Landing
      {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1},  // state 7 Taxi
      {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1}   // state 8 Grounded
    };
    
    int myState = 0;
    int buttonState;
    int lastButtonState;
    
    void setup() {
      pinMode(buttonPin, INPUT_PULLUP);
      for (int i = 0; i < 11; i++) {
        pinMode(ledPins[i], OUTPUT);
      }
    }
    
    void zeigeBeleuchtung() {
      for (int i = 0; i < 11; i++) {
        digitalWrite(ledPins[i], beleuchtungsZustaende[myState][i]);
      }
    }
    
    void loop() {
      buttonState = digitalRead(buttonPin);
      if ((buttonState != lastButtonState) && (buttonState == LOW)) {
        myState++;
        if (myState >= 9) myState = 0;
      }
    
      zeigeBeleuchtung();
      lastButtonState = buttonState;
      delay(10);
    }

    Nun sollen die Beacon- und Strobe-Lichter aber natürlich blinken. Da ich dafür keine Delays verwenden will, muss ich Timer-Funktionen einsetzen. Ich lege also zwei Arrays an. flashTimeouts speichert die oben erwähnten Wartezeiten, während flashBehaviour steuert, ob die Beacon- oder Strobe-LEDs an oder aus sein sollen. 

    Der Einfachheit zu liebe betrachte ich zwei unterschiedliche Zustände. Beim ersten sollen sowohl die Beacon- als auch die Strobe-LED blitzen:

    if ((beleuchtungsZustaende[myState][4] == 1) && (beleuchtungsZustaende[myState][7] == 1)) {
        digitalWrite(ledPins[4], flashBehaviour[0][flashPosition]);
        digitalWrite(ledPins[7], flashBehaviour[1][flashPosition]);
        if (flashTimer + flashTimeouts[flashPosition] < millis()) {
          flashPosition++;
          flashTimer = millis();
          if (flashPosition > 5) flashPosition = 0;
        }
    }

    Beim zweiten blitzt nur die Beacon-LED:

    if ((beleuchtungsZustaende[myState][4] == 1) && (beleuchtungsZustaende[myState][7] == 0)) {
        digitalWrite(ledPins[4], flashBehaviour[0][flashPosition]);
        if (flashTimer + flashTimeouts[flashPosition] < millis()) {
          flashPosition++;
          flashTimer = millis();
          if (flashPosition > 5) flashPosition = 0;
        }
    }

    Ringsherum noch etwas Timer-Magie und dann sieht der zusammenhängende Code so aus:

    int ledPins[11] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int buttonPin = 14;   // entspricht dem Analog In 0 (A0)
    
    int beleuchtungsZustaende[9][11] = {
      {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  // state 0 All Off
      {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1},  // state 1 Grounded
      {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1},  // state 2 Taxi
      {1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0},  // state 3 Takeoff
      {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},  // state 4 Climbing
      {0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1},  // state 5 In Flight
      {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1},  // state 6 Landing
      {1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1},  // state 7 Taxi
      {0, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1}   // state 8 Grounded
    };
    
    int flashTimeouts[6] = {50, 50, 50, 400, 50, 400};
    int flashBehaviour[2][6] = {{0, 0, 0, 0, 1, 0}, {1, 0, 1, 0, 0, 0}};
    int flashPosition = 0;
    
    long flashTimer = 0;
    
    int myState = 0;
    int buttonState;
    int lastButtonState;
    
    void setup() {
      pinMode(buttonPin, INPUT_PULLUP);
      for (int i = 0; i < 11; i++) {
        pinMode(ledPins[i], OUTPUT);
      }
    }
    
    void zeigeBeleuchtung() {
      for (int i = 0; i < 11; i++) {
        digitalWrite(ledPins[i], beleuchtungsZustaende[myState][i]);
      }
      if ((beleuchtungsZustaende[myState][4] == 1) && (beleuchtungsZustaende[myState][7] == 1)) {
        digitalWrite(ledPins[4], flashBehaviour[0][flashPosition]);
        digitalWrite(ledPins[7], flashBehaviour[1][flashPosition]);
        if (flashTimer + flashTimeouts[flashPosition] < millis()) {
          flashPosition++;
          flashTimer = millis();
          if (flashPosition > 5) flashPosition = 0;
        }
      }
    
      if ((beleuchtungsZustaende[myState][4] == 1) && (beleuchtungsZustaende[myState][7] == 0)) {
        digitalWrite(ledPins[4], flashBehaviour[0][flashPosition]);
        if (flashTimer + flashTimeouts[flashPosition] < millis()) {
          flashPosition++;
          flashTimer = millis();
          if (flashPosition > 5) flashPosition = 0;
        }
      }
    }
    
    void loop() {
      buttonState = digitalRead(buttonPin);
      if ((buttonState != lastButtonState) && (buttonState == LOW)) {
        myState++;
        flashTimer = millis();
        flashPosition = 0;
        if (myState >= 9) myState = 0;
      }
    
      zeigeBeleuchtung();
      lastButtonState = buttonState;
      delay(10);
    }

    Viel Spaß beim Nachbauen. Übrigens empfehle ich die Verwendung von SMD-LEDs für die Modell-Beleuchtung, da diese super klein sind. Zum Verkabeln kann man Lackdraht verwenden. Ist aber nicht so einfach im Handling. Allerdings ist das eine schöne Herausforderung. Du schaffst das schon :-) Der Torben hat das hier mal erklärt: SMD-LEDs und Lackdraht löten.

    User Gallery

    Das nachfolgende Video ist mir von Christian zur Verfügung gestellt worden. Er hat das Programm noch abgewandelt. Sieht echt super aus!

    Wir benötigen Ihre Zustimmung um den Inhalt von YouTube laden zu können.

    Mit dem Klick auf das Video werden durch den mit uns gemeinsam Verantwortlichen Youtube [Google Ireland Limited, Irland] das Video abgespielt, auf Ihrem Endgerät Skripte geladen, Cookies gespeichert und personenbezogene Daten erfasst. Damit kann Google Aktivitäten im Internet verfolgen und Werbung zielgruppengerecht ausspielen. Es erfolgt eine Datenübermittlung in die USA, diese verfügt über keinen EU-konformen Datenschutz. Weitere Informationen finden Sie hier.

    Jmx0O2RpdiBjbGFzcz0mcXVvdDtudi1pZnJhbWUtZW1iZWQmcXVvdDsmZ3Q7Jmx0O2lmcmFtZSB0aXRsZT0mcXVvdDtCLTFCIExhbmNlciBNb2RlbGxiZWxldWNodHVuZyBtaXQgQXJkdWlubyZxdW90OyB3aWR0aD0mcXVvdDsxMjAwJnF1b3Q7IGhlaWdodD0mcXVvdDs2NzUmcXVvdDsgc3JjPSZxdW90O2h0dHBzOi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkL05BSHVqTzFxcnZVP2ZlYXR1cmU9b2VtYmVkJnF1b3Q7IGZyYW1lYm9yZGVyPSZxdW90OzAmcXVvdDsgYWxsb3c9JnF1b3Q7YWNjZWxlcm9tZXRlcjsgYXV0b3BsYXk7IGNsaXBib2FyZC13cml0ZTsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZSZxdW90OyBhbGxvd2Z1bGxzY3JlZW4mZ3Q7Jmx0Oy9pZnJhbWUmZ3Q7Jmx0Oy9kaXYmZ3Q7

    Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!

    • Die beliebtesten Arduino-Projekte von StartHardware
    • Inklusive Schaltplan, Beschreibung und Code
    • Arduino-Schnellstart-Kapitel
    • Kompakter Programmierkurs


    0 0 votes
    Article Rating
    Abonnieren
    Benachrichtige mich bei

    Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..

    17 Comments
    Newest
    Oldest Most Voted
    Inline Feedbacks
    Alle Kommentare anzeigen
    Stephan Götz
    3 Jahre zuvor

    Hallo Stefan,

    auch hier brauche ich wieder einmal deine Hilfe!!

    Wie du sicher mitbekommen hast, wurde die ANTONOV AN-225 Mryja am ersten Tag des Ukraine Krieges zerstört.
    Aus gegebenem Anlass, möchte ich die anderen Modelle vorerst ruhen lassen und meine Zeit einem neuen Modell widmen. Es soll die AN-225 im Maßstab 1:10 Werden. Mit beinahe 9 Metern länge ist das schon ein Riesen Modell und wird somit natürlich in meinem Garten stehen. Also eine ordentliche Schau für Antonov Fans!

    Grüße Stephan

    Hansueli Goeldi
    3 Jahre zuvor

    Guten Abend Stefan
    Vielen vielen Dank für das Projekt, ich fange gerade an mit Arduino… konnte schon ein paar Übungen machen.
    Gibt es eine Möglichkeit den Taster zu ersetzen und mit Pausen die Verschiedenen „States“ ablaufen zu lassen ?
    Ist für ein Vitrinen Modell…
    Vielen Dank im Voraus
    Hansueli

    Stephan Götz
    4 Jahre zuvor

    Hi,

    ich nochmal,
    läuft das auch auf einem Nano oder muss da was geändert werden?

    ich frage weil ich jede menge Nano’s habe und ich nicht extra einen Uno kaufen möchte.

    Grüße

    Stephan

    Stephan Götz
    Antworte an  Stephan Götz
    4 Jahre zuvor

    schade, habs grad mal nachgebaut mit dem nano.

    Leider tut sich gar nichts

    Stephan Götz
    Antworte an  Stephan Götz
    4 Jahre zuvor

    Sooo,

    ich habe das jetzt mal mit einem Nano V3.0 nachgebaut. Leider geht das ganze schon nicht aufs Board. evtl. fehlt mir das richtige Board in der IDE. Wo bekommt man das her?

    Stephan Götz
    Antworte an  Stefan Hermann
    4 Jahre zuvor

    Geht auch nicht. Ich kanns dann zwar aufs Board laden, die LEDs bleiben aber dunkel

    Stephan Götz
    Antworte an  Stefan Hermann
    4 Jahre zuvor

    ja, schick ich dir gerne.

    Ich muss es aber erst wieder aufbauen. Habe es auseinander genommen nach dem es nicht funktionierte

    Chris
    Antworte an  Stephan Götz
    4 Jahre zuvor

    Hallo Stephan,
    bei mir lief es auf dem Nano mit geändertem button_pin pin mode / ohne Pull_up. Mit echtem Widerstand schaltet er dann die Zustände durch. Der Uno scheint hier „robuster“ – weil er sowohl mit dem einen als auch mit dem anderem klart kommt.

    Stephan Götz
    Antworte an  Chris
    4 Jahre zuvor

    Hi Chris,

    Ich weiß nicht in welcher Zeile ich was ändern muss.

    Ich muss zugeben, dass ich von programmieren nichts verstehe

    Chris
    4 Jahre zuvor

    Hallo Stefan,
    das ist echt eine super Hilfestellung – auch super erklärt.

    Falls man das „digitales Blinken“ durch rampenförmiges / dimmendes Verhalten von den (Beacon)-LEDs haben möchte (4 Stück), wie könnte man dies machen?
    Ginge dies über Timings oder
    PWMs nutzen oder
    über Transistor ansteuern,
    wenn diese asynchron Blinken sollten?

    Chris
    Antworte an  Stefan Hermann
    4 Jahre zuvor

    Hallo Stefan,
    erstmal danke für die Antworten. Ich weiß nicht ob Stephans-Projekt dann störe bzw. es dort nicht so komplex werden braucht…Sorry schon mal @ Stephan.

    Konkret geht es bei mir um diese Flugzeug:
    https://www.youtube.com/watch?v=GSnLV_KxKcE

    Falls die Digicams keinen Streich bei den Aufnahmen gespielt haben, dann sehe ich folgende Herausforderungen:
    https://www.youtube.com/watch?v=_vFvwrOcUBg

    – Faden/Schwellende Beleuchtungen (+ ggf. Simulation laufende Rundumlichter wie bei deinem Videobespiel https://www.youtube.com/watch?v=ZbXejOGsK1E
    mit 2 oder 3 LEDs)
    – Blitzlichter, die langsam voneinander driften d.h. nicht mehr im Gleichtakt (ggf. nur ein Thema der Ausgänge – eher unwichtig)
    – Blitzlichter, die eine high high high low low high high high low low low Sequenz haben
    (Das ist bei dem Code oben ja im Prinzip schon drin – glaube ich.)

    // ggf. 74HC595 Schieberegister Implementierung, um nicht alles Ausgänge zu belegen.
    (Vielleicht komme ich aber auch mit low current LEDs hin und kann sie dann parallel schalten. Ich muss das mal mit passenden SMD LEDs aufbauen.)

    VG Chris

    Stephan Götz
    4 Jahre zuvor

    Hi Stefan, das ist ja toll, kann ich den Code einfach in die IDE einfügen oder muss da noch was geändert werden,? Auf SMD LEDs kann ich verzichten da es ein sehr großes aufgehäntes Modell ist (teilweise werden 10mm LEDs verwendet.

    17
    0
    Ich würde mich über deine Meinung freuen.x