Einführung in die Programmierung von Raspberry Pi Pico Mikrocontrollern mit C++

Einführung in die Programmierung von ESP32 Mikrocontrollern mit C++

Einführung in die Programmierung von STM32 Mikrocontrollern mit C++

Beispiele im Wokwi-Simulator

Der Wokwi Simulator ist ein online-Simulator, mit dem man Mikrocontroller-Projekte (für Arduino, ESP32 und Raspberry Pi Pico) in einem Internetbrowser entwickeln und testen kann – ohne physische Hardware. Er ermöglicht das visuelle Verdrahten von Schaltkreisen, das Schreiben von Code (z. B. in C++ oder MicroPython) und das sofortige Ausführen und Debuggen im Browser. Ideal für Unterricht, Prototyping und schnelle Tests.

Vorwort

Dieses Buch ist eine Einführung in die Programmierung von Raspberry Pi Pico Mikro¬controllern mit C++. Es zeigt die Grundlagen an vielen Beispielen, die als lauffähige Programme im wokwi-Simulator
https://wokwi.com/projects/435902274723329025
ohne Hardware, Löten und Kurzschlüsse verfügbar sind. Weitere Informationen finden Sie auf meiner Internetseite
https://www.rkaiser.de/embedded-cpp-books

Mikrocontroller steuern viele Geräte, wie z.B. Waschmaschinen, Roboter, Drohnen, Autos, industrielle Produktionsanlagen, Flugzeuge, Weltraumsonden, medizinische Geräte (Intensivstationen sind voll davon), Waffensysteme usw. Solche Programme unterscheiden sich von den üblichen Programmen auf einem PC vor allem dadurch, dass sie nicht durch Benutzereingaben (über eine Maus, Tastatur usw.) gesteuert werden, sondern über Sensoren (z.B. den Temperaturfühler in einer Waschmaschine), die dann über Aktoren z.B. die Heizung der Waschmaschine an- oder ausschalten.

Mikrocontroller-Programme sind oft Teile von eingebetteten Systemen (embedded Systems). Darunter versteht man Rechner, die in Geräten enthalten sind und diese steuern. Deswegen ist dieses Buch auch eine Einführung in die Programmierung von eingebetteten Systemen. Eine umfassende Darstellung dazu finden Sie in meinem Buch „Modernes C++ für Embedded Systeme“ (siehe www.rkaiser.de).

Abgesehen von der Steuerung von Aktoren über die Werte von Sensoren haben Programme für eingebettete Systeme viele Gemeinsamkeiten mit Programmen, die auf einem Desktop laufen und mit der Maus und der Tastatur bedient werden. Die meisten Sprachelemente von C++ werden in einem embedded Programm ähnlich wie bei einem PC-Programm eingesetzt.

Traditionellerweise werden embedded Programme oft in C geschrieben. Die zunehmende Komplexität und Größe von solchen Anwendungen ist allerdings mit den Mitteln von C oft nur noch schwer zu bewältigen. Deswegen wird in diesem Buch von Anfang an C++ verwendet, auch wenn das bei den einfachen Anwendungen in dieser Einführung nicht groß ins Gewicht fällt. C++ bietet enorme Vorteile, die Entwicklungskosten sparen und zur Zuverlässigkeit der Anwendungen beitragen.
Dieses Buch richtet sich an alle, die Mikrocontroller mit C++ programmieren wollen. Das können Programmierer aus der Industrie, Schüler und Studenten sein. Die meisten Beispiele werden für einen Raspberry Pi Pico formuliert, der vor allem bei Hobbyprogrammierern und in der Ausbildung verbreitet ist.

Ähnliche Ausgaben dieses Buches orientieren sich an ESP32 oder den in der Industrie verbreiteten STM32 Prozessoren. Diese Bücher sind in großen Teilen identisch, so dass es eigentlich naheliegend wäre, sie in einem einzigen Buch zusammenzufassen. Das war auch meine ursprüngliche Absicht. Aber die vielen teilweise recht spitzfindigen Unterschiede haben die Lesbarkeit stark erschwert. Deswegen die verschiedenen Bücher.

