この記事はraspberry pi pico W攻略 Advent Calendar 2025の2日目です。
はじめに
ご覧いただきありがとうございます。これがどのような意図によって書かれているのか、どのような環境でおこなわれているかについては1日目の投稿を参照してください。
なにをするか
タイトルにあるとおり、C++のコードをラズパイピコの内部で動作させ、それの出力をWSL内のVSCodeから監視しようということをやってみます。
なるべく簡潔にまとめようと思っています。
ラズパイピコシリーズの入出力について
シリアル入力(stdin)と出力(stdout)の宛先は、シリアルUART、USB CDC(USBシリアル)、あるいはその両方を指定することができます 。
シリアルUARTコンソールの場合 入出力はデバイス上のUARTピンを経由して送信されます。デフォルトでは、出力用(UART0_TX)に Pin 1 (GP0) 、入力用(UART0_RX)に Pin 2 (GP1) が使用されます 。 この方法を使うには、「Debug Probe Wiring」の図にあるように、Pico側のUARTピンを「Debug Probe」のようなUART-USB変換器に物理的に接続する必要があります 。
USB CDCコンソールの場合 入出力はコンピュータと接続しているUSBケーブルを介して直接送受信されるため、追加の配線は一切不要です 。 ただし、Picoが再起動してからコンピュータ側がデバイスを再認識・接続するまでに1〜2秒かかる場合があるため、コードが走り始めた直後の出力(ログ)を見逃してしまう可能性があります 。
(スタートドキュメント5.1日本語訳)
つまりピン経由でも、USB経由でも出力を受け取ることができます。ただ、物理配線はだるいので、今回は既に接続しているのでUSB出力を受け取ろうと思います。
プロジェクトの作成
まずは、新しいプロジェクトをRaspberry Pi Pico Projectから作成します。New C/C++ Projectから、前回開いたような画面が得られます。Nameには自由名前を設定しましょう。私はhelloにしました。
board typeも間違えずに選び、作成するフォルダも間違えずに選択します。
Stdio supportでは、利用したい出力方法を選びます。
Createを押します。
すると、同様に新しいウィンドウが開きます。
接続する
接続方法は前回と同じで、BOOTSELモードでUSB接続するようにしてください。
実行する
初期状態で"Hello world"を出力しそうなcppファイルが入っています。これを今回動かし、その文字を見ようというわけです。
ではCompileを押します。できます。
できないならば、前回の記事を参照してください。
次にRunを押します。できます。
が、"Hello world!"の文字が確認できないはずです。
どこにあるのでしょうか?
文字を見る
ターミナルのタブには他に問題や出力などがあるはずです。この右側にシリアルモニターというものがあります。ラズパイピコの拡張機能がここへつないでくれています。
モニターモード:Serial
表示モード:テキスト
ポート:/dev/ttyS0
ボーレート:115200
行の終わりなし
が私の環境の初期設定でした。今回の出力は
ボーレート:115200
ポート:/dev/ttyACM0 - Raspberry Pi
に出力されています。
よって、ポートの選択を変更すればよいのですが、そのような選択はプルダウンにはないと思います。
これは実行中のラズパイピコの名義のようなものが変更されているためです。
実行中の(BOOTSELモードでない)ラズパイピコが接続されている状態でWindows Power Shellを管理者権限で開き、usbipd listをすると、
PS C:\WINDOWS\system32> usbipd list
Connected:
BUSID VID:PID DEVICE STATE
1-1 2e8a:000a USB シリアル デバイス (COM3), Reset Not shared
1-5 0408:5440 HP True Vision HD Camera, HP IR Camera Not shared
1-9 06cb:00c9 Synaptics UWP WBDI Not shared
1-10 8087:0026 インテル(R) ワイヤレス Bluetooth(R) Not shared
Persisted:
GUID DEVICE
ab8e1711-b9cd-4cf0-bd6c-aad68be73bfb USB 大容量記憶装置, RP2 Boot
となり、BOOTSELモードのラズパイピコのPIDは0003だったはずが、実行中のラズパイピコのPIDは000aです。
よって、これに対してもattachをしたいのですが、
PS C:\WINDOWS\system32> usbipd attach --wsl --busid 1-1
usbipd: error: Device is not shared; run 'usbipd bind --busid 1-1' as administrator first.
と怒られるので、おとなしく
PS C:\WINDOWS\system32> usbipd bind --busid 1-1
としてbindしてからもう一度attachを打つと、
PS C:\WINDOWS\system32> usbipd attach --wsl --busid 1-1
usbipd: info: Using WSL distribution 'Ubuntu' to attach; the device will be available in all WSL 2 distributions.
usbipd: info: Detected networking mode 'nat'.
usbipd: info: Using IP address 192.168.160.1 to reach the host.
とattachが成功します。
WSL上でもlusbを打っても確認できるはずです。
oni@DESKTOP-JVSVBV8:~/projects/rasp/hello$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 010: ID 2e8a:000a Raspberry Pi Pico
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
すると、ラズパイピコのポートが確認できるはずです。
oni@DESKTOP-JVSVBV8:~/projects/rasp/hello$ ls /dev/ttyACM*
/dev/ttyACM0
ありました。
では、Runをし、その操作が成功した状態で再度、シリアルモニターを選択し、ポートのプルダウンから該当するものを選び、監視の開始を選択すると下にHello, world!が1秒ごとに出力しているのが確認できるはずです。
これで成功しました!
補足
CMakeLists.txt内にある以下のコードはそれぞれこのような意味を持っています。
-
pico_enable_stdio_uart(hello 0) → シリアルUARTコンソール(物理配線が必要な方)を無効化
-
pico_enable_stdio_usb(hello 1) → USB CDCコンソール(USBケーブル1本で済む方)を有効化


