Elektronisches "Vier Gewinnt"

Hallo zusammen,

momentan mache ich meine Ausbildung zum staatl. gepr. Techniker in Elektrotechnik und bei uns steht ab dieser Woche eine Test-Projektarbeit an. Unsere Gruppe möchte gerne das Spiel "Vier Gewinnt" als elektronische Version mit LED's und Tastern und sowas bauen. Leider hatten wir bisher nur höchstens Einleitungen/Grundlagen bezüglich der Microcontroller gehabt und nun würde ich euch gerne bitten, uns etwas unter die Arme zu greifen, da ihr euch ja bestens mit Arduinos auskennt.

Das ganze soll wie folgt aussehen:

  • 7*6 = 42 Spielfelder mit WS2812B LED's (benötigt werden zwei Farben pro Spielfeld (eine Farbe je Spieler))
  • Das "Einwerfen" der "Chips" erfolgt mittels Taster (-> 7 Taster für 7 Spielfeldspalten)

Zusätzlich (optional):

  • 1 Schalter/Taster für eine Neustart-Funktion
  • akustische Wiedergabe (Beim Betätigen der Taster & wenn das Spiel zuende ist)
    (- Schalter zum Umstellen auf 2-Spieler-Modus bzw. 1-Spieler vs KI - Modus ---- werden wir zeitlich sehr wahrscheinlich nicht schaffen zu programmieren)
  • Schalter zum Aktivieren der "Linetris"-Version

Ich nehme mal an, für die 42 Spielfelder * 2 (LED's) brauchen wir schon einmal 84 Eingänge/Ausgänge. Dazu noch 7 Taster = 91. Die optionalen Funktionen benötigen wiederum ca. 4 Ein/Ausgänge, wären wir bei ca. 95 (???).

Zu welchem Arduino würdet ihr uns raten? Bzw. wie kann man das am sinnvollsten (hardware-)technisch lösen?

Vielen, vielen Dank vorab!

Schöne Grüße,
Martin

hi,

WS2812B?

da braucht Ihr nur einen ausgang des arduino für alles LEDs. schaut Euch das mal an....

gruß stefan

Also für die LEDs brauchst du nur 1 Pin die WS2812B sind "RGB-DatenLEDs" die brauchen nur einen Datenpin für das ganze Array also die Datenleiting sind hintereinder von einer LED zus anderen.
Also
1Data-Pin
7
Taster
1Reset
3
Reserve

12 Pins fürs ganze Spiel also jeder Nano bzw Uno reichen da aus.

Also für die LEDs LED Stripe oder einzelne wie hier

Oder schon Fertig 8*8Matrix spart viel Arbeit
Bleibt sogar eine Reihe drüber zum Animieren der Einwurfposition also dann nur noch Tasten Links Rechts und Einwerfen wäre noch ne schönere Lösung

Schau mal bei Google WS2812B Arduino da siehst du dann die Datenanbindung.
Library die von FastLEDio
Gruß
DerDani

Vielen Dank für die Antworten!

Wir haben uns nun doch für die Ansteuerung reiner RGB LED's über insgesamt 11 Schieberegister entschieden.

Diese 11 Schieberegister sind alle "in Reihe" geschaltet. 42 Bits pro Spielerfarbe. Ich habe mal ein PDF angehangen, wo man die Zuordnung erkennen sollte.

Nun hatte ich mir Anfangs gedacht: Gut haust du die 88 Bits als ein Array einfach mit einer Schleife Stück für Stück in die Schieberegister... und dann bin ich auf den ShiftOut-Befehl gestoßen. Dieser kann ja aber nur Byteweise agieren (?). Um den Programmcode abzuspecken würde ich gerne den ShifttOut-Befehl nutzen. Kann ich die 88 Bits einfach in 11 Ein-Byte-Arrays aufteilen und dann über eine Schleife Arrayweise in die Schieberegister stopfen? Oder gibt es da eine bessere Lösung?

Muss man in diesem Fall etwas wegen LSB/MSB oder so beachten?

Vielen, vielen Dank vorab!

Zuordnung Schieberegister.pdf (70.7 KB)

Moepix:
Kann ich die 88 Bits einfach in 11 Ein-Byte-Arrays aufteilen und dann über eine Schleife Arrayweise in die Schieberegister stopfen?

Wieso soll das nicht gehen?

Die Ansteuerung kann man auch über SPI machen. Und einfach die Byte per transfer() senden. Wird aber genauso mit einem Array und einer for-Schleife gemacht.

hi,

shiftOut geht problemlos, einfach die elf bytes rausschicken. und ob LSB oder MSB, mußt Du beim senden angeben.

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, reg1);
shiftOut(dataPin, clockPin, MSBFIRST, reg2);
shiftOut(dataPin, clockPin, MSBFIRST, reg3);
shiftOut(dataPin, clockPin, MSBFIRST, reg4);
shiftOut(dataPin, clockPin, MSBFIRST, reg5);
digitalWrite(latchPin, HIGH);

