Preparación para el desarrollo de Internet de las Cosas (IoT) en Apple Silicon con el Pico RP2040
2023-11-06
Machine-translated from English. Read the English original

Configuración de un MacBook M2 Max para su uso con la cadena de herramientas del microcontrolador RaspberryPi Pico W.
Las tuberías de IoT presentan el desafío añadido de que la “T” suele implicar que el thing es un dispositivo físico.
Este artículo detalla la diversión y los aprendizajes que obtuve mientras configuraba mi portátil para facilitar la experimentación con la primera incursión de RaspberryPi en el desarrollo de chips ASIC con la introducción del microcontrolador RP2040.
El equipo de RPI ha lanzado 2 placas de microcontroladores, el Pico a 3,90 £ y el Pico_W a 6,30 £ (precios a partir del 11 de octubre de 2023). Este último tiene wifi integrado en la placa y es el que me interesa probar hoy.
Entonces, ¿qué es un microcontrolador y qué tiene que ver con IoT? El microcontrolador RP2040 RPI Pico es un pequeño ordenador en un único circuito integrado. Se han convertido en cajas negras muy eficaces, eficientes y comparativamente baratas que permiten monitorizar, medir, instrumentar los elementos físicos y registrar y transmitir los datos a otra ubicación. O, en términos sencillos, el RP2040 puede considerarse como un intérprete: puede conectarse a dispositivos físicos (“Cosas”) e integrarlos en la nube, es decir, en Internet. Así, ahora disponemos de un mecanismo para el intercambio bidireccional de datos en tiempo casi real, si fuera necesario, por parte de “Cosas” físicas.
Entonces, ¿por qué la necesidad de este blog... bueno, sorpresa, sorpresa, una vez más es el nuevo silicio de Apple el que está dentro de mi MacBook! La Fundación RaspberryPi ha creado una documentación fantástica y guías de inicio, sin embargo, estas se centran actualmente en Macs basados en Intel x86 y Apple ha abandonado Intel con sus propios procesadores propietarios. El uso de la documentación oficial junto con estas notas ayudará, espero, a ponerse en marcha de forma más eficaz.
La guía principal que estoy utilizando es Primeros pasos con Raspberry Pi Pico
Así que, vamos a hacerlo, empecemos...
Requisitos previos
Una gran suposición por mi parte es que usted, el lector, tiene algunos conocimientos básicos de desarrollador. Por ejemplo, está familiarizado con git, homebrew, paquete Xcode, vscode, etc...
- Cree un directorio
picodonde descargaremos nuestros SDK, bibliotecas y código de ejemplo
mkdir ~/repos/pico
- Instale los siguientes 5 repositorios
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
- Instale Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
- Instale la cadena de herramientas
brew install cmake
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
- Silicio Apple M1/M2: instale el emulador de Intel y acepte la licencia
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
- Configure las siguientes rutas en su shell predeterminado. Nota: Estoy utilizando el fish shell aquí, es posible que necesite modificar esto para adaptarlo al entorno que esté utilizando actualmente. Tuve que modificar mi
~/.config/fish/config.fishpara incluir estas variables de entorno
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
Nuestra primera aplicación
- Ahora construyamos nuestra primera aplicación,
blinkpara la placa pico_w. Nota: La aplicación blink predeterminada en el repositorio de ejemplos es para la placa pico sin wifi; su LED está cableado físicamente a una ubicación diferente que la pico_w, de ahí la necesidad de una aplicación blink diferente ubicada en la subcarpeta wifi.
cd $PICO_EXAMPLES_PATH
mkdir build
cd build
cmake -DPICO_BOARD=pico_w ..
cd pico_w/wifi/blink
make -j4
- Esto debería dar lugar a la creación de los siguientes archivos
-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
El archivo picow_blink.uf2 es lo que se requiere cuando se copia el programa de forma 'manual' en la pico_w. Esto necesita una pulsación y mantenimiento de la tecla BOOTSEL Y desenchufar/volver a enchufar el cable USB para poner el rp2040 en modo bootloader.
Cuando el RP2040 está en el modo correcto, debería aparecer como una unidad adicional, RPI-RP2, en su MacBook en la aplicación Finder bajo Ubicaciones en el lado izquierdo.

Simplemente arrastre (copie) el archivo picow_blink.uf2 a la raíz de la unidad RPI-RP2 y ocurre la magia: el Pico_W carga el nuevo programa, se desconecta del MacBook (RPI-RP2 desaparece de las unidades conectadas), se reinicia y ejecuta el programa recién cargado. Si ha sido exitoso, debería ver el parpadeo integrado como sigue

