「Arduino Python連携って難しそう…センサーのデータをグラフにするなんて、自分には無理かも」
そんなふうに感じている方、けっこう多いんじゃないでしょうか。でも実は、必要なライブラリとちょっとしたコードさえあれば、初心者でも意外とすんなり動くんです。今回は「IoT入門」として、Arduinoで拾ったセンサーデータをPythonでリアルタイムにグラフ表示するところまで、一緒に試してみましょう! 🚀
対象読者:プログラミング初〜中級者 / Arduinoの基本操作ができる方 / Pythonの基礎文法がわかる方
そもそもArduino×Pythonで何ができるの?

Arduinoはセンサーや電子部品を動かすのが得意なマイコンボードです。一方Pythonはデータ処理・グラフ描画・Web連携などが得意な言語。この2つを組み合わせると、それぞれの強みを活かした本格的なIoTシステムが作れます。
イメージとしてはこんな感じです👇
- 🔌 Arduino:センサーで温度・湿度・照度などの値を読み取る
- 📡 シリアル通信:USBケーブルを通してPCへデータを送る
- 🐍 Python:受け取ったデータをリアルタイムにグラフ表示する
この流れが「入門IoTシステム」の基本形です。シンプルですが、これをマスターすると応用の幅がぐっと広がりますよ。
用意するもの
- Arduino Uno(または互換機)
- 温度センサー:TMP36(3本足で扱いやすくておすすめ)
- ブレッドボード・ジャンパワイヤー
- USBケーブル(A-Bタイプ)
- PC(Windows / Mac / Linux いずれも可)
Pythonのライブラリも事前に入れておきましょう。ターミナルで以下を実行してください。
pip install pyserial matplotlib
pyserialがシリアル通信を担当し、matplotlibがグラフ描画を担当します。この2つだけでOKです ✅
STEP 1:ArduinoでセンサーデータをシリアルにPrintする

まずはArduino側のスケッチ(コード)を書きます。TMP36センサーのアナログ値を読み取って、摂氏温度に変換してシリアル出力するだけのシンプルな内容です。
ポイントをまとめるとこんな感じです👇
- A0ピンでアナログ値を読み取る
- 読み取った値を電圧 → 温度(℃)に変換する
Serial.println()でPCへ送信する- 送信間隔は500msに設定(グラフが見やすいテンポになります)
// TMP36温度センサーのデータをシリアル送信するスケッチ
void setup() {
Serial.begin(9600); // シリアル通信を9600bpsで開始
}
void loop() {
int sensorValue = analogRead(A0); // A0ピンからアナログ値を読み取る
// アナログ値 → 電圧 → 温度(℃)へ変換
float voltage = sensorValue * (5.0 / 1023.0);
float temperatureC = (voltage - 0.5) * 100.0;
// 温度をシリアルモニターへ送信
Serial.println(temperatureC);
delay(500); // 0.5秒ごとに送信
}
このスケッチをArduino IDEで書き込んだら、シリアルモニターを開いて温度らしい数値が流れてくるか確認しておきましょう 🔍
STEP 2:Pythonでシリアルデータをリアルタイムにグラフへ描画する
Arduino側が整ったら、次はPython側です。ここが今回のメインです!
ここが重要です。matplotlibにはFuncAnimationという「一定間隔で描画を更新し続ける」機能があります。これを使うと、センサーデータのリアルタイム可視化がとても楽に実装できます。
import serial
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from collections import deque
# --- 設定 ---
PORT = 'COM3' # Windowsの場合。Macなら '/dev/tty.usbmodem...' など
BAUD_RATE = 9600
MAX_DATA_POINTS = 60 # グラフに表示するデータ数(最新60件)
# シリアルポートを開く
ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
# データ保存用のdeque(古いデータを自動で捨ててくれる便利なリスト)
temps = deque([0] * MAX_DATA_POINTS, maxlen=MAX_DATA_POINTS)
# グラフの初期設定
fig, ax = plt.subplots()
line, = ax.plot(list(temps), color='tomato', linewidth=2)
ax.set_ylim(0, 50) # 温度の表示範囲(0〜50℃)
ax.set_xlim(0, MAX_DATA_POINTS)
ax.set_title('TMP36 リアルタイム温度モニター 🌡️', fontsize=14)
ax.set_ylabel('温度 (℃)')
ax.set_xlabel('時間(サンプル数)')
ax.grid(True, linestyle='--', alpha=0.5)
def update(frame):
"""FuncAnimationから繰り返し呼ばれる更新関数"""
try:
raw = ser.readline().decode('utf-8').strip() # シリアルから1行読む
if raw:
temp = float(raw) # 文字列 → 小数に変換
temps.append(temp) # dequeに追加(古いものは自動削除)
except (ValueError, UnicodeDecodeError):
pass # 読み取り失敗時は無視して続行
line.set_ydata(list(temps)) # グラフのY軸データを更新
return line,
# 500msごとにupdate関数を呼び出してグラフを更新し続ける
ani = animation.FuncAnimation(fig, update, interval=500, blit=True)
plt.tight_layout()
plt.show()
# ウィンドウを閉じたらシリアルポートを閉じる
ser.close()
コードのポイントをまとめると👇
- deque(両端キュー)を使うと、古いデータを自動で捨てて常に最新N件だけキープできます
- FuncAnimationが500msごとに
update()を呼び続けるので、グラフが自動で更新されます blit=Trueにすると変化した部分だけ再描画するので、動作が軽くなります- Windowsなら
PORT = 'COM3'、Macなら'/dev/tty.usbmodem〇〇'のように、ご自身の環境に合わせて変更してください
これ、実際に動かしてみると「うわ、動いてる!」ってテンション上がりますよ 😄
COMポートがわからないときの確認方法
「PORTって何を入れればいいの?」という疑問、あるあるです。確認方法はOS別にこんな感じです。
- Windows:デバイスマネージャー → ポート(COMとLPT)に「Arduino Uno (COM〇)」と表示されます
- Mac / Linux:ターミナルで
ls /dev/tty.*を実行すると一覧が出ます
Arduino IDEで「ツール → シリアルポート」に表示されているポート名と同じものを使えばOKです ✅
まとめ
今回やったことをざっくり振り返ってみましょう。
- ✅ TMP36センサーの値をArduinoで読み取り、シリアル通信でPCへ送信した
- ✅ Pythonの
pyserialでデータを受け取り、matplotlibでリアルタイムグラフ表示した - ✅
dequeとFuncAnimationの組み合わせが、リアルタイム可視化のキモだとわかった
Arduino Python連携の基本パターンを押さえると、センサーを替えるだけで湿度・照度・距離などあらゆるデータに応用できます。IoT入門としては最高の出発点だと思っています。
「むずかしそう」が「できそう」に変わってきたんじゃないでしょうか 🎉 ぜひ実際にブレッドボードを組んで、リアルタイムでグラフが動く瞬間を体験してみてください!
次回はこのデータをCSVに保存したり、Webブラウザ上で表示する方法にも挑戦してみる予定です。お楽しみに!

📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。




