Eine weiterführende Einführung in die Programmierung mit der Pico C SDK, welche auch über die CMakeLists.txt erklärt.
Mir haben für die Programmierung des Raspberry Pi Picos in C/C++ und nicht in Micropython immer Anleitungen gefehlt, die über das Einfachste hinausgehen, gefehlt. Nun schreibe ich meine Eigene. Ich setze für die Programmierung eines weitergehenden Microcontrollers grundlegende Programmier- und C++-Erfahrung voraus.
Einrichtung der Entwicklungsumbgebung
Zum Programmieren des Raspberry Pi Pico (auch Pi Pico oder Pico genannt) empfehle ich allgemein Visual Studio Code mit der Extension von Raspberry Pi. Dessen Installation ist auch recht leicht. Durch die Installation der Extensions: Raspberry Pi Pico und CMake Tools.
Erstellen des ersten Projektes
Zum Erstellen eines Projektes, muss man in der linken Sidebar auf den Pi Pico klicken und dann auf "New C/C++ Project". Nun öffnet sich ein Menü mit Projekteinstellungen. Hier sollte Folgendes eingestellt werden:
- Der Projektname
- Dein Boardtyp(z.B. Pico, Pico 2 W)
- Der Speicherort des Projektes
- Die Features (lässt sich im Nachhinein noch ändern,
- Ein Ändern hier ändert das Beispiel, mit dem wir gleich starten!)
- Stdio support auf USB, wenn die Serialkonsole verwendet werden soll.
- Dann empfehle ich noch sehr C++, da es viel angenehmer ist und mehr Bibliotheken dafür existieren.
Jetzt muss nur noch auf "Create" gedrückt werden.
Flashen des Beispiels
Jetzt sehen wir das Beispielprogramm für die USB-Konsole. Dies printet sekündlich ein "Hello, world!\n". \n für Neuzeile. Zum ersten Programmieren muss, wenn der Pico an den USB gesteckt wird, der BOOTSEL gedrückt gehalten und danach "RPI-RP2" auf dem Rechner eingehängt werden. Zum Programmieren muss dann jetzt nur noch unten Rechts auf "Run" gedrückt werden. Danach ist das Programm geflashed. Dies können wir dann mit einem Serial Monitor überprüfen. Dies geht mit einer Extension für VSCode, die allerdings sehr viele Bugs hat. Sie heisst Serial Monitor und ist von Microsoft. Dann geht man auf "SERIAL MONITOR" neben dem Terminal, wählt den Pico aus und klickt auf "Start Monitoring" und sieht jede Menge "Hello, world!".
#include
#include "pico/stdlib.h"
int main()
{
stdio_init_all();
while (true) {
printf("Hello, world!\n");
sleep_ms(1000);
}
}
Blink
Das Hello World der Mikrocontrollerwelt. So ist blink auch eines von vielen Beispielen hier (blink_simple geht nur auf dem Pico 1/2, nicht W): blink_simple. Diese erweisen sich immer mal wieder als nützlich. Nun können wir flashen, jetzt beim Zweiten ist BOOTSEL meistens optional und nun, nach dem Flashen, blinkt die LED. Diese Menge an Code für ein einfaches Blink ist beeindruckend. Das liegt daran, dass dieser Code mit Pico 1 und 2 kompatibel ist. Für den 1 ist Folgendes äquivalent.
#include "pico/stdlib.h"
#define LED_BUILTIN 25
int main(){
gpio_init(LED_BUILTIN);
gpio_set_dir(LED_BUILTIN, GPIO_OUT); //pinMode(LED_BUILTIN, OUTPUT);
while (true) {
gpio_put(LED_BUILTIN, 1); //digitalWrite(LED_BUILTIN, HIGH);
sleep_ms(250); //delay(250);
gpio_put(LED_BUILTIN, 0); //digitalWrite(LED_BUILTIN, LOW);
sleep_ms(250); //delay(250);
}
}
CMakeLists.txt
Nun kann man selbst auch seinen eigenen Code programmieren. Da du wahrscheinlich nicht alles in einer Datei haben und vermutlich Interfaces, wie I²C verwenden willst, brauchst du die "CMakeLists.txt" (kurz: CML(nicht offiziel)). Mit der kann man auch Bibliotheken, von anderen einbinden.
Weitere Dateien
Für weitere Dateien kannst du zum Beispiel eine weit.h und weit.cpp in lib anlegen. Danach fügen wir in der CML unter add_executable die beiden hinzu:
add_executable(Gnulinux Gnulinux.cpp
${CMAKE_CURRENT_LIST_DIR}/lib/weit.h
${CMAKE_CURRENT_LIST_DIR}/lib/weit.cpp
)
Jetzt kannst du in deiner "main"-Datei die "lib/weit.h" includen und die Funktionen der weit.cpp verwenden.
Interfaces
Dafür unter target_link_libraries einfach den Namen der Interfacebibliothek hinzufügen, für I²C:
target_link_libraries(Gnulinux
pico_stdlib
hardware_i2c)
Beispiele für andere Interfaces:
hardware_piohardware_clockshardware_adchardware_spihardware_flash
Für die Namen anderer Interfaces kannst du in der weiterführenden Doku nachschauen.
Fremde Bibliotheken
Die meisten einfachen C++-Bibliotheken und alle für den Pico gemachten sind kompatible Bibliotheken. Diese lassen sich auch noch mal in die Kategorie mit eigener CML und ohne einteilen.
Mit eigener CML(z.B tinyexpr)
Die Verwendung von dieser Art ist sehr einfach. Man kopiert, dessen Ordner mit der CML in den lib Ordner vom Projekt und fügt danach ein "add_subdirectory" direkt unter dem "pico_sdk_init()" hinzu:
pico_sdk_init() #Schon in der CML vorhanden
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/lib/tinyexpr)
Ohne eigene CML
Das Importieren von diesen ist komplizierter, aber möglich mit nicht zu viel Aufwand, wenn die .h und .cpp in einem Ordner oder nach Typ getrennt in zwei Ordnern sind, sonst muss man es, wie im Kapitel "weitere Dateien" erklärt machen. Wenn der leichtere Fall zutrifft, geht das Importieren so "leicht": Zuerst den Root-Ordner der Bibliothek in den lib-Ordner kopieren und dann so in der CML hinzufügen.
file( GLOB BIBNAME_SOURCES /lib/bibname/cpp_dateien_ordner )
file( GLOB BIBNAME_HEADERS /lib/bibname/h_dateien_order )
add_executable(Gnulinux Gnulinux.cpp
${BIBNAME_SOURCES} ${BIBNAME_HEADERS}
)
Debugging
Das Debugging geht entweder per Serial mit printf("Hallo %d\n", 16), wenn man vorher stdio_init_all(); ausgeführt hat, oder mit einem wahren Debugger über VSCode, wie hier beschrieben: RPI Debug Probe Für das printf-Debuggen ist die Tabelle hier hilfreich: kleine Tabelle
Weiterführendes
Die wichtigste weiterführende Information ist die Pico SDK-Dokumentation: Pico C SDK. Anderes wäre hier zu projektspezifisch, um es anzugeben.
Quellen:
- Titelbild - Eigenkreation
- Bild 1 - Screenshot von VSCode
- Bild 2 - Screenshot von VSCode
- Bild 3 - Screenshot von VSCode
- https://github.com/raspberrypi/pico-examples
- https://github.com/codeplea/tinyexpr
- https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html
- https://de.wikipedia.org/wiki/Printf
- https://www.raspberrypi.com/documentation/pico-sdk/


