シリアルモニターにUART/printfでログ出力 (Raspberry Pi Pico&C/C++ SDK)

ラズパイピコで、UARTとprintfを使って動作ログをPCのシリアルモニターに表示する方法を解説しています。固定メッセージだけでなく、変数の値やセンサーなどの測定値を出力することも可能です。シリアルモニターを使うことでプログラムの動作を追うことができるので、意図したとおりに動いているか確認したり、問題発生時に原因を特定するのに役立ちます。

シリアルモニターでセンサーの温度、気圧、湿度を表示している例
更新日 : 2025年3月12日

本記事はVS Code + C/C++ SDK開発環境での手順を解説しています。開発環境の導入方法はこちらの記事をご覧ください。

PCとの接続方法

ログを出力するには、UARTと呼ばれるインターフェースを使用します。PCとの接続方法は2種類あり、PicoのUARTピンを使う方法と、USBを使う方法です。

UARTピンを使う場合、別途デバッグプローブか汎用のUSBシリアル変換器が必要です。USBを使う場合はPicoとUSB接続するだけで良いので接続は簡単ですが、プログラムを書き換えるたびにPCから開く操作が必要になります。

先にUARTピンを使う方法を解説していきます。USBを使う方法はこちら

UARTピンを使う方法

接続

まずは送信に使用するピン(TX)と受信に使用するピン(RX)をそれぞれ1つ選びます。最初にUART0を使うか、UART1を使うかを選び、続いて以下のピン配置の中からUARTx TX、UARTx RXに対応しているピンを選びます。

デフォルトではUART0 TXがGP0、UART0 RXがGP1となります(下の図の左上)。他の用途と競合していなければ、これらを使えば良いでしょう。

Picoのピン配置 (Raspberry Piより引用)

表の左右の対応しているピンを配線します。デバッグプローブの接続方法はこちらの記事で解説しています。

デバッグプローブ or USBシリアル変換器Pico
TX使用するRX (デフォルトはピン番号2)
RX使用するTX (デフォルトはピン番号1)
GNDいずれかのGNDピン
プログラム

サンプルプログラムが用意されているので、Pico拡張機能メニューの「New Project From Example」から「hello_serial」を選んでプロジェクトを作成してください。ボードは使用するものに合わせてください。(Pico W、Pico 2など)

ログの出力にはpico_stdlibライブラリを使用します。CMakeLists.txtの43行目で以下のようにライブラリが指定されていることがわかります。

target_link_libraries(hello_serial pico_stdlib)

ピンを変更する場合は、上記に続けてCMakeLists.txtに追記します。以下はUART1、TXにGP8、RXにGP9を使用する例です。デフォルトのピンを利用する場合は不要です。

target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE
  PICO_DEFAULT_UART=1 # UART0なら0, UART1なら1
  PICO_DEFAULT_UART_TX_PIN=8 # TXピンのGP番号
  PICO_DEFAULT_UART_RX_PIN=9 # RXピンのGP番号
)

続いてhello_serial.cの内容を見ていきます。

#include <stdio.h>と#include “pico/stdlib.h”はログ出力に必要なヘッダーファイルです。stdio_init_all()で初期化処理を行っています。

13行目のprintf()が指定したメッセージを出力する命令です。

プログラムをコンパイルして書き込めば、Pico側の準備は完了です。次はPCで先程のメッセージを受信して表示してみます。「シリアルモニターでログを表示する」に進んでください。

USBを使う方法

接続

PCとPicoがUSBケーブルで接続されていればOKです。

プログラム

サンプルプログラムが用意されているので、Pico拡張機能メニューの「New Project From Example」から「hello_usb」を選んでプロジェクトを作成してください。ボードは使用するものに合わせてください。(Pico W、Pico 2など)

ログの出力にはpico_stdlibライブラリを使用します。CMakeLists.txtの44行目で以下のようにライブラリが指定されていることがわかります。

target_link_libraries(hello_serial pico_stdlib)

デフォルトではUARTピンを使って出力する設定のため、CMakeLists.txt 47、48行目でUSBを有効化し、UARTピンを無効化しています。

