Montag, 4. Mai 2015

InstaButton

Seit kurzer Zeit bin ich wieder Teil einer kleinen Shadowrun Pen and Paper Gruppe. Nachdem ich sowohl Shadowrun: Returns und Shadworun: Dragonfall förmlich verschlungen habe, wuchs in mir der Wunsch wieder Shadowrun zu spielen. Ich wollte auch meistern und angeregt durch Dragonfall, spielt unsere aktuelle Kampagne in Berlin. Die Runner sind alles StreetLevel Ganger und inzwischen spielen wir zu fünft - mit mir als Spielleiter, Knuffel als Troll-Buchhändler, Ralle als Ork-Ganger, Sohmbee als Schmuggler und bmx als Menschen Decker ohne Cyberdeck.
Screenshot Shadowrun Returns
In den vergangenen Runs hat sich die Gruppe in Berlin aklimatisiert und die kommenden Runs sind auch grob umrissen. Ich bin ein großer Fan von Stimmung beim Rollenspiel und habe den heiligen Gral hierbei auch noch nicht gefunden. Ich mag Ambient Mixer, Subsonic, Winamp und Konsorten, aber alle diese Varianten benötigen eins: Ein Tablet oder einen "richtigen" Rechner. Letztenendes möchte man oft aber nur ein wenig Hintergrundgeplänkel haben und hier und da ein paar Sounds einspielen. Ich habe eine Weile drüber nachgedacht und kann nun endlich meine Lösung präsentieren.

Die Rahmenanforderungen
- Abspielen von Musikdateien unterschiedlicher Formate, ggfs. Umwandlung in kompatibles Format vorher.
- Headless-System, minimale Nutzerinteraktion notwendig um einen Ton abzuspielen
- Zeit von "ich brauche einen Ton" bis "der Ton wird gespielt" muss minimal sein (<1-2 Sek.)
- Portabel da es auch an anderen Orten genutzt werden soll

Konzept
- Implementierung in Hardware, Knöpfe drücken usw.
- Knopfdruck erzeugt Ton oder Tonschleife
- Speicher muss günstig sein und Portabel sein (SD-Karte oder USB Stick)