Tübingen, im Juli 2025

Inhalt des Raspberry Buchs – die ESP32- und STM32-Bücher sind ähnlich aufgebaut

1 Mikrocontroller und Embedded Systeme

1.1 Verbreitete Microcontroller Boards 2
1.2 Einsatzbereiche und spezielle Anforderungen 3
1.3 C und C++ 7

2 Entwicklungsumgebungen

2.1 Unterschiede der Entwicklungsumgebungen 11
2.2 Projekte mit dem Wokwi-Simulator 12
2.2.1 Fertige Wokwi-Projekte 12
2.3 Projekte mit der Arduino IDE 15
2.3.1 Die Installation der Arduino-IDE 15
2.3.2 Projekte anlegen 16
2.3.3 Pakete für weitere Boards installieren 17
2.4 Projekte mit Visual Studio und der VisualMicro Extension 18
2.4.1 Die Installation der VisualMicro Extension in Visual Studio 18
2.4.2 Ein Mikrocontroller-Projekt anlegen 20
2.4.3 Das Board auswählen 21
2.4.4 Board-Updates manuell installieren 24
2.5 Dokumentation 25
2.6 Compiler-Einstellungen Ө 25
2.7 Einige Elemente der Visual Studio und VS Code IDE Ө 27
2.7.1 Tastenkombinationen 27
2.7.2 Intellisense 28
2.7.3 Definitionen einsehen 29
2.7.4 Symbole suchen 30
2.7.5 Namen umbenennen 31
2.7.6 Zeichenfolgen suchen und ersetzen 32
2.7.7 Projektmappen-Explorer 33
2.8 Visual Studio Code Extensions 33

3 Projekte für Digital- und Analog-I/O 35

3.1 Projekte für Raspberry Pi Pico Boards 36
3.1.1 Die Hardware 36
3.1.2 Die serielle Schnittstelle auswählen 37
3.2 Die setup, loop und main Funktionen 39
3.2.1 Einfache Meldungen über die serielle Konsole ausgeben 40
3.2.2 Ein Programm auf den Mikrocontroller hochladen und ausführen 41
3.2.3 Fehler beim Kompilieren 42
3.2.4 Die Funktion setup_serial_port 43
3.2.5 Anweisungen zur Ausgabe von Daten über die serielle Konsole 44
3.2.6 Die main-Funktion 46
3.3 Elektrische Grenzwerte beachten 47
3.4 Digital I/O 47
3.4.1 Anweisungen für Digital I/O 48
3.4.2 Digital Output: Beispiel blinkende LED 49
3.4.3 Digital Output: Beispiel Ampelsteuerung 51
3.4.4 Digital Output: Ampelsteuerung mit einem Zustandsautomaten 54
3.4.5 Digital Input: Beispiel Druckschalter abfragen 56
3.4.6 Digital Input: Externe Interrupts 58
3.4.6.1 Beispiele für Anwendungen von externen Interrupts 62
3.4.7 Digital I/O: Analoge Werte mit einem Abstandssensor 62
3.5 Analog Input: AD-Wandler 65
3.5.1 Analog Input: Potentiometer lesen 67
3.5.2 Rohwerte und physikalische Werte umrechnen 68
3.5.3 Analog Input: Beispiel Spannungen (Volt) und Temperaturwerte 70
3.5.4 Analoge Eingänge mit mocking testen 71
3.6 Analog Output 72
3.6.1 Analoge Ausgabe mit Pulsweitenmodulation (PWM) 72
3.6.2 Töne erzeugen 75
3.6.3 Analog Output mit einem DA-Wandler 79
3.7 Timer Interrupts 79
3.8 Pin-Layout Raspberry Pi Pico 81
3.8.1 Onboard LEDs und Onboard PushButtons 82
3.8.2 Stromversorgung 82
3.8.3 Pins, die man normalerweise nicht verwenden sollte 82
3.9 Das Raspberry Pi Pico SDK Ө 83
3.9.1 Die setup und loop Funktionen 84
3.9.2 Ausgabefunktionen 84
3.9.3 Zeitfunktionen 84
3.9.4 Digital I/O GPIO 85
3.9.5 Analog Input 87
3.9.6 PWM Analog Output 88
3.9.7 Free RTOS 89

