皆さん こんにちは
ラズピコ研究員の moon です。
この記事は「初心者必見! Raspberry Pi Picoの C/C++デバッグ環境を容易に構築する」によって環境構築していることを前提にしています。
突然ですが皆さんは printf()関数を使っていますか?
こちらの環境ではデバッグ環境を構築できているので不要かも知れませんが、ログをシリアル出力したい場合等には便利な機能です。
ただしデバッグ目的で使う場合 実際の運用時には、返ってじゃまな場合もあると思うので状況に応じて使い分ける必要がありそうです。
VSCode+ラズピコ拡張 の環境を用意すると、おまけでシリアルモニタがついてきます。
今回はこれを使って標準入出力の動作を確認してみます。
ラズピコの標準入出力には UART か USB のどちらかを使います。
例えば実際の運用に UART を使っていて、かつ printf() のログも出力したい場合には標準入出力に USB を使うことができます。
今回はシリアルモニターを使って、双方のインターフェースで標準入出力の確認を行ってみます。
接続
UART を使うにはPicoProbeとラズピコを以下のように接続する必要があります。
これはPicoProbeのUSBシリアル機能とラズピコ(マイコンRP2040)のUARTをクロス接続するものです。

新規プロジェクトを作成する
VSCodeを起動し、フォルダを開いている場合には ファイル – フォルダーを閉じる を選択します。
次にアクティビティーバーから Raspberry Pi Pico Project を選択し、サイドバーの New C/C++ Project を選択します。

Name は std_io とし、Board type で Pico を選択します。
後は Stdio support の Console over UART にチェックを入れます。
(これにより UART を標準入出力として使うことができるようになります)
code generation options の Use project name as entry point file name にチェックを入れます。
Debugger は DebugProbe(CMSIS-DAP)[Default] を選択し、CMake Tools の Enable CMake-Tools extension integration にチェックを入れます。

(画像を参照してください)
そして右下の Create ボタンを押します。
これで標準出力として printf() するコードを生成してくれます。
キットの選択
std_io のキットを選択してください と言われるので、その下に出て来る候補の一番下の 「Pico コンパイラの使用: C = C:\Users…」を選択します。
実行とデバッグ
アクティビティーバーの実行とデバッグを選択します。
メニューの 実行 – デバッグの開始を選択します。
std_io の起動対象を選択します と言われるので、その下の候補から std_io を選択します。
main()関数の中の stdio_init_all() のところでプログラムが停止するので、F5キーを押してプログラムを実行します。
シリアルモニター
シリアルモニターは Tera Term の簡易版と考えれば良いと思います。
Raspberry Pi Picoの拡張を入れたら自動的にインストールされるようです。
UART でも USB でも入出力の対象はCOMポートとして認識されます。
UARTの動作確認:
エディター下の、下部パネルの右の方にあるシリアルモニターを選択します。

ポートで正しいCOMポートを選択し、ボーレートを115200に設定します。
(歯車アイコンを選択すると、データビットやパリティを選択することができますが今回はデフォルト値のまま動くようなので設定不要です)
そして監視の開始を選択すると、1秒周期で “Hello, world! が表示されれば成功です。
ここでプログラムを停止します。
Ctrl + Shift + E でサイドバーにエクスプローラーを表示し、ツリーから CMakeLists.txt を選択します。
# Modify the below lines to enable/disable output over UART/USB
pico_enable_stdio_uart(std_io 1)
pico_enable_stdio_usb(std_io 0)
pico_enable_stdio_uart(std_io 1) の2番目の引数の ‘1’ が 標準入出力をUARTで使う指定になります。
pico_enable_stdio_usb(std_io 0) の2番目の引数の ‘0’ が 標準入出力をUSBで使わない指定になります。
両方 ‘1’ にしてしまうと多分入力がぶつかってしまうので、どちらかを使うように(または両方使わないように)指定します。
USBの動作確認:
次に USB の確認をしますので CMakeLists.txt を以下のように編集して Ctrl + S で保存します。
pico_enable_stdio_uart(std_io 0)
pico_enable_stdio_usb(std_io 1)
USBの標準入出力は USB-CDC (Universal Serial Bus Communication Device Class)として機能します。
これはUSB上で通信する機能です。
そしてプログラムを実行します。
そしてシリアルモニターのポートからもうひとつのCOMポートを選択します。
監視の開始を選択し、1秒周期で “Hello, world! が表示されれば成功です。
(注)標準入出力に USB を指定した場合、プログラムを動作させるまでCOMポートが表示されないことがあります。
標準入出力
「入出力」と書いたのでラズピコから見た入力も確認してみます。
std_io.c を以下のコードに書き換えて保存し実行します。
#include <stdio.h>
#include "pico/stdlib.h"
int main()
{
stdio_init_all();
while (true) {
printf("Hello, std i/o\n");
int c = getchar();
putchar(++c);
putchar('\n');
}
}
このプログラムは whileループの中でまず「Hello, std i/o\n」を出力した後に、1文字の入力を待ち、その文字に+1したものを出力し、改行コードを送ります。
これを繰り返します。
私のところでは所定の動作を確認することができました。
まあラズピコから見た標準入力は使わないケースが多いと思いますけど、念のために入力できることも確認しておきました。
いかがでしたか?
皆さんの環境ではシリアルモニターを使えましたか?
標準入出力の UART , USB をどちらも使うことができましたか?
お疲れさまでした。