Kann ich ein Board mit Widerstandsleitertasten auf dem Himbeer-Pi verwenden?

Ich habe eine Uhr, die eine Platine mit einem Widerstandsleiter-Setup für die Tasten hat. Ich möchte (die Uhr trennen und) ein Pi hineinstecken und die Tasten verwenden, um das Pi zu steuern. Im Normalbetrieb wird die Platine mit Spannung versorgt und die Taster sind mit Masse verbunden. Die Uhr misst die Spannung irgendwie (ich glaube nicht, dass sie von der Masseseite kommt, denn wenn ich die Masseseite der Platine direkt mit Masse verbinde, funktioniert sie immer noch wie erwartet.) Wenn ich die GPIO-Pins mit den Tasten nach den Widerständen, aber vor dem verbinde Tasten wird die Spannung auch durch den Widerstand zum nächsten Widerstand zurückverfolgt. Das Ergebnis ist, dass der Pi erkennt, dass mehr als eine Taste gleichzeitig gedrückt wird. Dies geschieht, weil die hohe Seite der Spannungsleiterwiderstände miteinander verbunden sind. Wie kann ich das mit dem Himbeer-Pi verdrahten, ohne die Widerstände zu entfernen?schematisch

Bist du dir sicher, dass der Schaltplan stimmt?
@jsotola warum bezweifelst du die Genauigkeit? Ja. Ich bin sicher, es ist richtig. Ich denke, die Antwort von Jack Creasey ist, wie es funktioniert, nicht eine Widerstandsleiter, wie ich dachte. muss ich noch testen.
@Umar Ich bin mir nicht sicher, was du meinst ... Die Frage war nicht, wie man eine Widerstandsleiter für Arduino erstellt.
Nein, ich dachte darüber nach, den Analogwert zu lesen, um die gedrückte Taste zu decodieren. Ich verstehe immer noch nicht, warum wir nicht einzelne Analogwerte für einzelne Tasten lesen können
Fügen Sie einen 10k-Pullup-Widerstand hinzu, um key.... an den analogen Eingang anzuschließen key.... Spannung zu messen an key... der Kondensator könnte zur Entprellung verwendet werden ... der Pullup-Widerstand muss möglicherweise angepasst werden

Antworten (1)

Ich würde vorschlagen, dass der von Ihnen gezeigte Schaltplan einen "Time to Discharge" -Algorithmus verwendet, um zu entscheiden, welcher Schalter gedrückt wird (oder sogar wenn mehrere Schalter gedrückt werden).

Auf dem R'Pi könnten Sie die 'Schlüssel'-Leitung mit einem 1-kOhm-Widerstand (benötigt wegen SW7) an einen GPIO-Pin anschließen und dann so etwas tun:

  1. Stellen Sie den GPIO so ein, dass er eine "1" ausgibt. Dadurch wird der Kondensator aufgeladen (möglicherweise werden Schalter gedrückt, sodass die Hochspannung davon abhängt, welche gedrückt werden).
  2. Richten Sie einen Interrupt ein, wenn der GPIO niedrig wird
  3. Lesen Sie den System-Timer ( so )
  4. Stellen Sie den GPIO auf Eingang ohne internen Pullup ein
  5. Wenn Sie einen Interrupt erhalten, lesen Sie den Systemtimer erneut und speichern Sie ihn (der Differenzwert bezieht sich auf die Entladezeit des RC-Netzwerks auf den GPIO-Low-Pegel). Dann würden Sie ein RET ausführen
  6. Zurück in Ihrem Mainline-Code haben Sie sowohl den anfänglichen als auch den zweiten System-Timer-Wert …. subtrahieren Sie die beiden, um die Differenz zu erhalten.

Es ist nicht sehr genau, aber gut genug, um herauszufinden, welcher Schalter gedrückt ist. Es wird Spaß machen, alle Variationen zu katalogisieren, wenn mehrere Schalter gedrückt werden, aber es sollte machbar sein.