gruß stefan

Hey zusammen :slight_smile:

danke für eure Antworten! Die Variante mit SPI kam leider nicht mehr in Betracht, da die Hardware-Bestückung schon anders vorgesehen war. Von dem ShiftOut-Befehl musste ich auch absehen, da ich irgendwie die Bits einzeln untereinander für die Gewinnabfrage und die Abfrage der untersten, freien LED miteinander vergleichen muss. Daher bin ich jetzt dazu übergegangen, das Spielfeld in einem 88-Felder-Array abzulegen. Das wird mit Sicherheit nicht die beste Lösung sein, jedoch war es mir so möglich, den Programmcode zu entwickeln.

Heute war der Tag der Inbetriebnahme... und es funktionierte: Nichts. Alle RGB-LED's fingen sofort an in beiden Farben zu leuchten (rot + grün). Da leider nächste Woche Projektabgabe ist muss ich hier noch einmal um eure Hilfe bitten. :o

Wir haben aktuell den Master-Reset im Verdacht. Benötigt das Schieberegister 74HC595 bei Start einen Reset? Ich kann mir das nicht vorstellen. Wir hatten in der Hektik/Zeitnot auf einem Steckbrett mit 2 LEDs noch kurz was experimentiert und da sah es so aus, als ob es nach einem Reset über MR funktionieren würde. Die MR-Pins (Pin 10) der elf Schieberegister liegen bei uns auf unserer geätzten Platine alle auf Masse. Ist dies der Fehler? Oder liegt hier doch ein Programmfehler vor? Merkwürdigerweise geben die Schieberegister ständig 5V an alle Ausgänge aus... der Pin OE liegt doch auch nur an Masse, oder?

Es wäre super nett, wenn ihr uns helfen könntet. Ich war so frei und habe den Arduino Programmcode und Programmablaufplan (nicht ganz vollständig), den Schaltplan der Platine und zwei Hilfsdateien bzgl. der Zuordnung LEDs zu Steuerregistern im Anhang beigefügt.

Ich weiß, es ist viel, aber es wäre super wenn sich jemand von euch die Zeit nehmen könnte, um einen Blick darüber zu werfen. Wir haben mit der ganzen Thematik leider nur sehr wenig Erfahrung und das Wochenende wird ohnehin lang...

Vielen, vielen Dank vorab!

Arduino Programmablaufplan.pdf (145 KB)

Zuordnung Schieberegister.pdf (94.7 KB)

Zuordnung Schieberegister (2).pdf (57.2 KB)

Steuerplatine.pdf (22.9 KB)

viergewinnt.ino (18.7 KB)

Hat keiner eine Idee? :confused:

int SRstcp = 1;                 // ST_CP bzw. RCK - latchPin - zur Uebermittlung an die Schieberegister-Ausgaenge
int SRds = 0;                   // DS - Eingangssignal (dataPin)

An Pin 0 und 1 hängt auch USB, diese Pins sollten nicht für andere Zwecke genutzt werden. Die Schieberegister bekommen dadurch zufällige Signale.

Serial.begin(9600);

Löschen!

Ich sehe nirgendwo eine Initialisierung der Schieberegister auf einen definierten Anfangszustand.

Moepix:
Benötigt das Schieberegister 74HC595 bei Start einen Reset?

Nein. Man könnte SCLR am Anfang auf LOW setzen, man kann aber auch Nullen ins Schieberegister schieben -> die fehlende Initialisierung.

Moepix:
Die MR-Pins (Pin 10) der elf Schieberegister liegen bei uns auf unserer geätzten Platine alle auf Masse. Ist dies der Fehler?

Ja, mit SCLR auf LOW geht nichts, siehe TRUTH TABLE im Datenblatt.

Moepix:
der Pin OE liegt doch auch nur an Masse, oder?

Wenn damit Pin 13 gemeint ist, ist das OK, da ein hochohmiger Zustand nicht benötigt wird.

Alle Angaben nach bestem Wissen! :slight_smile:

Entschuldigung, das war wohl Donnerstag ein wenig zu spät bei mir. Master-Reset (Pin 10) liegt natürlich auf 5 Volt und Output Enabled (Pin 13) liegt auf Masse.

Vielen Dank dass du dir Zeit genommen hast über unseren Kram zu gucken.

Wir haben es nun im Laufe des Tages hinbekommen. Ehrlicherweise kann ich nicht genau sagen, was nun der Fehler war... evtl. kam das USB-Gehäuse vom Arduino auf die Kupferschicht der Platine und hatte dadurch rumgezickt. Ein Schieberegister hatte auch auf der Leiterbahn einen Kurzschluss und dadurch die war die Übertragung der seriellen Bitreihenfolge ab dem neunten Schieberegister vermurkst.

