Internet of Things (IoT) – Entwicklungsvorbereitung auf Apple Silicon mit dem Pico RP2040
2023-11-06
Machine-translated from English. Read the English original

Konfiguration eines M2 Max MacBook für die Verwendung mit der RaspberryPi Pico W MicroController-Toolchain.
IoT-Pipelines haben die zusätzliche Herausforderung, dass das „T“ normalerweise impliziert, dass das thing ein physisches Gerät ist.
Dieser Artikel beschreibt die Freude und Erkenntnisse, die ich beim Konfigurieren meines Laptops hatte, um mit dem ersten Schritt des RPI-Teams in die ASIC-Chip-Entwicklung mit der Einführung des RP2040-Mikrocontrollers zu spielen.
Das RPI-Team hat zwei Mikrocontroller-Boards veröffentlicht, den Pico für 3,90 £ und den Pico_W für 6,30 £ (Preise Stand 11. Oktober 2023). Letzteres hat WLAN direkt auf dem Board und ist das, mit dem ich mich heute gerne beschäftigen möchte.
Was ist also ein Mikrocontroller und was hat er mit IoT zu tun? Der RP2040 RPI Pico-Mikrocontroller ist ein kleiner Computer auf einem einzigen integrierten Schaltkreis. Sie sind zu sehr effektiven, effizienten und vergleichsweise günstigen Black-Boxen geworden, die es ermöglichen, physische Gegenstände zu überwachen, zu messen, zu instrumentieren und die Daten aufzuzeichnen und an einen anderen Ort zu übertragen. Oder, um es in Laienbegriffen auszudrücken: Der RP2040 kann wie ein Dolmetscher betrachtet werden – er kann mit physischen Geräten – „Dingen“ – verbunden werden und diese in die Cloud bzw. das Internet integrieren. So haben wir nun einen Mechanismus für den bidirektionalen Datenaustausch in nahezu Echtzeit, falls erforderlich, durch physische „Dinge“.
Warum also die Notwendigkeit für diesen Blog… nun, Überraschung, Überraschung, es ist einmal mehr Apples neuer Silizium-Chip, der in meinem MacBook steckt! Die RaspberryPi Foundation hat einige fantastische Dokumentationen und Erste-Hilfe-Anleitungen erstellt, diese konzentrieren sich jedoch derzeit auf x86 Intel-basierte Macs, und Apple ist von Intel zu ihren eigenen proprietären CPUs übergegangen. Die Verwendung der offiziellen Dokumentation in Verbindung mit diesen Notizen wird Ihnen hoffentlich helfen, sich effektiver in Betrieb zu nehmen.
Die Hauptanleitung, die ich verwende, ist Erste Schritte mit Raspberry Pi Pico
Also, lassen Sie uns genau das tun, anfangen…
Voraussetzungen
Eine große Annahme meinerseits ist, dass Sie, der Leser, über grundlegende Entwicklerkenntnisse verfügen. Zum Beispiel sind Sie mit git, homebrew, Xcode-Paket, vscode usw. vertraut…
- Erstellen Sie ein
pico-Verzeichnis, in das wir unsere SDKs, Bibliotheken und Beispielcode herunterladen
mkdir ~/repos/pico
- Installieren Sie die folgenden 5 Repositories
cd ~/repos/pico
git clone https://github.com/raspberrypi/pico-sdk.git --branch master
cd pico-sdk
git submodule update --init
cd ..
git clone https://github.com/raspberrypi/pico-examples.git --branch master
git clone https://github.com/raspberrypi/pico-extras.git --branch master
git clone https://github.com/raspberrypi/pico-playground.git --branch master
git clone https://github.com/raspberrypi/picoprobe.git --branch master
- Installieren Sie Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
- Installieren Sie die Toolchain
brew install cmake
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
- Apple Silicon M1/M2 – installieren Sie den Intel-Emulator und akzeptieren Sie die Lizenz
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
- Konfigurieren Sie die folgenden Pfade in Ihrer Standard-Shell. Hinweis: Ich verwende hier die fish-Shell – Sie müssen dies möglicherweise anpassen, um sie an die Umgebung anzupassen, die Sie derzeit verwenden. Ich musste meine
~/.config/fish/config.fishändern, um diese Umgebungsvariablen aufzunehmen
set -gx PICO_SDK_PATH $HOME/repos/pico/pico-sdk
set -gx PICO_EXAMPLES_PATH $HOME/repos/pico/pico-examples
set -gx PICO_EXTRAS_PATH $HOME/repos/pico/pico-extras
set -gx PICO_PLAYGROUND_PATH $HOME/repos/pico/pico-playground
Unsere erste App
- Bauen wir nun unsere erste App,
blink, für das Pico_W-Board. Hinweis: Die Standard-Blink-App im Beispiel-Repository ist für das Pico-Board ohne WLAN – seine LED ist physisch an einer anderen Stelle verdrahtet als die des Pico_W, daher die Notwendigkeit einer anderen Blink-App, die sich im WLAN-Unterordner befindet!
cd $PICO_EXAMPLES_PATH
mkdir build
cd build
cmake -DPICO_BOARD=pico_w ..
cd pico_w/wifi/blink
make -j4
- Dies sollte zur Erstellung der folgenden Dateien führen
-rwxr-xr-x 1 graz staff 263444 11 Oct 11:06 picow_blink.bin*
-rw-r--r-- 1 graz staff 670466 11 Oct 11:06 picow_blink.dis
-rwxr-xr-x 1 graz staff 300956 11 Oct 11:06 picow_blink.elf*
-rw-r--r-- 1 graz staff 276436 11 Oct 11:06 picow_blink.elf.map
-rw-r--r-- 1 graz staff 741065 11 Oct 11:06 picow_blink.hex
-rw-r--r-- 1 graz staff 527360 11 Oct 11:06 picow_blink.uf2
Die picow_blink.uf2-Datei ist erforderlich, wenn das Programm „manuell“ auf das Pico_W kopiert wird. Dazu muss die BOOTSEL-Taste gedrückt und gehalten UND das USB-Kabel abgezogen/wieder eingesteckt werden, um den RP2040 in den Bootloader-Modus zu versetzen.
Wenn sich der RP2040 im richtigen Modus befindet, sollte er als zusätzliches Laufwerk, RPI-RP2, auf Ihrem MacBook in der Finder-App unter „Standorte“ auf der linken Seite erscheinen.

