Antriebszahnräder


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Zauberkrone und Charlieplexing

In dem Experiment konstruieren wir mit Hilfe von farbigen Leuchtdioden eine mögliche Verschönerung einer Krone. Ob man das Ergebnis anschließend als Zauberkrone bezeichnen kann, überlassen wir dem Betrachter selbst.

Wir widmen uns der Frage, wie man die Aufgabe realisieren kann. Es gilt in dem Beispiel 20 LEDs anzusteuern. Für einen Microcontroller eine gewaltige Menge. Dass man solche (und größere) Mengen an LEDs direkt ansteuert ist in der Praxis eher nicht anzutreffen. Eine der Methoden, die Anzahl der Ausgänge zu minimieren heißt Charlieplexing.

Bei der Methode werden jeweils zwei Dioden entgegengepolt an zwei Ausgänge angeschlossen. Setzt man den ersten Ausgang auf High und den zweiten auf Low leuchtet eine der Dioden auf. Setzt man den ersten Ausgang auf Low und den zweiten dagegen auf High leuchtet die andere Diode auf.

Charlieplexing Prinzip


Bei mehreren LEDs werden automatisch mehr Ausgänge benötigt. Hier ist darauf zu achten, dass die Anschluss-Pins, die gerade nicht benötigt werden, nicht als Outputs sondern als Inputs zu definieren sind. Dadurch werden sie hochohmig und hindern andere (nicht gewollte) Dioden am Leuchten.

Die folgenden Abbildungen zeigen eine aufgebaute Testschaltung und den zugehörigen Schaltplan:

Testschaltung



schaltplan

Schaltplan

Das Steuerungsprogramm:

In dem unten vorgestelltem Beispiel-Programm (Arduino) werden im Laufe des Programms die teilnehmende Pin-Anschlüsse laufend zwischen Output-High, Output-Low und Input umgeschaltet. Damit kann jede einzelne Diode gezielt angesprochen und zum Leuchten gebracht werden.


  // ----------------------------------------------------------
  // Zauberkrone mit LEDs und Arduino
  // ----------------------------------------------------------


  int Line_R1 = 40;
  int Line_R2 = 42;
  int Line_R3 = 44;
  int Line_R4 = 46;
  int Line_R5 = 48;
  int Element_Nr = 0;
  int Schritt = 1;
  int Zaehler = 0;
  int i;

  void setup() {
  }

  // Hauptprogramm
  // ++++++++++++++++++++++++++
  void loop() {
    Zaehler = ++Zaehler;

    // Sequenz 1 (von links nach rechts und umgekehrt)
    if (Zaehler < 59) {
      Element_Nr = Element_Nr + Schritt;
      Alles_Aus ();
      Element (Element_Nr);
      delay (150);
      if (Element_Nr == 20) { Schritt = -1; }
      if (Element_Nr == 1) { Schritt = 1; }
    }

    // Sequenz 2 (Rot Ein)
    if (Zaehler == 59 or Zaehler == 61 or Zaehler == 63) {
      for (int i=0; i<30; i++) {
        Alles_Aus ();
        Element_Nr = 10;
        Element (Element_Nr);
        delay (10);
        Alles_Aus ();
        Element_Nr = 11;
        Element (Element_Nr);
        delay (10);
      }
    }

    // Sequenz 3 (Blau Ein)
    if (Zaehler == 60 or Zaehler == 62 or Zaehler == 64) {
      for (int i=0; i<30; i++) {
        Alles_Aus ();
        Element_Nr = 1;
        Element (Element_Nr);
        delay (10);
        Alles_Aus ();
        Element_Nr = 20;
        Element (Element_Nr);
        delay (10);
      }
    }

    // Sequenz 4 (Nur Gelb nach Innen))
    if (Zaehler == 65 or Zaehler == 67 or Zaehler == 69) {
      for (int i=2; i<10; i++) {
        Alles_Aus ();
        Element_Nr = i;
        Element (Element_Nr);
        delay (20);
        Alles_Aus ();
        Element_Nr = 21-i;
        Element (Element_Nr);
        delay (20);
      }
    }

    // Sequenz 5 (Nur Gelb nach Außen))
    if (Zaehler == 66 or Zaehler == 68 or Zaehler == 70) {
      for (int i=9; i>1; i--) {
        Alles_Aus ();
        Element_Nr = i;
        Element (Element_Nr);
        delay (20);
        Alles_Aus ();
        Element_Nr = 21-i;
        Element (Element_Nr);
        delay (20);
      }
    }

    // Wiederholung Start
    if (Zaehler == 70) {
      Zaehler = 0;
      Element_Nr = 0;
      Schritt = 1;}
  }