4 Elementare C++-Grundlagen 91

4.1 Variablen und Bezeichner 91
4.1.1 Bezeichner und Schlüsselwörter 93
4.1.2 Globale und lokale Variablen 93
4.1.3 Die Ausgabe mit std::cout und std::print 94
4.1.4 Die Initialisierung von Variablen bei ihrer Definition 98
4.1.5 volatile Variablen Ө 99
4.2 Ganzzahldatentypen 100
4.2.1 Ganzzahlliterale und ihr Datentyp 102
4.2.2 Typ-Inferenz: Implizite Typzuweisungen mit auto 103
4.2.3 Initialisierungslisten und Konversionen 105
4.2.4 Zuweisungen und Standardkonversionen bei Ganzzahlausdrücken Ө 108
4.2.5 Operatoren und die „üblichen arithmetischen Konversionen“ 108
4.2.6 Die Inkrement- und Dekrementoperatoren 109
4.2.7 Bitoperationen 110
4.2.8 Die Datentypen char und wchar_t 112
4.2.9 Der Datentyp bool 115
4.3 Kontrollstrukturen 120
4.3.1 Die if- und die Verbundanweisung 120
4.3.1.1 Die Bedingung in einer if-Anweisung 120
4.3.1.2 Die Verbundanweisung 120
4.3.1.3 Verschachtelte if-Anweisungen 122
4.3.2 Die switch-Anweisung 123
4.3.3 Die for-, die while- und die do-Schleife 126
4.4 Funktionen und der Datentyp void 129
4.4.1 Die Definition von Funktionen 129
4.4.2 Der Rückgabetyp void 130
4.4.3 Der Rückgabetyp auto 130
4.4.4 Design von Funktionen 131
4.4.5 Wert- und Referenzparameter 133
4.4.6 Default-Argumente 134
4.4.7 Funktionszeiger: Datentypen für Funktionen 137
4.5 Namensbereiche – Grundlagen 139
4.5.1 Die Verwendung von Bibliotheken und Namensbereichen 143
4.6 Gleitkommadatentypen 147
4.6.1 Die interne Darstellung von Gleitkommawerten 147
4.6.2 Der Datentyp von Gleitkommaliteralen 150
4.6.3 Standardkonversionen 151
4.6.4 Mathematische Funktionen 156
4.6.5 Lineare Transformationen der Werte von AD- und DA-Wandlern 157
4.7 Konstanten 160
4.7.1 Laufzeitkonstanten mit const 161
4.7.2 Compilezeit-Konstanten mit constexpr 162
4.7.3 constexpr Funktionen 164
4.8 Strings 167
4.8.1 Die Definition von Variablen eines Klassentyps 168
4.8.2 Einige Elementfunktionen der Klasse string 170
4.8.3 Stringkonversionen 178
4.8.3.1 Die C-Konversionsfunktionen 179
4.8.3.2 C++11-Konversionsfunktionen: to_string, stoi usw. 179
4.9 Kommentare 180
4.10 Exception-Handling Grundlagen: try, catch und throw 182
4.10.1 Exceptions abfangen 182
4.10.2 Exception-Handling aktivieren 185
4.10.3 try-catch: Der Programmablauf an einem einfachen Beispiel 186
4.10.4 Exceptions mit throw auslösen 188
4.10.5 noexcept 189
4.11 Präprozessordirektiven 189
4.11.1 Die #include-Direktive 190
4.11.2 Makros Ө 191
4.11.3 Bedingte Kompilation 193
Literaturverzeichnis 199
Index 201