Ziehen Sie einfach die picow_blink.uf2-Datei (kopieren) auf das Stammverzeichnis des RPI-RP2-Laufwerks und Magie geschieht – das Pico_W lädt das neue Programm, trennt die Verbindung zum MacBook (RPI-RP2 verschwindet von den angeschlossenen Laufwerken), führt einen Neustart durch und führt das neu geladene Programm aus. Wenn dies erfolgreich war, sollten Sie das folgende Blinken der eingebauten LED sehen

Manuelle Interaktionen sind, wie wir alle wissen, nicht immer produktivitätsfördernd – es wird sehr schnell langweilig, wenn Sie an Codeänderungen arbeiten und diese Änderungen testen müssen, indem Sie ständig Kabel ein- und ausstecken und Tasten drücken.
Verbesserungen der Pipeline
Hier kommt der SWD-Port (Serial Wire Debug) ins Spiel, und obwohl er unsere Toolchain/Pipeline-Einrichtung etwas komplexer macht, verbessert er auch die Produktivität und die Benutzererfahrung (UX).
Die zusätzliche Komplexität besteht in Form einer zusätzlichen Debug-Sonde mit der entsprechenden Software. Eine offizielle Sonde könnte hier gekauft werden, oder Sie können so vorgehen wie ich und einfach eine freie Pico-Sonate verwenden, wie in der offiziellen Dokumentation in Anhang A: Verwendung von Picoprobe beschrieben
- Installieren Sie weitere Voraussetzungen, um sicherzustellen, dass wir OpenOCD speziell für den RP2040-Controller erstellen können – dies funktioniert nicht mit der Standard-Homebrew-Version!!! [Nebenbemerkung: Ich habe das Standard-OpenOCD einmal zum Laufen gebracht, als ich es auf die RaspberryPi-Konfigurationen verwies, die Teil des RPI-OpenOCD-Repositorys waren.]
brew install libtool automake libusb wget pkg-config gcc texinfo
- Laden Sie die RaspberryPi-Version von OpenOCD herunter und erstellen Sie sie
cd ~/repos/pico
git clone https://github.com/raspberrypi/openocd.git --branch rp2040 --depth=1
cd openocd
fish_add_path -aP /opt/homebrew/Cellar/texinfo/7.0.3_1/bin # Note: bash shell users will need to change this e.g. export PATH="/opt/homebrew/Cellar/texinfo/7.0.3_1/bin:$PATH"
- Es gibt noch eine weitere Kompilierungs-Falle für Apple versus Intel-Silizium beim Erstellen von OpenOCD, die vor dem Erstellen mit diesem Workaround behoben wird
set -gx CAPSTONE_CFLAGS "-I/opt/homebrew/Cellar/capstone/4.0.2/include/capstone -I/opt/homebrew/include" # Note: Change this to align with your preferred shell
Fahren Sie dann fort, bis Sie einen erfolgreichen Build wie folgt haben.
./bootstrap
./configure --disable-werror
make -j4
Überprüfen Sie, ob es ausgeführt wird
src/openocd
Open On-Chip Debugger 0.11.0-g8e3c38f (2023-10-11-15:32)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
embedded:startup.tcl:26: Error: Can't find openocd.cfg
in procedure 'script'
at file "embedded:startup.tcl", line 26
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Error: Debug Adapter has to be specified, see "adapter driver" command
embedded:startup.tcl:26: Error:
in procedure 'script'
at file "embedded:startup.tcl", line 26
Die obigen Fehler sind zu erwarten, da wir dem Debugger keine sinnvolle Konfiguration gegeben haben… das kommt später.
Die OpenOCD-Software auf dem Mac ist nun bereit, jetzt müssen wir die Anwendung erstellen, die auf den RP2040 Pico-Debugger geladen wird.
- Wir müssen die Debugger-Sonden-Software aus dem RaspberryPi Probe-Repository herunterladen und die Binärdatei erstellen
cd ~/repos/pico
git clone https://github.com/raspberrypi/picoprobe.git --branch master
cd picoprobe
git submodule update --init
mkdir build
cd build
cmake ..
make -j4
Ausgabe
[100%] Built target picoprobe
➜ build git:(master) ls -al
total 3176
drwxr-xr-x 19 graz staff 608 11 Oct 15:59 ./
drwxr-xr-x 13 graz staff 416 11 Oct 15:59 ../
-rw-r--r-- 1 graz staff 21126 11 Oct 15:59 CMakeCache.txt
drwxr-xr-x 18 graz staff 576 11 Oct 15:59 CMakeFiles/
drwxr-xr-x 5 graz staff 160 11 Oct 15:59 FREERTOS_KERNEL/
-rw-r--r-- 1 graz staff 156529 11 Oct 15:59 Makefile
-rw-r--r-- 1 graz staff 1796 11 Oct 15:59 cmake_install.cmake
drwxr-xr-x 10 graz staff 320 11 Oct 15:59 elf2uf2/
drwxr-xr-x 3 graz staff 96 11 Oct 15:59 generated/
drwxr-xr-x 8 graz staff 256 11 Oct 15:59 pico-sdk/
-rwxr-xr-x 1 graz staff 40872 11 Oct 15:59 picoprobe.bin*
-rw-r--r-- 1 graz staff 768351 11 Oct 15:59 picoprobe.dis
-rwxr-xr-x 1 graz staff 88608 11 Oct 15:59 picoprobe.elf*
-rw-r--r-- 1 graz staff 324827 11 Oct 15:59 picoprobe.elf.map
-rw-r--r-- 1 graz staff 115023 11 Oct 15:59 picoprobe.hex
-rw-r--r-- 1 graz staff 81920 11 Oct 15:59 picoprobe.uf2
drwxr-xr-x 7 graz staff 224 11 Oct 15:59 pioasm/
-rw-r--r-- 1 graz staff 2926 11 Oct 15:59 probe.pio.h
-rw-r--r-- 1 graz staff 3157 11 Oct 15:59 probe_oen.pio.h
Mit demselben Prozess, der in Schritt 8 oben befolgt wurde, können wir nun picoprobe.uf2 auf das Pico kopieren, das als Debug-Sonde verwendet wird [denken Sie daran, die BOOTSEL-Taste gedrückt zu halten, bevor Sie das Pico an den USB-Port anschließen]

