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:
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:
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 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:
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.
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!
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.
mcmiln
Eisig
Golo Roden
Passant
mcmiln
Golo Roden
Golo Roden
Eisig
Transistor
Benutzer2813274
Tomnexus
Benutzer13107