ArduinoとPCのシリアル通信入門――Serial.printで値を可視化する基本と応用。

プログラミング・電子工作






ArduinoとPCのシリアル通信入門――Serial.printで値を可視化する基本と応用。|YOFUKASI AI




Arduino / 電子工作

ArduinoとPCのシリアル通信入門――Serial.printで値を可視化する基本と応用。

センサーの値、目で確認できていますか。Serial.begin()の基本設定から、シリアルモニタ・シリアルプロッタの使い分け、実践的なデバッグ手順までを解説します。

YOFUKASI AI編集部 | 更新日:2026年8月18日 | 読了目安:約12分

Chapter 01 — Introduction

01なぜシリアル通信で「値を見る」ことが重要なのか

結論から言えば、Arduinoで電子工作をする上で最初にぶつかる壁は「センサーが今どんな値を返しているのか、目で確認できない」ことにある。LEDの点滅やモーターの動きだけを見ていても、内部で計算されている数値が正しいかどうかは分からない。Serial.print()を使い、Arduinoが読み取った値をPCの画面に文字として出力することで、プログラムの中身を可視化し、意図した通りに動いているかを確認できるようになる。

実例として、ArduinoとGSMモジュールをシリアル通信で接続した際に、送信した文字列が意味不明な文字の羅列として表示されてしまうトラブルが報告されている。原因を調査したところ、Arduino IDEのシリアルモニタ側のボーレート設定が、スケッチ内のSerial.begin()の設定値と一致していなかったことが判明した事例がある。Arduinoシリアル通信の文字化けをボーレートの見直しで解決した事例では、通信速度の設定を送受信双方で揃えることで文字化けが解消したことが紹介されている。

編集部見解:シリアル通信によるデバッグは地味に見えるが、電子工作における最初の「動作確認の窓」として最も基本的かつ重要な手段だと考えられる。LCDや専用の表示器を用意する前に、まずシリアルモニタで値を確認する習慣をつけておくと、後のトラブルシューティングが格段に速くなる。
― YOFUKASI AI編集部

本記事では、Arduinoにおけるシリアル通信の基本構文から、シリアルモニタ・シリアルプロッタの使い分け、実際にセンサー値を確認する手順までを、初心者から中級者を対象に体系的に解説する。



Chapter 02 — Background

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のコードの書き方の基礎はこちらの記事で詳しく解説している

Chapter 03 — Mechanism

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へ送るセンサーの実例は、以下の記事でも詳しく扱っている。



Chapter 04 — Comparison

04値の確認方法の比較と選択肢

Arduinoが出力した値をどう確認するかは、目的によって最適な方法が変わる。以下に3つの選択肢を整理する。

項目 A. シリアルモニタ B. シリアルプロッタ C. 外部ツール(Python/Processing)
向いている用途 文字列・生の数値をそのまま確認 数値の時間変化をグラフで確認 データの保存・高度な可視化・GUI連携
準備の手軽さ Arduino IDEのみで完結 Arduino IDEのみで完結 別途プログラム作成が必要
複数値の同時表示 可能(見づらくなりやすい) カンマ区切りで複数系列を重ねて表示可能 自由度が高い(棒グラフ・散布図等)
データの保存 基本的に不可(コピー&ペーストのみ) 不可 CSV等での保存が容易

※B案のシリアルプロッタの具体的な操作方法は【Arduino IDE】シリアルプロッタの使い方(ツール・ラボ)で詳しく解説されている。カンマ区切りで複数の数値を送信することで、複数系列を重ねて表示できる点が紹介されている。

デバッグの初期段階ではまずシリアルモニタで生の値を確認し、値の傾向やノイズの有無を視覚的に把握したくなった段階でシリアルプロッタに切り替える、という流れが実務的である。長期間のデータを記録・分析したい場合は、C案のようにPythonなどでシリアルデータを受信し、ファイルに保存する構成を検討するとよい。

Chapter 05 — Practice

05実践:Serial.printでセンサー値を確認する5ステップ

ここでは「アナログ温度センサーの値をシリアルモニタで確認し、想定通りの範囲に収まっているかを検証する」という編集部想定シナリオを題材に、具体的な手順を示す。

  1. STEP1. setup()でSerial.begin()を呼び出す

    スケッチの冒頭、setup()関数の中でSerial.begin(9600)のようにボーレートを指定する。この1行がないと、シリアルモニタを開いても何も表示されない。

    実例:void setup() { Serial.begin(9600); }を追加。シリアルモニタ側のボーレートも9600に設定し、両者を一致させた。
  2. STEP2. センサー値をラベル付きで出力する

    analogRead()で取得した値をそのまま出力するのではなく、何のセンサーの値かが分かるようにラベル文字列を添える。

    実例:Serial.print("Raw ADC: "); Serial.println(analogRead(A0));とし、シリアルモニタ上で「Raw ADC: 512」のように表示されるようにした。
  3. STEP3. 単位換算した値もあわせて出力する

    センサーの生の数値(ADC値など)だけでなく、実際の物理量(温度・電圧など)に変換した値も出力することで、想定した範囲に収まっているかを直接確認できるようにする。

    実例:float voltage = analogRead(A0) * (5.0 / 1023.0); Serial.print("Voltage: "); Serial.println(voltage, 2);を追加し、電圧値を小数点以下2桁で表示するようにした。
  4. STEP4. delay()の時間を調整して出力頻度を最適化する

    出力頻度が高すぎるとシリアルモニタの画面が流れて読み取りにくくなる。逆に低すぎると変化を追いにくい。デバッグ時は500ms〜1000ms程度の間隔から調整を始めるとよい。

    実例:当初delay(10)としていたところ、シリアルモニタの表示が速すぎて目視確認できなかったため、delay(500)に変更した(編集部想定シナリオ)。
  5. STEP5. 想定外の値が出た箇所を特定する

    出力された値の中に、明らかにおかしい値(急激なスパイクや0固定など)がないかを確認する。ラベル付きで出力しておくと、どのセンサー・どの変換処理に問題があるかを素早く切り分けられる。

    実例:Voltageの値が常に0.00と表示され続けたため、配線を確認したところ、アナログ入力ピンの接続忘れが原因だったことが判明した(編集部想定シナリオ)。

