はじめに

VS Code に拡張を 1 つ入れるだけで、Pico SDK の C/C++ 環境がホームフォルダの .pico-sdk の中にそろい、Pico・Pico 2・WIZnet の評価ボードに UF2 を書けるようになる。この記事のゴールはそこです。到達点は 3 つ。①blink で基板の LED が点滅する、②Hello World が USB シリアルに流れる、③GitHub から取ってきた既存プロジェクト(WIZnet-PICO-C)を Import してビルドが通り、.uf2 ができる。そこへ行く前に確かめたいのは、拡張が「何を」「どこに」入れているかです。PATH や環境変数を書き換えて既存の環境を上書きするのか、それとも版ごとのフォルダに隣り合わせで足していくのか。だからこの記事では、まず拡張が入れる部品と置き場所を図にしてから、3 つの到達点を順に通します。

Pico SDK の環境構築は、以前は Windows 用インストーラや手作業の CMake・コンパイラ導入が必要でした。いまは Raspberry Pi 公式の Getting Started(2026-10-01 版)も VS Code 拡張を主経路にしていて、コマンドラインでの構築は付録に回っています。ここで扱うのは基礎だけです。デバッグや RISC-V、Zephyr・Rust は最後に「こういうこともできる」として触れるだけにします。

📌 この記事でわかること
  • Pico SDK は CMake で組み立てる公式の C/C++ SDK。RP2040(Pico)と RP2350(Pico 2)で同じ書き方が使える
  • VS Code 拡張は、SDK・コンパイラ・CMake・Ninja・picotool を ~/.pico-sdk/ の下に版ごとに置く。SDK 2.3.1 なら Arm GNU Toolchain 15.2.Rel1・CMake 4.3.4・Ninja 1.13.2・picotool 2.3.1 の組み合わせ
  • 手順は blink → Hello World(USB シリアル)→ 既存プロジェクトの Import の 3 段
  • WIZnet の評価ボード(W55RP20-EVB-Pico/W6300-EVB-Pico2)は SDK にボード定義が無いので pico/pico2 を選ぶ。W55RP20-EVB-Pico は LED が GPIO19 なので、blink は 1 行足して LED のピンを変える
  • RP2040 の基板を Windows で Run するには Zadig でドライバが要る。入れなくても .uf2 のコピーで書き込める

🧩 Pico SDK とは

CMake で組み立てる、RP2040/RP2350 共通の C/C++ SDK

Pico SDK(Raspberry Pi Pico-series C/C++ SDK)は、Raspberry Pi が公式に出している RP2040/RP2350 向けの C/C++ 開発キットです。GPIO・UART・SPI・I2C・PIO・USB などを扱うライブラリと、それをビルドするための CMake の仕組みがセットになっています。版は 2026-09-04 に出た 2.3.1 が最新です(GitHub のリリース)。

プロジェクトの骨格は、SDK の README にある最小の CMakeLists.txt を見るとつかめます。

cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)          # SDK の場所を探して読み込む(project() より前)
project(my_project C CXX ASM)
pico_sdk_init()                         # SDK を初期化
add_executable(hello_world hello_world.c)
target_link_libraries(hello_world pico_stdlib)   # 基本ライブラリをリンク
pico_add_extra_outputs(hello_world)     # .uf2 や .map なども作る
名前 何をするか
pico_sdk_import.cmake SDK のどこにあるか(PICO_SDK_PATH)を探して読み込む。SDK の external/ からプロジェクトにコピーして使う
pico_stdlib GPIO・時間・stdio など、ほとんどのプログラムが使う基本ライブラリの束
PICO_BOARD どの基板向けにビルドするか。pico・pico2・pico_w など。LED のピンや UART の既定ピンが基板ごとのヘッダで決まる
PICO_PLATFORM どのチップ向けか。rp2040・rp2350(Arm)・rp2350-riscv。ふつうは PICO_BOARD から自動で決まる
pico_enable_stdio_usb printf の出力先を USB シリアルにする(UART なら pico_enable_stdio_uart)

ビルドすると何ができるか

ビルドが終わると、同じプログラムからいくつかの形式のファイルができます(Getting Started 付録 C の表)。

拡張子 中身 使いどころ
.uf2 USB ドライブにコピーして書き込める形式 ふだんの書き込みはこれ
.elf プログラム全体(デバッグ情報を含むことがある) デバッガ・SWD での書き込み
.bin/.hex 生のバイナリ/その 16 進ダンプ 他のツールに渡すとき
.map/.dis メモリ配置の一覧/逆アセンブル サイズや配置を調べるとき

UF2 は Microsoft が作った USB 書き込み用の形式です。Pico の BOOTSEL ボタンを押しながら USB をつなぐと、基板が USB ドライブ(RPI-RP2 や RP2350)として見え、そこに .uf2 をコピーすると書き込まれて再起動します。BOOTSEL と UF2 の仕組みは自作ロジアナ #2 で書いています。VS Code 拡張の Run は、この書き込みを picotool で自動でやってくれるボタンです。

MicroPython・Arduino との位置づけ

Pico の開発方法は Pico SDK だけではありません。目的で選びます。

方法 書く言語 向いていること
Pico SDK(この記事) C/C++ 公式の例題・ハードウェアを細かく使う・速度やメモリを詰める
MicroPython Python すぐ試す・書いてその場で動かす
Arduino(arduino-pico) C++(Arduino API) Arduino のライブラリや書き方を使い回す

