Ich möchte ein hölzernes Schachbrett herstellen, auf dem Sie mit normalen Stücken spielen können (dh nicht mit modifizierten Stücken, die RFID-Codes, Magnete usw. verwenden), das jedoch mit einer Software verbunden ist, die meine Bewegungen berücksichtigt und als solche fungiert der zweite Spieler.
Ich habe darüber nachgedacht, wie ich Teile auf der Tafel erkennen soll, und ich habe die Entscheidungen getroffen, die ich nicht unbedingt treffen muss, um zu erkennen, welche Teile wo sind: Die "Wahrheit" ist in der Software, wenn ich also ein Teil von A nach B verschiebe kann die Software herausfinden, welches Teil bewegt wurde.
Ich hatte also 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 ein Teil auf dem Feld steht oder nicht.
- Das in der Ecke wird als LED verwendet, um anzuzeigen, welches Teil der Benutzer für den Computer bewegen muss, damit die reale Situation wieder mit der Softwaresituation übereinstimmt.
Ich möchte einen Raspberry Pi als Hardwaregrundlage 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 benötige 64 Ausgänge und 64 Eingänge. Und dies ist natürlich etwas, das ein Raspberry Pi nicht von der Stange schafft - und ich denke, dass es einen besseren Weg geben muss, als 128 I / O-Ports zu haben.
Da ich der Meinung bin, dass das Erkennen des Platinenstatus die wichtigere Aufgabe ist, habe ich mich im Internet mit der Handhabung einer 8x8-Matrix von Schaltern befasst. Ich fand den Vorschlag, einen Mikrocontroller zu verwenden, der die Spalten der Karte nacheinander 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 Status der Karte lesen zu können).
Dazu habe ich ein paar Fragen:
- Sind meine Gedanken richtig, dh ist dies der richtige Ansatz, oder gibt es eine bessere Alternative, auf die ich achten sollte?
- Worauf muss ich achten, da ich keine Erfahrung mit Mikrocontrollern habe? Benötige ich nur einen Mikrocontroller mit 16 Pins, der in einer Sprache programmiert werden kann, die ich schreiben kann, oder ...?
- Hat jemand ein solches Board gebaut und hat einige Ratschläge oder kennt ein Tutorial, das Sie durch den Prozess führt?
Antworten:
Da ein Bild mehr als tausend Worte sagt , ist hier ein Beispiel für LDM-24488NI : eine 64- LED -Matrix
Für Ihre Anwendung benötigen Sie eine solche Matrix für LEDs und eine andere für Sensoren, die insgesamt 32 IO-Pins benötigen. Da Ihr RPi nicht so viele hat, müssen Sie 1-zu-8-Demux verwenden , um einzelne Zeilen und Spalten auszuwählen:
Für LEDs können Sie Demultiplexer für Zeilen und 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. Das bringt die erforderliche Pinanzahl auf 17 Pins, die ein RPi verarbeiten kann.
quelle
Ja, Multiplexing, wie Sie es beschreiben, ist eine gebräuchliche Methode, um Arrays von Dingen anzusprechen.
Der schwierigste Teil wird sich mit der analogen Natur der Lichtsensoren befassen. CdS-LDRs (lichtabhängige Widerstände) sind wahrscheinlich die besten in diesem Fall, da sie empfindlich und billig sind und eine große, leicht messbare Reaktion über den menschlichen Helligkeitsbereich erzeugen. Elektrisch handelt es sich um Widerstände, deren Widerstand bei hellerem Licht abnimmt.
Es würde das Multiplexen vereinfachen, wenn Sie ein Mikro mit 8 analogen Eingängen verwenden. Das heißt, der halbe Multiplexer ist in das Mikro eingebaut. Sie aktivieren eine Reihe von LDR und lesen beispielsweise die 8-Spalten-Signale direkt mit dem Mikro.
Das sequentielle Abtasten von 64 analogen Eingängen kann mit normalen Mikros sofort ausgeführt werden. Nehmen wir an, Sie können alle 100 µs eine neue Messung durchführen. Das ist "lang", auch 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 über digitale Ausgänge erfolgt. Viele Mikros haben weit mehr als 16 digitale Ausgänge, das ist also kein Problem. Es gibt andere Dinge, die passieren müssen, und Sie werden die Pins schneller verbrauchen, als Sie 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 Platinen-E / A verwenden. Dies ist optimiert, um genügend E / A-Pins, A / D-Eingänge und dergleichen zu haben. Anschließend wird über UART eine Schnittstelle zur Hauptrechenmaschine hergestellt. Das Protokoll würde so aussehen, als ob "Quadrat 3,2 aufleuchten" oder "Stück von Quadrat 5,4 entfernt". Dies ermöglicht auch in Zukunft eine völlig andere Hardwareschnittstelle, solange Sie das Protokoll unverändert lassen.
quelle
Für die LEDs ist es naheliegend, eine Ausgabe für jede Zeile und jede Spalte des Schachbretts zu haben: insgesamt 8 + 8 = 16 Pins. Die Anoden wären mit den Zeilendrähten und die Kathoden mit dem Spaltendraht verbunden. Für die LED, die Sie beleuchten möchten, würden Sie den Anodendraht positiv (logisch 1) und den Kathodendraht negativ (logisch 0) machen, während die anderen im umgekehrten Zustand bleiben (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 untereinander überbrücken können. Ist dies nicht der Fall, benötigen Sie für jede Leitung einen Transistor oder Puffer. Bei einer 5-V-Versorgung ist es dicht, wenn man bedenkt, dass die LED um 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 ( dh zusätzlich zu logisch 0 und logisch 1 können sie in einen hochohmigen Zustand versetzt werden, indem sie möglicherweise vorübergehend als Eingänge konfiguriert werden), können Sie clever werden und ein 4x8-Gitter mit LEDs verwenden in antiparallelen Paaren verbunden. Es ist wichtig, nicht verwendete Ausgänge in diesem Setup auf hohe Impedanz zu setzen, da sonst unerwünschte LEDs aufleuchten.
In beiden Fällen müssen Sie über die Stromaufnahme nachdenken und ob es akzeptabel ist, die Möglichkeit eines Softwarefehlers beim gleichzeitigen Aufleuchten aller LEDs in einer Reihe zu riskieren (der, wenn er nicht berücksichtigt wird, diese Zeilenleitung des Mikrocontrollers übersteuern könnte .)
Der Fall der Sensoren ist komplizierter. Ich gehe davon aus, dass Sie resistive Sensoren verwenden, obwohl Fototransistoren nicht unbedingt nur in eine Richtung leiten.
Sie können dieselben 8-Zeilen-Ausgänge verwenden, die Sie zum Beleuchten Ihrer LEDs verwenden. Sie benötigen jedoch 8-Spalten-Eingänge für die Erfassung. Sie werden ohne Zweifel Schaltungen für solche Tastaturen gesehen haben . Beachten Sie, dass nur jeweils eine Taste gedrückt werden kann . Wenn der Benutzer die Tasten 1,3,7 und 9 gleichzeitig drückt, kann die Tastatur nicht erkennen, ob der Benutzer eine dieser vier Tasten loslässt, da noch ein aktueller Pfad durch die anderen drei Schalter vorhanden ist.
Eine Lösung für Musiktastaturen (bei denen mehr als ein Element der Matrix gleichzeitig leitend ist) besteht darin, zu jedem Schalter eine Diode in Reihe zu schalten.
Eine andere Lösung wäre der Kauf von vier 4-zu-16-Decoder-ICs mit Open-Collector-Ausgängen (oder Open-Drain- Ausgängen bei Verwendung von MOSFET-ICs) wie folgt: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Open Collector bedeutet, dass die Ausgänge des IC nur Strom aufnehmen, nicht aber speisen. Somit können Sie 16 Sensoren an 16 Ausgänge des Chips anschließen und die anderen Enden zusammen mit einem Pullup-Widerstand verbinden (Sie würden Ihren ADC auch hier anschließen). Sie bringen einen Ausgang auf Low (leitend) und die anderen 15 bleiben auf High (nicht leitend). Dies steht im Gegensatz zum Standard-Logikausgang, bei dem die anderen 15 Ausgänge Strom in den gemeinsamen Punkt einspeisen 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. Auf diese Weise könnten möglicherweise 64 Open-Collector-Senken an 64 Sensoren angeschlossen werden, wobei die anderen Enden der Sensoren alle einem einzigen Pullup-Widerstand und einem Analog-Digital-Wandler zugeordnet sind. Hierfür benötigen Sie insgesamt 8 Ausgänge an Ihrem Mikrocontroller: vier für die 4 bis 16 Auswahlsignale (für alle vier Chips gemeinsam) und vier für die Freigabesignale (für jeden Chip eines).
BEARBEITEN: 3 bis 8 Decoder (auch als 1 von 8 = 1 von 8 Zeilen bezeichnet) scheinen verfügbarer zu sein als 4 bis 16, aber 8 ICs sind viel unordentlicher als 4. Ein anderer Typ von IC, der nützlich sein könnte, ist der Oktalzähler (und sein häufigster Verwandter der Dekadenzähler , der durch Verbinden seines neunten Ausgangs mit der Rücksetzleitung als Oktalzähler konfiguriert werden kann.) Damit ein serieller Impuls von einem Ausgang zum nächsten weitergeschaltet werden kann, ist weniger erforderlich I / O-Pins am Mikrocontroller als die Decoder-ICs. Sie verfügen normalerweise über zusätzliche Eingänge zum Zurücksetzen und Aktivieren. Es gibt auch sogenannte Schieberegister von ICs , die in zwei Typen erhältlich sind: einer zum Konvertieren von Serien in Parallel und der andere zum Konvertieren von Parallel in Serien. Endlich gibt esPuffer , die Sie zwischen Ihren Rasberry Pi und Ihr Schachbrett legen können, damit der Pi im Falle eines Überstroms nicht zerstört wird. All dies kann bei Multiplexschaltungen nützlich sein.
quelle
Multiplexing ist in der Tat eine gängige Praxis.
Es gibt verschiedene Möglichkeiten, wie Sie mehr aus Ihren Himbeer-Pi-Stiften herausholen können
Eine ist, einen Chip zu verwenden, um das schwere Heben für Sie zu erledigen. Wenn Sie beispielsweise über 8 Eingänge und 8 Ausgänge verfügen, um den Status der Karte zu lesen, können Sie einen Zähler verwenden, um die 8 Eingänge nacheinander zu erhöhen. Dazu benötigen Sie 2 Pins auf dem Arduino - einen, um auf den ersten Pin zurückzusetzen, und einen, um "in die nächste Zeile zu wechseln". Sie haben gerade 6 Pins gespeichert!
Das Speichern von 6 Pins reicht möglicherweise nicht aus - sehen wir uns an, wie es weitergeht: 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 Zeilen, die von oben nach unten kommen, sind Ihr "Reset" und kommen von oben nach links.) gehe zur nächsten Reihe ", die hier CLK heißt, für die Uhr). Sie können jetzt die 8 in der linken Hälfte der Tafel zählen, gefolgt von der 8 in der rechten Hälfte der Tafel. Verbinden Sie die Spalten A und E, B und F, C und G sowie D und H miteinander.
Herzlichen Glückwunsch, Sie haben jetzt zwei Ausgangspins (Reset und Clock) und 4 Eingangspins für insgesamt 6 - das spart 10 Pins! Beachten Sie, dass der Himbeer-Pi keine Analog-Digital-Wandler hat, so dass Sie etwas zusätzliche Arbeit dafür benötigen.
Nun zu den LEDs. Sie haben bereits eine kontrollierte Stromversorgung (die beiden Dekadenzähler) - können diese wiederverwenden. Stecken Sie Ihre 64 LEDs von Ihren 16 Versorgungsstiften über einen Widerstand (jede LED MUSS einen eigenen Widerstand haben!) Auf 4 andere Schienen (gleiche Anordnung wie oben: AE, BF, CG und DH). Verbinden Sie diese 4 Schienen über 4 Transistoren mit 4 Pins und setzen Sie alle Pins auf "high" - da beide Seiten der LED jetzt 5 Volt haben, sind die LEDs aus. Wenn Sie dann eine LED anzünden möchten, vergewissern Sie sich, dass sich Ihre zwei Jahrzehnte in der richtigen Position befinden (als ob Sie den Sensor auf diesem Quadrat lesen würden), setzen Sie eine der 4 Schienen auf niedrig. Der Strom sollte nun vom "Hoch" des Dekadenzählers zum "Niedrig" in dieser spezifischen Schiene fließen. Hey Presto, das Licht geht an! Geben Sie eine kleine Verzögerung und schalten Sie sie 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 (also 4 davon) auf eine Helligkeitsstufe einstellen von 0 (aus) bis 1024 (voll ein), so dass Sie einzelne LEDs mit großer Kontrolle ein- und ausblenden können. Aus dem Speicher benötigen diese ungefähr 4 Pins und können in Reihe geschaltet werden, so dass 4 digitale Pins (von denen einer PWM sein muss - diese haben ein "~" - Symbol neben dem Pin) eine beliebige Anzahl von LEDs steuern.
Viel Glück!
quelle
Ich glaube nicht, dass Sie eine LED in der oberen rechten Ecke benötigen. Ein Sensor in der Mitte würde ausreichen. Der schwierige Teil ist der Code für das Schachbrett. Stellen Sie sich vor, Sie haben ein Schachbrett. Die Zeile wird als 'Alphabet' und die Spalte als 'Nummer' angezeigt.
Sie benötigen also zuerst ein Programm, um die Art des Stücks an der Anfangsposition zu programmieren. Später, wenn Sie Ihre Teile verschieben, generiert der Code die anfängliche Position des Teils an der endgültigen Position. Das wird Ihre Eingabe um die Hälfte reduzieren.
quelle