Préparation au développement IoT sur Apple Silicon avec le Pico RP2040

2023-11-06

Préparation au développement IoT sur Apple Silicon avec le Pico RP2040

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…

  1. Créez un répertoire pico où nous téléchargerons nos SDK, bibliothèques et code d'exemple
mkdir ~/repos/pico
  1. 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
  1. Installez Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  1. Installez la chaîne d'outils (Toolchain)
brew install cmake
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
  1. Apple silicon M1/M2 – installez l'émulateur Intel et acceptez la licence
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
  1. 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.fish pour 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

  1. Construisons maintenant notre première application, blink pour 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
  1. 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.

Pico Bootloader Mode

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

flashing gif

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

  1. 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
  1. 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"
  1. 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.

  1. 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]

picoprobe compiled software

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

Physical Wiring Diagram

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.

mysetup

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
  1. 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

  1. Construisez l'exemple Hello_World pour 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.

  1. 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
  1. Et enfin, pour vérifier que l'application hello_world est réellement chargée dans notre Pico_W cible et fonctionne, vérifions le UART de l'appareil en utilisant minicom.
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 !

Graz

Originally published on allthingscloud.eu (2023-11-06).

← All posts