Schlagwort-Archive: Retropie

Guter Ton mit Raspberry PI

Nach schon einigen Projekten und Versuchen mit dem Raspberry PI, bin ich immer wieder einmal auf die Problematik mit der schlechten, verrauschten Tonqualität des Raspi-Audioausgangs gestoßen. Der analoge Ton besteht ja nur aus einem einfachen PWM (PulseWidthModulation) Signal, das über ein paar Filtercaps direkt an die Klinkenbuchse des Raspberry geschaltet ist. Für viele Anwendungen reicht das sicherlich, wenn man nur eben einmal ein paar Töne ausgeben will. Soll´s aber Musik sein, oder wie in meinem Fall ein vernünftiger Ton bei der Retro-Gamestation, die mit „retropie und der EmulationStation“ läuft, so reicht die Qualität einfach nicht aus.

DSC_2748Hier sollte man dem Raspberry PI einen richtigen Soundchip, also Soundkarte verpassen. Im Internet wird man schnell fündig und so habe ich mir bei einem Onlineshop  um gerade einmal 2,90 Euro eine USB – Soundkarte bestellt. Die Karte, oder besser, der USB Dongle besitzt zwei 3,5mm Klinkenbuchsen. (einen Audio-Ausgang und einen Mikrofon-Eingang)

 

Die Installation ist schnell durchgeführt. Will man ein bestehendes System umrüsten, so ist einfach der Klinkenstecker der Lautsprecherzuleitung vom Raspberry abzuziehen und in den Audioausgang des Raspberry einzustöpseln. Der USB Stecker kommt in einen freien Port des Raspberry.

DSC_2751

Der Hardwareteil ist somit erledigt und es kann mit dem Anpassen der Software begonnen werden. Nach dem Booten der Retropi-Maschine und dem Einloggen in die Konsole kann man überprüfen, welche Geräte am USB-Bus erkannt wurden. Nach der Eingabe von:

pi@retropie:~ $ lsusb

werden alle am USB-Bus angeschlossenen Geräte gelistet:

Bus 001 Device 007: ID 1516:1603 CompUSA Flash Drive
Bus 001 Device 006: ID 03f0:034a Hewlett-Packard
Bus 001 Device 005: ID 16c0:05e1 Van Ooijen Technische Informatica Free shared USB VID/PID pair for CDC devices
Bus 001 Device 004: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

In diesem Fall ist der C-Media Electronics, Inc. CM108 Audio Controller unsere USB – Soundkarte. Als nächsten Schritt überprüft man die Reihenfolge (Priorität) der geladenen Soundmodule.

pi@retropie:~ $ cat /proc/asound/modules

Als Ergebnis kommt:

0 snd_bcm2835
1 snd_usb_audio

Das bedeutet die Soundausgabe des BCM2835 ist als erstes gelistet. Wir wollen jedoch alle Tonausgaben über den USB-Ausgang hören. Dazu muß die Datei „alsa-base.conf“ wie folgt angelegt werden. (auf einigen Systemen ist sie bereits vorhanden – hier sind dann nur die Prioritäten anzupassen)

pi@retropie:~ $ sudo nano /etc/modprobe.d/alsa-base.conf

Falls jetzt ein leeres Script öffnet, hat die .conf-Datei noch nicht existiert und man muß die folgenden Zeilen eingeben:

options snd_usb_audio index=0
options snd_bcm2835 index=1
options snd slots=snd-usb-audio,snd-bcm2835

Mit „control+O“ wird gespeichert und mit „control+X“ kann der Editor beendet werden. Jetzt ist das System zu rebooten. Nach dem Neustart kann in der Konsole nochmals mit:

pi@retropie:~ $ cat /proc/asound/modules

die Reihenfolge der Module überprüft werden. Die sollte jetzt so aussehen:

0 snd_usb_audio
1 snd_bcm2835

Jetzt sollten in der Emulationstation wieder Töne zu hören sein. Diesmal aber ohne Rauschen und kristallklar 😀

 

RetroPie und IngmarsRetro