// Unterprogramm Element
// ++++++++++++++++++++++++++
void Element (int Element_Nr) {
    switch (Element_Nr) {
      case 1 : {
        pinMode (Line_R1, OUTPUT); pinMode (Line_R2, OUTPUT);
        digitalWrite (Line_R1, LOW); digitalWrite (Line_R2, HIGH); break; }
      case 2 : {
        pinMode (Line_R1, OUTPUT); pinMode (Line_R2, OUTPUT);
        digitalWrite (Line_R1, HIGH); digitalWrite (Line_R2, LOW); break; }
      case 3 : {
        pinMode (Line_R2, OUTPUT); pinMode (Line_R3, OUTPUT);
        digitalWrite (Line_R3, HIGH); digitalWrite (Line_R2, LOW); break; }
      case 4 : {
        pinMode (Line_R2, OUTPUT); pinMode (Line_R3, OUTPUT);
        digitalWrite (Line_R2, HIGH); digitalWrite (Line_R3, LOW); break; }
      case 5 : {
        pinMode (Line_R3, OUTPUT); pinMode (Line_R4, OUTPUT);
        digitalWrite (Line_R4, HIGH); digitalWrite (Line_R3, LOW); break; }
      case 6 : {
        pinMode (Line_R3, OUTPUT); pinMode (Line_R4, OUTPUT);
        digitalWrite (Line_R3, HIGH); digitalWrite (Line_R4, LOW); break; }
      case 7 : {
        pinMode (Line_R4, OUTPUT); pinMode (Line_R5, OUTPUT);
        digitalWrite (Line_R5, HIGH); digitalWrite (Line_R4, LOW); break; }
      case 8 : {
        pinMode (Line_R4, OUTPUT); pinMode (Line_R5, OUTPUT);
        digitalWrite (Line_R4, HIGH); digitalWrite (Line_R5, LOW); break; }
      case 9 : {
        pinMode (Line_R1, OUTPUT); pinMode (Line_R3, OUTPUT);
        digitalWrite (Line_R3, HIGH); digitalWrite (Line_R1, LOW); break; }
      case 10 : {
        pinMode (Line_R1, OUTPUT); pinMode (Line_R3, OUTPUT);
        digitalWrite (Line_R1, HIGH); digitalWrite (Line_R3, LOW); break; }
      case 11 : {
        pinMode (Line_R2, OUTPUT); pinMode (Line_R4, OUTPUT);
        digitalWrite (Line_R4, HIGH); digitalWrite (Line_R2, LOW); break; }
      case 12 : {
        pinMode (Line_R2, OUTPUT); pinMode (Line_R4, OUTPUT);
        digitalWrite (Line_R2, HIGH); digitalWrite (Line_R4, LOW); break; }
      case 13 : {
        pinMode (Line_R3, OUTPUT); pinMode (Line_R5, OUTPUT);
        digitalWrite (Line_R5, HIGH); digitalWrite (Line_R3, LOW); break; }
      case 14 : {
        pinMode (Line_R3, OUTPUT); pinMode (Line_R5, OUTPUT);
        digitalWrite (Line_R3, HIGH); digitalWrite (Line_R5, LOW); break; }
      case 15 : {
        pinMode (Line_R1, OUTPUT); pinMode (Line_R4, OUTPUT);
        digitalWrite (Line_R4, HIGH); digitalWrite (Line_R1, LOW); break; }
      case 16 : {
        pinMode (Line_R1, OUTPUT); pinMode (Line_R4, OUTPUT);
        digitalWrite (Line_R1, HIGH); digitalWrite (Line_R4, LOW); break; }
      case 17 : {
        pinMode (Line_R2, OUTPUT); pinMode (Line_R5, OUTPUT);
        digitalWrite (Line_R5, HIGH); digitalWrite (Line_R2, LOW); break; }
      case 18 : {
        pinMode (Line_R2, OUTPUT); pinMode (Line_R5, OUTPUT);
        digitalWrite (Line_R2, HIGH); digitalWrite (Line_R5, LOW); break; }
      case 19 : {
        pinMode (Line_R1, OUTPUT); pinMode (Line_R5, OUTPUT);
        digitalWrite (Line_R5, HIGH); digitalWrite (Line_R1, LOW); break; }
      case 20 : {
        pinMode (Line_R1, OUTPUT); pinMode (Line_R5, OUTPUT);
        digitalWrite (Line_R1, HIGH); digitalWrite (Line_R5, LOW); break; }
    }
  }

  // Unterprogramm Alles_Aus
  // ++++++++++++++++++++++++++
  void Alles_Aus () {
  pinMode (Line_R1, INPUT);
  pinMode (Line_R2, INPUT);
  pinMode (Line_R3, INPUT);
  pinMode (Line_R4, INPUT);
  pinMode (Line_R5, INPUT);
  }
  // ----------------------------------------------------------

Kurzvideo


Weitere Themen:


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz