ArduinoとPCのシリアル通信入門――Serial.printで値を可視化する基本と応用。
センサーの値、目で確認できていますか。Serial.begin()の基本設定から、シリアルモニタ・シリアルプロッタの使い分け、実践的なデバッグ手順までを解説します。
目次
01なぜシリアル通信で「値を見る」ことが重要なのか
結論から言えば、Arduinoで電子工作をする上で最初にぶつかる壁は「センサーが今どんな値を返しているのか、目で確認できない」ことにある。LEDの点滅やモーターの動きだけを見ていても、内部で計算されている数値が正しいかどうかは分からない。Serial.print()を使い、Arduinoが読み取った値をPCの画面に文字として出力することで、プログラムの中身を可視化し、意図した通りに動いているかを確認できるようになる。
実例として、ArduinoとGSMモジュールをシリアル通信で接続した際に、送信した文字列が意味不明な文字の羅列として表示されてしまうトラブルが報告されている。原因を調査したところ、Arduino IDEのシリアルモニタ側のボーレート設定が、スケッチ内のSerial.begin()の設定値と一致していなかったことが判明した事例がある。Arduinoシリアル通信の文字化けをボーレートの見直しで解決した事例では、通信速度の設定を送受信双方で揃えることで文字化けが解消したことが紹介されている。
編集部見解:シリアル通信によるデバッグは地味に見えるが、電子工作における最初の「動作確認の窓」として最も基本的かつ重要な手段だと考えられる。LCDや専用の表示器を用意する前に、まずシリアルモニタで値を確認する習慣をつけておくと、後のトラブルシューティングが格段に速くなる。
― YOFUKASI AI編集部
本記事では、Arduinoにおけるシリアル通信の基本構文から、シリアルモニタ・シリアルプロッタの使い分け、実際にセンサー値を確認する手順までを、初心者から中級者を対象に体系的に解説する。
02Arduinoにおけるシリアル通信の基礎知識
シリアル通信(serial communication)とは、1本の通信線を使い、データを1ビットずつ順番に送受信する通信方式のことである。複数の線を同時に使うパラレル通信に対し、配線がシンプルで済むのが特徴で、ArduinoとPCの間の通信には主にこの方式が使われている。
Arduinoでシリアル通信を行う際は、まずsetup()内でSerial.begin()を呼び出して通信を開始する。公式リファレンスの日本語版では、Serial.begin() ― Arduinoリファレンスにおいて、この関数がシリアルポートを開き、通信速度(ボーレート)を設定する働きを持つと説明されている。よく使われる通信速度には9600bps・57600bps・115200bpsなどがあり、数字が大きいほど1秒間に送れるデータ量が多くなる。シリアル通信をしてみよう(Serial)(Qiita)では、マイコンでよく使われる通信速度として9600bps・57600bps・115200bpsが挙げられ、数字が大きくなるほど多くのデータを送れる速度になると説明されている。
用語の整理
- ボーレート(baud rate):1秒間に送受信できるビット数を表す通信速度の設定値。Arduino側とPC側で一致させる必要がある。
- シリアルモニタ(Serial Monitor):Arduino IDEに標準搭載されている、シリアル通信の内容をテキストで確認できるツール。
- シリアルポート(COMポート):ArduinoとPCがUSBケーブルを通じて通信するための仮想的な接続口。
値を出力する基本的な関数がSerial.print()とSerial.println()である。公式のLanguage Referenceでは、Arduino公式 Language Reference「Serial.print()」においてこの関数の仕様が定義されている。数値・文字列・バイトなど、さまざまなデータ型を人間が読める形式(ASCIIテキスト)としてシリアルポートに出力できる点が特徴である。
シリアル通信を学ぶ前に、Arduinoの基礎文法や変数の扱い方をまだ体系的に学んでいない場合は、先に基礎を押さえておくとこの先の理解がスムーズになる。Arduinoのコードの書き方の基礎はこちらの記事で詳しく解説している。
03Serial.print()の仕組みと技術的背景
最小構成のシリアル通信スケッチは、次のような形になる。
void setup() {
Serial.begin(9600); // シリアル通信を9600bpsで開始
}
void loop() {
int sensorValue = analogRead(A0);
Serial.print("Sensor: ");
Serial.println(sensorValue); // 改行付きで出力
delay(500);
}
Serial.print()とSerial.println()の違いは、出力の末尾に改行を付けるかどうかである。公式リファレンスでは、Arduino公式 Language Reference「Serial.println()」において、この関数がSerial.print()と同じ形式でデータを出力したうえで、末尾にキャリッジリターンとラインフィードを付加すると定義されている。複数の値を1行ずつ整理して表示したい場合は、基本的にSerial.println()を使うとよい。
出力フォーマットの指定
数値を出力する際は、第2引数でフォーマットを指定できる。Serial.print(value, HEX)のように書くことで、16進数(HEX)・8進数(OCT)・10進数(DEC)・2進数(BIN)の形式で出力できる。浮動小数点数の場合は、第2引数に小数点以下の桁数を指定する。
int value = 255;
Serial.print(value, DEC); // "255"
Serial.print(value, HEX); // "FF"
Serial.print(value, OCT); // "377"
Serial.print(value, BIN); // "11111111"
float temp = 23.456;
Serial.println(temp, 1); // "23.5"(小数点以下1桁)
複数のセンサーから取得した値をひとつのシリアルモニタ画面で見比べたい場合、それぞれの値の前にラベルとなる文字列を
Serial.print()で出力しておくと、どの数値がどのセンサーのものか一目で判別できる。ラベルなしで数値だけを羅列すると、後から見返したときに判別できなくなりやすい。
圧センサーや筋電センサーのように、複数チャネルのアナログ値を継続的に読み取り、シリアル通信でPCへ送るセンサーの実例は、以下の記事でも詳しく扱っている。
04値の確認方法の比較と選択肢
Arduinoが出力した値をどう確認するかは、目的によって最適な方法が変わる。以下に3つの選択肢を整理する。
| 項目 | A. シリアルモニタ | B. シリアルプロッタ | C. 外部ツール(Python/Processing) |
|---|---|---|---|
| 向いている用途 | 文字列・生の数値をそのまま確認 | 数値の時間変化をグラフで確認 | データの保存・高度な可視化・GUI連携 |
| 準備の手軽さ | Arduino IDEのみで完結 | Arduino IDEのみで完結 | 別途プログラム作成が必要 |
| 複数値の同時表示 | 可能(見づらくなりやすい) | カンマ区切りで複数系列を重ねて表示可能 | 自由度が高い(棒グラフ・散布図等) |
| データの保存 | 基本的に不可(コピー&ペーストのみ) | 不可 | CSV等での保存が容易 |
※B案のシリアルプロッタの具体的な操作方法は【Arduino IDE】シリアルプロッタの使い方(ツール・ラボ)で詳しく解説されている。カンマ区切りで複数の数値を送信することで、複数系列を重ねて表示できる点が紹介されている。
デバッグの初期段階ではまずシリアルモニタで生の値を確認し、値の傾向やノイズの有無を視覚的に把握したくなった段階でシリアルプロッタに切り替える、という流れが実務的である。長期間のデータを記録・分析したい場合は、C案のようにPythonなどでシリアルデータを受信し、ファイルに保存する構成を検討するとよい。
05実践:Serial.printでセンサー値を確認する5ステップ
ここでは「アナログ温度センサーの値をシリアルモニタで確認し、想定通りの範囲に収まっているかを検証する」という編集部想定シナリオを題材に、具体的な手順を示す。
-
STEP1. setup()でSerial.begin()を呼び出す
スケッチの冒頭、
setup()関数の中でSerial.begin(9600)のようにボーレートを指定する。この1行がないと、シリアルモニタを開いても何も表示されない。実例:void setup() { Serial.begin(9600); }を追加。シリアルモニタ側のボーレートも9600に設定し、両者を一致させた。 -
STEP2. センサー値をラベル付きで出力する
analogRead()で取得した値をそのまま出力するのではなく、何のセンサーの値かが分かるようにラベル文字列を添える。実例:Serial.print("Raw ADC: "); Serial.println(analogRead(A0));とし、シリアルモニタ上で「Raw ADC: 512」のように表示されるようにした。 -
STEP3. 単位換算した値もあわせて出力する
センサーの生の数値(ADC値など)だけでなく、実際の物理量(温度・電圧など)に変換した値も出力することで、想定した範囲に収まっているかを直接確認できるようにする。
実例:float voltage = analogRead(A0) * (5.0 / 1023.0); Serial.print("Voltage: "); Serial.println(voltage, 2);を追加し、電圧値を小数点以下2桁で表示するようにした。 -
STEP4. delay()の時間を調整して出力頻度を最適化する
出力頻度が高すぎるとシリアルモニタの画面が流れて読み取りにくくなる。逆に低すぎると変化を追いにくい。デバッグ時は500ms〜1000ms程度の間隔から調整を始めるとよい。
実例:当初delay(10)としていたところ、シリアルモニタの表示が速すぎて目視確認できなかったため、delay(500)に変更した(編集部想定シナリオ)。 -
STEP5. 想定外の値が出た箇所を特定する
出力された値の中に、明らかにおかしい値(急激なスパイクや0固定など)がないかを確認する。ラベル付きで出力しておくと、どのセンサー・どの変換処理に問題があるかを素早く切り分けられる。
実例:Voltageの値が常に0.00と表示され続けたため、配線を確認したところ、アナログ入力ピンの接続忘れが原因だったことが判明した(編集部想定シナリオ)。
シリアル通信で取得したセンサー値を、リアルタイムでPython側のゲームやグラフに反映させる実例は、以下の記事でも扱っている。Serial.printで出力した値を外部プログラムで受け取る際の構成の参考になる。
リアルタイム握力計測ゲームのコード解説はこちらの記事で読める。センサー値をシリアル通信でPythonに送り、ゲーム画面にリアルタイム反映する構成の参考になる。
06注意点・よくある誤解
Arduino側のSerial.begin()で指定したボーレートと、シリアルモニタ側の設定値が一致していないと、送受信のタイミングがずれて文字化けが発生する。実際に、ボーレートの設定不一致が原因で文字化けが起きた事例も報告されており、シリアル通信のトラブルではまず双方の設定値が一致しているかを確認するのが基本となる。
出力頻度が高い状態のままボーレートが低いと、送信待ちがボトルネックとなり、loop()全体の実行速度に影響することがある。デバッグが完了したら、出力頻度を下げるか、不要なSerial.print()の呼び出しを削除・コメントアウトしておくことが推奨される。
シリアルモニタに何も表示されない原因は、コードの誤りとは限らない。Serial.begin()の呼び出し忘れ、ボーレートの不一致、誤ったCOMポートの選択など、設定面の見落としであることも多い。コードを疑う前に、まず設定を一つずつ確認することが近道になる。
07FAQ
参考文献
- Arduino公式ドキュメント編集チーム「Serial.print()」Arduino Documentation, 2024年改訂. https://docs.arduino.cc/language-reference/en/functions/communication/serial/print
- Arduino公式ドキュメント編集チーム「Serial.println()」Arduino Documentation. https://docs.arduino.cc/language-reference/en/functions/communication/serial/println
- Arduino「Serial.begin()」Arduinoリファレンス(日本語版). https://cdn.arduino.cc/reference/jp/language/functions/communication/serial/begin/
- hsgucci「シリアル通信をしてみよう(Serial)」Qiita, 2023年. https://qiita.com/hsgucci/items/eee5894e3651d0a8cb75
- ツール・ラボ「【Arduino IDE】シリアルプロッタの使い方」ツール・ラボ, 2025年. https://tool-lab.com/how-to-use-arduino-ide-serial-plotter/
- openillumi「Arduinoシリアル通信 文字化けはボーレートで解決!」openillumi, 2025年. https://openillumi.com/arduino-serial-garble-baudrate-fix/
- 本文中の具体的な数値・原因特定エピソードは、断りのない限り編集部想定シナリオに基づく試算・想定であり、実測データではありません。
関連記事(内部リンク)
- Arduinoのコードの書き方|基礎から応用まで全てがわかる初心者の手引き ― https://yofukasi-lab-wp.com/2025/03/07/arduino-cord/
- 圧センサーを用いた電子工作の基礎編|圧センサーの種類、配線、読み取り値など徹底解説 ― https://yofukasi-lab-wp.com/2025/03/08/pressure/
- ArduinoとPythonとセンサーを用いたリハビリテーションへの応用 ― https://yofukasi-lab-wp.com/2025/03/08/rehabilitation/
- リアルタイム握力計測ゲームのコードを徹底解説、応用も簡単|Arduino & Python ― https://yofukasi-lab-wp.com/2025/03/12/force/
コメント