Tic-Tac-Toe mit dem Arduino

Mit dem Arduino-Projekt kann man zu zweit Tic-Tac-Toe, mithilfe von RGB-LEDs und Tastern spielen. Insgesamt werden neun LEDs und neun Taster verbaut. Für die Kreuze und Kreise werden einfach die Farben Rot und Blau angezeigt. Der erste Spieler beginnt beispielsweise unten links und es wird rot angezeigt. Wenn der zweite Spieler jetzt zum Beispiel oben rechts drückt, wird automatisch Blau leuchten. Die Farben wechseln sich dauerhaft ab und das beste ist, dass automatisch erkannt wird, ob drei gleiche Farben in einer Reihe sind und alle LEDs gehen automatisch aus.

Zeitaufwand: ca. 4-5h für den Aufbau
Kosten: ca. 30€
Das Benötigen Sie:

  • Arduino Nano
  • Taster
  • RGB-LEDs
  • Lochrasterplatinen
  • Lötkolben
  • Kabel
  • Schieberegister (74hc595)
  • verschiedene Widerstände
  • Stiftleisten
  • (3d-Drucker)

Die Produkte findest du in diesem reichelt-Warenkorb.

Schwierigkeitsstufe: Fortgeschrittener

Die Hardware

Das ganze Projekt wird über einen Arduino Nano gesteuert. Da für Ansteuerung der neun LEDs und neun Taster die Pins des Arduino nicht ausreichen, werden die LEDs mit insgesamt drei Schieberegistern angesteuert.

Was sind Schieberegister?

Ein Schieberegister ist ein IC (Integrated Circuit) oder im deutschen Integrierter Schaltkreis, mit dem es möglich ist, die Ausgänge des Arduino fast beliebig zu erweitern. Das Schieberegister 74hc595 verfügt über drei Ein- und acht Ausgänge. Wie gerade erwähnt ist es auch möglich, mehrere Schieberegister hintereinander zu schalten, ohne dass die verbrauchten Pins des Arduino mehr werden.

Funktionsweise eines Schieberegisters:

Das Schieberegister wandelt serielle Daten in parallele Daten um. Das bedeutet, wenn die erste LED leuchten soll, die Sequenz An-Aus-Aus-Aus-Aus-Aus-Aus-Aus oder 10000000 an das Schieberegister gesendet wird. Diese Daten werden dann an die eigenen Output-Pins von 1 bis 8 geschickt und schaltet dann seinen 1.Pin ein und die restlichen aus. Die Pins bleiben solange in ihrem Zustand, bis über den Daten-In-Pin neue Informationen ankommen. Das Schieberegister erhält serielle Daten über den DS-Pin und bekommt über den Clock Pin einen „Herzschlag“ gesendet. Zum Schluss wird noch ein Reset-Pin mit dem Arduino verbunden. Wenn man, wie bei diesem Projekt, mehrere Schieberegister in Reihe schalten möchte, gibt es einen extra Pin am Schieberegister, womit der Serielle Ausgang an ein weiteres Schieberegister geleitet wird. Weitere Informationen zu den Schieberegistern gibt es hier und hier.

Wie können alle Taster über einen Pin ausgelesen werden?

An jedem Taster befindet sich ein anderer Widerstand und wenn Sie nun die Taster am seriellen Monitor auslesen, erhalten Sie für jeden gedrückten Taster einen anderen Wert. Diesen Wert können Sie nun abfragen und die richtige LED kann angesteuert werden. Da dieser Wert aber schwankt, kann es dazu kommen, dass die falsche LED leuchtet, obwohl der zugehörige Taster gar nicht gedrückt wurde. Deswegen sollte man bei den Widerständen darauf achten, dass sie eine hohe Differenz zueinander haben. In meinem Fall wurden die neun Taster auf zwei Pins aufgeteilt um wirklich sicher zu gehen, dass am Schluss die richtige LED leuchtet. Weitere Informationen zu den Tastern gibt es hier.

Die Schaltpläne

