Raspberry Pi Pico 2 を入手したので動作確認する (USB で Hello, World 編)
今年 (2024 年) の 8 月に Raspberry Pi Pico 2 (以下 Pico 2) が発表され、各パーツショップでも取り扱いが始まりました。まだ初代 Pico の理解も進んでいない私としてはちょっと待ってほしいところですが、CPU コアが Cortex-M33 となり、FPU が利用できるようになったのはうれしいです。というわけで取り急ぎ Pico 2 を入手し、SDK の公式サンプルプログラムである hello_usb が動くかどうかを確認しました。
目次
購入品一覧
今回の購入品は次のとおりです。この中で最低限必要なのは Pico 2 本体と USB ケーブルだけです。
品名・型番 | メーカー | 参考単価 (円) | 備考 |
---|---|---|---|
Raspberry Pi Pico 2 | Raspberry Pi 財団 | 880 | ― |
ピンヘッダー (オスL型) 1×40 | ― | 50 | (*1) |
細ピンヘッダー 1×40 | ― | 45 | (*2) |
ブレッドボード EIC-801 | E-CALL ENTERPRISE | 370 | (*3) |
USB ケーブル | ― | 1,000 程度 | (*4) |
(*1) | デバッグ (SWD) 端子用として。3 ピン分だけ折って使う。秋月電子通商にて購入。販売コード: 101627 |
(*2) | ブレッドボードに挿すには細ピンのほうがいいらしい。真ん中で折って 20 ピン × 2 個として使う。秋月電子通商にて購入。販売コード: 106631 |
(*3) | 必須ではないが、あればなにかと便利。 |
(*4) | コネクタ形状が A - USB 2.0 micro-B タイプで、給電可能なもの。初代 Pico で使っていたものがあれば、それを流用できる。 |
Pico 2 用クロス開発環境の構築
基本的には初代 Pico のときと同じ手順で開発環境を構築します。詳しくは次の記事を参照してください。
なお、今回は RP2350 の CPU コアである Cortex-M33 向けとなるので、前回 (Cortex-M0+ 向け) とは別のディレクトリに構築します (もしかしたら共通でいけるのかもしれないが…よくわからないので、一応インストール先を分けることにします)。初代のときは ~/pico/arm-none-eabi/ だったので、今回は ~/pico2/arm-none-eabi/ にインストールすることにします。
まず、依存するパッケージがインストールされていなければインストールします。
# pkg install -y gmake gcc gmp expat guile3 iconv lzma mpfr python zlib-ng
ビルド用およびインストール先のディレクトリを作ります。
% mkdir -p ~/pico2/arm-none-eabi-build/ ~/pico2/arm-none-eabi/
% cd ~/pico2/arm-none-eabi-build/
% mkdir binutils-build/ gcc-build/ newlib-build/ gdb-build/
各ツールのソースコードを取得して展開します。
% wget wget https://ftp.gnu.org/gnu/binutils/binutils-2.43.tar.xz
% wget https://ftp.gnu.org/gnu/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz
% wget ftp://sourceware.org/pub/newlib/newlib-4.4.0.20231231.tar.gz
% wget https://ftp.gnu.org/gnu/gdb/gdb-15.2.tar.xz
% tar Jxf binutils-2.43.tar.xz
% tar Jxf gcc-14.2.0.tar.xz
% tar xzf newlib-4.4.0.20231231.tar.gz
% tar Jxf gdb-15.2.tar.xz
binutils をビルドしてインストールします。
% cd ~/pico2/arm-none-eabi-build/binutils-build
% ../binutils-2.43/configure --target=arm-none-eabi --prefix=/home/mijinco/pico2/arm-none-eabi --with-cpu=cortex-m33 --with-no-thumb-interwork --with-mode=thumb
% gmake all install
GCC をビルドするために binutils へのパスを通します。
% export PATH="~/pico2/arm-none-eabi/bin:$PATH"
GCC と libgcc をビルド、インストールします。
% cd ~/pico2/arm-none-eabi-build/gcc-build
% ../gcc-14.2.0/configure --target=arm-none-eabi --prefix=/home/mijinco/pico2/arm-none-eabi --with-cpu=cortex-m33 --enable-languages=c,c++ --without-headers --with-newlib --with-no-thumb-interwork --with-mode=thumb
% gmake all-gcc install-gcc
% gmake all-target-libgcc install-target-libgcc
Newlib をビルド、インストールします。
% cd ~/pico2/arm-none-eabi-build/newlib-build
% ../newlib-4.4.0.20231231/configure --target=arm-none-eabi --prefix=/home/mijinco/pico2/arm-none-eabi --disable-newlib-supplied-syscalls
% gmake all install
Newlib への対応のため、再度 GCC を configure して make します。
% cd ~/pico2/arm-none-eabi-build/gcc-build
% ../gcc-14.2.0/configure --target=arm-none-eabi --prefix=/home/mijinco/pico2/arm-none-eabi --with-cpu=cortex-m33 --enable-languages=c,c++ --with-newlib --with-no-thumb-interwork --with-mode=thumb
% gmake all-gcc install-gcc
続いて GDB です (今回は使いませんが)。
% cd ~/pico2/arm-none-eabi-build/gdb-build
% ../gdb-15.2/configure --target=arm-none-eabi --prefix=/home/mijinco/pico2/arm-none-eabi --disable-nls
% gmake all install
最後に libstdc++ です。Pico SDK をビルドするのに必要となります。
% cd ~/pico2/arm-none-eabi-build/gcc-build
% gmake all-target-libstdc++-v3 install-target-libstdc++-v3
picotool のビルドとインストール
ELF ファイルから UF2 ファイルへの変換を行うのに picotool というツールが必要です。ビルドとインストールの方法については、次の記事を参照してください。
Pico SDK および Pico Examples
Pico SDK と Pico Examples を Pico 2 向けにビルドする手順を示します。また、参考までに初代 Pico 向けにビルドする方法と、両 Pico を共存させるための CMakeLists.txt の書きかたも示します。
ソースコードの取得
ソースコードは Pico SDK も Pico Examples も GitHub から取得することができます。ここでは ~/pico/repo/ にクローンします。
% cd ~/pico/repo/
% 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
ちなみに Pico SDK をアップデートするときは次のようにします。
% cd ~/pico/repo/
% git pull
% git submodule update
サンプルコードのビルド
Pico Examples を Pico 2 向けにビルドします。cmake
の際に-DPICO_BOARD=pico2
を指定しましょう。また、上のほうに書いたとおり、ツールチェインが ~/pico2/arm-none-eabi/ に、picotool が ~/pico/tools/ にインストールされているものとし、それぞれPICO_TOOLCHAIN_PATH
とpicotool_DIR
に指定します。ビルド用のディレクトリは build_pico2 としておきます。こうすることで初代 Pico 向けのビルド用ディレクトリと分けることができます。
% cd ~/pico/repo/pico-examples
% mkdir build_pico2; cd build_pico2
% export PICO_SDK_PATH=../../pico-sdk
% cmake -DPICO_BOARD=pico2 -DPICO_TOOLCHAIN_PATH=~/pico2/arm-none-eabi -Dpicotool_DIR=~/pico/tools/picotool ..
% gmake
参考: 初代 Pico 向けのビルド
参考までに、初代 Pico 向けにビルドする方法も記載します。-DPICO_BOARD=pico
を指定するか、このオプション自体を省略すれば初代 Pico 向けになります。また、ツールチェインは ~/pico/arm-none-eabi/ に、picotool は ~/pico/tools/ にインストールされているものとします。
% cd ~/pico/repo/pico-examples
% mkdir build_pico1; cd build_pico1
% export PICO_SDK_PATH=../../pico-sdk
% cmake -DPICO_TOOLCHAIN_PATH=~/pico/arm-none-eabi -Dpicotool_DIR=~/pico/tools/picotool ..
% gmake
参考: pico-examples/CMakeLists.txt を Pico 1/2 両対応にする
PICO_TOOLCHAIN_PATH
やpicotool_DIR
の値を毎回コマンドラインで指定するのは面倒くさいです。もし pico-examples/CMakeLists.txt に手を加えることに抵抗がなければ、先頭付近に次のように書くことで楽ができます。
# set path to tools.
set(tools $ENV{HOME}/pico/arm-none-eabi)
if (PICO_BOARD)
set(tools $ENV{HOME}/${PICO_BOARD}/arm-none-eabi)
endif()
set(PICO_TOOLCHAIN_PATH ${tools})
set(picotool_DIR ~/pico/tools/picotool)
-DPICO_BOARD
にpico2
が与えられたらツールチェインのパスが ~/pico2/arm-none-eabi/ になり、無指定かpico2
以外が与えられたら ~/pico/arm-none-eabi/ になります。
プログラムの書き込みと実行
プログラムの書き込み方法は初代 Pico のときと同じです。詳しくは過去記事を参照してください (過去記事への転送ばかりですみません)。
このあと出てくる picowrite.sh という自作スクリプトもこの記事に掲載しています。
今回もまた L チカというのもあれなので、今回は USB シリアル通信で Hello, World を送信するサンプルを試してみましょう。Pico 2 の BOOTSEL スイッチを押しながらパソコンに USB 接続して、次の手順で UF2 ファイルを書き込みます。
% cd ~/pico/repo/pico-examples/build_pico2/hello_world/usb/
# ~/pico/tools/picowrite.sh hello_usb.uf2
書き込みが完了するとリセットがかかり、Pico 2 から一方的に Hello, World を送り付けている状態になります。ホスト PC 側で何らかの通信ソフトを開き、受信してみましょう。ここでは cu コマンドを使います。次のように表示されれば、正常に受信できています。
# cu -s 115200 -l /dev/cuaU0
Connected
Hello, world!
Hello, world!
Hello, world!
...
終了させるときは「~.
」 (チルダとピリオド) を入力します。
おわりに
とりあえず Pico 2 も初代 Pico と同様にして開発できることがわかりました。またしばらくは初代のほうに戻ってやりかけのことをやりたいと思いますが、その前にせっかくなので浮動小数点演算についても確認しておきたいと思います (次回につづく)。