Préparation au développement IoT sur Apple Silicon avec le Pico RP2040
2023-11-06
Machine-translated from English. Read the English original

Configuration d'un MacBook M2 Max pour une utilisation avec la chaîne d'outils MicroController Toolchain RaspberryPi Pico W.
Les pipelines IoT présentent ce défi supplémentaire que le « T » implique généralement que l'thing est un dispositif physique.
Cet article détaille les moments amusants et les apprentissages que j'ai eus lors de la configuration de mon ordinateur portable pour faciliter l'expérimentation avec la première incursion de RaspberryPi dans le développement de puces ASIC avec l'introduction du microcontrôleur RP2040.
L'équipe RPI a lancé deux cartes microcontrôleurs, le Pico à 3,90 £ et le Pico_W à 6,30 £ (prix au 11 octobre 2023). Ce dernier a le wifi intégré sur la carte et est celui qui m'intéresse pour jouer avec aujourd'hui.
Alors, qu'est-ce qu'un microcontrôleur et quel rapport a-t-il avec l'IoT ? Le microcontrôleur RP2040 RPI Pico est un petit ordinateur sur un seul circuit intégré. Ils sont devenus des boîtes noires très efficaces, efficientes et comparativement bon marché qui permettent de surveiller, mesurer, instrumenter les objets physiques et d'enregistrer et transmettre les données vers un autre endroit. Ou, en termes plus simples, le RP2040 peut être considéré comme un interprète – il peut être connecté à des dispositifs physiques – les « Choses » – et les intégrer au cloud, alias l'internet. Ainsi, nous disposons désormais d'un mécanisme pour le partage bidirectionnel de données en quasi temps réel, si nécessaire, par les « Choses » physiques.
Alors, pourquoi ce blog… eh bien, surprise, surprise, c'est encore la nouvelle puce d'Apple qui se trouve dans mon MacBook ! La fondation RaspberryPi a créé une documentation fantastique et des guides de démarrage, mais ceux-ci se concentrent actuellement sur les Mac basés sur Intel x86 et Apple a abandonné Intel au profit de ses propres processeurs propriétaires. L'utilisation de la documentation officielle conjointement avec ces notes devrait vous aider à vous mettre en route plus efficacement.
Le guide principal que j'utilise est Getting started with Raspberry Pi Pico
Alors, faisons exactement cela, commençons…
Prérequis
Une grande hypothèse de ma part est que vous, le lecteur, avez quelques connaissances de base en développement. Par exemple, vous êtes familier avec git, homebrew, Xcode package, vscode etc…
- Créez un répertoire
picooù nous téléchargerons nos SDK, bibliothèques et code d'exemple
mkdir ~/repos/pico
- Installez les 5 dépôts suivants
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
- Installez Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
- Installez la chaîne d'outils (Toolchain)
brew install cmake
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
- Apple silicon M1/M2 – installez l'émulateur Intel et acceptez la licence
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
- Configurez les chemins suivants dans votre shell par défaut. Note : j'utilise le fish shell ici – vous devrez peut-être modifier cela pour convenir à l'environnement que vous utilisez actuellement. J'ai dû modifier mon
~/.config/fish/config.fishpour inclure ces variables d'environnement
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
Notre première application
- Construisons maintenant notre première application,
blinkpour la carte pico_w. Note : l'application blink par défaut dans le dépôt d'exemples est pour la carte pico sans wifi – sa LED est physiquement câblée à un endroit différent de celui du pico_w, d'où la nécessité d'une application blink différente située dans le sous-dossier wifi !
cd $PICO_EXAMPLES_PATH
mkdir build
cd build
cmake -DPICO_BOARD=pico_w ..
cd pico_w/wifi/blink
make -j4
- Cela devrait résulter en la création des fichiers suivants
-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
Le fichier picow_blink.uf2 est ce qui est requis lors de la copie « manuelle » du programme sur le pico_w. Cela nécessite d'appuyer et de maintenir enfoncé le bouton BOOTSEL ET de débrancher/rebrancher le câble USB pour mettre le rp2040 en mode bootloader.
Lorsque le RP2040 est en mode correct, il devrait apparaître comme un lecteur supplémentaire, RPI-RP2, sur votre MacBook dans l'application Finder sous Emplacements sur le côté gauche.

Il suffit de faire glisser (copier) le fichier picow_blink.uf2 à la racine du lecteur RPI-RP2 et la magie opère – le Pico_W charge le nouveau programme, se déconnecte du MacBook (RPI-RP2 disparaît des lecteurs attachés), redémarre et exécute le programme nouvellement chargé. Si cela a réussi, vous devriez voir le clignotement intégré comme suit

