Raspberry Pi Pico おぼえがき
02基本的な操作:コードを書いてバイナリを作る
Raspberry Pi Pico C/C++ SDKでの開発おぼえがきです。
環境構築が終わったらいよいよコードを書いてuf2バイナリを作ります。
1. ディレクトリ・ファイル構成
前回の
01.開発環境構築ではホーム直下のpicoディレクトリに諸々をインストールしました。
例として今回は、このpicoディレクトリ内にcodesディレクトリを作り、さらにその中に各プロジェクトのディレクトリを作成します。
WSL2 ubuntuコンソール
cd ~/pico
mkdir codes
cd codes
mkdir -p test1/build
cd test1
cp -p ../../pico-sdk/external/pico_sdk_import.cmake ./
ディレクトリ構成(例)
pico/
├(略)
└codes/
└test1/
├build/ この中に.uf2ファイルが生成される
├test1.cpp ソースコード
├pico_sdk_import.cmake pico-sdkにあるファイルをコピー
└CMakeLists.txt cmakeのための設定ファイル
ソースコードの拡張子はCなら ".c" 、C++なら ".cpp" にします。コンパイル時に拡張子でC/C++が判別されます。
例えば拡張子を.cにして中身をC++のコードにしたりするとmakeの段階でしっかり怒られます。
2. C/C++のソースコードを書く
test1.cppにコードを書いていきます。
試しにPicoボード上のLEDを0.5秒おきに点滅させるプログラムをC++で書きます。
test1.cpp
#include "pico/stdlib.h"
const uint_fast8_t PIN_LED = 25; // Picoボード上LEDのGPIO番号(Pico Wでは指定方法が異なるので注意)
int main(){
gpio_init(PIN_LED);
gpio_set_dir(PIN_LED, GPIO_OUT);
while(true){
gpio_put(PIN_LED, 0);
sleep_ms(500);
gpio_put(PIN_LED, 1);
sleep_ms(500);
}
return 0;
}
Q1. main()がvoidではなくintを返すようにしているのはどうして?
A1. Cではvoidに出来ますが、C++ではintを返すようにしないとコンパイルエラーになります。とりあえず今はそういう仕様だという理解で……
3. CMakeのための準備
CMakeLists.txt を以下の内容で作成します。
CMakeLists.txt
# 以下2行(赤字部分)はRaspberry Pi Pico 2用のバイナリを作る場合にのみ必要
set(PICO_PLATFORM rp2350-arm-s)
set(PICO_BOARD pico2)
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
set(PROG_NAME test1)
project(${PROG_NAME} C CXX ASM)
set(CMAKE_C_STNDARD 11)
set(CMAKE_CXX_STNDARD 17)
pico_sdk_init()
add_executable(${PROG_NAME}
${PROG_NAME}.cpp
)
pico_enable_stdio_usb(${PROG_NAME} 1)
pico_enable_stdio_uart(${PROG_NAME} 0)
pico_add_extra_outputs(${PROG_NAME})
target_link_libraries(
${PROG_NAME}
pico_stdlib
)
変数をセットする:
set(変数名 値)
変数を使う:
${変数名}
標準出入力先の設定(1: 有効、0: 無効)
pico_enable_stdio_usb
: 接続したPCのUSBシリアルコンソール
pico_enable_stdio_uart
: UART(GPIOピン)
printfの出力先などになります。デバッグ時はpico_enable_stdio_usbを指定しておくと便利でしょう。
target_link_librariesで
pico_stdlib
を読み込むように指示していますが、これはソースコードの冒頭の
#include "pico/stdlib.h"
に対応します。
Pico SDKを使う場合、例えばマルチコアを扱う際には
#include "pico/multicore.h"
→
pico_multicore
、I2C通信を扱う際には
#include "hardware/i2c.h"
→
hardware_i2c
などを読み込ませます。
4. ビルド:uf2バイナリを作る
buildディレクトリに入ってビルドします。
WSL2 ubuntuコンソール
cd ~/pico/codes/test1/build
cmake ..
make
makeには結構な時間がかかります。成功するとbuildディレクトリ内にtest1.uf2ファイルが出来ているはずです。
5. Picoにuf2バイナリを転送する
Picoボード上のBOOTSELボタンを押しながらPC(Windows)にUSB接続
↓
PCのエクスプローラにドライブとしてマウントされる ※1
↓
そのドライブにtest1.uf2ファイルをPicoのドライブにコピーする
↓
ドライブがアンマウントされ、Pico上でプログラムが動作し始める。
※1 Windows側であらかじめドライバインストールが必要な場合があります。
6. 参考資料(外部リンク)