Ein elektronisches Schachbrett bauen

Ich möchte ein hölzernes Schachbrett bauen, auf dem man mit normalen Figuren spielen kann (also keine modifizierten Figuren, die RFID-Codes, Magnete usw. verwenden), das aber mit einer Software verbunden ist, die meine Züge bemerkt und sich so verhält der zweite Spieler.

Ich habe darüber nachgedacht, wie ich Figuren auf dem Brett erkennen kann, und ich habe die Entscheidung getroffen, dass ich nicht erkennen muss, welche Figur wo ist: Die „Wahrheit“ liegt in der Software, also wenn ich eine Figur von A nach B bewege , kann die Software herausfinden, welches Stück verschoben wurde.

Also hatte ich die Idee, zwei Löcher in jedes Feld des Schachbretts zu bohren, eines in der Mitte und eines in der oberen rechten Ecke:

  • Der in der Mitte wird für einen Helligkeitssensor verwendet, um zu erkennen, ob eine Figur auf dem Feld steht oder nicht.
  • Der in der Ecke wird für eine LED verwendet, um anzuzeigen, welches Stück der Benutzer für den Computer verschieben muss, damit die reale Situation wieder mit der Softwaresituation übereinstimmt.

Ich möchte einen Raspberry Pi als Hardware-Grundlage für die auszuführende Software verwenden, die in Node.js geschrieben wird (aber das sollte für diese Frage nicht wichtig sein).

Am Ende habe ich also 64 Helligkeitssensoren und 64 LEDs, die ich einzeln ansprechen muss. Mit anderen Worten: Ich brauche 64 Ausgänge und 64 Eingänge. Und natürlich ist dies etwas, was ein Raspberry Pi nicht standardmäßig bewältigt - und ich denke, dass es einen besseren Weg geben muss, als 128 I/O-Ports zu haben.

Da ich denke, dass das Erkennen des Zustands der Platine die wichtigere Aufgabe ist, habe ich begonnen, im Internet zu suchen, wie man mit einer 8x8-Matrix von Schaltern umgeht. Ich fand den Vorschlag, einen Mikrocontroller zu verwenden, der die Spalten der Platine sequentiell abtastet und in jeder Spalte erkennt, ob eine Zeile (= ein Feld) verwendet wird oder nicht.

Dies würde die Komplexität auf 8 Ausgänge und 8 Eingänge reduzieren (um den Zustand der Platine lesen zu können).

Dazu habe ich ein paar Fragen:

  1. Sind meine Gedanken richtig, dh ist dies der richtige Ansatz, oder gibt es eine bessere Alternative, auf die ich achten sollte?
  2. Da ich keine Erfahrung mit Mikrocontrollern habe, worauf muss ich achten? Brauche ich nur einen Mikrocontroller mit 16 Pins, der in einer Sprache programmierbar ist, die ich schreiben kann, oder …?
  3. Hat jemand ein solches Board gebaut und hat einen Rat oder kennt ein Tutorial, das Sie durch den Prozess führt?
Sie haben die richtige Idee. Es wird jedoch ein wenig Verfeinerung der Sensoranwendung erfordern. Abhängig von der Größe und dem Gewicht der Teile können Sie ein Erkennungsschema mit Lichtblockierung oder taktilem Knopf verwenden. Die eigentliche Frage hier ist, wie willst du sagen, welches Stück was ist? Wahrscheinlich werden auch benutzerdefinierte Teile benötigt. Vielleicht ein RFID-Tag an jedem Platz anbringen und dann hat jedes Quadrat einen RFID-Scanner? Overkill, aber ein Gedanke.
Das von Ihnen beschriebene Matrix-Scan-Routing wird nicht in der Lage sein, 4 Teile in 2 Zeilen und 2 Spalten zu haben. Betrachten Sie 3-8 Leitungsdecoder (74138) und extrapolieren Sie auf 5-64
Die anfängliche Aufstellung der Stücke ist immer gleich, sodass die Software weiß, welches Stück wo ist. Wenn Sie dann einen Stein von A nach B verschieben, weiß die Software, welcher Stein wohin verschoben wurde. Das erlaubt natürlich nicht, mit beliebigen Lineups zu starten, aber das könnte man auch manuell in der Software einstellen.
Das scheint ... umständlich. Ich wäre mit einer Software-Video-Methode gegangen. OpenCV und eine Kamera. Und ein Beamer.
@Golo Roden - Aber der Computer weiß nicht, welches Stück Sie bewegen. Wenn drei Teile auf dem Feld landen könnten, auf das Sie sich bewegen, woher weiß der Computer, welches dort ist?
Der Computer erkennt nicht nur das Feld, auf das Sie sich bewegen, sondern auch das Feld, von dem Sie sich bewegt haben (weil er von verwendet auf unbenutzt umschaltet).
@Passerby Auch ein interessanter Gedanke, danke für den Beitrag :-)
und ein Roboterarm, um das Computerstück zu bewegen :-)
Erwägen Sie, einen Magneten in den Boden jedes Stücks einzubetten und einen Reed-Schalter unter jedem Quadrat zu verwenden. Sehr einfach für Matrix zu verdrahten. Die Software müsste "piepen", wenn ein Stück nicht in einer angemessenen Zeit wieder auf dem Brett erscheint, da es möglicherweise außermittig genug ist, um den Sensor nicht zu aktivieren.
Diese Anleitung kann für die Sensor-/Erkennungsorganisation hilfreich sein
Erwägen Sie die Verwendung eines i2c-Lichtsensors wie diesem von Avago , wie er in Smartphones verwendet wird. Sie könnten sie alle an einen Bus anschließen und sie einfach aus dem Pi auslesen.
@GoloRoden hast du ein Board gebaut? Können wir bitte das Endergebnis sehen? Vielen Dank

Antworten (5)

Da ein Bild mehr als tausend Worte sagt, ist hier ein Beispiel für LDM-24488NI : eine 64-LED-Matrix

Geben Sie hier die Bildbeschreibung ein

Für Ihre Anwendung benötigen Sie eine solche Matrix für LEDs und eine weitere für Sensoren, was insgesamt 32 IO-Pins erfordert. Da Ihr RPi nicht so viele hat, müssen Sie 1-zu-8-Demux verwenden , um einzelne Zeilen und Spalten auszuwählen:

Geben Sie hier die Bildbeschreibung ein

Für LEDs können Sie Demultiplexer sowohl für Zeilen als auch für Spalten verwenden, da Sie jeweils nur eine LED benötigen. Für Sensoren würde ich empfehlen, einen Demux für Zeilen und einzelne Zeilen für Spalten zu verwenden, um mehrere aktive Sensoren in einer Zeile erkennen zu können. Dadurch wird die erforderliche Pin-Anzahl auf 17 Pins erhöht, die ein RPi verarbeiten kann.

Ja, Multiplexing, wie Sie es beschreiben, ist eine gängige Methode, um Arrays von Dingen zu adressieren.

Der schwierigste Teil wird der Umgang mit der analogen Natur der Lichtsensoren sein. CdS-LDRs (lichtabhängige Widerstände) sind in diesem Fall wahrscheinlich die besten, da sie empfindlich und billig sind und eine große, leicht messbare Reaktion über den menschlichen Helligkeitsbereich erzeugen. Elektrisch sind sie Widerstände, wobei der Widerstand bei hellerem Licht abnimmt.

Es würde das Multiplexen vereinfachen, wenn Sie ein Mikro verwenden, das 8 analoge Eingänge hat. Das bedeutet, dass die Hälfte Ihres Mux in das Mikro eingebaut ist. Sie aktivieren eine Reihe von LDR und lesen zum Beispiel die 8 Spaltensignale direkt mit dem Mikro aus.

Das sequentielle Scannen von 64 analogen Eingängen kann mit gewöhnlichen Mikros nach menschlichen Maßstäben problemlos sofort durchgeführt werden. Angenommen, Sie können alle 100 µs eine neue Messung vornehmen. Das ist "lang", selbst für kleine und billige Mikros. Das bedeutet, dass die gesamte Platine alle 6,4 ms gescannt wird, was viel schneller ist, als Sie eine Verzögerung wahrnehmen können.

Das Multiplexen der LEDs ist noch einfacher, da dies alles mit digitalen Ausgängen erfolgt. Viele Mikros haben weit mehr als 16 digitale Ausgänge, also ist das kein Problem. Es gibt noch andere Dinge, die passieren müssen, und Sie werden Pins schneller verbrauchen, als Sie jetzt vielleicht erwarten, aber ein 64-Pin-Mikro sollte wirklich gut genug sein, wenn nicht ein 44-Pin-Mikro.

Ich würde wahrscheinlich ein Mikro nur für die Handhabung der Board-E / A verwenden. Dies ist optimiert, um genügend I/O-Pins, A/D-Eingänge und dergleichen zu haben. Es wird dann über UART mit der Hauptrechenmaschine verbunden. Das Protokoll würde wie folgt aussehen: „Feld 3,2 aufleuchten“ oder „Stück von Feld 5,4 entfernt“. Dies ermöglicht in Zukunft auch eine völlig andere Hardwareschnittstelle, solange Sie das Protokoll beibehalten.

Für die LEDs ist es naheliegend, für jede Reihe und jede Spalte des Schachbretts einen Ausgang zu haben: insgesamt 8 + 8 = 16 Stifte. Die Anoden würden mit den Zeilendrähten und die Kathoden mit dem Spaltendraht verbunden. Für die LED, die Sie anzünden möchten, würden Sie ihren Anodendraht positiv (logisch 1) und ihren Kathodendraht negativ (logisch 0) machen, während die anderen im umgekehrten Zustand gehalten werden (so dass die verbleibenden LEDs eine neutrale oder umgekehrte Vorspannung haben).

Ich gehe hier davon aus, dass der Mikrocontroller ausreichend hohe / niedrige Spannungen liefert, damit Sie eine LED von einer zur anderen überbrücken können. Wenn dies nicht der Fall ist, benötigen Sie für jede Leitung einen Transistor oder Puffer. Bei einer 5-V-Versorgung ist es eng, wenn man bedenkt, dass die LED um etwa 2 V abfällt und Sie einen angemessenen Spannungsabfall über Ihrem Strombegrenzungswiderstand wünschen (beachten Sie, dass Sie diese nur entweder in den Zeilenleitungen oder in den Spaltenleitungen installieren müssen, nicht in beiden.)

Wenn Ihre Ausgänge Tri-State sind (d. h. zusätzlich zu logisch 0 und logisch 1 können sie in einen hochohmigen Zustand versetzt werden, indem Sie sie vielleicht vorübergehend als Eingänge konfigurieren), können Sie clever vorgehen und ein 4x8-Raster mit LEDs verwenden in antiparallelen Paaren verbunden. Bei diesem Setup ist es wichtig, unbenutzte Ausgänge hochohmig einzustellen, da sonst ungewollte LEDs aufleuchten.

In jedem Fall müssen Sie über die Stromaufnahme nachdenken und ob es akzeptabel ist, die Möglichkeit eines Softwarefehlers zu riskieren, der alle LEDs in einer Reihe gleichzeitig aufleuchtet (was, wenn es nicht berücksichtigt wird, diese Reihenleitung des Mikrocontrollers überlasten könnte .)


Der Fall der Sensoren ist komplizierter. Ich gehe davon aus, dass Sie Widerstandssensoren verwenden, obwohl Fototransistoren nicht unbedingt nur in eine Richtung leiten.

Sie können die gleichen 8 Reihenausgänge verwenden, die Sie zum Aufleuchten Ihrer LEDs verwenden, aber Sie benötigen 8 Spalteneingänge, die der Erfassung gewidmet sind. Bestimmt haben Sie Schaltungen für Tastaturen wie diese gesehen. Denken Sie daran, dass diese nur für das gleichzeitige Drücken einer Taste ausgelegt sind . Wenn der Benutzer 1, 3, 7 und 9 zusammen drückt, kann das Tastenfeld nicht erkennen, ob der Benutzer eine dieser vier Tasten loslässt, da immer noch ein Strompfad durch die anderen drei Schalter besteht.

Eine Lösung, die bei Musikklaviaturen verwendet wird (die so ausgelegt sind, dass mehr als ein Element der Matrix gleichzeitig leitend ist), besteht darin, eine Diode in Reihe mit jedem einzelnen Schalter zu haben.

Eine andere Lösung wäre der Kauf von vier 4-zu-16-Decoder-ICs mit Open-Collector-Ausgängen (oder Open-Drain bei Verwendung von MOSFET-ICs) wie hier: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Offener Kollektor bedeutet, dass die Ausgänge des IC nur Strom aufnehmen, nicht liefern. So können Sie 16 Sensoren an 16 Ausgänge des Chips anschließen und die anderen Enden mit einem Pullup-Widerstand verbinden (Sie würden auch hier Ihren ADC anschließen). Sie bringen einen Ausgang auf Low (leitend) und die anderen 15 bleiben High (nicht leitend). Dies steht im Gegensatz zum Standard-Logikausgang, bei dem die anderen 15 Ausgänge Strom in den gemeinsamen Punkt gießen würden.

