Sicherheitsbodenscanner von Keyence


Google-Suche auf MEINE-SCHALTUNG.de :





Online Rechner

Chronik

Dauerkalender


Seilziehen mit Arduino

Seilziehen mit Arduino Anordnung


Seilziehen, sehr oft auch als Tauziehen bezeichnet ist eine Sportart mit einer langen und stolzen Geschichte. Bereits in der Antike versuchten so die Einzelkämpfer als auch ganze Mannschaften auf diesem Wege ihre Kräfte zu messen. In den Jahren 1900 bis 1920 stieg das Seilziehen sogar zu einer olympischen Disziplin auf. Die Regeln sind sehr einfach. Zwei Teams ziehen an einem Seil in zwei entgegengesetzte Richtungen. Gewinner ist die Mannschaft, die es schafft, das Seil bis zu einer festgelegten Marke zu ziehen.
Mit der folgenden Schaltung soll das Seilziehen auf elektronischem Wege imitiert werden. Das Seil ersetzen wir mit einer langen LED-Reihe. Die Mannschaften werden zu zwei Gegenspieler reduziert, die durch schnelles Betätigen einer Taste versuchen, das LED-Seil in eigene Richtung zu lenken. Der Knoten, das Mittelpunkt des Seils, wird durch in einer bestimmten Farbe leuchtenden Leuchtdioden markiert. Jeweils an beiden Enden der Ziehstrecke markieren weitere leuchtende Leuchtdioden die Marke, die es zu erreichen gilt. Schafft ein Spieler, den farbigen Knoten des Seils bis zu seiner Markierung zu bewegen, hat er gewonnen.

RGB-LED

RGB Leuchtdiode

Eine RGB-Leuchtdiode stellt eine Zusammenstellung drei farbigen Leuchtdioden in einem Gehäuse dar. Es werden die Farben Rot (R), Grün (G) und Blau (B) verwendet. Durch Mischung dieser drei Grundfarben können auch andere Farbtöne erzielt werden. Das weiße Licht bekommt man z.B. dann, wenn alle drei Teilleuchtdioden der RGB-Leuchtdiode (Rot, Grün und Blau) gleichzeitig eingeschaltet werden. Hier verwendete RGB-LEDs haben vier Anschlüsse. Plus-Anschluss für jede Farbe und eine gemeinsame Masse. In der Schaltung werden die Farben Blau und Grün verwendet.

Verschaltung der Leuchtdioden

Eine Leuchtdiode zum Leuchten zu bringen dürfte grundsätzlich mit keinen Problemen verbunden sein. Ein wenig Spannung, ein passender Vorwiderstand und schon gibt es Licht. Wenn jedoch die Zahl der LEDs stark ansteigt, muss man sich gut überlegen, wie man die Ansteuerung gestaltet. Das Spiel wird mit dem Arduino Mega gesteuert. Doch der Mikrocontroller hat nicht so viele Ausgänge, um jede im Spiel auftretende LED separat anzusteuern. Darüber hinaus werden die E/As auch für andere Zwecke verwendet. Das elektronische Seil wird in unserem Spiel mit 7x8=56 RGB-LEDs dargestellt. Von jeder LED, damit etwas Farbe ins Spiel kommt, werden zwei Teil-Leuchtdioden, nämlich blau und grün, verwendet. Somit haben wir 2x56=112 einzelne LEDs, die klar und deutlich erfahren müssen, wann sie leuchten sollen und wann nicht.
Um die Aufgabe zu bewältigen verwenden wir drei Schieberegister, die insgesamt 3x8=24 Ausgänge zur Verfügung stellen. Durch entsprechende Verdrahtung der LEDs stellen wir sicher, dass jede einzelne LED separat ansprechbar ist. Wenn mehrere LEDs gleichzeitig leuchten sollen, kommt das Multiplexing ins Spiel.

Prinzip der LEDs-Verschaltung


