Preparazione allo sviluppo Internet of Things (IoT) su Apple Silicon con il Pico RP2040

2023-11-06

Preparazione allo sviluppo Internet of Things (IoT) su Apple Silicon con il Pico RP2040

Machine-translated from English. Read the English original

Configurazione di un MacBook M2 Max per l'uso con la toolchain del microcontrollore RaspberryPi Pico W.

I pipeline IoT presentano quella sfida aggiuntiva che la "T" di solito implica che il thing sia un dispositivo fisico.

Questo articolo descrive le divertenti esperienze e gli apprendimenti che ho avuto durante la configurazione del mio laptop per facilitare l'esplorazione della prima avventura del RaspberryPi nello sviluppo di chip ASIC con l'introduzione del microcontrollore RP2040.
Il team RPI ha lanciato 2 schede microcontrollore, la Pico a £3.90 e la Pico_W a £6.30 (prezzi al 11 ottobre 2023). Quest'ultima ha il wifi integrato sulla scheda ed è quella che mi interessa esplorare oggi.

Quindi, cos'è un microcontrollore e cosa c'entra con l'IoT? Il microcontrollore RP2040 RPI Pico è un piccolo computer su un singolo circuito integrato. Sono diventati scatole nere molto efficaci, efficienti e relativamente economiche che permettono di monitorare, misurare, strumentare gli oggetti fisici e registrare e trasmettere i dati a un'altra posizione. O, in termini semplici, l'RP2040 può essere considerato come un interprete – può essere connesso a dispositivi fisici – le "Cose" – e integrarli nel cloud, ovvero internet. Quindi, ora abbiamo un meccanismo per la condivisione bidirezionale dei dati in tempo quasi reale, se necessario, da parte delle "Cose" fisiche.

Allora, perché questo blog… beh, sorpresa, sorpresa, ancora una volta è il nuovo silicon di Apple che si trova all'interno del mio MacBook! La Fondazione RaspberryPi ha creato documentazione fantastica e guide per iniziare, tuttavia queste si concentrano attualmente sui Mac basati su Intel x86 e Apple si è allontanata da Intel con le proprie CPU proprietarie. L'uso della documentazione ufficiale insieme a queste note dovrebbe aiutarti a configurarti e a iniziare in modo più efficace.

La guida principale che sto utilizzando è Introduzione a Raspberry Pi Pico

Allora, iniziamo proprio così, iniziamo…

Prerequisiti

Un grande presupposto da parte mia è che tu, lettore, abbia una conoscenza di base dello sviluppo. Ad esempio, sei familiare con git, homebrew, pacchetto Xcode, vscode ecc…

  1. Crea una directory pico dove scaricheremo i nostri SDK, librerie e codice di esempio
mkdir ~/repos/pico
  1. Installa i seguenti 5 repository
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. Installa Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  1. Installa la Toolchain
brew install cmake
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
  1. Apple silicon M1/M2 – installa l'emulatore Intel e accetta la licenza
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
  1. Configura i seguenti percorsi nel tuo shell predefinito. Nota: sto usando la fish shell qui – potresti dover modificare questo per adattarlo all'ambiente che stai attualmente utilizzando. Ho dovuto modificare il mio ~/.config/fish/config.fish per includere queste variabili d'ambiente
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

La nostra prima app

  1. Ora costruiamo la nostra prima app, blink per la scheda pico_w. Nota: L'app blink predefinita nel repository degli esempi è per la scheda pico senza wifi – il suo LED è cablato fisicamente in una posizione diversa rispetto al pico_w, da qui la necessità di un'app blink diversa situata nella sottocartella wifi!
cd $PICO_EXAMPLES_PATH
mkdir build
cd build
cmake -DPICO_BOARD=pico_w ..
cd pico_w/wifi/blink
make -j4
  1. Questo dovrebbe risultare nella creazione dei seguenti file
-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

Il file picow_blink.uf2 è ciò che è richiesto quando si copia 'manualmente' il programma sul pico_w. Questo richiede una pressione e tenuta del pulsante BOOTSEL E lo scollegamento/riconnessione del cavo USB per mettere l'rp2040 in modalità bootloader.
Quando l'RP2040 è nella modalità corretta dovrebbe apparire come un'unità aggiuntiva, RPI-RP2, sul tuo MacBook nell'app Finder sotto Posizioni nella parte sinistra.

Pico Bootloader Mode

Trascina semplicemente (copia) il file picow_blink.uf2 sulla radice dell'unità RPI-RP2 e succede la magia – il Pico_W carica il nuovo programma, si disconnette dal MacBook (RPI-RP2 scompare dalle unità collegate), si resetta ed esegue il programma appena caricato. Se è andato a buon fine dovresti vedere il lampeggiamento interno come segue

flashing gif

Le interazioni manuali, come tutti sappiamo, non sono sempre favorevoli alla produttività – diventa molto noioso molto velocemente se stai iterando su alcune modifiche al codice e devi continuare a collegare/scollegare e premere pulsanti per testare queste modifiche.

Miglioramenti del pipeline

È qui che entra in gioco la porta SWD (Serial Wire Debug) e, sebbene aggiunga un po' più di complessità alla configurazione del nostro toolchain/pipeline, migliora anche la produttività e l'UX (esperienza utente).