Alle LED's sind nun in beiden Farben ansteuerbar. Die Taster sind noch nicht angeschlossen, daher platziert der Arduino nun in ca. 2 Sekunden Abständen abwechselnd LEDs in irgendwelchen Spalten. Sieht ganz gut aus bisher.

Der Code hat sich auch geändert, jedoch haben wir aktuell noch Pin 0 und 1 für DS und ST_CP im Code vorgesehen, da wir ungerne eine Drahtverbindung ergänzen wollten (alle Verbindungen als Leiterbahnen) um diese mögliche Fehlerquelle zu beseitigen. Der Arduino wird über eine USB-Powerbank mit Spannung versorgt, bei welchem nur die Spannungsversorgungs-Pins genutzt werden. Die Datenpins vom USB bekomme nix ab. Ich denke, das sollte nicht für Probleme sorgen (?). Ja den Serial.begin hatte ich ganz am Anfang von den Musterprojekten übernommen (hatte vorher ja nie etwas mit Arduino zu tun), dachte das muss rein :slight_smile: Das ist schon rausgeflogen. Danke nochmal!

Morgen wird es denke ich soweit fertig gestellt werden können. Anbei ein Foto von unserem Vier gewinnt.

Moepix:
Die Datenpins vom USB bekomme nix ab. Ich denke, das sollte nicht für Probleme sorgen (?).

Wenn Ihr einen neuen Sketch übertragt, zappeln Pin 0 und Pin 1. Aber: Sketch übertragen, USB abziehen, Powerbank dran, dann funktioniert das. Nicht optimal, aber ich sage es nicht weiter. :slight_smile:

Ich hoffe, ihr macht eine vernünftige Initialisierung. Als Prüfer würde ich den Reset-Knopf des Arduino drücken. :o

Danke für das Foto, sieht beeindruckend aus, edle Knöpfe!

Okay :smiley: Ja, das wird noch ergänzt.

Stehe nur gerade vor dem Problem, dass das mit den sieben Tastern für die jeweiligen Spalten nicht klappt.

Die sieben Taster liegen alle mit einem Pin auf +5V, die anderen Pins der Taster sind jeweils über unterschiedliche Widerstände (1kOhm bis 7kOhm) alle mit Eingang A0 verbunden. Wird kein Taster betätigt, dann liegt nichts an A0 an.

Nun sagt mir mein serieller Monitor, dass im Ruhezustand der analogRead-Wert (Bereich 0-1023) von ca. 600 langsam immer weiter runtersteigt und sich jetzt nach ca. 3 Minuten bei ~330 einpendelt.
Egal, welchen Taster ich drücke, gibt der Monitor den Wert 1023 wieder.

Bei meiner Suche bin ich auf die Lösung mittels Spannungsteiler gestoßen, was hier aber äußerst ungern noch in Frage kommt... habe den A0 über digitalWrite nen HIGH für den Pullup-Widerstand gegeben (der analogRead-Wert ist dauerhaft 1023) bzw. nen LOW für den Pulldown-Widerstand (ändert nichts, dass alle Taster 1023 beim Betätigen ausgeben - ja, hab die Sache mit Pullup und Pulldown-Widerstand nicht ganz kapiert).

Hat jemand eine Lösung für mich?

Gibt es irgendwo einen Schaltplan der Schalter?

Moepix:
... nen LOW für den Pulldown-Widerstand ...

Der existiert nicht!

agmue:
Gibt es irgendwo einen Schaltplan der Schalter?

Ja, siehe das Bild im Anhang.

Damit erklärt sich das Verhalten:

  • Kein Taster gedrückt: Der Eingang hängt in der Luft und zeigt einen zufälligen Wert an.
  • Ein Taster gedrückt: Der hochohmige Eingang wird über einen Widerstand auf 5 V = 1023 gezogen.

Irgendwas habt ihr da vergessen!

agmue:
Damit erklärt sich das Verhalten:

  • Kein Taster gedrückt: Der Eingang hängt in der Luft und zeigt einen zufälligen Wert an.
  • Ein Taster gedrückt: Der hochohmige Eingang wird über einen Widerstand auf 5 V = 1023 gezogen.

Irgendwas habt ihr da vergessen!

Hmmm... hat jemand einen Lösungsvorschlag?

Kann auch sein, dass ich gerade mächtig ein Brett vorm Kopf habe.

Es fehlt ein Widerstand von A0 nach GND.

OT:
Eine PC Version habe ich vor vielen Jahren gebastelt, und nie fertig gemacht.
(Computer greift nicht an, verteidigt sich nur)
Stelle das mal als Gadget rein. :slight_smile: Steuerung über die Cursortasten, und mit Leertaste neuer Stein.

Dropbox