Die Abbildung zeigt das Prinzip der Verdrahtung der LEDs für die ersten 16 LEDs. Das Seil besteht in dem Beispiel aus 56 RGB-LEDs, die von links nach rechts mit 1 bis 56 nummeriert sind. Alle LEDs sind auf sieben 8-Gruppen aufgeteilt. Die Minus-Pins der LED-Reihe 1 bis 8 werden zusammengeführt und mit dem ersten Ausgang des ersten Schieberegisters (IC1) verbunden. Die Minus-Pis der LED-Reihe 9-16 werden ebenfalls zusammengeführt und mit dem zweiten Ausgang des IC1 verbunden. Analog verfahren wir mit allen weiteren Reihen.
Mit den Plus-Pins der LEDs verfahren wir ein wenig anders. Zunächst werden die Blaue-Pins der ersten RGB-Leuchtdiode jeder 8-Reihe zusammengeführt und mit dem ersten Ausgang des Schieberegisters IC2 verbunden. An den zweiten Ausgang des Schieberegisters IC2 werden nach dem gleichen Prinzip die Blaue-Pins der RGB-Leuchtdioden Nr. 2, 10, 18, 26, 34, 42 und 50 angeschlossen. Ähnlich werden alle weiteren Blaue-Pins verdrahtet.
Das gleiche Prinzip verwenden wir auch bei den grünen Leuchtdioden. Sie werden allerdings nicht an den IC2 sondern IC3 angeschlossen. Die folgende Abbildung zeigt, welcher Pin wo angeschlossen wird. Dabei steht C für GND, B für Blau und G für Grün.

Alle LED-Anschluesse



Schaltplan

Schaltplan


Schieberegister

schieberegister

Da der Mikrocontroller nicht in der Lage ist, alle LEDs anzusteuern, kommen in der Schaltung drei Schieberegister zum Einsatz. Jedes Schieberegister (74HC595) verfügt über vier Ausgänge. Die Schieberegister sind in Reihe verschaltet. Das erste Schieberegister ist für die GND-Anschlüsse der LEDs zuständig, der zweite bedient die blauen LEDs, der dritte die grünen LEDs. Wenn man z.B. die blaue Leuchtdiode der RGB-LED Nr. 9 einschalten möchte (die erste RGB-LED der zweiten 8-Reihe) muss der zweite Ausgang des ersten Schieberegisters IC1 auf 0 (LOW) geschaltet werden (Verbindung mit Masse). Bei dem zweiten Schieberegister IC2 muss dann der erste Ausgang auf 1 (HIGH) geschaltet werden.

Mikrocontroller

mikrocontroller_arduino_mega

Das Ein- und Ausschalten der Leuchtdioden überlassen wir dem Mikrocontroller Arduiono Mega. Arduino Mega stellt ziemlich viele I/Os zur Verfügung. Da für die Ansteuerung der LEDs nur drei Leitungen benötigt werden, könnte man hier auch einen anderen Mikrocontroller einsetzen. Z.B. Arduino Nano. Insgesamt werden für diese Schaltung lediglich fünf I/O gebraucht.

Touchsensor

touchsensor_modul

Als Schalter, die von den beiden Spielern möglich schnell betätigt werden sollen, kommen zwei Touchsensoren zum Einsatz. Sie liefern jeweils ein Signal, wenn die Oberfläche des Sensors mit Finger berührt wird. Ein normaler mechanischer Schalter wäre für diese Aufgabe nicht geeignet. Die mechanischen Schalter prellen und würden den Spielern einen ungewollten Vorteil verschaffen.

Programm (Sketch)

// **************************************************************************************
// Seilziehen mit Arduino
// Schaltung mit Arduino Mega 2560, Schieberegistern, RGB-LEDs und Touchsensoren
// Arduino IDE 2.3.3
// **************************************************************************************
int SH_CP_Pin = 8;                          // Übertragungspins
int ST_CP_Pin = 9;
int DS_Pin = 10;

byte B_gnd;                                 // Bits Belegung GND-Schieberegister
byte B_gruen;                               // Bits Belegung Grün-Schieberegister
byte B_blau;                                // Bits Belegung Blau-Schieberegister
int Taster_Spieler_Blau = 2;                // Taster Spieler Links (Blau)
int Taster_Spieler_Gruen = 3;               // Taster Spieler Rechts (Grün)
int Spielstatus;                            // 0-Stop, 1-Spiel läuft
int Spielstand = 10;                        // Punkte, 10 Pkt = Gleichstand
unsigned long MillisAktuell;
unsigned long MillisAlt;

byte Seil_Knoten [21][4] = {{ B11011111, B11110000, B11011111, B11110000 },
                            { B11011111, B01111000, B11011111, B01111000 },
                            { B11011111, B00111100, B11011111, B00111100 },
                            { B11011111, B00011110, B11011111, B00011110 },
                            { B11011111, B00001111, B11011111, B00001111 },
                            { B11011111, B00000111, B11101111, B10000000 },
                            { B11011111, B00000011, B11101111, B11000000 },
                            { B11011111, B00000001, B11101111, B11100000 },

                            { B11101111, B11110000, B11101111, B11110000 },
                            { B11101111, B01111000, B11101111, B01111000 },
                            { B11101111, B00111100, B11101111, B00111100 },
                            { B11101111, B00011110, B11101111, B00011110 },
                            { B11101111, B00001111, B11101111, B00001111 },
                            { B11101111, B00000111, B11110111, B10000000 },
                            { B11101111, B00000011, B11110111, B11000000 },
                            { B11101111, B00000001, B11110111, B11100000 },

                            { B11110111, B11110000, B11110111, B11110000 },
                            { B11110111, B01111000, B11110111, B01111000 },
                            { B11110111, B00111100, B11110111, B00111100 },
                            { B11110111, B00011110, B11110111, B00011110 },
                            { B11110111, B00001111, B11110111, B00001111 },
                          };