Wir sind fast da! Die letzten Schritte sind die physische Verdrahtung der PicoProbe – stellen Sie sicher, dass Sie die offizielle Dokumentation dafür befolgen. Es sollte in etwa so aussehen

Und so sieht mein tatsächliches Setup aus, ja, ich habe die Boards im Gegensatz zum Diagramm vertauscht, aber die Verdrahtung ist dieselbe. Außerdem werden Sie vielleicht bemerken, dass in meinem Setup die PicoProbe ein Pico-Board verwendet und ich es verwende, um ein Pico W-Board zu programmieren.

Sie können ls verwenden, um zu sehen, ob die neue Sonde erkannt wird, nachdem Sie die Software kopiert haben, und stellen Sie sicher, dass das USB-Kabel noch eingesteckt ist.
Wenn Sie das /dev/tty.usbmodemXXX-Gerät nicht sehen, versuchen Sie, das Pico-Gerät vom USB zu trennen und wieder anzuschließen.
ls -al /dev/tty.usb*
crw-rw-rw- 1 root wheel 0x9000002 11 Oct 17:01 /dev/tty.usbmodem102
- Installieren Sie minicom, ein Terminal-Emulator-Programm, und verwenden Sie es, um eine Verbindung zum UART-Port (Universal Asynchronous Receiver Transmitter) der PicoProbe herzustellen
brew install minicom
minicom -D /dev/tty.usbmodem102 -b 115200
Führt zum Ausführen des Terminal-Emulators
Welcome to minicom 2.8
OPTIONS:
Compiled on Jan 1 2021, 17:45:55.
Port /dev/tty.usbmodem102, 17:01:23
Press Meta-Z for help on special keys
esc+x bringt Sie aus dieser Anwendung heraus
Nun sind wir bereit, eine Anwendungsbereitstellung mit der PicoProbe zu testen.
Wir verwenden die einfachste Anwendung – Hello World – und kompilieren diese, um ihre UART-Schnittstelle anstelle der USB-Schnittstelle zu verwenden. Dann sollten wir die Ausgabe über die UART-Schnittstelle der PicoProbe sehen können.
Testlauf
- Bauen Sie das
Hello_World-Beispiel, um die serielle UART anstelle des USB zu verwenden
cd $PICO_EXAMPLES_PATH/build/hello_world/serial
make -j4
Dies erstellt die hello_serial.elf-Datei, die von der PicoProbe für die Übertragung an das Ziel erforderlich ist. Bitte denken Sie daran, dass wir nun die .elf anstelle der .uf2-Datei verwenden, da dieses Format erforderlich ist, wenn es über die andere Schnittstelle gesendet wird. Beide Formate werden standardmäßig erstellt.
- Übertragen wir nun die Datei mit der frisch erstellten OpenOCD-Anwendung – keine manuellen Tastendrücke oder Kabel-Ein- und -Ausstecken erforderlich!
cd $HOME/pico/openocd/tcl
../src/openocd -f interface/cmsis-dap.cfg -c "adapter speed 5000" -f target/rp2040.cfg -s tcl -c "program $PICO_EXAMPLES_PATH/build/hello_world/serial/hello_serial.elf verify reset exit"
Was hoffentlich zu etwas wie diesem führt
Open On-Chip Debugger 0.11.0-g8e3c38f (2023-10-11-15:32)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
adapter speed: 5000 kHz
Info : auto-selecting first available session transport "swd". To override use 'transport select '.
Info : Hardware thread awareness created
Info : Hardware thread awareness created
Info : RP2040 Flash Bank Command
Info : Using CMSIS-DAPv2 interface with VID:PID=0x2e8a:0x000c, serial=E6605838837F8B2E
Info : CMSIS-DAP: SWD Supported
Info : CMSIS-DAP: FW Version = 2.0.0
Info : CMSIS-DAP: Interface Initialised (SWD)
Info : SWCLK/TCK = 0 SWDIO/TMS = 0 TDI = 0 TDO = 0 nTRST = 0 nRESET = 0
Info : CMSIS-DAP: Interface ready
Info : clock speed 5000 kHz
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x00000001
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x10000001
Info : rp2040.core0: hardware has 4 breakpoints, 2 watchpoints
Info : rp2040.core1: hardware has 4 breakpoints, 2 watchpoints
Info : starting gdb server for rp2040.core0 on 3333
Info : Listening on port 3333 for gdb connections
target halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x000000ea msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x000000ea msp: 0x20041f00
** Programming Started **
Info : RP2040 B0 Flash Probe: 2097152 bytes @10000000, in 512 sectors
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
Info : Writing 12288 bytes starting at 0x0
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
** Programming Finished **
** Verify Started **
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
target halted due to debug-request, current mode: Thread
xPSR: 0x01000000 pc: 0x00000184 msp: 0x20041f00
** Verified OK **
** Resetting Target **
shutdown command invoked
- Und schließlich, um zu überprüfen, ob die
hello_world-Anwendung tatsächlich in unser Ziel-Pico_W geladen wurde und funktioniert, überprüfen wir die UART des Geräts mitminicom.
minicom -D /dev/tty.usbmodem102 -b 115200
Wenn Sie bei der Bearbeitung dieses Tutorials erfolgreich waren, sollten Sie nun einen Terminal-Emulator haben, der mit den folgenden Aussagen gefüllt ist
Welcome to minicom 2.8
OPTIONS:
Compiled on Jan 1 2021, 17:45:55.
Port /dev/tty.usbmodem102, 17:29:24
Press Meta-Z for help on special keys
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
Hello, world!
H
Was als Nächstes?
Herzlichen Glückwunsch! Sie können nun die Embedded-Programmierung als weitere Fähigkeit in Ihrem Lebenslauf vermerken 😉
Künftige IoT-Beiträge auf meinem Blog werden sich auf dieses für die grundlegende Einrichtung beziehen, die ich nutze.
Nun, um diesen alten Regenschirm mit dem Internet zu verbinden.
Viel Spaß beim Coden!
Originally published on allthingscloud.eu (2023-11-06).