Der Eingang zu diesen ICs ist 4-Bit-Binär, um einen der 16 Ausgänge auszuwählen, aber sie haben auch einen zusätzlichen Eingang, um den Chip zu aktivieren/deaktivieren. Somit könnten Sie möglicherweise eine Anordnung von 64 Open-Collector-Senken haben, die mit 64 Sensoren verbunden sind, wobei die anderen Enden der Sensoren alle mit einem einzigen Pullup-Widerstand und einem Analog-Digital-Wandler verbunden sind. Dafür benötigen Sie insgesamt 8 Ausgänge an Ihrem Mikrocontroller: vier für die 4-bis-16-Auswahlsignale (allen vier Chips gemeinsam) und vier für die Freigabesignale (einer für jeden Chip).

BEARBEITEN: 3 bis 8 Decoder (auch 1 von 8 = 1 Zeile von 8 genannt) scheinen mehr verfügbar zu sein als 4 bis 16, aber 8 ICs sind viel chaotischer als 4. Ein anderer Typ von IC, der nützlich sein könnte, ist der Oktalzähler (und sein häufigerer Cousin, der Dekadenzähler , der als Oktalzähler konfiguriert werden kann, indem sein neunter Ausgang mit der Rücksetzleitung verbunden wird.) Diese erfordern einen seriellen Impuls, um von einem Ausgang zum nächsten zu gelangen, also würde der weniger benötigen E/A-Pins auf dem Mikrocontroller als die Decoder-ICs. Sie haben typischerweise zusätzliche Eingänge zum Zurücksetzen und Aktivieren. Es gibt auch Schieberegister genannte ICs , die in zwei Ausführungen erhältlich sind: eine zum Umwandeln von Serien in Parallel, die andere zum Umwandeln von Parallel in Serien. Endlich gibt esBuffer , die Sie zwischen Ihren Rasberry Pi und Ihr Schachbrett stecken können, damit der Pi bei Überstrom nicht zerstört wird. All dies kann in Multiplexschaltungen nützlich sein.

Sie erwähnen Schieberegister - sie könnten auch für die LED-Ausgänge verwendet werden. Ein weiterer Zähler plus ein 8-Bit-Schieberegister, das Tristate kann, könnte das gesamte Array mit kaum mehr als zwei oder drei Pins ansteuern, wenn sie schnell genug sind, um sichtbares Flackern zu vermeiden.
@hobbs Ich denke nicht, dass Flackern ein Problem ist, da OP nur ein oder zwei LEDs gleichzeitig leuchten möchte. Selbst Tristate ist nicht wirklich notwendig, wenn Sie nur eine gerade und eine invertierende Dekade / Oktalzähler / Schieberegister haben, um die LEDs anzusteuern. 3 Pins sind perfekt erreichbar: Common Reset, Column Advance, Row Advance. Das kann der richtige Weg sein - sparen Sie alle anderen Stifte für das schwierigere Problem der Sensoren.
Für die LEDs könnte auch der LED-Treiber MAX7219/7221 verwendet werden. Dadurch wird die Anzahl der Eingänge auf 3 reduziert - Takt, Daten, Latch.

Multiplexing ist in der Tat eine gängige Praxis.

Es gibt ein paar Möglichkeiten, wie Sie mehr aus Ihren Himbeer-Pi-Pins herausholen können

Eine besteht darin, einen Chip zu verwenden, um einige der schweren Aufgaben für Sie zu erledigen. Wenn Sie beispielsweise 8 Eingänge und 8 Ausgänge haben, um den Zustand der Platine zu lesen, können Sie einen Zähler verwenden, um die 8 Eingänge einzeln zu erhöhen. Dazu benötigen Sie 2 Pins auf dem Arduino - einen, um auf den ersten Pin zurückzusetzen, und einen, um "zur nächsten Reihe zu gehen". Du hast gerade 6 Pins gespart!