byte BG_Ledsreihe [] =      { B00111111, B11111111, B11111001, B11111111 };

// **************************************************************************************

void setup() {

 pinMode(ST_CP_Pin, OUTPUT);
 pinMode(SH_CP_Pin, OUTPUT);
 pinMode(DS_Pin, OUTPUT);
 pinMode(Taster_Spieler_Blau, INPUT_PULLUP);
 pinMode(Taster_Spieler_Gruen, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(Taster_Spieler_Blau), Punkte_Blau, FALLING);
 attachInterrupt(digitalPinToInterrupt(Taster_Spieler_Gruen), Punkte_Gruen, FALLING);
}

// **************************************************************************************

void loop () {

    if (Spielstatus == 0) {                 // LEDs Effekte
        Alle_Leds_ein_aus ();
        Lauflicht_rechts (1);
        Lauflicht_links (1);
        Lauflicht_rechts (2);
        Lauflicht_links (2);
        Lauflicht_rechts (3);
        Lauflicht_links (3);
        Spielstatus = 1;                    // Spiel kann beginnen
        MillisAlt = millis();
        Spielstand = 10;                    // Seilknoten in die Mitte
    }

    if (Spielstatus == 1) {                 // Spiel läuft
        Position (Spielstand);              // Seilknoten Position
        MillisAktuell = millis();           // 5sek keine Aktion = Spiel AUS
        if (MillisAktuell - MillisAlt > 5000) {
            Spielstatus = 0;                // Spiel AUS
        }      
        if (Spielstand == 0) {              // Blau hat gewonnen
            for (int i=0; i<10; i++){       // Gewinn-Posion anzeigen
                Position (0);
                delay(2);
            }
            Blau_hat_gewonnen ();           // Blaue LEDs blinken
            Spielstatus = 0;                // Spiel AUS
        }
        if (Spielstand == 20) {             // Grün hat gewonnen
            for (int i=0; i<10; i++){       // Gewinn-Position anzeigen
                Position (20);    
                delay(2);
            }
            Gruen_hat_gewonnen ();          // Grüne LEDs blinken
            Spielstatus = 0;                // Spiel AUS
        }
    }
}        

// **************************************************************************************

void Punkte_Blau() {                        // Punktezählung nur bei laufendem Spiel
    if (Spielstatus == 1) {
        Spielstand--;
        MillisAlt = millis();               // Zeit aktualisieren
    }
}

// **************************************************************************************

void Punkte_Gruen() {                       // Punktezählung nur bei laufendem Spiel
    if (Spielstatus == 1) {
      Spielstand++;
      MillisAlt = millis();                 // Zeit aktualisieren
    }
}

// **************************************************************************************

void Position (int Position) {              // Position vom Seilknoten aktualisieren
    
    B_gruen = B00000000;                    // Blaue LEDs linke Seite EIN
    B_gnd = BG_Ledsreihe [0];               // GND aktivieren
    B_blau = BG_Ledsreihe [1];              // Blaue LEDs
    Bits_schieben();                        // Bits in Schieberegister laden

    B_blau = B00000000;                     // Grüne LEDs rechte Seite EIN
    B_gnd = BG_Ledsreihe [2];               // GND aktivieren       
    B_gruen = BG_Ledsreihe [3];             // Grüne LEDs
    Bits_schieben();                        // Bits in Schieberegister laden

    B_gnd = Seil_Knoten [Position][0];      // Position Seilknoten (4 cyan LEDs)
    B_blau = Seil_Knoten [Position][1];
    B_gruen = B_blau;                       // Blau + Grün = Cyan
    Bits_schieben();                        // Bits in Schieberegister laden
    B_gnd = Seil_Knoten [Position][2];      // w.o.
    B_blau = Seil_Knoten [Position][3];
    B_gruen = B_blau;
    Bits_schieben();       
}

// **************************************************************************************