# enable usb output, disable uart output
pico_enable_stdio_usb(hello_usb 1)
pico_enable_stdio_uart(hello_usb 0)

続いてhello_serial.cの内容を見ていきます。

#include <stdio.h>と#include “pico/stdlib.h”はログ出力に必要なヘッダーファイルです。stdio_init_all()で初期化処理を行っています。

13行目のprintf()が指定したメッセージを出力する命令です。

プログラムをコンパイルして書き込めば、Pico側の準備は完了です。次はPCで先程のメッセージを受信して表示してみます。「シリアルモニターでログを表示する」に進んでください。




シリアルモニターでログを表示する

VS Codeのシリアルモニター拡張機能を使って、Picoが出力したログを取得します。

VS Codeの右下のパネルの上部タブから「SERIAL MONITOR」をクリックすると、シリアルモニター画面が表示されます①。

次にPortのメニューから接続先を選択します②。デバッグプローブを使っている場合かUSB接続の場合は「Raspberry Pi…」などと表示されていると思います。Baud rateは115200にしておきます。

「Start Monitoring」をクリックすることで、モニターを開始します③。

1秒おきに「Hello, world!」メッセージが表示されれば成功です! プログラムで出力したメッセージがシリアルモニターで受信できていることが分かります。「Stop Monitoring」をクリックするとモニターを終了します。

なお、UARTピンを使っている場合は常時モニターし続けることができますが、USBを使う場合はプログラム書き換え時に停止してしまうので、一度StopしてからStartし直す必要があります。

変数の値を出力する

固定のメッセージだけでなく、変数の値を出力することも可能です。プログラムのmainループを以下のように変更し、書き込んでみてください。

int main() {
    stdio_init_all();
    int i=0; // 整数型の変数を作成
    while (true) {
        printf("Hello, world! %d\n", i); // %dの部分に変数iの値を出力
        i++; // iを1つ増やす
        sleep_ms(1000);
    }
}

以下のように変数iの値が1ずつ増えていく様子が出力されれば成功です!

printfの1つめの引数の文字列の中に%dと書いておくと、2つめの引数の値を出力することができます。この機能を応用すると、モニターしておきたい変数の値を表示させたり、センサーの測定値などを表示させることも可能です。

%dは符号付き整数型を出力するものですが、他にもよく使う指定についてまとめてみました。

printfでの表記用途
%d10進数で整数を表示
%x16進数で整数を表示
%u10進数で符号なし整数(uint型など)を表示
%f浮動小数点型(float型)を表示
%s文字列型(char*型など)を表示

まとめ

UARTとprintfを使ってPicoの動作ログをシリアルモニターに表示する方法の解説は以上です。固定メッセージだけでなく、変数の値やセンサーなどの測定値を出力することも可能です。シリアルモニターを使うことでプログラムの動作を追うことができるので、意図したとおりに動いているか確認したり、問題発生時に原因を特定するのに役立ちます。

デバッグプローブの接続方法とプログラム書き込み (Raspberry Pi Pico&C/C++ SDK)

デバッグプローブをラズパイピコに接続する方法と、プログラムを書き込む方法について解説しています。デバッグプローブを使うことで、迅速なプログラム書き込みや動作検証が可能になるので、本格的な開発をする場合におすすめです。手持ちのPicoにファームウェアを書き込んでデバッグプローブとして使う方法も解説しました。

CG-CustomARGB (Arduino IDEでプログラミング可能なアドレサブルRGB LEDコントローラー)

発光パターンを自由にプログラミング可能なアドレサブルRGB LEDコントローラーです。市販のコントローラーではできないようなイルミネーションを自作できます。世界的に有名なArduino互換機として設計しており、未経験者でも簡単にプログラミングできるチュートリアルとサンプルプログラムを提供しています。

RPZ-Stepper (Raspberry Pi用 高機能ステッピングモータードライバー)

ステッピングモーターを制御できるRaspberry Pi(ラズパイ)用拡張基板です。位置や角度、回転数などを指示すれば、自動で目標までモーターを動かしてくれます。加減速、静音モード、省電力モード、電流測定などの機能を搭載しています。ものを動かしたり回転させるシステムが実現できます。