PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USB Gamepad - Redesign



µautonom
27.11.2012, 21:52
Hi, ich habe hier ein altes Gamepad mit USB-Anschluss. Dieses möchte ich dazu nutzen meinen Roboter zu steuern.

Den USB-Anschluss kann bzw. will ich nicht nutzen, da ich das Protokoll nicht kenne und ein reverse-engineering viel zu aufwendig bis kaum machbar ist. Daher möchte ich nur die Platine behalten auf der sich die Tasterkontakte befinden und mir ein eigenes Protokoll bzw. eigene Elektronik drumherum basteln.

Im Grunde befinden sich auf der Platine diese typischen Drucktaster. Das einfachste wäre die Taster als Pullup zu verschalten und dahinter dementsprechend ein Latch in Form eines D-FF's. Damit ich nicht soviele I/O's verschenke, hab ich mir noch überlegt hinter den Latches einen Multiplexer zu packen, sodass ich nur ein I/O Pin + Takt brauche + paar Pins für den Multiplexer zum ansteuern. Bzw. den Takt erzeuge ich mit einem 2. I/O Pin. Komischerweise ist der "Joystick" nicht als Poti ausgeführt, sondern für die Richtung Links, Rechts Oben Unten als Drucktaster ausgeführt.

Was mir grad einfällt, das ich extrem schnell abtasten muss, sodass mir kein Tastendruck entgeht.

Schaltung, siehe Anhang "Gamepad design"

Das Gamepad hat 12 Drucktaster, als D FF mit CLear Pin nehm ich zweimal den 74LS273 jeweils 8 Bit. Für den Multiplexer habe ich mir den 74HCT151 rausgesucht (8:1), kostet nur 20Cent.

Anschließend will ich per USART-Schnittstelle, abhängig davon welcher Taster gedrückt wurde ein entsprechendes ASCII Zeichen an den Roboter senden.

Was haltet ihr von der Schaltung, gibt es Einwände? Oder gibt es bessere Lösungen, Ideen? Vielleicht hat das jemand schon mal umgesetzt und hat wertvolle Tipps für mich :)

Grüße

PICture
27.11.2012, 22:27
Hallo!

Mein Vorschlag wäre: dafür einen 8-bit Schieberegister 74XX166 verwenden und durch "/PE" gespeicherte D0-D7 seriell per 2 Pins "CP" und "D7" einlesen. Für mehr Bits kann man die Schieberegister kaskadieren. ;)

µautonom
28.11.2012, 09:37
Hey,

an ein Schieberegister hatte ich auch erst gedacht, aber ich hatte diese in Errinnerung die einen seriellen Eingang und mehere paralelle Ausgänge haben.

Das ist eine gute Idee und vielen Dank für den passenden Typ, mit 8 Eingängen und einem seriellen Ausgang spare ich mir den Multiplexer. So ein Schieberegister besteht ja auch nur aus D-FFs.

Ich werde mir zwei solcher Bausteine besorgen und zunächst mit dieser Variante versuchen.

Hast du zufällig einen solchen Baustein in deiner Bastelkiste? Dann brauch ich nicht extra wegen einem Baustein im Internet bestellen.

Grüße

PICture
28.11.2012, 12:11
Hast du zufällig einen solchen Baustein in deiner Bastelkiste?

Leider nicht, bloss die 164-er, da die 166-er ich schon lange nicht benötigt habe. ;)

µautonom
28.11.2012, 16:09
Schade,

den 166-er konnte ich bei csd nicht finden, nehme stattdessen den 165 er, der sollte auch gehen, der hat noch einen zusätzlichen seriellen Eingang + invertierten Ausgang.

Werde mal im Kaufen Forum nachfragen ob den jemand hat und eventuell gegen etwas tauschen würde.
Grüße

PICture
28.11.2012, 16:15
Ich habe bei mir noch zwei 74LS166 gefunden, sonst geht der 165-er genauso. :)

µautonom
28.11.2012, 16:18
Juhuu alles weitere klären wir per PN :D

µautonom
12.12.2012, 13:59
Huhu,
es tut sich was :)

Die Taster des Steuerkreuzes kann ich schon mal abfragen. Hab nen kurzes Video gemacht.

http://www.youtube.com/watch?v=-b0edzP0iKA&feature=youtu.be
Sobald Taster "Up" betätigt wird, blinkt die LED einmal. Bei "Right" zweimal, "Left" dreimal und bei betätigen der "Down"-Taste viermal.