Ein schon lange in meinem Kopf herumirrender Gedanke war, einmal einen Videospielautomaten zu bauen. Diese Teile haben mich als Kind magisch angezogen, wenn es mit den Eltern in den Sommerurlaub an die Adria ging. Dort gab es und gibt es auch heute noch die Spielhallen. Die Faszination hat aber seit Erscheinen der Heimkonsolen und der Möglichkeit, vor dem heimischen TV-Gerät zu zocken, stark nachgelassen, und die Automaten wurden rar. Auch die einfache Pixelwelt, der 8Bit und 16Bit Spiele ist schon lange verschwunden. Dabei, so finde ich zumindest, haben die alten, einfachen 8Bit Pixelspiele mehr Reiz, als die modernen High-End-Games mit fotorealistischer 3D-Rendergrafik. Vielleicht ist auch aus dem Grund der „Retroboom“ der letzten Zeit entstanden. Nun ja – mein erster Kontakt zu den Videospielautomaten war eben als Kind im Urlaub und dann erstmals am heimischen TV, Ende der siebziger Jahre an einer geliehenen Atari 2600 Konsole. In den letzten Jahren, auch Dank des Internets, habe ich immer wieder mal die Zeit gefunden in Foren und auf Websites zu schmökern und so die Faszination aufrecht zu erhalten. Auch die Vielzahl an Emulatoren (Mame, Vice, etc.) die ganz leicht und schnell auf jedem PC eingerichtet werden können, lässt schnell die alten Gefühle wieder aufkommen.

Nun ja, dieses Jahr habe ich mich überwunden und das Projekt endlich begonnen. Dank Internet und elektronischer Bucht ist es jetzt auch einfach, die benötigten Materialen zu bekommen. Die Basis des Videospielautomaten „Arcade – Station“ soll ein Raspberry Pie sein. Den kleinen Einplatinenrechner gibt es mittlerweile schon in der 3. Generation und der hat auch mächtig Leistung um die alten Homecomputer und Spielekonsolen wie Commodore C64, Amiga, Atari, Nintendo 64 etc. in der Emulation zum Laufen zu bekommen. Als Softwarebasis nutze ich das Projekt retropie , das mittlerweile als DAS Projekt für die Umsetzung von Retrospielekonsolen und -computern bezeichnet wird. RetroPie wird als Image für alle Raspberry Pi Modelle angeboten und ständig weiterentwickelt. Es ist einfach einzurichten und man hat schnell wieder das „feeling“ der guten alten 8 Bit Zeit 🙂

Folgende Dinge benötige ich für den Bau der Retro-Arcade Maschine:

  • Rasperry Pi als Zentrale Recheneinheit
  • Ein Interface, das die Microschalter der Joysticks und Tasten in ein USB-HID umsetzt (hier kommt mein Arduino HID Projekt zum Einsatz) es gibt aber auch etliche Controller (XinMo und GPIO Controller etc.)
  • Tasten und Joysticks für die Bedienkonsole
  • Ein Gehäuse passend im Stil einer Arcademaschine . (Hier habe ich in der Bucht einen Lieferanten gefunden, der MDF-Platten beschichtet und gefräst liefert)
  • Eine Bemalung des Gehäuses (in meinem Fall schwarzer Mattlack und ein auf Klebefolie gedrucktes Design – liefert auch die Firma, die die MDF Platten bearbeitet)
  • Montageteile, Schrauben, Kabel, Netzteile, USB-Kabel…
  • Einen alten LCD Monitor mit DVI-Eingang
  • Adapterkabel für den Anschluss des Monitors an den Raspberry
  • Lautsprecher und einen Audioverstärker
  • Eine Hintergrundbeleuchtung für den Ledkasten
  • Zeit und Geduld, Werkzeug und ein bisschen Geschick

Die folgenden Bilder sollen den Auf- und Zusammenbau der Arcadestation ein wenig dokumentieren:

DSC_2276

Die Gehäuseteile sind geliefert und werden erstmal auf Passgenauigkeit und Vollständigkeit überprüft.

DSC_2266Alles passt zusammen.

DSC_2271

Das sind die Dekor-Klebefolien

DSC_2274

Die Joysticks …

DSC_2273

… und die Tasten

DSC_2288

Im Garten werden die Teile zum Lackieren vorbereitet. Ja, jetzt vor Beginn der Blütezeit klappt das mit dem Outdoorlackieren noch ganz gut.

DSC_2289

Schon bald sind die Teile mit einer matten, schwarzen Lackschicht überzogen.

DSC_2290

Mit Klarlack wird dann nochmals übergesprüht.

DSC_2278

Jetzt ist der Cutter dran, die Dekorfolien müssen zugeschnitten werden.

DSC_2281

auch alle Löcher für Tasten und Joysticks

DSC_2284

und natürlich sollen auch die Kanten schön aussehen

DSC_2296

nach dem Bekleben mit den Folien wird wieder probiert. Passt perfekt…

 DSC_2298

Nachdem jetzt alle Teile vorbereitet sind, kann der Zusammenbau beginnen

DSC_2300