Las interacciones manuales, como todos sabemos, no siempre son propicias para la productividad: se vuelve muy aburrido muy rápido si está iterando en algunos cambios de código y necesita seguir enchufando/desenchufando y presionando botones para probar estos cambios.
Mejoras de la tubería
Aquí es donde entra en juego el puerto SWD (Serial Wire Debug) y, aunque añadirá un poco más de complejidad a nuestra configuración de cadena de herramientas/tubería, también mejora la productividad y la UX (experiencia de usuario).
La complejidad añadida viene en forma de una sonda de depuración adicional con el software adecuado. Se podría comprar una sonda oficial aquí o podría hacer lo que he hecho y simplemente usar un Pico de repuesto como se describe en la documentación oficial en Apéndice A: Uso de Picoprobe
- Instale algunos requisitos previos más para asegurarnos de que podemos construir el OpenOCD específico para el controlador RP2040: ¡esto no funciona con la versión predeterminada de Homebrew! [A parte: Logré que el OpenOCD predeterminado funcionara una vez que lo apunté a las configuraciones de RaspberryPi que formaban parte del repositorio RPI OpenOCD.]
brew install libtool automake libusb wget pkg-config gcc texinfo
- Descargue y construya la versión de RaspberryPi de 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"
- Hay otro problema de compilación para Apple versus silicio Intel al construir OpenOCD que se resuelve con este workaround antes de construir...
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
Luego continúe hasta tener una compilación exitosa como sigue.
./bootstrap
./configure --disable-werror
make -j4
Compruebe que se ejecuta
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
Los errores anteriores son esperados ya que no hemos proporcionado al depurador ninguna configuración significativa... eso viene más tarde.
Eso es el software OpenOCD en el Mac listo, ahora tenemos que construir la aplicación que se cargará en el depurador RP2040 Pico.
- Necesitamos descargar el software del depurador del repositorio RaspberryPi Probe y construir el 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
Salida
[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
Usando el mismo proceso seguido en el Paso 8 anterior, ahora podemos copiar picoprobe.uf2 en el Pico que se utilizará como Sonda de Depuración [recuerde mantener presionado el botón BOOTSEL antes de conectar el Pico al puerto USB]

¡Ya casi estamos! Los pasos finales son el cableado físico del PicoProbe: asegúrese de seguir la documentación oficial para esto. Debería verse algo así

Y esto es lo que parece mi configuración real, sí, tengo las placas al revés en comparación con el diagrama pero el cableado es el mismo. Además, puede notar que en mi configuración el PicoProbe utiliza una placa Pico y lo estoy usando para programar una placa Pico W.

Puede usar ls para ver si la nueva sonda se detecta una vez que haya copiado el software y asegúrese de que el cable USB sigue conectado.
Si no ve el dispositivo /dev/tty.usbmodemXXX, intente desconectar y volver a conectar el dispositivo Pico del USB.
ls -al /dev/tty.usb*
crw-rw-rw- 1 root wheel 0x9000002 11 Oct 17:01 /dev/tty.usbmodem102
- Instale minicom, un programa emulador de terminal, y úselo para conectarse al puerto UART (Receptor Transmisor Asíncrono Universal) del PicoProbe
brew install minicom
minicom -D /dev/tty.usbmodem102 -b 115200
Da lugar a la ejecución del emulador de terminal
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 le sacará de esta aplicación
Ahora estamos listos para probar un despliegue de aplicación utilizando el PicoProbe.
Usaremos la aplicación más sencilla: Hello World, y la compilaremos para usar su interfaz UART en lugar de USB. Luego deberíamos poder ver la salida a través de la interfaz UART del PicoProbe.
Ejecución de prueba
- Construya el ejemplo
Hello_Worldpara usar el UART serial en lugar del USB
cd $PICO_EXAMPLES_PATH/build/hello_world/serial
make -j4
Esto crea el archivo hello_serial.elf que es requerido por el PicoProbe para la transferencia al objetivo. Por favor, recuerde, ahora vamos a usar el .elf en lugar del archivo .uf2 ya que este formato es requerido al enviarlo a través de la interfaz diferente. Ambos formatos se crean por defecto.
- Ahora transfiramos el archivo utilizando la aplicación OpenOCD recién construida: ¡no se requieren pulsaciones manuales de botones ni enchufar/desenchufar cables!
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"
Lo cual, con suerte, dará lugar a algo como esto
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
- Y finalmente, para verificar que la aplicación
hello_worldestá realmente cargada en nuestro Pico_W objetivo y funcionando, echemos un vistazo al UART del dispositivo usandominicom.
minicom -D /dev/tty.usbmodem102 -b 115200
Si ha tenido éxito mientras trabajaba a través de este tutorial, ahora debería tener un emulador de terminal lleno de las siguientes declaraciones
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
¿Qué sigue?
¡Felicidades! Ahora puede añadir la programación embebida como otra habilidad en su CV 😉
Las publicaciones posteriores de IoT en mi blog harán referencia a esto para la configuración básica que estoy aprovechando.
Ahora para conectar ese viejo paraguas a la interweb.
¡Feliz codificación!Originally published on allthingscloud.eu (2023-11-06).