das sieht interessant aus. Ich habe nie an diese Option gedacht. Ist es das, wovon Sie sprechen? instructables.com/id/…
Ja, fast gleich. In der Verbindung ist nur ein Widerstand von Bedeutung ... in Ihrem Schaltplan sind die Widerstände effektiv parallel, wenn mehrere Tasten gedrückt werden. Die gezeigte Software ist eine monolithische Routine, denn so lange Sie sie verwenden, können Sie nichts anderes tun. Was ich ausgelegt habe, war eine Interrupt-basierte Routine mit wenig Overhead.
guter Punkt über das Hinzufügen des Reihenwiderstands von 1 kOhm. Timing-Ergebnisse können davon abhängen, ob GPIO vom Typ „TTL“, „CMOS“ oder „Schmitt“ ist.
@glen_geek ist in einer modernen MCU kaum TTL ... und hier sprechen wir über ein bestimmtes Gerät (Raspberry Pi) und wissen, dass es sich nicht um TTL- oder Schmitt-E / A-Ports handelt.
Können Sie das bitte ein wenig erläutern. Ich verstehe es bisher so: gpio hoch setzen Interrupt setzen, um auf Low zu warten ... auf Taste warten ... wenn die Taste gedrückt wird, gpio auf Low geht Timer lesen gpio auf Input und Floating setzen und auf Interrupt auf High warten .. ... wenn es hoch ist, lese den Timer erneut und rechne nach ... ist das richtig?
@ FoxSam12 Ja ... obwohl es nur einen Interrupt beim 1-0-Übergang gibt.
@ FoxSam12 Die Interrupt-Service-Methode ist möglicherweise zu fortgeschritten für Sie. Probieren Sie den Software-Ansatz in dem Link aus, den Sie zu Beginn gepostet haben, und leiten Sie die Werte ab, die Sie mit Ihrem Kondensator erhalten. Versuchen Sie dann den Interrupt-gesteuerten Ansatz.
Ich verstehe Schritt 5 nicht. Wenn der Interrupt nur 1-0 ist, wann lese ich den Timer das zweite Mal?
Schritt 5 sagt: "Wenn Sie einen Interrupt erhalten, lesen Sie den Systemtimer erneut und der Differenzwert bezieht sich auf die Entladezeit ..." Welchen Teil davon verstehen Sie nicht?? In der ISR würden Sie den Messwert des Systemzeitgebers lesen und speichern ... dann RET Sobald Sie wieder in Ihrer Hauptcodezeile sind, würden Sie die beiden Messwerte subtrahieren, um den Unterschied zu erhalten.
Entschuldigen Sie, dass ich den Punkt verpasst habe, aber ich kann einfach nicht herausfinden, wie Sie dies mit nur 2 Drähten bewältigen können. Woher kennen wir die zwei Zeiten, um den Timer zu lesen?
Sie haben nur zwei Drähte von Ihrer Tastatur, Sie verwenden einen einzelnen GPIO-Pin zuerst als Ausgang, um die Kappe aufzuladen, und dann als Eingang, um zu erkennen, wann die Kappe auf einen Schwellenwert von '0' entladen wird. Folgen Sie dem Beispiel aus dem Link, den Sie gepostet haben, und verwenden Sie diesen Code ... wenn Sie verstehen, wie der GPIO-Port verwendet wird, können Sie zu einer ISR-basierten Methode konvertieren. instructables.com/id/… ... wenn Sie nicht verstehen können, wie der GPIO-Port verwendet wird, dann weiß ich nicht, wie ich Ihnen helfen kann.
@ FoxSam12 - Die Idee ist, zu bestimmen, wie lange es dauert, bis sich der Kondensator entladen hat. Was nicht klar genug erklärt wird, ist, dass dies eine Messung ist, die immer wieder durchgeführt werden müsste, um zu sehen, ob tatsächlich eine Taste gedrückt wird, und wenn ja, welche. Die Zeit wird einmal zu Beginn jedes Experiments gelesen und dann erneut, wenn (und wenn) der Eingangszustand sich ändert, was anzeigt, dass der Kondensator entladen wurde. Dies ist jedoch alles nur eine Theorie; Es ist erwähnenswert, dass bei der Arduino-Nutzung dieser Art von Tastatur traditionell über den eingebauten A / D-Wandler gemessen wird, der einem Pi fehlt.