| Seilziehen mit ArduinoSeilziehen, 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.
RGB-LEDEine 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 LeuchtdiodenEine 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.
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.
SchaltplanSchieberegisterDa 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. MikrocontrollerDas 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. TouchsensorAls 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); } // ************************************************************************************** TestschaltungFrontansicht mit Arduino und Touchsensoren Schieberegister KurzvideoKurzvideo Weitere Themen:
|