シリアル通信で取得したセンサー値を、リアルタイムでPython側のゲームやグラフに反映させる実例は、以下の記事でも扱っている。Serial.printで出力した値を外部プログラムで受け取る際の構成の参考になる。

リアルタイム握力計測ゲームのコード解説はこちらの記事で読める。センサー値をシリアル通信でPythonに送り、ゲーム画面にリアルタイム反映する構成の参考になる。

Chapter 06 — Pitfalls

06注意点・よくある誤解

!誤解1. ボーレートはどの値を選んでも同じだ

Arduino側のSerial.begin()で指定したボーレートと、シリアルモニタ側の設定値が一致していないと、送受信のタイミングがずれて文字化けが発生する。実際に、ボーレートの設定不一致が原因で文字化けが起きた事例も報告されており、シリアル通信のトラブルではまず双方の設定値が一致しているかを確認するのが基本となる。

!誤解2. Serial.print()はデバッグ用なので本番のコードにも残しておいて問題ない

出力頻度が高い状態のままボーレートが低いと、送信待ちがボトルネックとなり、loop()全体の実行速度に影響することがある。デバッグが完了したら、出力頻度を下げるか、不要なSerial.print()の呼び出しを削除・コメントアウトしておくことが推奨される。

!誤解3. シリアルモニタに何も表示されなければコードが間違っている

シリアルモニタに何も表示されない原因は、コードの誤りとは限らない。Serial.begin()の呼び出し忘れ、ボーレートの不一致、誤ったCOMポートの選択など、設定面の見落としであることも多い。コードを疑う前に、まず設定を一つずつ確認することが近道になる。



Chapter 07 — FAQ

07FAQ

Q.Serial.print()とSerial.println()の違いは何ですか。
A.Serial.print()は値をそのまま出力するのに対し、Serial.println()は出力の末尾に改行コード(キャリッジリターンとラインフィード)を付け加えます。連続してデータを出力する際、値ごとに改行して見やすく表示したい場合はSerial.println()を使うのが基本です。

Q.ボーレート(baud rate)とは何ですか。なぜArduino側とPC側で一致させる必要がありますか。
A.ボーレートは1秒間に送受信できるビット数を表す通信速度の設定値です。Arduino側のSerial.begin()で指定した値と、PC側のシリアルモニタの設定値が一致していないと、送受信のタイミングがずれて文字化けが発生します。9600、57600、115200などの値がよく使われます。

Q.シリアルモニタとシリアルプロッタはどう使い分ければよいですか。
A.文字列やセンサーの生の数値をそのままテキストで確認したい場合はシリアルモニタが適しています。一方、値の時間的な変化をグラフとして視覚的に確認したい場合は、Arduino IDEに標準搭載されているシリアルプロッタが適しています。デバッグの初期段階ではシリアルモニタ、傾向を掴みたい段階ではシリアルプロッタ、という使い分けが実務的です。

Q.Serial.print()で数値を16進数や2進数で表示することはできますか。
A.できます。Serial.print(value, HEX)のように第2引数にHEX、OCT、DEC、BINのいずれかを指定することで、16進数、8進数、10進数、2進数の形式で出力できます。浮動小数点数の場合、第2引数には小数点以下の桁数を指定します。

Q.シリアルモニタに何も表示されない場合、何を確認すればよいですか。
A.まずスケッチ内のSerial.begin()の引数と、シリアルモニタ側のボーレート設定が一致しているかを確認してください。次に、正しいCOMポート(またはシリアルポート)が選択されているか、ケーブルが正しく接続されているかを確認します。それでも改善しない場合は、setup()内でSerial.begin()の呼び出し自体が漏れていないかを見直してください。

Q.Serial.print()を多用するとArduinoの動作が遅くなりますか。
A.ボーレートが低い設定のまま大量のデータを頻繁に出力すると、送信待ちの時間がボトルネックになり、loop()全体の実行速度に影響することがあります。デバッグ完了後は出力頻度を下げる、あるいはSerial.print()の呼び出し自体を削除・コメントアウトすることが推奨されます(編集部見解)。

参考文献

関連記事(内部リンク)


関連記事

特集記事

コメント

この記事へのコメントはありません。

TOP
CLOSE