Les interactions manuelles, comme nous le savons tous, ne sont pas toujours propices à la productivité – cela devient très ennuyeux très vite si vous itérez sur des modifications de code et devez continuer à brancher/débrancher et appuyer sur des boutons pour tester ces modifications.
Améliorations du pipeline
C'est ici que le port SWD (Serial Wire Debug) entre en jeu et bien qu'il ajoutera un peu plus de complexité à notre configuration de chaîne d'outils/pipeline, il améliore également la productivité et l'UX (expérience utilisateur).
La complexité ajoutée se présente sous la forme d'un sonde de débogage supplémentaire avec le logiciel approprié. Une sonde officielle pourrait être achetée ici ou vous pourriez faire comme moi et simplement utiliser un Pico de rechange comme décrit dans la documentation officielle dans Appendix A: Using Picoprobe
- Installez quelques prérequis supplémentaires pour nous assurer de pouvoir construire l'OpenOCD spécifique au contrôleur RP2040 – cela ne fonctionne pas avec la version par défaut de Homebrew !!! [Aside : J'ai réussi à faire fonctionner l'OpenOCD par défaut une fois que je l'ai pointé vers les configurations RaspberryPi qui faisaient partie du dépôt RPI OpenOCD.]
brew install libtool automake libusb wget pkg-config gcc texinfo
- Téléchargez et construisez la version RaspberryPi d'OpenOCD
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"
- Il y a un autre piège de compilation pour Apple versus Intel silicon when building out OpenOCD that’s resolved using this workaround avant de construire…
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
Puis continuez jusqu'à ce que vous ayez une construction réussie comme suit.
./bootstrap
./configure --disable-werror
make -j4
Vérifiez qu'il s'exécute
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
Les erreurs ci-dessus sont attendues car nous n'avons pas fourni au débogueur de configuration significative… cela vient plus tard.
C'est le logiciel OpenOCD sur le Mac prêt, maintenant nous devons construire l'application qui sera chargée sur le RP2040 Pico Debugger.
- Nous devons télécharger le logiciel de sonde de débogage du dépôt RaspberryPi Probe et construire le binaire
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
Sortie
[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
En utilisant le même processus suivi à l'étape 8 ci-dessus, nous pouvons maintenant copier picoprobe.uf2 sur le pico qui sera utilisé comme sonde de débogage [n'oubliez pas de maintenir le bouton BOOTSEL enfoncé avant de brancher le Pico sur le port USB]

Nous y sommes presque ! Les étapes finales sont le câblage physique du PicoProbe – assurez-vous de suivre la documentation officielle pour cela. Cela devrait ressembler à quelque chose comme ceci

Et voici à quoi ressemble ma configuration réelle, oui, j'ai les cartes dans le sens inverse du diagramme mais le câblage est le même. De plus, vous remarquerez peut-être que dans ma configuration, le PicoProbe utilise une carte Pico et que je l'utilise pour programmer une carte Pico W.

Vous pouvez utiliser ls pour voir si la nouvelle sonde est détectée une fois que vous avez copié le logiciel et assurez-vous que le câble USB est toujours branché.
Si vous ne voyez pas le dispositif /dev/tty.usbmodemXXX, essayez de débrancher et de rebrancher le dispositif Pico de l'USB.
ls -al /dev/tty.usb*
crw-rw-rw- 1 root wheel 0x9000002 11 Oct 17:01 /dev/tty.usbmodem102
- Installez minicom, un programme d'émulation de terminal, et utilisez-le pour vous connecter au port UART (Universal Asynchronous Receiver Transmitter) du PicoProbe
brew install minicom
minicom -D /dev/tty.usbmodem102 -b 115200
Résultat dans l'émulateur de terminal s'exécutant
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 vous sortira de cette application
Maintenant, nous sommes prêts à tester un déploiement d'application en utilisant le PicoProbe.
Nous utiliserons l'application la plus simple – Hello World – et la compilerons pour utiliser son interface UART plutôt que USB. Ensuite, nous devrions pouvoir voir la sortie à travers l'interface UART du PicoProbe.
Essai
- Construisez l'exemple
Hello_Worldpour utiliser le UART série au lieu de l'USB
cd $PICO_EXAMPLES_PATH/build/hello_world/serial
make -j4
Cela crée le fichier hello_serial.elf qui est requis par le PicoProbe pour le transfert vers la cible. Veuillez vous rappeler, nous allons maintenant utiliser le .elf plutôt que le fichier .uf2 car ce format est requis lors de l'envoi via l'interface différente. Les deux formats sont créés par défaut.
- Maintenant, transférons le fichier en utilisant l'application OpenOCD fraîchement construite – aucune pression manuelle sur les boutons ou branchement/débranchement de câble requis !
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"
Ce qui devrait résulter en quelque chose comme ceci
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
- Et enfin, pour vérifier que l'application
hello_worldest réellement chargée dans notre Pico_W cible et fonctionne, vérifions le UART de l'appareil en utilisantminicom.
minicom -D /dev/tty.usbmodem102 -b 115200
Si vous avez réussi à traverser ce tutoriel, vous devriez maintenant avoir un émulateur de terminal rempli des déclarations suivantes
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
Et ensuite ?
Félicitations ! Vous pouvez maintenant ajouter la programmation embarquée comme une autre compétence sur votre CV 😉
Les prochains posts IoT sur my blog feront référence à cela pour la configuration de base que j'utilise.
Maintenant, pour connecter ce vieux parapluie à l'interweb.
Bonne programmation !
Originally published on allthingscloud.eu (2023-11-06).