1. Für die Schieberegister und RGB-LEDs:
Im Grunde werden nur die drei Input-Pins an den Arduino angeschlossen, die Schieberegister mit GND und 5V verbunden und die Ausgänge an die RGBLEDs mit einem passenden Vorwiderstand verbunden. Eine Ausnahme gilt aber für das zweite und dritte Schieberegister. Das zweite Schieberegister muss über den seriellen Ausgang an das erste Schieberegister verbunden werden und das dritte Schieberegister muss wiederum über den Seriellen Ausgang des zweiten Schieberegisters verbunden werden.

Schaltplan mit dem Arduino und den LED's

2. Für die Taster:
Die Widerstände werden an einer Seite der Taster befestigt und anschließend mit 5V verbunden. A0 wird am ersten Taster diagonal vom Widerstand aus verbunden. Dann verbindet man diese Diagonale Seiten alle miteinander bis zum vierten Taster und verbindet die gleiche Seite noch mit einem 100kΩ Widerstand, der an dem GND Pin des Arduino verbunden wird. Das selbe wird mit der anderen hälfte der Taster wiederholt mit dem Unterschied, dass
der fünfte Taster mit A1 verbunden wird.

Schaltplan mit dem Ardunio und den Tastern

Der Aufbau

Zuerst werden die Taster auf ein 3d-Gedrucktes Gehäuse geklebt und anschließend nach dem Schaltplan zusammengelötet. Dann werden die RGB-LEDs auf eine Lochrasterplatine gelötet, um sie dann mit einer Stiftleiste zu verkabeln. Auf der anderen Lochrasterplatine wird der Arduino Nano mit den Schieberegistern und den Vorwiderständen (Rot: 10Ω, Blau: 20Ω) gelötet und wieder nach Schaltplan verkabelt. Die Widerstände werden noch mit Stiftleisten verbunden und zum Schluss kann dann die obere Platine auf die untere gesteckt werden und das 3d-Gedruckte Gehäuse kann auf die LEDs gesteckt werden.

Die Programmierung

Wenn Sie alles nach Plan aufgebaut haben, müssen Sie auf den Arduino noch den Code hochladen. Laden Sie sich dazu am besten die Arduino IDE im Internet herunter und verbinden sie den Arduino per Kabel an ihren PC oder Laptop. Dann öffnen Sie die .ino Datei und laden den Code hoch. Die Arduino Software hier downloaden.

Code Erklärung: Woher weiß das Programm welche LED leuchten muss?

Wenn eine Taste gedrückt wurde, erhält man im Seriellen Monitor einen bestimmten Wert. Da jeder Taster einen anderen Wert besitzt, weiß das Programm durch die „if Abfrage“ welche LED eingeschaltet werden muss. (Eine if Abfrage führt eine Anweisung nur unter einer bestimmten Bedingung aus. Also wenn der Wert 1023 ist dann schalte LED1 ein). Wenn beispielsweise die 1. Taste gedrückt wurde erhält man im Seriellen Monitor den Wert „1023“, beim 2. Taster den Wert „500“ usw. Mehr Informationen zum seriellen Monitor hier.

Wir werden dir LEDs mit Schieberegistern angesteuert?

