Apple Silicon搭載Pico RP2040でのIoT開発準備
2023-11-06
Machine-translated from English. Read the English original

Raspberry Pi Pico W マイコンツールチェーンで使用するためのM2 Max MacBookの設定。
IoTパイプラインには、通常「T」がthingを物理デバイスであることを意味するという追加の課題があります。
この記事では、RP2040マイクロコントローラの導入により、Raspberry PiがASICチップ開発に初めて取り組んだ際、ラップトップを設定して遊んでいる間に得た楽しさと学びを詳述しています。
RPIチームは2つのマイクロコントローラボードを発売しました。Pico(£3.90)とPico_W(£6.30)です(2023年10月11日時点の価格)。後者はボードにWiFiが内蔵されており、今日私が遊んでみたいと思っているものです。
では、マイクロコントローラとは何か、そしてそれがIoTとどう関係するのか? RP2040 RPI Picoマイクロコントローラは、単一の集積回路上の小型コンピュータです。これらは非常に効果的、効率的、そして比較的安価なブラックボックスとなり、物理的なアイテムの監視、測定、計装、およびデータの記録と他の場所への送信を可能にします。あるいは、一般の人々の言葉で言えば、RP2040は通訳のように考えることができます – 物理的なデバイス(「Things」)に接続し、それらをクラウド、つまりインターネットに統合することができます。したがって、今や物理的な「Things」が、必要に応じて、ほぼリアルタイムで双方向のデータ共有を行うメカニズムを持っています。
では、なぜこのブログが必要なのか… まあ、驚くことではありませんが、またしてもMacBookの中にあるのはAppleの新しいシリコンです! Raspberry Pi財団は素晴らしいドキュメントと始め方のガイドを作成しましたが、これらは現在x86 IntelベースのMacに焦点を当てており、Appleは独自の専用CPUに移行しました。公式ドキュメントとこれらのメモを併用することで、より効果的にセットアップできることを願っています。
私が主に使用しているガイドはRaspberry Pi Picoの始め方です。
では、始めましょう…
前提条件
私の大きな前提として、あなた、読者の方は、いくつかの基本的な開発者の知識を持っていることです。例えば、git、homebrew、Xcodeパッケージ、vscodeなどに精通していることなどです…
- SDK、ライブラリ、サンプルコードをダウンロードする
picoディレクトリを作成します
mkdir ~/repos/pico
- 以下の5つのリポジトリをインストールします
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
- Homebrewをインストールします
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
- ツールチェーンをインストールします
brew install cmake
brew tap ArmMbed/homebrew-formulae
brew install arm-none-eabi-gcc
- Apple silicon M1/M2 – Intelエミュレータをインストールし、ライセンスに同意します
/usr/sbin/softwareupdate --install-rosetta --agree-to-license
- デフォルトのシェルで以下のパスを設定します。注:ここではfish shellを使用しています – 現在使用している環境に合わせて変更する必要があるかもしれません。私は
~/.config/fish/config.fishを変更してこれらの環境変数を含める必要がありました
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
最初のアプリ
- さて、最初のアプリをビルドしましょう。
blinkはpico_wボード用です。注:examplesリポジトリのデフォルトのblinkアプリはWiFiなしのpicoボード用です – そのLEDはpico_wとは物理的に異なる場所に配線されているため、wifiサブフォルダにある異なるblinkアプリが必要です!
cd $PICO_EXAMPLES_PATH
mkdir build
cd build
cmake -DPICO_BOARD=pico_w ..
cd pico_w/wifi/blink
make -j4
- これにより、以下のファイルが作成されるはずです
-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
picow_blink.uf2ファイルは、プログラムをpico_wに「手動で」コピーする際に必要です。rp2040をブートローダモードにするには、BOOTSELボタンを押し続けたままUSBケーブルを抜いて再接続する必要があります。
RP2040が正しいモードになると、MacBookのFinderアプリの左側の「場所」の下に、追加のドライブRPI-RP2として表示されるはずです。

単にpicow_blink.uf2ファイルをRPI-RP2ドライブのルートにドラッグ(コピー)するだけで、魔法が起こります – Pico_Wが新しいプログラムを読み込み、MacBookから切断され(RPI-RP2が接続されたドライブから消え)、リセットして新しく読み込まれたプログラムを実行します。成功した場合は、次のようにオンボードの点滅が見えるはずです