Tasten einbauen und Microschalter/-taster bestücken

DSC_2306

Joystickmodul einbauen und verschrauben

DSC_2304

Ansicht von oben (sieht ja schon mal nicht schlecht aus)

DSC_2305

Jetzt kann mit der Verkabelung begonnen werden. Es empfiehlt sich, alle Drähte zu beschriften 😉

DSC_2307

Nach dem Verkabeln der Tasten wird wieder provisorisch zusammengesteckt und ein erster rein informeller Funktionstest gemacht.

DSC_2321

und schon kann mit der Monitorhalterung begonnen werden. Ich habe einen 19″ Monitor mit vier M4 x 20 Schrauben am Brett befestigt. Zwischen Brett und Rückseite des Monitors sind noch 4mm Abstandhalter unterlegt, um die Löcher im Blechkasten des Bildschirmes nicht durch das Bett abzudecken.

DSC_2323

So ist der Bildschirm mit dem Brett verschraubt.

DSC_2325

Die Monitorhalterung samt Monitor wird jetzt in Position gebracht, die weiteren Montagelöcher gebohrt und dann mit einer Seitenwange verschraubt. Auch das bestückte Bedienpanel sowie das Lautsprecherpanel und die restlichen Gehäuseteile werden mit der Seitenwange verleimt.

DSC_2327

Das soll dann so aussehen. Passt alles, dann kann die andere Seitenwange vorbereitet werden. Ist alles gebohrt, wird wieder geleimt und das Gehäuse bekommt seine zweite Seite.

DSC_2328

Das Seitenteil liegt perfekt in der Nut. Mit Winkeln wird jetzt alles zusätzlich noch verschraubt.

DSC_2330

Jetzt kann der Kasten erst einmal ruhen und der Leim aushärten.

DSC_2310

In der Zwischenzeit kann ich eine Montageplatte anfertigen, die den Raspberry und den Controller für die Joysticks tragen soll. Die Platte besteht aus einer 2mm dicken Aluminiumplatte an der ich 20mm lange Sechskant-Abstandhalter schraube. Festgemacht werden die mit M3x10 Senkkopfschrauben.

DSC_2311

So sieht die fertige Trägerplatte aus

DSC_2315

Sie wird jetzt am Boden des Arcade-Gehäuses angeschraubt

DSC_2318

Und hier sind die Platinen auch schon befestigt

DSC_2314Im nächsten Schritt wird die Bildschirmfrontverkleidung, eine 2mm Plexiglasplatte vorbereitet.

DSC_2313

Die Ränder der Plexiplatte werde ich von der Rückseite schwarz lackieren. Praktischerweise kann ich die Schutzfolie auch gleich zum Maskieren für die Lackierung verwenden. Mit dem Cutter wird die nicht benötigte Schutzfolie ausgeschnitten und entfernt. Jetzt kann lackiert werden.

DSC_2324Nach dem Lackieren und Entfernen der Schutzfolie habe ich die Ränder mit 9x3mm Unterlegeband (Dichtband) beklebt, das dann auf dem Monitor aufliegen soll und gleichzeitig vor Kratzern in der Plexiplatte und Staub zwischen den Scheiben schützen soll.

DSC_2321Für die seitliche Auflage der Plexischeibe habe ich links und rechts je eine Alukante ans Gehäuse geschraubt.

DSC_2322auch auf die Aluleisten kommt das Dichtband. Jetzt kann die Plexiplatte eingesetzt werden.

_20160326_173240Auch innen ist es jetzt ein wenig mehr aufgeräumter. Alle Buttons sind am Controller angeschlossen. Die Innereien eines PC-Speakersets dienen als Audioversorgungseinheit. Ein Led-Streifen soll den „Lichtkasten“ später beleuchten.

Wie der ganze „Automat“ dann im fertigen Zustand aussieht ist im folgenden Video zu sehen:

Arduino als USB-Joystick