La complessità aggiuntiva si presenta sotto forma di una sonda di debug aggiuntiva con il software appropriato. Una sonda ufficiale potrebbe essere acquistata qui o potresti fare come ho fatto io e semplicemente usare un Pico di scarto come descritto nella documentazione ufficiale in Appendice A: Utilizzo di Picoprobe

  1. Installa alcuni prerequisiti aggiuntivi per assicurarci di poter costruire l'OpenOCD specifico per il controller RP2040 – questo non funziona con la versione predefinita di Homebrew!!! [Nota a parte: sono riuscito a far funzionare l'OpenOCD predefinito una volta che l'ho puntato verso le configurazioni di RaspberryPi che facevano parte del repository RPI OpenOCD.]
brew install libtool automake libusb wget pkg-config gcc texinfo
  1. Scarica e costruisci la versione RaspberryPi di 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. C'è un altro intoppo di compilazione per Apple contro Intel silicon quando si costruisce OpenOCD che è risolto usando questo workaround prima della costruzione…
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

Poi continua fino a quando non hai una costruzione di successo come segue.

./bootstrap
./configure --disable-werror
make -j4

Verifica che funzioni

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

Gli errori sopra sono previsti poiché non abbiamo fornito al debugger alcuna configurazione significativa…questa arriverà più tardi.

Quello è il software OpenOCD sul Mac pronto, ora dobbiamo costruire l'applicazione che verrà caricata sul Debugger RP2040 Pico.

  1. Dobbiamo scaricare il software del debugger probe dal repository RaspberryPi Probe e costruire il binario
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

Output

[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

Utilizzando lo stesso processo seguito nel passaggio 8 sopra possiamo ora copiare picoprobe.uf2 sul pico che verrà utilizzato come Debug Probe [ricorda di tenere premuto il pulsante BOOTSEL prima di collegare il Pico alla porta USB]

picoprobe compiled software

Quasi arrivati! Gli ultimi passaggi sono il cablaggio fisico del PicoProbe – assicurati di seguire la documentazione ufficiale per questo. Dovrebbe assomigliare a qualcosa del genere

Physical Wiring Diagram

E questo è come appare la mia configurazione effettiva, sì, ho le schede dall'altra parte rispetto al diagramma ma il cablaggio è lo stesso. Inoltre, potresti notare che nella mia configurazione il PicoProbe utilizza una scheda Pico e lo sto usando per programmare una scheda Pico W.

mysetup

Puoi usare ls per vedere se la nuova sonda viene rilevata una volta che hai copiato il software e assicurarti che il cavo USB sia ancora collegato.
Se non vedi il dispositivo /dev/tty.usbmodemXXX, prova a rimuovere e riconnettere il dispositivo Pico dall'USB.

ls -al /dev/tty.usb*
crw-rw-rw-  1 root  wheel  0x9000002 11 Oct 17:01 /dev/tty.usbmodem102
  1. Installa minicom, un programma emulatore di terminale, e usalo per connetterti alla porta UART (Universal Asynchronous Receiver Transmitter) del PicoProbe
brew install minicom
minicom -D /dev/tty.usbmodem102 -b 115200

Risultato nell'esecuzione dell'emulatore di terminale

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 ti farà uscire da questa applicazione

Ora siamo pronti per testare un deployment di un'applicazione utilizzando il PicoProbe.

Utilizzeremo l'applicazione più semplice – Hello World – e la compileremo per utilizzare la sua interfaccia UART invece di USB. Quindi dovremmo essere in grado di vedere l'output attraverso l'interfaccia UART del PicoProbe.

Esecuzione di prova

  1. Costruisci l'esempio Hello_World per utilizzare la seriale UART invece dell'USB
cd $PICO_EXAMPLES_PATH/build/hello_world/serial
make -j4

Questo crea il file hello_serial.elf che è richiesto dal PicoProbe per il trasferimento al target. Si prega di ricordare, ora useremo il .elf invece del file .uf2 poiché questo formato è richiesto quando lo si invia attraverso l'interfaccia diversa. Entrambi i formati sono creati per impostazione predefinita.

  1. Ora trasferiamo il file utilizzando l'applicazione OpenOCD appena costruita – nessuna pressione manuale di pulsanti o collegamento/scollegamento di cavi richiesto!
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"

Il che dovrebbe portare a qualcosa del genere

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. E infine, per verificare che l'applicazione hello_world sia effettivamente caricata nel nostro Pico_W target e funzioni, controlliamo l'UART del dispositivo utilizzando minicom.
minicom -D /dev/tty.usbmodem102 -b 115200

Se hai avuto successo mentre lavoravi attraverso questo tutorial dovresti ora avere un emulatore di terminale pieno delle seguenti dichiarazioni

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

Cosa succede dopo?

Congratulazioni! Ora puoi aggiungere la programmazione embedded come un'altra abilità sul tuo CV 😉
I successivi post IoT su il mio blog faranno riferimento a questo per la configurazione di base che sto utilizzando.

Ora per collegare quella vecchia ombrello alla rete interweb.

Coding felice!

Graz

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

← All posts