Zuerst werden drei Variablen erstellt (sh, st, ds) und den Arduino Pins Zugwiesen. Damit die Eingänge des Schieberegisters angesteuert werden können, müssen sie auf Output (Ausgang) gesetzt werden. Dies geschieht in der Setup Funktion. (Diese wird jedes mal nach dem Starten des Arduino einmalig ausgeführt.) Dann werden die Variablen für die LEDs erstellt in welcher Reihenfolge sie leuchten sollen. Wir brauchen genau soviel Variablen, wie die Anzahl der Schieberegister, also drei Stück. Die Variablen werden wegen der Übersicht nicht mit normalen Zahlen zugewiesen sondern mit dem Binärsystem. (Im Binärsystem gibt es nur zwei Zahlen, 1 und 0. Wenn wir zum Beispiel die 1. LED zum leuchten bringen wollen müssen wir schrieben 10000000). Wenn wir eine LED ein oder aus schalten, müssen wir dies dem Schieberegister mitteilen. Dies geschieht über unsere Funktion updateShiftRegister, die wir in den loop Teil schrieben. (Im loop Teil werden Anweisungen, nicht wie im setup Teil nur einmal ausgeführt, sondern die Anweisungen werden die ganze Zeit aktualisiert. (Hier befinden sich auch übrigens alle if Abfragen). Es gibt nur ein Problem: Wird die 1. Taste gedrückt, leuchtet die 1.LED. Wird aber jetzt zum Beispiel die 2. Taste gedrückt geht die 2. LED an, aber die 1. LED aus. Das liegt daran, dass die LEDs direkt angesteuert werden und der Arduino nicht weiß, dass LED1 schon geleuchtet hat. Deswegen brauchen wir zwei Speicher Variablen. Wir speichern einfach in der Variable, dass die LED1 leuchtet. Wenn jetzt die 2. Taste gedrückt wird, addieren wir einfach die Speicher Variable mit der Variable die die 2. LED zum Leuchten bringt.

Beispiel: Taste 1 wurde gedrückt, bedeutet 10000000
Speicher: 10000000
Taste 2 wurde gedrückt, bedeutet 00010000+10000000
also leuchtet jetzt LED1 und LED2.
Speicher: 10010000
Mehr Informationen zur Programmierung von Schieberegistern hier.

Wie ändern sich die Farben automatisch nach jedem Tastendruck?

Für jede LED gibt es eine Variable. (Eine Variable kann einen bestimmten Wert speichern, der auch wieder ausgelesen werden kann). Außerdem kann sie benannt werden, wie Sie wollen. Hier wurden sie LED1, LED2 usw. bis LED9 benannt). Wenn die Variable für die jeweilige LED gleich 0 ist bedeutet es, dass die LED Rot wird. Wenn die Variable für die jeweilige LED gleich 1 ist bedeutet es, dass die LED Blau wird. Am Anfang soll es so sein, dass egal welcher Taster gedrückt wird jede LED erstmal Rot werden soll. Also weisen wir jeder Variable den Wert 0 zu. Wenn jetzt zum Beispiel die erste Taste gedrückt wird, wird mit einer weiteren if-Abfrage geprüft, ob LED1 den Wert 0 oder 1 besitzt. Da jede
Variable, inklusive LED1, den Wert 0 besitzt erscheint sie Rot. Zusätzlich wird jede andere LED, außer LED1 auf den Wert 1 gesetzt. Wird jetzt zum Beispiel der zweite Taster gedrückt, wird abgefragt ob LED2 den Wert 0 oder 1 besitzt. Da jede LED inklusive LED2 auf 1 gesetzt ist, erscheint diese Blau. Auch wird jetzt hier wieder jede LED außer LED2 auf 0 also Rot gesetzt. Dies wird solange wiederholt, bis es einen Gewinner gibt. Mehr Informationen zu den Variablen hier.

Wie erkennt der Code ob jemand gewonnen hat, also dass drei gleiche Farben in einer Reihe sind?

Erstmal wird ein Zweidimensionales Array erstellt. (In einem Array können mehrere Variablen gespeichert und ausgelesen werden. In einem Zweidimensionalen Array sind die Variablen wie in einer Fläche angeordnet, also wie beim Tic Tac Toe). Wenn eine LED Rot oder Blau erscheint, wird dies in einem Array mit einer 0 oder 1 gespeichert. Dann werden mithilfe von if-Abfragen alle Möglichen Kombinationen abgefragt die es gibt. (Insgesamt gibt es acht verschieden Kombinationen, mit beiden Farben 16 Kombinationen). Dann werden die LEDs ausgeschaltet, indem alle
Variablen auf 00000000 gesetzt werden. Wenn es unentschieden ist, drücken Sie einfach die Reset-Taste auf dem Arduino. Mehr Information zu Arrays hier.

So funktioniert Tic Tac Toe mit dem Ardunio

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.