手動での操作は、ご存知の通り、必ずしも生産性に寄与するものではありません – コードの変更を反復してテストするためにプラグイン/ unpluggingとボタンの押し続けが必要だと、すぐに退屈になってしまいます。
パイプラインの改善
ここでSWD(Serial Wire Debug)ポートが活躍します。これはツールチェーン/パイプラインセットアップに少し複雑さを加えますが、生産性とUX(ユーザー体験)も向上させます。
追加される複雑さは、適切なソフトウェアを備えた追加のデバッグプローブの形態で現れます。公式のプローブはこちらで購入できますが、付録A: Picoprobeの使用の公式ドキュメントで説明されているように、予備のPicoを単に使用することもできます。
- RP2040コントローラ固有のOpenOCDをビルドできるように、いくつかの追加の前提条件をインストールします – これはデフォルトのHomebrewバージョンでは機能しません!!! [余談:RPI OpenOCDリポジトリの一部であるRaspberry Pi構成を指すように設定すると、デフォルトのOpenOCDが一度動作しました。]
brew install libtool automake libusb wget pkg-config gcc texinfo
- Raspberry Pi版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"
- OpenOCDをビルドする際のAppleとIntelのシリコンの違いに関する別のコンパイルの罠があり、ビルド前にこの回避策を使用して解決します…
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
その後、以下のように成功したビルドが行われるまで続けます。
./bootstrap
./configure --disable-werror
make -j4
実行を確認します
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
上記のエラーは、デバッガに意味のある構成を提供していないため、予想されます…それは後ほど来ます。
これでMac上のOpenOCDソフトウェアの準備が整いました。次に、RP2040 Picoデバッガにロードされるアプリケーションをビルドする必要があります。
- Raspberry Pi Probeリポジトリからデバッガプローブソフトウェアをダウンロードし、バイナリをビルドする必要があります
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
出力
[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
上記のステップ8で従ったのと同じプロセスを使用して、picoprobe.uf2をデバッグプローブとして使用されるPicoにコピーできます [PicoをUSBポートに接続する前にBOOTSELボタンを押したままにすることを忘れないでください]

ほぼ完了です! 最後のステップはPicoProbeの物理的な配線です – これについては公式ドキュメントに従ってください。以下のようなものになるはずです

そして、これが私の実際のセットアップの外観です。はい、図とは逆の方向にボードを配置していますが、配線は同じです。また、私のセットアップではPicoProbeがPicoボードを使用しており、Pico Wボードをプログラムするために使用していることに気づくかもしれません。

ソフトウェアをコピーし、USBケーブルがまだ接続されていることを確認した後、新しいプローブが検出されたかどうかを確認するためにlsを使用できます。
/dev/tty.usbmodemXXXデバイスが表示されない場合は、PicoデバイスをUSBから取り外して再接続してみてください。
ls -al /dev/tty.usb*
crw-rw-rw- 1 root wheel 0x9000002 11 Oct 17:01 /dev/tty.usbmodem102
- ターミナルエミュレータプログラムであるminicomをインストールし、それを使用してPicoProbeのUART(Universal Asynchronous Receiver Transmitter)ポートに接続します
brew install minicom
minicom -D /dev/tty.usbmodem102 -b 115200
ターミナルエミュレータが実行される結果
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でこのアプリケーションから退出できます
これで、PicoProbeを使用してアプリケーションデプロイメントをテストする準備が整いました。
最も単純なアプリケーション – Hello World – を使用し、USBインターフェースではなくUARTを使用するようにコンパイルします。そうすれば、PicoProbeのUARTインターフェースを通じて出力を見ることができるはずです。
テストラン
- USBの代わりにシリアルUARTを使用する
Hello_World例をビルドします
cd $PICO_EXAMPLES_PATH/build/hello_world/serial
make -j4
これにより、PicoProbeがターゲットに転送するために必要なhello_serial.elfファイルが作成されます。覚えておいてください、今から.elfではなく.uf2ファイルを使用します。これは、異なるインターフェースを通じて送信する際に必要な形式です。両方の形式がデフォルトで作成されます。
- さて、新しくビルドされたOpenOCDアプリケーションを使用してファイル転送を行いましょう – 手動のボタン押しやケーブルの抜き差しは不要です!
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"
以下のような結果が得られることを願っています
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
- 最後に、
hello_worldアプリケーションが実際にターゲットのPico_Wにロードされて動作していることを確認するために、minicomを使用してデバイスのUARTを確認しましょう。
minicom -D /dev/tty.usbmodem102 -b 115200
このチュートリアルを順調に進められた場合、以下のようなステートメントで満たされたターミナルエミュレータが得られるはずです
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
次は?
おめでとうございます! これで、埋め込みプログラミングがもう一つのスキルとしてあなたのCVに追加できます 😉
私のブログの今後のIoT投稿では、私が活用している基本的なセットアップを参照します。
さて、その古い傘をインターネットに接続しましょう。
ハッピーコーディング!
Originally published on allthingscloud.eu (2023-11-06).