Letzten Endes wollte ich also einen MP3 Player bauen. Die Idee ist bei weitem nicht neu. Die günstigste Möglichkeit wäre eine Android-App gewesen. Ich habe mich noch nie mit der Android API beschäftigt und wollte tendenziell auch auf eine reine Software Lösung verzichten. Die "Instant Button" App und die unzähligen Varianten haben das Problem das man recht häufig scrollt bis man beim gewünschten Ton angekommen ist. Dies ist lösbar, wenn man die Auswahl einschränkt, sodass nur "ein Screen" benötigt wird. Fazit: Eine reine Software Lösung ist möglich, war aber nicht mein Fokus.
Die nächste Idee war die Implementierung auf Basis von Mikrocontroller und dedizierten Hardware Chips. Eine kurze Google Suche ergab recht hohe Kosten (um die 40-50 Euro für die Bauteile). Verbunden mit der geringen Rechenleistung von Mikrocontrollern waren das Aus für diese Variante.
Als ersten richtigen Wurf baute ich das System anschließend auf einem FPGA (Field Programmable Gate Array). Die Idee dabei war ein wenig VHDL (Very High Speed Hardware Description Language) zu üben. Ich habe zuhause noch ein Entwicklungsboard von Terrasic mit einem Cyclone II FPGA von Altera rumfliegen das ich faktisch fast gar nicht genutzt habe bisher. Eine gute Gelegenheit also. Als ich mir den SD-Card Controller angesehen hatte, stellte ich fest, das hierfür verdammt viele Zustände in einer State Machine notwendig werden würden. Kombiniert mit dem notwendigen Dateisystem entschied ich mich hier für einen Softcore und konfigurierte mir einen Nios II mit SD-Card Controller. Die recht chaotische Entwicklungsumgebung für den Nios kannte ich schon aus meiner Diplomarbeit, inklusive der vielen Stolperfallen (Projekt löschen wenn man etwas am System verändert hat und alles wieder reinladen etc.pp.). Die Buttons und auch das Dateisystem gingen recht fix, das LCD hingegen lies sich nicht dazu bringen Text darzustellen. Nach knapp einer Woche war ich so frustriert das ich das Projekt in die Ecke warf. Der FPGA war vollkommen überdimensioniert für das Projekt und das Board verfügte auch nur über 4 Buttons und 16 DIP Switches.
DE2 Board von Altera (gefunden auf http://www.terasic.com.tw)
Die Lösung: Hardware nahe Programmierung auf einem Raspberry Pi. Der Pi hat die Vorteile eines regulären Rechners und verbindet diese mit einer kleinen Bauform. Weiterhin kann der Pi durch die GPIO Pins recht leicht erweitert werden. Da es eigentlich ein Unix-PC ist, funktionieren viele Programmiersprachen wie C, C++ oder Python. Da ich aber auch Hardware Buttons haben wollte, musste ich ja auch ein wenig basteln. Hierfür entwarf ich eine kleine Schaltung und testete diese auf einem Breadboard. Anschließend lötete ich mir eine kleine Testplatine zusammen für die Buttons. Nachdem ich diese beiden Testplattformen zum fliegen gebracht hatte, und ein paar kleine Python Skripte die Buttons auch auslesen konnten, war es Zeit für die Kür. Ich wollte ein praktisches, kleines System.
Der nächste Schritt war nun den Schaltplan in EAGLE zu übertragen und dort anschließend ein Board Layout zu erzeugen. Leider habe ich kein Equipment für Kleinserien Platinen wie zB ein Ätzbecken. Das alles anzuschaffen wäre Overkill gewesen, stattdessen ließ ich die Platine fertigen. Ursprünglich wollte ich zu QPrint greifen, aber sowohl QPrint als auch der "Klassiker" PCB-Pool waren verdammt teuer. Eine Platine sollte knapp 40-50 Euro kosten. Das sprengte erneut den Rahmen. Ein Arbeitskollege empfahl mir Itead, eine Firma in China die sich auf Kleinserien spezialisiert hat. Mit Porto war ich bei einem etwas höheren Betrag, aber ich bekam dafür 10 (!) Platinen.
Board
Alle überzähligen Platinen können bei mir erworben werben, schreibt mir einfach hier in den Kommentaren oder via E-Mail. Pro Stück hätte ich gerne 7 Euro. Wer das lieber selber machen möchte kann von mir auch gerne PDF-Dateien mit Front- und Rückseite zum Belichten oder die EAGLE Dateien bekommen. Der Schaltplan ist unten abgebildet.


Schaltplan

Der einzige ungewöhnliche Baustein ist der MCP23017SS. Der Baustein ist ein I2C-basierter GPIO-Extender und erweitert die maximalen GPIO Pins um 16, hierfür müssen nur die zwei SDA und SCL Pins angeschlossen werden. Mehrere MCP23017 könnten verwendet werden, sie müssen nur entsprechend verdrahtet werden. Den MCP bekommt man leider nicht bei Reichelt, aber z.B. bei Mouser, Conrad oder auch Farnell. Letzterer beliefert leider nur gewerbliche Kunden. Ich habe meine von Conrad bezogen, aus dem simplen Grund das ich mit dem Fahrrad vorbeifahren kann. Ich habe noch zwei übrig behalten und würde diese zum Selbstkostenpreis bestellten Platinen beilegen. Falls jemand das Projekt auch machen möchte. Alle anderen Teile bezieht man am besten über Reichelt, hier habe ich einen Warenkorb vorbereitet. Es werden folgende Teile benötigt:

4x SMD Widerstand 56Ohm 0805 Bauform (andere Werte möglich, Strombegrenzung für die LEDs)
12x SMD Widerstand 1KOhm 0805 Bauform
12x SMD Widerstand 10KOhm 0805 Bauform
1x MCP23017SS
1x ACP 6mm 10K Linear Poti
1x 16x2 LCD
4x LED beliebiger Farbe (ggfs. den Vorwiderstand anpassen, 56Ohm sollte passen für Rot, Gelb und Grün)
8x Taster 6mmx6mm
1x 4er DIPSwitch Bank
16er Buchsenleiste (für das LCD)
16er Steckerleiste (für das LCD)
2x 13x2 Buchsenleiste die aufeinander gesteckt werden.

Der Grund für die doppelte Buchsenleiste: Der Abstand der Platine reicht sonst nicht aus und ich habe bisher noch keine "schöne" Lösung gefunden. Sobald ich hier eine bessere Lösung habe kommt ein aktualisiertes Posting. Vorerst erfüllt es aber seinen Zweck. Man könnte natürlich eine Lösung mit Kabeln anstreben, dies wollte ich aber vermeiden. Weiterhin benötigt man auch noch Abstandhalter, diese sind aber optional. Für die Funktionalität werden sie natürlich nicht benötigt.
Die Extender Platine auf dem Raspberry Pi
Als dann am Dienstag endlich die Platinen geliefert wurden machte ich mich daran den ganzen Kram zusammenzulöten und auszuprobieren. Ein erster Test der Hardware war erfolgreich, als nächstes folgt die Software Implementierung. Sobald hier etwas "handfestes" vorliegt werde ich alles auf Github hochladen (inkl. Schaltplan natürlich) und unter der GPL veröffentlichen.

Auf dem Photo sind noch zwei Leitungen fliegend verdrahtet, diese sind aus Testzwecken angelötet. Die Leitungen verbinden die Interrupt Leitungen des GPIO Extenders, können aber unter Unix (zumindest meines Wissens nach) nicht direkt als Interrupts angesprochen werden, sondern nur als GPIO-Pins. Die Idee hinter dem Test war Polling zu vermeiden und das ganze elegant als Interrupt zu lösen.

Ich bin eifrigst dabei auf dem Pi rumzuexperimentieren und simple Button Abfragen, das Display und Kommunikation via I2C steht auch. Viel nimmt einem hier zugegebenermaßen das Rpi-Hw Projekt ab. So long!

Keine Kommentare:

Kommentar veröffentlichen