Nachdem wir Pokémon Picross endlich übersetzt haben, wird es Zeit für ein neues Projekt. So ganz wollen wir die Welt rund um das Puzzlespiel aber noch nicht verlassen, denn bei der Recherche zu dem Spiel – insbesondere der Möglichkeit, es im Zusammenspiel mit einem Game Boy Printer zu verwenden – bin ich über ein interessantes Projekt gestoßen. Angeblich lässt sich mit einem Arduino recht einfach ein Emulator für den „Game Boy Printer“ basteln.

Im Endeffekt macht das Ding nichts anderes, als dem Game Boy einen angeschlossenen Game Boy Printer vorzugaukeln und die von der Handheld-Konsole gesendeten Daten über USB entgegenzunehmen. Boah, wie cool! Damit könnten wir vermutlich die Bilder der 151 Taschenmonster aus Pokémon Picross (wir erinnern uns an meinen perfekten Spielstand :P) exportieren und auf einen PC oder ein Smartphone übertragen. Hatten wir das nicht sowieso vor? Ich erinnere mich dunkel, dass ich das sogar in Artikel 333 angeteasert hatte! 😀

Na, wenn das mal nicht nach einer Bastel-Challenge schreit! Die Frage nach dem „Warum“ stellt sich allerdings schon ein bisschen. Einerseits könnten wir die Bilder aus dem Spiel sicherlich auch irgendwie anders exportieren (schließlich haben wir ja sogar Grafiken und Assembler-Code zur Verfügung) und andererseits haben wir in den Artikeln 209 und 262 ja bereits einige Möglichkeiten gefunden, wie man Bilder zumindest mal von einer Game Boy Camera (ab Artikel 208) auf den PC übertragen kann. Warum also das Ganze? Eigentlich ist ein weiteres Gerät doch völlig unnötig, oder?
Fun Fact: In Artikel 209 hatte ich sogar schon mal das Game Boy Printer Emulator Projekt erwähnt. War das vielleicht schon ein gutes Omen für den heutigen Beitrag? 😉

Dennoch habe ich mich für den Bau eines „Game Boy Printer Emulators“ entschieden, da dieser angeblich mit allen Spielen, welche den Game Boy Printer unterstützen, kompatibel ist und wir das Ding so nicht nur für die Übertragung von Bildern der Game Boy Camera oder Pokémon Picross, sondern eben z.B. auch für den Transfer von Bildern aus dem Pokédex einer Pokémon-Edition der ersten und zweiten Generation verwenden können. Quasi ein Universalwerkzeug! 🙂

Klingt gut, was brauchen wir dafür? Im Endeffekt benötigen wir lediglich einen Arduino Nano Mikrocontroller (oder einen Klon davon) sowie ein Game Boy (Color) Link Kabel. Beide Teile kann man für jeweils ca. 5€ problemlos z.B. auf eBay erwerben.
Fun Fact: Natürlich habe ich mich für den Kauf eines günstigen Aftermarket-Kabels entschieden, da ich keine originalen Linkkabel aus den Neunzigern zerstören möchte.

Der Aufbau der Hardware ist denkbar einfach. Im Endeffekt müssen wir lediglich ein paar Leitungen des Game Boy Link Kabels an die digitalen I/O-Pins des Mikrocontrollers löten. Dafür müssen wir das Kabel erst mal abisolieren…

…und mit einem Multimeter herausfinden,…

…welche der Adern wir für die Datenübertragung (siehe Pinout hier) vom Game Boy hin zum Arduino benötigen. Da jedes Kabel andersfarbige Adern besitzt, macht es Sinn, sich einen entsprechenden Plan mit der Pinbelegung zu erstellen:

Die vier Leitungen sind dann recht schnell am Arduino verlötet:

Damit ist der Game Boy Printer Emulator schon fertig und wir können ihn mit Hilfe eines Mini-USB-Kabels…

…an einen PC anschließen. Bevor wir das Ding jedoch verwenden können, müssen wir erst mal die Firmware (Steuerprogramm für den Arduino) auf den Mikrocontroller flashen.
Fun Fact: Das Mini-USB-Kabel musste nicht gekauft werden, das hatte ich noch herumliegen! 🙂