IMAG1861
Arduino als USB-Joystickinterface
Die große Welt der kleinen Microcontroller und vor allem der sehr günstigen Microcontroller und deren Vielfältigkeit, hat mich beim folgenden 'Projektchen' wieder motiviert sie zu verwenden. Für die eher weniger outdoorlastigen kalten Wintertage habe ich mir ein Projekt vorgenommen, dass das Thema Retrocomputer betrifft. Zum einen habe geplant, die Website um die Rubrik der alten Computer zu erweitern (zumindest sollen die paar wenigen aus meiner Sammlung vorgestellt und in Betrieb genommen werden...) und zum anderen will ich mir eine Arcade-Station bauen, deren Kern das neue RaspBerry2 Modell ist . Auf dem soll die Emulatorplattform Retropie aus dem gleichnamigen Projekt zu Einsatz kommen. Die ersten Versuche mit den Images aus dem Projekt sehen sehr gut aus. Die alten 8-Bit und 16-Bit Computer laufen in der Emulation ausgezeichnet (C64, Atari, Amiga usw...). Was die Anbindung von Eingabegeräten betrifft, kann man natürlich Maus und Keyboard vom PC an den Raspberry anschliessen und alles steuern. Die Jungs aus dem Projekt haben auch selbst einige Boards entwickelt, die die Anbindung von Joysticks und co an des Raspberry ermöglichen. (zB. den GPIO Adapter). Aber da ich ein paar Arduino Unos herumliegen habe, dachte ich mir, warum nicht diese verwenden. Da es beim Arduino möglich ist, den Mega 16U2 zu flashen (der Chip wird als Programmer für den Atmega 328 auf dem Uno - Board verwendet) und aus dem Uno-Board so zum Beispiel ein USB-HID (Human Interface Device) zu machen -sprich Keyboard, Mouse, was auch immer, bot sich der als ideale Plattform an.

Tutorials, den Arduino zu einem HID-Interface zu flashen, gibt es mittlerweile schon sehr viele. Zum Beispiel findet man hier eine schöne Anleitung. Je nach dem welche Arduino-Uno Boardversion man hat, kann man sich den zusätzlichen Widerstand fürs DFU-Flashen sparen. (z.Bsp. bei meinen Boardversionen R3 ist der Widerstand nicht nötig.) Auf den neuen Boards ist auch nicht mehr der Atmega 8U2 verbaut, sondern der 16U2. Man muß einfach im Atmega Flash-Tool "ATMEL-FLIP" den entsprechenden Chip auswählen. Die entsprechenden Firmwarefiles findet man im Netz...

Arduino-keyboard-0.3.hex
Arduino-mouse-0.1.hex

Ist der Arduino dann geflasht, so wird er beim Anschluss an den PC eben als Keyboard oder Maus erkannt. Jetzt braucht man nur mehr den gewünschten Code in den Atmega328 zu schreiben und die Arduino UNO Eingänge führen z.Bsp. Tastaturbefehle aus. Um die Firmware jetzt nicht jedes Mal zwischen Programmer und USB-HID zu ändern, verwende ich einfach einen zweiten UNO der als Programmer dient und stecke einfach den geflashten Chip immer um (ist viel einfacher beim Testen).

Da das Interface jetzt soweit passt, habe ich mich mit dem HID-Codetable beschäftigt und die entsprechenden Tasten, die die Joystickbewegungen an den PC senden sollen herausgesucht.