Das Speichern von 6 Pins reicht möglicherweise nicht aus - mal sehen, wo wir von hier aus gehen können: Wenn Sie Ihr 8x8-Raster in ein 16x4-Raster umordnen, können Sie so etwas wie http://www.instructables.com/id/16-Stage verwenden -Decade-Counter-Chain-Using-two-4017-Chi/?ALLSTEPS (ignorieren Sie die obere Hälfte, die beiden Linien, die von oben nach unten kommen, sind Ihr "Reset", das von oben links kommt, und die " gehe zur nächsten Zeile", die hier CLK heißt, für Uhr). Sie können jetzt die 8 auf der linken Hälfte des Bretts zählen, gefolgt von der 8 auf der rechten Hälfte des Bretts; Verbinden Sie Spalte A und E, B und F, C und G und D und H miteinander.

Herzlichen Glückwunsch, Sie haben jetzt zwei Ausgangspins (Reset und Clock) und 4 Eingangspins, also insgesamt 6 - das spart 10 Pins! Beachten Sie, dass der Himbeer-Pi keine Analog-Digital-Wandler hat, sodass Sie dafür etwas zusätzliche Arbeit benötigen.

Nun zu den LEDs. Sie haben bereits eine kontrollierte Stromversorgung (die beiden Dekadenzähler) - lassen Sie uns diese wiederverwenden. Setzen Sie Ihre 64 LEDs von Ihren 16 Versorgungspins über einen Widerstand (jede LED MUSS einen eigenen Widerstand haben!) Auf 4 andere Schienen (gleiches Layout wie oben: AE, BF, CG und DH). Verbinden Sie diese 4 Schienen über 4 Transistoren mit 4 Pins und stellen Sie alle Pins auf "high" - da beide Seiten der LED jetzt 5 Volt haben, sind die LEDs ausgeschaltet. Wenn Sie dann eine LED anzünden möchten, stellen Sie sicher, dass sich Ihre zwei Dekaden in der richtigen Position befinden (als ob Sie den Sensor auf diesem Quadrat ablesen würden), stellen Sie eine der 4 Schienen auf niedrig ein. Der Strom sollte jetzt vom "Hoch" des Dekadenzählers zum "Niedrig" in dieser bestimmten Schiene fließen. Puh, das Licht geht an! Geben Sie eine kleine Verzögerung ein und schalten Sie es dann wieder aus, bevor Sie den Dekadenzähler erneut ändern.

Wenn Sie mehr Kontrolle wünschen, können Sie so etwas wie einen TLC5940-Chip verwenden - http://playground.arduino.cc/Learning/TLC5940 - jeder Chip kann 16 LEDs (Sie benötigen also 4 davon) auf eine Helligkeitsstufe einstellen von 0 (aus) bis 1024 (voll an), sodass Sie einzelne LEDs mit großer Kontrolle ein- und ausblenden können. Aus dem Speicher benötigen diese etwa 4 Pins und können in Reihe geschaltet werden, sodass 4 digitale Pins (von denen einer PWM sein muss - diese haben das Symbol "~" neben dem Pin) eine beliebige Anzahl von LEDs steuern.

Viel Glück!

Es ist RPi, nicht Arduino.
Entschuldigung, Sie haben recht. Fast alles, was ich gesagt habe, gilt immer noch, also habe ich einige kleinere Änderungen vorgenommen, damit es funktioniert

Ich glaube nicht, dass Sie eine LED in der oberen rechten Ecke benötigen. Ein Sensor in der Mitte, wie Sie erwähnen, würde ausreichen. Der knifflige Teil wird der Code für das Schachbrett sein. Stellen Sie sich vor, Sie haben ein Schachbrett. Die Zeile wird als „Alphabet“ und die Spalte als „Zahl“ angezeigt.

Sie benötigen also zunächst ein Programm, um die Art des Stücks an der Anfangsposition zu programmieren. Später, wenn Sie Ihre Stücke bewegen, generiert der Code die ursprüngliche Position des Stücks bis zur endgültigen Position. Das reduziert Ihren Input um die Hälfte.

Vielleicht habe ich das nicht gut erklärt … die LEDs sind nicht zum Ablesen des aktuellen Zustands gedacht, sie sollen zeigen, welchen Zug der Computer machen möchte. Also bewegt sich der Nutzer: Helligkeitssensoren teilen der Software mit, was der Nutzer gemacht hat. Die Software berechnet den nächsten Zug und lässt zwei LEDs blinken, der Benutzer bewegt die Figur und dann ist der Mensch wieder an der Reihe.