Dafür benötigen wir die Arduino IDE, bei deren Installation einige USB-Treiber (z.B. Serial CH340) zur Erkennung der Arduino-Boards installiert werden:
Fun Fact: Tatsächlich ist der USB-SERIAL CH340-Treiber scheinbar mittlerweile in den neueren Windows-Versionen bereits integriert. Falls nicht, kann man ihn sich hier herunterladen.

Die von Github heruntergeladene Firmware kann dann als Sketch (GameBoyPrinterEmulator.ino) geöffnet und – per Tastenkombination „STRG + U“ – auf den Arduino geladen werden:
Fun Fact: Die richtig langweiligen Schritte wie z.B. das Auswählen des korrekten, seriellen COM-Ports („Tools“ => „Port“ => „COM4“) oder das Einstellen der Boardversion („Tools“ => „Board“ => „Arduino AVR Boards“ => „Arduino Nano“) überspringen wir jetzt einfach mal! 😉

Um zu überprüfen, ob der Arduino korrekt funktioniert, können wir per Tastaturkürzel „STRG + UMSCHALT + M“ den seriellen Monitor öffnen. Nanu? So richtig gut sieht die Ausgabe aber nicht aus:

Ah! Das liegt daran, dass wir vergessen haben, die Baudrate auf 115200 einzustellen. Puh, das muss man wissen! 😀

Jetzt sollte eigentlich bereits eine Kommunikation zwischen Game Boy und dem PC möglich sein. Um das zu testen, stecken wir den Game Boy Printer Emulator an einem Game Boy Color an…

…und versuchen mal, das Bild von Pikachu…

…zu drucken.

Tatsächlich scheinen Daten in Form von Hexadezimalwerten am PC anzukommen:

Doch wie wird daraus ein Bild? Dafür benötigen wir eine spezielle Webanwendung, welche die Daten dekodieren…

…und daraus ein Bild generieren kann. Die importierten Bilder werden dann im Cache des Browsers gespeichert, können aber auch ganz einfach heruntergeladen werden.

Besonders cool finde ich, dass sich in der App Farbpaletten für die Bilder auswählen lassen. So können wir nachträglich das Bild so darstellen, wie es z.B. auf einem originalen Game Boy Display oder dem Bildschirm eines Game Boy Pocket aussieht. Ebenso gibt es ein paar bunte Paletten, mit denen sich – dem eigentlich schwarz-weißem Ausdruck – etwas Farbe verleihen lässt.

Das funktioniert an und für sich sehr gut und zuverlässig, allerdings finde ich es schon etwas umständlich, für jeden Übertragungsvorgang die Arduino IDE sowie eine Onlineanwendung nutzen und dann auch noch händisch irgendwelche Daten zwischen beiden kopieren zu müssen. Das muss doch auch irgendwie einfacher gehen, oder?

Was die serielle Übertragung angeht, kann man theoretisch mit jeder beliebigen Anwendung, welche die COM-Port-Kommunikation unterstützt, die Daten empfangen. Wichtig ist dabei nur, die entsprechenden Sitzungsparameter (z.B. Baudrate, Parität, Stoppbits, etc.) korrekt zu setzen. Tut man das, lassen sich Programme wie z.B. der beliebte Telnet- und SSH-Client „PuTTY“ oder sogar einfache Befehl wie „type“ oder „copy“ in der Eingabeaufforderung für die Übertragung verwenden:

So sparen wir uns zumindest schon mal die Arduino IDE (samt seriellen Monitor). Das ändert aber nichts an der Tatsache, dass man händisch noch Daten in die Onlineanwendung kopieren muss. Gut, dass es für die Umwandlung der Binärdaten in ein Bild auch einige Alternativen zur Webanwendung gibt. So stehen uns beispielsweise Konvertierungsprogramme in Python, Javascript oder C++ zur Verfügung. Gerade letztere Version, der sog. „GameBoyPrinterDecoderC“ ist interessant, weil wir daraus eine EXE-Datei kompilieren können, welche sich von der Kommandozeile aufrufen lässt.
Not so fun Fact: Der Weg dahin war ein weiter, da ich das Programm unter Linux mit entsprechenden Kunstgriffen für Windows kompilieren und linken musste. Alleine über die Erstellung der EXE-Datei mit sämtlichen Herausforderungen wie z.B. der Anpassung des MAKE-Files, den Verzicht auf die Nutzung des AdressSanitizers, da dieser im Windows-Port vom Compiler GCC/G++ nicht verfügbar ist, sowie der Behebung diverser Linker-Fehler könnte man ganze Bücher füllen. Das wäre aber ziemlich am heutigen Thema vorbei, darum seht es mir bitte nach, wenn ich da jetzt nicht weiter drauf eingehe! 🙂

Bleibt noch ein letztes Problem zu klären: Der Arduino schickt immer einen endlosen Datenstrom, welchen man händisch, durch das Drücken von STRG + C abbrechen muss. Das ist unschön, denn so lässt sich der Vorgang nicht ohne manuelles Eingreifen vollständig automatisieren. Doch auch hierfür gibt es eine pfiffige Lösung: Wir können den Arduino-Sketch so anpassen, dass als letztes Zeichen der Übertragung ein Byte mit dem Inhalt „0x1A“ als Steuerzeichen gesendet wird,…

…welches dann vom Copy-Befehl („copy com4 bild.txt“) als „STRG + Z“ (End of File) interpretiert wird und den Kopier- bzw. Lesevorgang von der seriellen Schnittstelle abbricht. Abgefahren! 😀

Dadurch können wir den gesamten Prozess in einem Skript automatisieren:
Not so fun Fact: Leider musste ich für das Setzen der seriellen Übertragungsparameter auf die Initialisierungsroutinen von PuTTY zurückgreifen, da der von Windows bereitgestellte Befehl „MODE“ scheinbar nicht alle, für die Arduino-Kommunikation benötigten, Parameter beim COM-Port setzt und dadurch die Übertragung in unregelmäßigen Abständen abbricht oder nicht anhält. Pfusch!

Ich gebe es zu – das Ergebnis ist etwas verrückt und alles andere als schön, aber es funktioniert.
Fun Fact: Es wäre vermutlich sinnvoller gewesen, ein C-Programm zu schreiben, welches das Auslesen der seriellen Daten sowie die Konvertierung in einem Aufwasch übernimmt, aber darauf hatte ich einfach keine Lust. Ich will mir gar nicht vorstellen, wie viel Zeit es kosten würde, ein Programm zur Ansteuerung einer seriellen Schnittstelle zu schreiben. Lebenszeit, Adieu! Nein, danke! 😀

Ist es nicht schön, wenn mal was funktioniert? 😀 Jetzt sollten wir uns abschließend noch um die Optik des Game Boy Printer Emulators kümmern. Ich bin kein Fan davon, dass lose Platinen durch die Gegend fliegen, also habe ich aus einer alten Kabel-Verbindungsdose, die zufälligerweise ähnliche Maße wie der Arduino hat, ein Gehäuse für den Mikrocontroller gebastelt. Sicher hätte man auch mit dem 3D-Drucker was – vermutlich sogar deutlich schöneres – drucken können, aber so hat wieder ein Teil, welches ansonsten im Müll gelandet wäre, eine neue Daseinsberechtigung bekommen! 🙂

Mit passendem Aufkleber versehen, sollte auch der „Zukunfts-retrololo“ noch kapieren, um was es sich bei der mysteriösen, schwarzen Box handelt! 😉

Und damit wäre auch schon alles über das Ding gesagt. Auch wenn das kleine „Mini-Projekt für zwischendurch“ mal wieder krass ausgeufert ist (das ist bei solchen Projekten gefühlt ja immer so), bin ich trotzdem mit dem Game Boy Printer Emulator sehr zufrieden. Es ist wirklich beeindruckend, wie gut die Übertragung funktioniert und im Endeffekt hat das Ding nicht mal zehn Euro an Material gekostet. Daumen hoch!
In diesem Sinne – bis die Tage, ciao!