Der PicoBoy Color in C++/Arduino

Die Arduino IDE für den PicoBoy Color vorbereiten und das erste Programm übertragen.

Um den PicoBoy Color in C++ zu programmieren, brauchst du zuerst die Arduino IDE mit installiertem Core für den Raspberry Pi Pico. Sieh dir dazu den entsprechenden Abschnitt in der Anleitung zum PicoBoy an. Die dort erwähnte u8g2-Bibliothek passt allerdings nicht zum Farbdisplay – dafür brauchst du eine andere Bibliothek.

Eine dieser beiden Bibliotheken brauchst du dafür:

  • Adafruit ST7735 and ST7789 Library (mit den Abhängigkeiten, die die IDE automatisch mitinstalliert)
  • TFT_eSPI

Beide lassen sich in der Arduino IDE über „Sketch → Include Library → Manage Libraries…“ installieren. In der deutschen Oberfläche heißt der Weg „Sketch → Bibliothek einbinden → Bibliotheken verwalten…“. Fragt die IDE nach den Abhängigkeiten, wähle „Alle installieren“.

Nimm die Adafruit-Bibliothek, wenn du keinen besonderen Grund für TFT_eSPI hast. Sie ist deutlich einfacher zu konfigurieren. Willst du TFT_eSPI verwenden, sieh dir die PlatformIO-Beispielprojekte und vor allem deren Konfigurationsdateien an.

Gehe wie folgt vor, um alles auszuprobieren:

  1. Erstelle in der Arduino IDE ein neues Projekt.
  2. Wähle unter „Tools → Board“ (deutsch: „Werkzeuge → Board“) den Raspberry Pi Pico aus.
  3. Kopiere den Quelltext des Beispielprogramms simpleExample.ino hinein.
  4. Verbinde den PicoBoy mit dem PC und versetze ihn in den Bootloadermodus, indem du die Taste „BOOT“ gedrückt hältst, während du kurz die Taste „RES“ drückst.
    Rückseite des PicoBoy Color mit den Tasten BOOT und RES
  5. Klicke auf den Pfeil („Hochladen“) oben in der Werkzeugleiste und gib deinem Programm einen Namen deiner Wahl.
  6. Nach einiger Zeit sollte das Programm laufen. Falls nicht: Melde dich über eine der unten genannten Möglichkeiten.

Achtung: Dein Programm ersetzt, was bisher auf dem PicoBoy Color lief, also auch das vorinstallierte Spielepaket. Du kannst es jederzeit neu aufspielen: Die Datei PicoPacC liegt unter Links & Downloads.

Das Display in C++

Die Programmierung des PicoBoy Color unterscheidet sich kaum von der des PicoBoy. Anders ist vor allem die Ansteuerung des Displays, weil hier ein ST7789-Controller mit 240 × 280 Pixeln sitzt. Dazu kommen einige andere Pin-Nummern, siehe unten.

Wie schon beim PicoBoy ist es sinnvoll, Grafiken zuerst in den Speicher zu zeichnen und sie erst am Ende der Berechnung zum Display zu senden. Beim Zeichnen direkt auf das Display sieht man sonst den Bildaufbau. Im Beispielprogramm simpleExample.ino übernimmt ein GFXcanvas16 diese Aufgabe; er wird mit tft.drawRGBBitmap(…) in einem Zug auf das Display geschrieben.

Die Pins des Displays, des Joysticks, der Taster, der LEDs und des Lautsprechers stehen auf der Hardware-Seite. Im Beispielprogramm sind sie oben als #define eingetragen.

Beispiele vom PicoBoy übernehmen

Das C++-Tutorial zum PicoBoy kannst du auch für den Color nutzen, denn Variablen, Verzweigungen, Schleifen und Funktionen funktionieren genauso. Zwei Dinge musst du dabei anpassen: Die Displaybefehle von U8g2 gelten hier nicht, und die Bauteile hängen teilweise an anderen Pins. Ein Beispiel, das die LED an Pin 7 schaltet, lässt auf dem Color keine LED leuchten. Bei Joystick, LEDs und Lautsprecher stimmen nur die Joystick-Mitte (GPIO 0) und der Lautsprecher (GPIO 15) überein.

Mit diesen Festlegungen stimmen alle Anschlüsse. Das kleine Programm dahinter lässt die grüne LED leuchten, solange du Taster A drückst. Das Display brauchst du dafür noch nicht:

#define LEDR 14        // rote LED
#define LEDY 13        // gelbe LED
#define LEDG 12        // grüne LED
#define SPEAKER 15     // Lautsprecher

#define KEY_CENTER 0   // Joystick: Druck auf die Mitte
#define KEY_RIGHT 1    // Joystick: nach rechts
#define KEY_DOWN 2     // Joystick: nach unten
#define KEY_LEFT 3     // Joystick: nach links
#define KEY_UP 4       // Joystick: nach oben
#define KEY_A 27       // Taster A (links)
#define KEY_B 28       // Taster B (rechts)

void setup() {
  pinMode(LEDG, OUTPUT);
  pinMode(KEY_A, INPUT_PULLUP);       // ohne Pull-up lässt sich der Taster nicht lesen
}

void loop() {
  if (digitalRead(KEY_A) == LOW) {    // gedrückt heißt LOW
    digitalWrite(LEDG, HIGH);
  } else {
    digitalWrite(LEDG, LOW);
  }
  delay(20);
}

Weitere Beispiele – vom Testbild bis zu vollständigen Spielen – liegen im Arduino-Ordner des Repositorys.

Folgende Links können hilfreich sein:

Wenn du Fragen hast oder Unterstützung brauchst, melde dich per Mail an info@picoboy.de oder über Discord.