Vielleicht ein paar kurze Wort zum Video. Auf der linken Seite sieht man das modifizierte Steuerkreuz des Gamepads. Auf dem Steckbrett befindet sich oben der 166er und dadrunter der Attiny2313. Zu Abfrage der Taster benötigt der 166 nur zwei Pins, ein Takt-und der ein Shift/*Load-Eingang.

Bei Shift/*Load=0 werden die anliegen Pegel "gespeichert" im Datenblatt als Load bezeichnet. Sobal der Pegel wieder auf High ist, befindet sich der 166 im Shift Modus. Nun können die Bits per Takteingang geshiftet werden. Die geshifteten Bits können anschließend am QH Ausgang abgefragt werden. Wichtig ist zu wissen das nach dem "Load" Vorgang der anliegende Pegel am H-Eingang schon am Ausgang QH anlieget, dieses Bit muss man vor dem Shiftenabfragen, da es ansosnten verloren geht.

Die Taster werden alle 60ms abgefragt, ich denke das sollte reichen um jeden Tastendruck zu regestrieren. Software ist noch nicht optimal aber für die ersten Tests reicht es. Notfalls werde ich zur Sicherheit die Taster mehrmals abfragen, so das ich sicher sein kann das die Pegel gültig sind.

Hatte rein aus Neugier die Taster als Pulldown verschaltet um den Stromverbauch zu testen. Bei TTL ist es nicht sinvoll ist, wenn das ganze später Batterie betrieben wird, aufgrund des erhöhten Stromverbrauches im Ruhezustand. Hatte zuerst einen sehr großen Pulldown mit 10k genommen, gemessen habe ich 0,36V und das hat der 166er schon als high erkannt? Das habe ich noch nicht so ganz verstanden, laut Datenblatt liegt der max. Low-Pegel bei 0,8V. Werds nochmal nachmessen, den ich vermute das es ne höhere Spannung am Pulldown abfallen muss. Die Pullup-Version funktioniert zumindest.

Der nächste Schritt wird die Kaskadierung zweier 166er, sodass ich alle Taster abfragen kann.
In der Schaltung fehlt noch eine ganze Menge. Ein Schalter zum einschalten des Joypads, die Spannungserzeugung, Bluetooth-Modul zur kabellosen Übertragung und das dazugehörige Übertragungsprotokoll. Demnächst folgt der neue Stand.

Für denjenigen, der sich mit dem 74LS166 auseinandersetzen muss bzw. sich für den Code interessiert, findet diesen im Anhang für den Attiny2313 und den dazugehörigen Schaltplan.

Grüße

PICture
12.12.2012, 15:36
Hatte zuerst einen sehr großen Pulldown mit 10k genommen, gemessen habe ich 0,36V und das hat der 166er schon als high erkannt?

Für besseres Verständnis habe ich eine TTL Eingangsstufe skizziert, die in Datenblätter (DB) nur selten zu sehen ist. Der Eingang kann ruhig in "der Luft" hängen und dann wird er auch als high erkannt (bei CMOS nicht). ;)

Übrigens, bei kurzen Leitungen an TTL Eingängen ("Antennen" für Störungen) sind oft keine "pull-up's" notwendig.




VCC +-------+--------+
+ | TTL N | TTL LS |
| +---+-------+--------+
.-. | R | 4k | 40k |
| | R +---+-------+--------+
| |
'-'
|
---
v \--
/ T
Input >-----/

(created by AACircuit v1.28.6 beta 04/19/05 www.tech-chat.de)

µautonom
15.12.2012, 15:30
Hi,

das Bild, das du als Code gezeichnet hast habe ich noch in einem Datenblatt für einen UND-Baustein gefunden, nur die Widerstandsangabe habe ich nirgends entdecken können :) In deiner Skizze erkennt man sehr gut, was passiert wenn man das ganze als Pulldown Version aufbaut. Es fließt im "Ruhezustand" ständig Strom durch den Pulldown-Widerstand.

Die Kaskadierung läuft nun auch und ich kann alle Taster abfragen. Mir gefällt der Chip, da für die Kaskadierung nur eine kleine Änderung im Code benötigt wird, statt 8 mal muss 16mal getaktet werden :) Und man braucht insgesamt nur drei Pins. Schaltplan werde ich später hochladen, Eagle gefällt mir nicht, zu umständlich.

Ich habe vor das Gamepad mit zwei 1,2V NiMH Akkus zu versorgen. Laut Messung vebraucht die gesamte Schaltung ca. 30mA. Jetzt ist die Frage ob eine Ladungspumpe ausreichend ist oder ich einen kleinen Step-Up aufbauen muss. Werde ich noch ausprobieren müssen. Wird ganz interessant sein, da ich noch nie eine Ladungspumpe aufgebaut habe, mal sehen wieviel Strom man unter "Last" erzeugen kann. Im Grunde muss ich 5V nur für den 166er erzeugen, also wird weniger Strom benötigt.

Der Attiny2313 arbeitet schon bei 1,8V. Habe die Pegel für den 166er verglichen:

Attiny2313 ( @Vcc=2,4V (2*1,2V) ):
VOL=0,5V
VOH=2,5V(min.)

Die 2,5V sollten schon für einen Logic-Level Mosfet reichen, um diesen für die Ladungspumpe zu schalten.

VIL=0,2*Vcc=0,48V(max.)
VIH=0,7*Vcc=1,68V(min)

74LS166 (@Vcc=5V):
VIL=0,8V(max.)
VIH=2V(min.)

VOL=0,5V(max.)
VOH=2,7V(min.)

Die nächsten Erkenntnisse sowie Bilder werden hoffentlich folgen ;)

EDIT: Hab gerade im Datenblatt nachgesehen, leider habe ich nicht die V-Version des Attiny2313 die mit 1,8V versorgt werden kann, nur mit minimalen 2,7V

Grüße

PICture
15.12.2012, 15:54
Hi,

Für 2 bis 6V würde ich 74HC166 empfehlen, wo leider keine Eingänge "in der Luft" hängen dürfen. Den vorhandenen Code brauchst du dann nicht ändern und keine Ladungspumpe aufbauen. Die CMOS IC's brauchen praktisch kein Strom und benötigen keine stabilisierte Versorgungsspannung wie TTL. :D

µautonom
16.12.2012, 09:14
Bis ich die HC version bestelle, werde ich mal die Ladungspumpe probieren :) Vielleicht auch einen diskreten Step Up aufbauen, rein aus Interesse.

PICture
16.12.2012, 14:00
Wenn du etwas praktisches lernen willst, dann musst du es unbedingt machen. Also viel Spass dabei ! :)