Hier der sehr einfache Code der momentan die alten Commodore Joystickbewegungen umsetzt:)
/* HID Joystickinterface für Arduino UNO im HID Modus
 Jun2015 by I.Bihlo
 Die Tasten brauch i  Taste/Hexcode/Dec-Code  
  KEY_LEFT_CTRL    0x01  //01 
  KEY_LEFT_SHIFT    0x02  //02 
  KEY_LEFT_ALT    0x04  //04 
  KEY_LEFT_GUI    0x08  //08 
  KEY_RIGHT_CTRL    0x10  //16 
  KEY_RIGHT_SHIFT 0x20  //32 
  KEY_RIGHT_ALT   0x40  //64 
  KEY_RIGHT_GUI   0x80  //128 

  KEY_RIGHT_ARROW 0x4F  //79 
  KEY_LEFT_ARROW  0x50  //80 
  KEY_DOWN_ARROW  0x51  //81 
  KEY_UP_ARROW    0x52  //82 
  KEY_TAB         0x2B  //43 
  KEY_ENTER       0x28  //40 
  KEY_SPC         0x2C  //44 
 */ 
     uint8_t keyNone[8] = { 0, 0, 0, 0, 0, 0, 0 }; 
     uint8_t keyA[8] = { 0, 0, 4, 0, 0, 0, 0 };  //left 
     uint8_t keyD[8] = { 0, 0, 7, 0, 0, 0, 0 }; //right 
     uint8_t keyW[8] = { 0, 0, 26, 0, 0, 0, 0 }; //up 
     uint8_t keyS[8] = { 0, 0, 22, 0, 0, 0, 0 }; //down 
     uint8_t keySPACE[8] = { 0, 0, 44, 0, 0, 0, 0 }; //space 
      
     uint8_t keyLEFT[8] = { 0, 0, 80, 0, 0, 0, 0 };  //left 
     uint8_t keyRIGHT[8] = { 0, 0, 79, 0, 0, 0, 0 }; //right 
     uint8_t keyUP[8] = { 0, 0, 82, 0, 0, 0, 0 }; //up 
     uint8_t keyDOWN[8] = { 0, 0, 81, 0, 0, 0, 0 }; //down 
     uint8_t keyENTER[8] = { 0, 0, 40, 0, 0, 0, 0 }; //enter 
      
 // DEFINE inputs 
 const int UPA = 12; 
 const int DOWNA = 13; 
 const int LEFTA = 2; 
 const int RIGHTA = 3; 

 const int UPB = 4; 
 const int DOWNB = 5; 
 const int LEFTB = 6; 
 const int RIGHTB = 7; 

 int out=0; //fürs Testen am Serial Monitor im Programmermodus 

 void setup() { 
    
   // Die Pins als Eingang definieren (Intern PullUP setzen - ist bei mir nötig da actice Low geschaltet wird 
   pinMode(UPA, INPUT_PULLUP); pinMode(DOWNA, INPUT_PULLUP); pinMode(LEFTA, INPUT_PULLUP); pinMode(RIGHTA, INPUT_PULLUP);  
   pinMode(A0, INPUT); 
   pinMode(UPB, INPUT_PULLUP); pinMode(DOWNB, INPUT_PULLUP); pinMode(LEFTB, INPUT_PULLUP); pinMode(RIGHTB, INPUT_PULLUP);  
   pinMode(A1, INPUT);    
    
   Serial.begin(9600); 
    
 } 

  void loop() { 
     
    // Joystickbewegungen abfragen und senden 
    // Da das Interface einen Invert-Schmitt Trigger verpasst bekommen hat, werden die Ausgänge auf active LOW abgefragt - wenn nix passiert sind alles Eingänge HIGH 
     
    if (digitalRead(UPA)==LOW) {out=120; Serial.write(keyW, 8);}   
      
    if (digitalRead(DOWNA)==LOW) {out=121; Serial.write(keyS, 8);}   
      
    if (digitalRead(LEFTA)==LOW) {out=122; Serial.write(keyA, 8);}  
      
    if (digitalRead(RIGHTA)==LOW) {out=123; Serial.write(keyD, 8);}  
     
    if (digitalRead(A0)==LOW) {out=124; Serial.write(keySPACE, 8);}  
      
     
    if (digitalRead(UPB)==LOW) {out=130; Serial.write(keyUP, 8);}  
      
    if (digitalRead(DOWNB)==LOW) {out=131; Serial.write(keyDOWN, 8);}  
       
    if (digitalRead(LEFTB)==LOW) {out=132; Serial.write(keyLEFT, 8);}  
       
    if (digitalRead(RIGHTB)==LOW) {out=133; Serial.write(keyRIGHT, 8);}  
       
    if (digitalRead(A1)==LOW) {out=134; Serial.write(keyENTER, 8);}  
      
  delay(20);   
  //Serial.println(out); //des is nur fürs debuggen im serial monitor 
  Serial.write(keyNone, 8); // den Tastendruck beenden 

 delay(20); 
}
IMAG1858
Lochrasterplatine am Arduino

Als nächstes habe ich ein Interfaceboard (eine einfache Lochrasterplatine) mit zwei 9-poligen SUB-D-Buchsen für den Anschluss der Joysticks gebastelt. Da der Arduino genügend Ports besitzt, habe ich auf ein Multiplexen oder Matrixverschalten der insgesamt zehn Steuerleitungen verzichtet und jeden Joystickkontakt direkt auf einen Port gelegt. Das funktioniert schon einmal ganz gut. Aber das Prellen der Federkontakte und Microtaster in den Joysticks muss natürlich softwaremäßig entfernt werden. Um jetzt nicht in jeder Softwareversion einen debounce-code mitzuführen entschloss ich mich das Entprellen in der Hardware zu machen. Einfach ein RC-Glied (10k - 1uF) an einen Schmitt-Trigger und gut ist´s. Also schnell ein Board gelayoutet (das geht schneller als am Lochrasterprint zu löten), geätzt und bestückt... und heraus kam das Board hier:

IMAG1870
Board geätzt und gebohrt
IMAG1871
fertig bestückt am Arduino

Der Funktionstest verlief positiv. Die Bewegungen des Sticks werden sauber umgesetzt. Ein schneller Test mit WinVice ließ sofort das Zockergefühl von vor 30 Jahren aufkommen 😉