公式の C 例題(pico-examples)や、WIZnet-PICO-C のようなメーカー公式のサンプルは Pico SDK 前提で書かれています。それをそのままビルドして動かせるのが、この環境を作る一番の理由です。


📦 拡張が何をどこに入れるか

部品の一覧:拡張 1 つと、ホームの .pico-sdk

自分で入れるのは VS Code と Raspberry Pi Pico 拡張 の 2 つだけです。あとは拡張が、プロジェクトを作るときに必要な部品をダウンロードしてきます。置き場所は拡張のソース(src/utils/download.mts)で決まっていて、すべて ホームフォルダの .pico-sdk(Windows なら %USERPROFILE%\.pico-sdk)の下に、部品ごと・版ごとのフォルダ で並びます。

flowchart TD U["自分で入れる
VS Code + Raspberry Pi Pico 拡張"] --> D["プロジェクト作成時に
拡張がダウンロード"] D --> H["ホームの .pico-sdk/"] H --> S["sdk/2.3.1
Pico SDK 本体"] H --> T["toolchain/15_2_Rel1
Arm GNU コンパイラ"] H --> B["cmake/v4.3.4・ninja/v1.13.2
ビルドの道具"] H --> P["picotool/2.3.1
書き込み・情報表示"] H --> O["tools/2.3.1・openocd
(Python・Git は PC に無いときだけ)"]
フォルダ(.pico-sdk/ の下) 中身
sdk/<版> Pico SDK 本体(例: sdk/2.3.1)
toolchain/<版> Arm GNU Toolchain(C コンパイラ・リンカ)
cmake/<版>・ninja/<版> ビルドの設定を作る CMake と、実際にビルドを回す Ninja
picotool/<版> UF2 の書き込み・基板の情報表示をするツール
tools/<版> pioasm(PIO のアセンブラ)など SDK 付属のビルド済みツール
openocd/<版> SWD でのデバッグ・書き込み用(Debug Probe を使うとき)
python/<版>・git 拡張の内部処理に使う Python と Git。Windows で PC に見つからないときだけ拡張が用意する

拡張は、このほかに cmake/pico-vscode.cmake という小さなファイルを置きます。中身は「PICO_SDK_PATH を .pico-sdk/sdk/<版> に、コンパイラの場所を .pico-sdk/toolchain/<版> にする」という設定です。

Windows 11 の PC で、最初の blink を作ったあとの .pico-sdk は次のとおりでした。合計は 1.58 GB で、その 7 割がコンパイラです。

フォルダ 容量
toolchain/15_2_Rel1 1,106 MB
sdk/2.3.1 313 MB
cmake/v4.3.4 133 MB
openocd/0.12.0+dev 19 MB
picotool/2.3.1・tools/2.3.1・ninja/v1.13.2 6 MB・3 MB・1 MB

この PC には Git for Windows と Python(py ランチャー)がすでに入っていたので、python と git のフォルダは作られず、PC 側の Git(C:\Program Files\Git\cmd\git.exe)が使われました。

SDK 2.3.1 に紐づく版の組み合わせ

拡張は「SDK の版を選ぶと、それに合うツールの版が決まる」表を持っています(data/0.22.0/versionBundles.json)。最新の 2.3.1 と、ひとつ前の 2.2.0 を並べると次のとおりです。

部品 SDK 2.3.1 SDK 2.2.0
Arm GNU Toolchain 15.2.Rel1 14.2.Rel1
CMake 4.3.4 3.31.5
Ninja 1.13.2 1.12.1
picotool 2.3.1 2.2.0-a4

SDK を 2.2.0 から 2.3.1 に上げると、コンパイラも CMake も一緒に上がります。古い版は消えずに、隣のフォルダに残ります。

プロジェクト側に書かれるのは「どの版を使うか」だけ

拡張が作ったプロジェクトの CMakeLists.txt の先頭には、次のブロックが入ります(拡張の scripts/pico_project.py)。

# == DO NOT EDIT THE FOLLOWING LINES for the Raspberry Pi Pico VS Code Extension to work ==
if(WIN32)
    set(USERHOME $ENV{USERPROFILE})
else()
    set(USERHOME $ENV{HOME})
endif()
set(sdkVersion 2.3.1)
set(toolchainVersion 15_2_Rel1)
set(picotoolVersion 2.3.1)
set(picoVscode ${USERHOME}/.pico-sdk/cmake/pico-vscode.cmake)
if (EXISTS ${picoVscode})
    include(${picoVscode})
endif()
# ====================================================================================

プロジェクトが持っているのは 版の番号だけ で、実体はホームの .pico-sdk にあります。だから、プロジェクト A は SDK 2.2.0、プロジェクト B は 2.3.1、という使い分けができます。切り替えはサイドバーの Switch SDK(コマンドパレット Ctrl+Shift+P なら Raspberry Pi Pico: Switch Pico SDK)で、この行を書き換えるだけです。

もう一つ、プロジェクトの .vscode/settings.json にも拡張の設定が書かれます。CMake を .pico-sdk/cmake/v4.3.4/bin/cmake に、ジェネレータを Ninja に固定し、VS Code の中で開くターミナルの PATH・PICO_SDK_PATH・PICO_TOOLCHAIN_PATH を .pico-sdk の下に向けます。OS 全体の環境変数には手を付けず、そのプロジェクトを開いた VS Code の中だけ で道具が通る作りです。

💡 ESP-IDF の eim と同じ「隣に足す」考え方

ESP32 の ESP-IDF では、公式の EIM が複数の版を並べて置き、eim select で切り替えます。Pico の拡張も考え方は同じで、版ごとのフォルダに隣り合わせで足していき、プロジェクトごとに使う版を選びます。違うのは切り替えの単位で、EIM は「既定の版」を切り替えるのに対し、Pico の拡張は プロジェクトの CMakeLists.txt に版を書く ので、プロジェクトを開けば使う版が決まります。

入れる前に確かめること:旧インストーラと手動の SDK

拡張の README のトラブルシューティングには「以前の SDK のインストール(Pico setup for Windows や手動で入れたもの)は消しておくこと。拡張と競合することがある」と書かれています。旧 Windows インストーラ pico-setup-windows は、README の冒頭で「今後はサポートしない。VS Code 拡張を使うこと」と案内されています。

  • 「アプリと機能」に Raspberry Pi Pico SDK(pico-setup-windows)が残っていないか
  • 環境変数に PICO_SDK_PATH や PICO_TOOLCHAIN_PATH が設定されていないか

を、入れる前に見ておくと安心です。pico_sdk_import.cmake は、PICO_SDK_PATH が CMake 側で決まっていないときに環境変数の値を使う作りになっています。

ほかのマイコンのツールチェーンと VS Code の拡張がぶつかるのが心配なら、拡張の README にある VS Code プロファイル を使う方法もあります(配布されている Pico.code-profile を Profiles: Import Profile で読み込むと、Pico 専用のプロファイルに拡張が入る)。


🗺️ 手順の全体像と OS ごとの違い

ここからは Windows 11 で進めます。流れは次のとおりです。

flowchart TD A["① VS Code と
Raspberry Pi Pico 拡張を入れる"] --> B["② New Project From Example
blink を作る(初回は部品のダウンロード)"] B --> C["③ Compile → BOOTSEL で書き込み
LED が点滅"] C --> D["④ New C/C++ Project で hello_world
Console over USB → シリアル端末"] D --> E["⑤ Import Project で
WIZnet-PICO-C をビルド → .uf2"]

macOS と Linux でも手順は同じですが、拡張を入れる前に必要なものが違います(Getting Started 3.1・拡張の README)。

OS 先に入れるもの 備考
Windows 10/11 なし Git・Python は PC に無ければ拡張が用意する
Raspberry Pi OS(64 bit) なし Lite 版は「その他の Linux」と同じ扱い
macOS 14 以降 xcode-select --install Git と tar が入る。sudo xcodebuild -license が要ることもある
その他の Linux(x64/arm64) Python 3.10 以上・Git 2.28 以上・tar OpenOCD・picotool を sudo なしで使うなら udev ルール

① VS Code と拡張を入れる

  1. VS Code を code.visualstudio.com から入れる。拡張が求めるのは 1.105.1 以上 です
  2. VS Code の拡張機能ビュー(Ctrl+Shift+X)で Raspberry Pi Pico を検索し、発行元が Raspberry Pi のものを入れる(ID は raspberry-pi.raspberry-pi-pico)
  3. 左のアクティビティバーに Pico のアイコン(Raspberry Pi Pico Project)が出れば完了
拡張機能ビューの Raspberry Pi Pico。発行元が Raspberry Pi(認証マーク付き)であることを確かめてから入れる

拡張機能ビューの Raspberry Pi Pico。発行元が Raspberry Pi(認証マーク付き)であることを確かめてから入れる

2026-10-31 に入れたところ、入ったのは 0.23.0(GitHub のリリースの最新と同じ、SDK 2.3.1 対応を追加した版)でした。Marketplace のページには 0.23.1 と出ていましたが、入れたあとの画面に「プレリリース バージョンへの切り替え」ボタンがあるので、0.23.1 はプレリリース側の版とみられます。拡張の依存として、Cortex-Debug・MicroPico・Python の 3 つの拡張も一緒に入ります。

入れただけでは、まだ .pico-sdk フォルダは作られません。SDK とツールが入るのは、次の手順で最初のプロジェクトを作るときです。

左の Pico アイコンを開くと、拡張のメニュー(Quick Access)が出ます。この記事で使うのは、General の New Project From Example・New C/C++ Project・Import Project と、Project の Compile Project・Run Project (USB)・Switch SDK・Switch Board です。

拡張のサイドバー。General がプロジェクトを作る入口、Project が開いているプロジェクトへの操作で、Switch SDK と Switch Board の横には今の版(2.3.1)とボード(pico)が出る

拡張のサイドバー。General がプロジェクトを作る入口、Project が開いているプロジェクトへの操作で、Switch SDK と Switch Board の横には今の版(2.3.1)とボード(pico)が出る


プロジェクトを作る

  1. 左の Pico アイコンを開き、New Project From Example を選ぶ
  2. Name の欄で blink を選ぶ
  3. Board type で基板を選ぶ(選択肢は Pico 2・Pico・Pico W・Pico 2 W・Other)。WIZnet の評価ボードを使う場合は、下の「ボードの選び方」を先に見てください
  4. プロジェクトを作るフォルダを指定する(その下にサブフォルダができる)
  5. Create を押す
New Project From Example の画面。Name で例題(blink)、Board type で基板(Pico)、Location で置き場所を選ぶ。Debugger と CMake Tools は既定のままでよい

New Project From Example の画面。Name で例題(blink)、Board type で基板(Pico)、Location で置き場所を選ぶ。Debugger と CMake Tools は既定のままでよい

初回は、ここで SDK とツールチェーンのダウンロードと展開が始まります。Getting Started には「最初のプロジェクトは 5〜10 分かかることがある」とあります。有線 1 Gbps の回線では 約 2 分 40 秒 で終わりました。入る順番は SDK(313 MB)→ コンパイラ(1,106 MB)→ Ninja・OpenOCD・picotool・tools → CMake で、時間のほとんどはコンパイラです。回線が遅いと、この部分がそのまま延びます。

終わると VS Code が「このフォルダの作者を信頼しますか」と聞いてくるので はい を選びます(拡張が .vscode フォルダを自動生成したため)。CMake Tools 拡張の通知が出ることがありますが、Getting Started の指示どおり閉じてかまいません。

できるのは blink.c・CMakeLists.txt・pico_sdk_import.cmake・.gitignore・.vscode/・build/ です。CMakeLists.txt の先頭は上で見た DO NOT EDIT のブロックそのままで、その直後に set(PICO_BOARD pico CACHE STRING "Board type") が入ります。ターゲット名は blink です。

ボードの選び方:WIZnet の評価ボードは pico/pico2

Pico SDK 2.3.1 には 160 個のボード定義(src/boards/include/boards/ のヘッダ)がありますが、WIZnet 製は wiznet_w5100s_evb_pico.h/wiznet_w5100s_evb_pico2.h の 2 つだけで、W55RP20-EVB-Pico と W6300-EVB-Pico2 の定義はありません。そこで、載っているマイコンが同じ Pico/Pico 2 を選びます。

手元の基板 選ぶ Board type 既定の LED ピン(ボード定義) 基板の LED
Raspberry Pi Pico Pico(pico) GP25 GP25
Raspberry Pi Pico 2 Pico 2(pico2) GP25 GP25
W55RP20-EVB-Pico Pico(pico) GP25 GPIO19(シルク user)
W6300-EVB-Pico2 Pico 2(pico2) GP25 GP25
⚠️ W55RP20-EVB-Pico では、blink はそのままでは「user」の LED が光らない

pico のボード定義は LED を GP25 としていますが、W55RP20-EVB-Pico の LED(シルク「user」・回路図の LD3)は GPIO19 です。GPIO25 はパッケージの中で W5500 のリセット(RSTn)につながっています(WIZnet Docs)。下の「LED のピンを 19 にする」を足してからビルドしてください。W6300-EVB-Pico2 の LED は Pico 2 と同じ GP25 なので、そのままで光ります。

pico-examples の blink/blink.c(sdk-2.3.1 タグ)は、ボード定義の PICO_DEFAULT_LED_PIN を使って LED を点滅させます。

#ifndef LED_DELAY_MS
#define LED_DELAY_MS 250
#endif

int pico_led_init(void) {
#if defined(PICO_DEFAULT_LED_PIN)
    gpio_init(PICO_DEFAULT_LED_PIN);          // ボード定義の LED ピン
    gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
    return PICO_OK;
#elif defined(CYW43_WL_GPIO_LED_PIN)
    return cyw43_arch_init();                 // Pico W は無線チップ側の LED
#endif
}

int main() {
    int rc = pico_led_init();
    hard_assert(rc == PICO_OK);
    while (true) {
        pico_set_led(true);
        sleep_ms(LED_DELAY_MS);
        pico_set_led(false);
        sleep_ms(LED_DELAY_MS);
    }
}

ボード定義のヘッダは #ifndef PICO_DEFAULT_LED_PIN で値を決めているので、ビルド時に別の値を渡せば上書きできます。

LED のピンを 19 にする(W55RP20-EVB-Pico のときだけ)

プロジェクトの CMakeLists.txt の add_executable(blink ...) より後に、1 行足します。

target_compile_definitions(blink PRIVATE PICO_DEFAULT_LED_PIN=19)

blink の部分は、add_executable( に書かれているターゲット名に合わせます。

W55RP20-EVB-Pico で両方を書いてみると、違いははっきり出ます。GP25 のままの blink では「user」は点かず、代わりにシルク「SPD」の LED が 0.25 秒ごとに瞬きます。GP25 で W5500 のリセットを上げ下げしているので、リセットのたびに W5500 の LED 出力(回路図では W55RP20 のピン 36〜39 が SPDLED/LINKLED/DUPLED/ACTLED)がリセット中の状態で点くためです。1 行足した版では「user」が 0.25 秒ごとに点滅し、「SPD」は点きっぱなしになります。GPIO25 を駆動しないので W5500 はリセットのままですが、blink には関係ありません。

ビルドする:Compile

サイドバーの Compile Project(Getting Started では画面右下のステータスバーの Compile として案内されています)を押すと、下のターミナルで Ninja がビルドを回します。

Compile のターミナル。実行されるのが .pico-sdk の ninja.exe で、最後に [69/69] Linking CXX executable blink.elf と出れば完了

Compile のターミナル。実行されるのが .pico-sdk の ninja.exe で、最後に [69/69] Linking CXX executable blink.elf と出れば完了

できあがるのは build/blink.uf2(13,312 バイト)と、.elf・.bin・.hex・.map・.dis です。build/CMakeCache.txt を見ると、PICO_SDK_PATH が C:/Users/<ユーザー名>/.pico-sdk/sdk/2.3.1、PICO_BOARD が pico、ビルドの種類が Release、コンパイラが .pico-sdk/toolchain/15_2_Rel1 のものになっていて、ここまで全部 .pico-sdk の道具で組み立てられているのがわかります。

画像のタブにある「問題 1」は、config_autogen.h が見つかりません という IntelliSense(エディタの補完機能)の警告です。このヘッダはビルドの途中で生成されるので、ビルド前に開いたときだけ出て、ビルド後には消えます。

💡 同じ道具はコマンドラインからも使える

拡張の道具は .pico-sdk にふつうのファイルとして置かれているだけなので、VS Code の外からも使えます。.pico-sdk の cmake/v4.3.4/bin・ninja/v1.13.2・toolchain/15_2_Rel1/bin を PATH に通し、プロジェクトのフォルダで cmake -S . -B build -G Ninja → ninja -C build とすると、configure のログに PICO_SDK_PATH is …/.pico-sdk/sdk/2.3.1 と出て、拡張と同じ SDK・同じコンパイラでビルドできます。CI やスクリプトでビルドしたいときの足がかりになります。

書き込む:UF2 のコピーか、Run

書き込みの方法は 2 つあります。

方法 手順 準備
UF2 をコピー BOOTSEL を押したまま USB をつなぎ、出てきたドライブ(Pico なら RPI-RP2)に build/blink.uf2 をコピーする なし
Run Project (USB) BOOTSEL でつないでからサイドバーの Run を押す。拡張が picotool で書き込んで起動する RP2040 の基板は Windows では Zadig でドライバを入れる

UF2 のコピー はどの基板でもそのまま使えます。コピーが終わるとドライブが消えて、基板が再起動し、プログラムが走り始めます。

Run は、裏で picotool load … -fx を実行します。RP2040 の基板(Pico・W55RP20-EVB-Pico)を Windows でそのまま Run すると、次のように止まりました。

No accessible RP-series devices in BOOTSEL mode were found.
...
RP2040 device ... appears to be in BOOTSEL mode, but picotool was unable to connect.
You may need to install a driver via Zadig.

このときデバイスマネージャーでは、BOOTSEL 中の基板の「RP2 Boot」がドライバの無い状態になっています。RP2040 の BOOTSEL には、USB ドライブ(UF2 を受け取る口)とは別に picotool が話すための口(Interface 1)があり、Windows はここに自動でドライバを当てません。picotool の README の「Zadig」の節に、手順が書かれています(Getting Started 2026-10-01 版には書かれていません)。

  1. Zadig をダウンロードして起動する
  2. 一覧から RP2 Boot (Interface 1) を選び、ドライバに WinUSB を選ぶ
  3. Install Driver を押して、終わるまで待つ(数分かかることがある)

README には「これは RP2040 だけに必要」とあり、RP2350 の基板(Pico 2・W6300-EVB-Pico2)では要りません。W6300-EVB-Pico2 をつないだときは、デバイスマネージャーで picotool 用の Reset インタフェースにドライバが自動で当たっていました(W6300-EVB-Pico2 でも、書き込みは UF2 のコピーで通しています)。Zadig を入れたくなければ、Run は使わずに UF2 のコピーで進めれば十分です。この記事の残りも UF2 のコピーで通しています。Run がうまくいったときは、Getting Started によるとターミナルに The device was rebooted to start the application. と出ます。

LED が 1 秒に 2 回点滅すれば成功です(250 ms 点灯・250 ms 消灯)。

コードを変えてもう一度

動いたら、blink.c の LED_DELAY_MS を 250 から 100 に変えて Compile し、もう一度 BOOTSEL を押しながらつなぎ直して書き込みます(UF2 のコピーか Run)。1 秒に 5 回の速い点滅になれば、「書き換え → ビルド → 書き込み」の一巡が回っています。


③ Hello World:USB シリアルに出す

stdio の出口は UART か USB か

Pico の printf の出力先は 2 つから選べます(Getting Started 5.1)。

出口 配線 注意
UART(GP0 が TX・GP1 が RX) USB-シリアル変換器(Debug Probe など)が要る 起動直後から確実に読める
USB CDC(USB シリアル) 書き込みと同じ USB ケーブルだけ 起動直後の出力を取りこぼすことがある

USB CDC は、基板が再起動したあと PC が USB シリアルとして認識するまでに 1〜2 秒かかることがあり、そのあいだの出力は見えません。Hello World のように 1 秒ごとに出し続けるプログラムなら問題になりませんが、起動時に 1 回だけ出すメッセージは見落とすことがあります。

プロジェクトを作る

  1. Pico アイコンから New C/C++ Project を選ぶ(今度は Example ではない)
  2. Name に hello_world と入れる
  3. Board type は blink と同じ基準で選ぶ
  4. フォルダを指定する
  5. Stdio support で Console over USB (disables other USB use) にチェックを入れる(UART の出力も残すなら Console over UART も)
  6. Create を押し、「作者を信頼しますか」に はい
New C/C++ Project の画面。見るのは中ほどの Stdio support で、Console over USB にチェックを入れる。SDK の版(v2.3.1)もこの画面で選べる

New C/C++ Project の画面。見るのは中ほどの Stdio support で、Console over USB にチェックを入れる。SDK の版(v2.3.1)もこの画面で選べる

画面には、ほかに Features(SPI・I2C・UART・PIO・DMA・補間器・ウォッチドッグ・タイマー・クロックの 9 項目)と、Code generation options(RAM から実行する・C++ で生成する・RTTI/例外を有効にする・プロジェクト名をソースのファイル名にする)が並びます。Hello World ではどれも既定のままで構いません。

2 回目からは、SDK やツールはもう .pico-sdk にあるので、ダウンロードは起きず、すぐにプロジェクトができます。

生成される hello_world.c の本体は、1 秒ごとに Hello, world! を出すループです。

int main()
{
    stdio_init_all();

    while (true) {
        printf("Hello, world!\n");
        sleep_ms(1000);
    }
}

CMakeLists.txt には、Stdio support の選択に応じて pico_enable_stdio_uart(hello_world 0) と pico_enable_stdio_usb(hello_world 1) が書かれます。

書き込んでシリアル端末で見る

  1. Compile して、BOOTSEL を押したまま USB をつなぎ、build/hello_world.uf2 をドライブにコピーする(Zadig を入れてあれば Run でもよい)
  2. 基板が再起動すると、USB シリアル(COM ポート)として見えるようになる
  3. その COM ポートをシリアル端末で開く。ボーレートは 115200

シリアル端末は、VS Code のシリアル モニター タブ(メニューの 表示 → ターミナル で下のパネルを開き、シリアル モニター タブでポートを選んで Start Monitoring)でも、Tera Term などの端末ソフトでも構いません。

Tera Term で COM ポートを開いたところ。Hello, world! が 1 秒ごとに 1 行ずつ増えていけば完了

Tera Term で COM ポートを開いたところ。Hello, world! が 1 秒ごとに 1 行ずつ増えていけば完了

COM ポートが複数出ている場合は、基板を抜き差しして増減するものが基板です。Pico SDK の USB シリアルの ID は VID 2E8A・PID 000A です。W55RP20-EVB-Pico では出荷時に入っていたファームウェアも同じ ID だったので、Windows は前と同じ COM 番号(このときは COM12)を割り当てました。


④ 既存のプロジェクトを Import してビルドする(WIZnet-PICO-C)

Import で拡張がすること

GitHub などから取ってきた Pico SDK のプロジェクトは、サイドバーの Import Project で拡張の管理下に入れます。拡張は次のことをします(拡張の CHANGELOG・scripts/pico_project.py)。

  • CMakeLists.txt に pico_sdk_init() があるかでプロジェクトかどうかを判定する
  • CMakeLists.txt の 先頭 に、上で見た「DO NOT EDIT」のブロック(sdkVersion・toolchainVersion・picotoolVersion と pico-vscode.cmake の読み込み)を書き足す
  • set(PICO_BOARD ...) の行が無ければ、set(PICO_BOARD pico CACHE STRING "Board type") を足す(あとで Switch Board で切り替えられるようにするため)
  • pico_sdk_import.cmake を、選んだ SDK に同梱の版に置き換える
  • .vscode フォルダ(ビルド・書き込み・デバッグの設定)を作る
Import Project の画面。選ぶのは場所・SDK の版・デバッガ・CMake Tools 連携だけで、ボードの欄は無い。上の Warning は「すべてのプロジェクトでうまくいくとは限らず、Import 後に手で直すことが多い」という意味

Import Project の画面。選ぶのは場所・SDK の版・デバッガ・CMake Tools 連携だけで、ボードの欄は無い。上の Warning は「すべてのプロジェクトでうまくいくとは限らず、Import 後に手で直すことが多い」という意味

ボードは選べないので、上のとおり pico が入ります。画面の警告どおり、Import はあくまで「拡張で扱える形にする入口」で、プロジェクトによっては後から手で直す前提です。

💡 Import はリポジトリのファイルを書き換える

WIZnet-PICO-C を Import したあとに git status を見ると、変わっていたのは 2 つでした。CMakeLists.txt は先頭に DO NOT EDIT のブロックと set(PICO_BOARD pico CACHE STRING "Board type") の 16 行が足され、pico_sdk_import.cmake は SDK 同梱の版に置き換えられています(61 行追加・2 行削除)。ほかに .vscode/ に 6 つのファイル(c_cpp_properties・cmake-kits・extensions・launch・settings・tasks)ができます。元に戻したいときは git diff で中身を確かめてから戻してください。

WIZnet-PICO-C を取ってきてボードを選ぶ

WIZnet-PICO-C は、W55RP20-EVB-Pico や W6300-EVB-Pico2 などの公式 C 例題集です。README には「Windows で、Getting Started の VS Code 拡張の章に沿って環境を作ってテストした」と書かれています。

  1. submodule ごと取得する

    git clone --recurse-submodules https://github.com/WIZnet-ioNIC/WIZnet-PICO-C.git
    

    libraries/ の下に ioLibrary_Driver・mbedtls・pico-sdk が入ります。--recurse-submodules を付けないと、これらが空になります。取得は 1 分ほどで、submodule 込みで約 1.2 GB になりました

  2. ルートの CMakeLists.txt の set(BOARD_NAME ...) で基板を選ぶ。取得した時点(main・2026-10-06 版)では W6300_EVB_PICO2 が有効になっています。W55RP20-EVB-Pico なら W55RP20_EVB_PICO に書き換えます

  3. Pico アイコンから Import Project を選び、このフォルダを指定して SDK 2.3.1 で Import する。Import が終わると、そのまま CMake の設定(configure)まで走る

使われる SDK はどちらか:submodule の 2.2.0 と拡張の 2.3.1

WIZnet-PICO-C は submodule として pico-sdk 2.2.0 を持っていて、CMakeLists.txt に次のように書かれています。

if(NOT DEFINED PICO_SDK_PATH)
    set(PICO_SDK_PATH ${CMAKE_SOURCE_DIR}/libraries/pico-sdk)
    message(STATUS "PICO_SDK_PATH = ${PICO_SDK_PATH}")
endif()

include(pico_sdk_import.cmake)

PICO_SDK_PATH がまだ決まっていなければ submodule を使う、という書き方です。Import で先頭に足されるブロックが読み込む pico-vscode.cmake が、それより前に PICO_SDK_PATH を .pico-sdk/sdk/2.3.1 に設定します。

実際に Import してみると、build/CMakeCache.txt の PICO_SDK_PATH は C:/Users/<ユーザー名>/.pico-sdk/sdk/2.3.1 で、使われたのは拡張の 2.3.1、submodule の 2.2.0 は使われていません。WIZnet 側が出す PICO_SDK_PATH = …libraries/pico-sdk の行も出ませんでした。PICO_BOARD は pico、PICO_PLATFORM は rp2040 です。

自分のプロジェクトで確かめるときは、configure のログの次の 2 行を見ます。

  • PICO_SDK_PATH is … の行(SDK の pico_sdk_init.cmake が出す)に、どのフォルダの SDK が使われたかが出る
  • PICO_SDK_PATH = …libraries/pico-sdk の行(WIZnet 側が出す)が出ていれば、submodule の SDK が使われている

なお、ログに出る WIZNET-PICO-C SDK version is 2.2.0 は WIZnet-PICO-C 自身の版番号で、Pico SDK の版ではありません。

W6300-EVB-Pico2 のときは、ボードを pico2 に切り替える

WIZnet-PICO-C の CMakeLists.txt は、BOARD_NAME が W6300_EVB_PICO2 のとき set(PICO_PLATFORM rp2350) でチップを RP2350 にします。一方、Import で足される PICO_BOARD は pico(RP2040 の基板)です。Pico SDK は、PICO_PLATFORM とボード定義のチップが食い違うと設定の段階で止まる作りになっていて(cmake/pico_pre_load_platform.cmake)、実際に W6300 用のまま Import すると、Import に続く自動の Configure が次のエラーで止まりました。

PICO_PLATFORM is specified to be 'rp2350', but PICO_BOARD='pico' uses 'rp2040' which is incompatible. You need to delete the CMake cache or build directory and reconfigure to proceed.

このエラーは CMake の出力(Output パネル)にしか出ません。気づかずに Compile Project を押すと、ターミナルに出るのは次の 1 行だけです。

Import 直後に Compile Project を押した結果。ターミナルは build.ninja が見つからないと言うだけで、本当の原因(PICO_PLATFORM と PICO_BOARD の食い違い)は出ない

Import 直後に Compile Project を押した結果。ターミナルは build.ninja が見つからないと言うだけで、本当の原因(PICO_PLATFORM と PICO_BOARD の食い違い)は出ない

ninja: error: loading 'build.ninja': The system cannot find the file specified. は「Configure が終わっていないので、ビルドの手順書(build.ninja)が無い」という意味で、ninja の行だけ見ても原因はわかりません。手がかりは VS Code 右下のステータスバーで、ここが Board: pico のままになっています。

直し方は、サイドバーの Switch Board で pico2 を選ぶことです。pico2 を選ぶと「Use RISC-V?」と聞かれます。

Switch Board で pico2 を選んだ直後の問い。No で Arm Cortex-M33、Yes で RISC-V(Hazard3)向けになる。pico を選んだときは出ない

Switch Board で pico2 を選んだ直後の問い。No で Arm Cortex-M33、Yes で RISC-V(Hazard3)向けになる。pico を選んだときは出ない

ここは No を選びます。RP2350 の Arm Cortex-M33 でビルドする設定です(CMake のキャッシュでは PICO_PLATFORM が rp2350-arm-s になります)。Yes にすると RISC-V 用のツールチェーンを別に取ってきてビルドします。No を選ぶと先頭の行が set(PICO_BOARD pico2 CACHE STRING "Board type") に書き換わり、build フォルダを消さなくても Configure が通りました。そのまま Compile Project で、全例題が 2,799 ステップでビルドできています(ビルド種別は拡張の既定の Release)。

W55RP20-EVB-Pico(BOARD_NAME W55RP20_EVB_PICO)は RP2040 なので、足された pico のままで通ります。

ビルドして .uf2 を確かめる

Compile を押すと、mbedtls(TLS のライブラリ)と 12 個の例題がまとめてビルドされます。W55RP20-EVB-Pico の設定で 2,855 ステップ・約 2 分かかり、出たのは警告(未使用の変数・マクロの再定義)だけでした。

例題ごとに build/examples/<例題名>/wizchip_<例題名>.uf2 ができます。

例題 .uf2
DHCP と DNS build/examples/dhcp_dns/wizchip_dhcp_dns.uf2
受け取ったデータを送り返す(loopback) build/examples/loopback/wizchip_loopback.uf2
ほか 10 個 igmp・netbios・network_install・pppoe・sntp・tcp_client_over_ssl・tcp_server_multi_socket・tcp_server_over_ssl・tftp_client・upnp

例題が複数あるプロジェクトでは、書き込みは BOOTSEL でドライブを出して、使いたい .uf2 をコピーするのが確実です。ここまで来れば、W55RP20-EVB-Pico の記事・W6300-EVB-Pico2 の記事の公式 C 例題の経路(DHCP・ping・TCP エコー)にそのまま進めます。


💡 こういうこともできる

この記事では扱いませんが、同じ拡張の上で次のことができます。

できること 何を使うか 入口
ブレークポイントで止めるデバッグ Raspberry Pi Debug Probe、または 2 台目の Pico に debugprobe を書いたもの Getting Started 4.3・付録 A
RISC-V コアでビルド(RP2350) New C/C++ Project の Architecture で RISC-V を選ぶ 拡張が RISC-V のツールチェーンも入れる
Zephyr・Rust のプロジェクト 拡張のプロジェクト生成 拡張の README(追加で入れるものがある)
picotool で基板の情報を見る .pico-sdk/picotool picotool の README
コマンドラインだけで環境を作る pico_setup.sh(Raspberry Pi OS)・手動の CMake Getting Started 付録 C

🔧 トラブルシューティング

症状 原因として考えられること 試すこと
Error while retrieving SDK and toolchain versions SDK の版一覧を取る GitHub API の回数制限(未認証は IP ごと) GitHub の個人アクセストークン(classic・public_repo)を設定 raspberry-pi-pico.githubToken に入れる
ダウンロードが途中で失敗する 回線・一時的な失敗 拡張の設定(raspberry-pi-pico で検索)を既定に戻す → Raspberry Pi Pico: Uninstall Pico SDK → 拡張を入れ直す(README の手順)
ビルドで別の SDK やコンパイラが使われる 旧 pico-setup-windows・手動の SDK・環境変数 PICO_SDK_PATH が残っている 旧インストーラを削除し、環境変数を消してから VS Code を開き直す
CMake Tools の通知が出る CMake Tools 拡張が入っている 閉じてよい。連携は大きいプロジェクト向けの任意機能
Run で No accessible RP-series devices in BOOTSEL mode were found・install a driver via Zadig RP2040 の BOOTSEL の口(RP2 Boot (Interface 1))に Windows がドライバを当てていない Zadig で WinUSB を入れる。入れないなら .uf2 をドライブにコピーする(RP2350 では不要)
Run で基板が見つからない(Zadig の文言が出ない) 基板が BOOTSEL の状態になっていない・充電専用ケーブル BOOTSEL を押したまま挿し直す。データ通信できるケーブルか確かめる
「問題」タブに config_autogen.h が見つかりません ビルド前に IntelliSense が見ただけ(ビルド中に生成されるヘッダ) 一度 Compile すれば消える
W55RP20-EVB-Pico で blink の「user」が光らず「SPD」が瞬く LED が GP25 のまま(GP25 は W5500 のリセット) PICO_DEFAULT_LED_PIN=19 の 1 行を足す
シリアル端末に何も出ない Console over USB を選んでいない・ポート違い・起動直後の取りこぼし CMakeLists.txt の pico_enable_stdio_usb(... 1) を確かめる。基板を抜き差しして増える COM を選ぶ
PICO_PLATFORM is specified to be 'rp2350', but PICO_BOARD='pico' ... Import で足された PICO_BOARD pico と、プロジェクトの PICO_PLATFORM rp2350 が食い違う Switch Board で pico2 にする(Use RISC-V? は No)。build を消さなくても通った。通らなければ build を消して設定し直す
Import 直後の Compile で ninja: error: loading 'build.ninja' だけが出る Configure が止まっていて build.ninja ができていない(原因は Output パネルの CMake のログ側) ステータスバーの Board: を見る。W6300-EVB-Pico2 なら Switch Board で pico2 にする
SDK を上げたらビルドが変になった 古い build フォルダの CMake キャッシュ build を消して作り直す(SDK のリリースノートの推奨)

✅ まとめ

  • Pico SDK は CMake で組み立てる公式の C/C++ SDK。PICO_BOARD で基板を選ぶと、チップ(PICO_PLATFORM)や LED のピンが決まる
  • VS Code の Raspberry Pi Pico 拡張は、SDK・コンパイラ・CMake・Ninja・picotool をホームの .pico-sdk の下に 版ごとのフォルダ で置く。プロジェクトに書かれるのは版の番号だけなので、版を並べて置き、プロジェクトごとに選べる
  • SDK 2.3.1 の組み合わせは Arm GNU Toolchain 15.2.Rel1・CMake 4.3.4・Ninja 1.13.2・picotool 2.3.1
  • 手順は blink(New Project From Example)→ Hello World(New C/C++ Project・Console over USB)→ 既存プロジェクトの Import Project の 3 段。初回のダウンロードは 1.58 GB で、有線 1 Gbps なら 3 分足らず
  • 書き込みは .uf2 のコピーが確実。RP2040 の基板を Windows で Run するなら Zadig で WinUSB を入れる
  • Import すると CMakeLists.txt と pico_sdk_import.cmake が書き換わり、使われる SDK は拡張の .pico-sdk/sdk/2.3.1 になる(WIZnet-PICO-C の submodule の 2.2.0 ではない)
  • WIZnet の評価ボードは SDK にボード定義が無いので pico/pico2 を選ぶ。W55RP20-EVB-Pico は LED が GPIO19、W6300-EVB-Pico2 は Import 後に pico2 へ切り替える

環境ができたら、次は W55RP20-EVB-Pico・W6300-EVB-Pico2 の記事で、公式 C 例題を使って有線 LAN の最初の一歩(DHCP・ping・TCP エコー)を通します。


関連記事


参考