Raspberry Pi Pico おぼえがき
02基本的な操作:コードを書いてバイナリを作る

2024-10-22作成
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. 参考資料(外部リンク)
理系的な戯れ - Raspberry Pi Picoのcmakeを用いたオリジナルプロジェクト
yoshiyuki's blog - Raspberry Pi Pico / Serial 通信ができるまで

Raspberry Pi Pico おぼえがき
INDEX(HOMEに戻る)

ritsuka@ritsukaPya@ritsukaPya@misskey.io
ツイートmisskey.io