void Blau_hat_gewonnen () {
    delay (1000);
    for (int i=0; i<10; i++) {              // Blaue LEDs blinken lasen
        Alle_LEDs_Aus ();
        delay (200);
        B_gruen = B00000000;                // Grüne LEDs AUS
        B_gnd = BG_Ledsreihe [0];           // GND aktivieren
        B_blau = BG_Ledsreihe [1];          // Blaue LEDs EIN
        Bits_schieben();                    // Bits in Schieberegister laden
        delay (100);                        // Wartezeit
    }
}

// **************************************************************************************

void Gruen_hat_gewonnen () {
    delay (1000);
    for (int i=0; i<10; i++) {              // Grüne LEDs blinken lassen
        Alle_LEDs_Aus ();
        delay (200);
        B_blau = B00000000;                 // Blaue LEDs AUS
        B_gnd = BG_Ledsreihe [2];           // GND aktivieren
        B_gruen = BG_Ledsreihe [3];         // Grüne LEDs EIN
        Bits_schieben();                    // Bits in Schieberegister laden
        delay (100);                        // Wartezeit
    }
}

// **************************************************************************************

void Lauflicht_links (int Farbe) {

    for (int i=0; i<8; i++) {               // GND-Schieberegister durchlaufen
        B_gnd = B11111111;                  // Vorbelegung
        bitClear (B_gnd, i);                // Ausgänge einzeln aktivieren 0=aktiv
        for (int j=0; j<8; j++) {           // LEDs register durchlaufen
            B_gruen = B00000000;            // Blaue LEDs aktiv (Grün AUS)
            if (Farbe == 1 or Farbe == 3) {
                bitSet (B_gruen, j);        // Ausgänge einzeln setzen 1=aktiv
            }
            B_blau = B00000000;             // Grüne LEDs aktiv (Blau AUS)
            if (Farbe == 2 or Farbe == 3) {
                bitSet (B_blau, j);         // Ausgänge einzeln setzen 1=aktiv
            }            
            Bits_schieben();                // Schieberegister laden
            delay (10);
       }
    }
}

// **************************************************************************************

void Lauflicht_rechts (int Farbe) {         // wie Lauflicht_links ()

    for (int i=7; i>-1; i--) {
        B_gnd = B11111111;
        bitClear (B_gnd, i);
        for (int j=7; j>-1; j--) {
            B_gruen = B00000000;
            if (Farbe == 1 or Farbe == 3) {
                bitSet (B_gruen, j);
            }
            B_blau = B00000000;
            if (Farbe == 2 or Farbe == 3) {
                bitSet (B_blau, j);
            }            
            Bits_schieben();
            delay (10);
       }
    }
}

// **************************************************************************************

void Alle_Leds_ein_aus () {

    for (int i=0; i<5; i++) {               // Alle LEDs 5mal EIN und AUS
        B_gnd = B00000000;                  // Alle 8-Segmente aktivieren
        B_gruen = B11111111;                // Grüne Farbe aktiv
        B_blau = B00000000;                 // Blau AUS
        Bits_schieben();                    // Schieberegister laden
        delay (150);
        Alle_LEDs_Aus ();                   // Alle LEDs ausschalten
        delay (150);    
        B_gnd = B00000000;                  // Alle 8-Segmente aktivieren
        B_gruen = B00000000;                // Farbe Grün AUS
        B_blau = B11111111;                 // Blau EIN
        Bits_schieben();                    // Schieberegister laden
        delay (150);  
        Alle_LEDs_Aus ();                   // Alle LEDs ausschalten
        delay (150); 
    }               
}

// **************************************************************************************

void Alle_LEDs_Aus () {

        B_gnd = B_gruen = B_blau = B00000000; // Vorbelegung
        Bits_schieben();                      // Schieberegister laden
}
// **************************************************************************************

void Bits_schieben () {
                                            // Schiebregister mit Daten laden
    digitalWrite(ST_CP_Pin, LOW);         
    shiftOut(DS_Pin, SH_CP_Pin, LSBFIRST, B_blau);
    shiftOut(DS_Pin, SH_CP_Pin, LSBFIRST, B_gruen);
    shiftOut(DS_Pin, SH_CP_Pin, LSBFIRST, B_gnd);
    digitalWrite(ST_CP_Pin, HIGH);
}

// **************************************************************************************

Testschaltung

Testschaltung

Frontansicht mit Arduino und Touchsensoren

Testschaltung Schieberegister

Schieberegister

Kurzvideo

Kurzvideo


Weitere Themen:


Google-Suche auf MEINE-SCHALTUNG.de :


Home Impressum Datenschutz