「ArduinoとPythonを組み合わせてIoTって、なんだか上級者向けじゃない?」そう思っている方、多いんじゃないでしょうか。😊
実は、必要な知識はそこまで多くないんです。Arduinoでセンサーのデータを読み取って、Pythonでグラフにリアルタイム表示する——この流れさえつかめば、あなただけのオリジナルIoTデバイスがサクッと完成します。
今回は「センサーデータの可視化」を題材に、Python×Arduino連携の入門ガイドを丁寧に解説していきます。ぜひ手を動かしながら読んでみてください!
📌 この記事の対象者と難易度

- ✅ Pythonの基本文法(変数・ループ)がわかる方
- ✅ Arduinoを触ったことがある、または興味がある方
- ✅ IoTやセンサーデータの扱いに興味がある初〜中級者の方
難易度は★★☆☆☆(初〜中級者向け)です。難しそうに見えて、実はシンプルな構成なので安心してください。
🔧 全体の仕組みをざっくり理解しよう
まず、大きな流れをつかんでおきましょう。イメージとしてはこんな感じです👇
センサー → Arduino → シリアル通信(USB) → Python → リアルタイムグラフ表示
- 🔹 Arduino:センサーの値を読み取り、シリアル通信でPCに送信する役割
- 🔹 シリアル通信:ArduinoとPCをUSBケーブルでつないでデータをやり取りする仕組み
- 🔹 Python:受け取ったデータを処理してグラフに表示する役割
この3つの役割分担を頭に入れておくと、コードの理解がぐっと楽になりますよ。
🛠️ 必要なもの・環境準備
ハードウェア
- Arduino Uno(または互換機)
- 温度センサー(今回はLM35を使用。DHT11でもOK)
- ジャンパーワイヤー・ブレッドボード
- USBケーブル(Arduino接続用)
ソフトウェア
- Arduino IDE(スケッチの書き込みに使用)
- Python 3.x
- Pythonライブラリ:
pyserial・matplotlib
ライブラリのインストールは以下のコマンド一発でOKです。
pip install pyserial matplotlib
インストールが完了したら、次のステップに進みましょう!
⚡ STEP 1:Arduinoスケッチでセンサーデータを送信する
まずはArduino側のコードです。センサーの値を読み取って、シリアル通信でPCに送り続けるシンプルなスケッチになっています。
// LM35温度センサーのデータをシリアル送信するスケッチ
const int sensorPin = A0; // センサーをアナログピン0に接続
void setup() {
Serial.begin(9600); // シリアル通信を9600bpsで開始
}
void loop() {
int rawValue = analogRead(sensorPin); // アナログ値を読み取る(0〜1023)
// LM35は10mV/℃の出力なので電圧から温度に変換
float voltage = rawValue * (5.0 / 1023.0); // 電圧(V)に変換
float temperature = voltage * 100.0; // 温度(℃)に変換
Serial.println(temperature); // 温度をシリアルポートに送信
delay(500); // 0.5秒ごとに送信
}
ここが重要です📌
- Serial.begin(9600):Python側と通信速度を合わせる必要があります。後で出てくるPythonコードでも
9600と一致させること! - Serial.println():数値を文字列として送信します。Python側で受け取ったときに変換が必要になります。
- delay(500):送信間隔を調整できます。短すぎるとデータが溜まりすぎるので注意。
このスケッチをArduino IDEで書き込んだら、次はPython側の準備です。
🐍 STEP 2:Pythonでシリアルデータを受信する
次に、Pythonでシリアルポートからデータを受け取る部分を作ります。まずは受信だけを確認する小さなコードから試してみましょう。
import serial
import time
# ポート名はOSによって異なります
# Windows: 'COM3' など Mac/Linux: '/dev/ttyUSB0' や '/dev/tty.usbmodem...' など
PORT = '/dev/ttyUSB0'
BAUD_RATE = 9600 # Arduinoスケッチと合わせること!
# シリアル接続を開く
ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
time.sleep(2) # Arduinoのリセット待ち(重要!)
print('データ受信開始...')
for _ in range(10): # 10回分のデータを受け取って表示
line = ser.readline().decode('utf-8').strip()
if line:
print(f'受信データ: {line} ℃')
ser.close()
print('接続を閉じました')
ポイントを押さえておきましょう。
- time.sleep(2):Arduinoは接続時にリセットがかかります。2秒待たないとデータが文字化けすることがあるので必須です。
- decode(‘utf-8’).strip():シリアルで届くデータはバイト列なので、文字列に変換して余分な改行を取り除きます。
- ポート名の確認:Windowsなら「デバイスマネージャー」、Mac/Linuxなら
ls /dev/tty*コマンドで確認できます。
このコードを実行して温度データが表示されれば、通信は成功です!次はいよいよグラフ表示に進みます。
📊 STEP 3:matplotlibでリアルタイムグラフを表示する
いよいよメインの可視化パートです。matplotlibのアニメーション機能を使って、センサーデータをリアルタイムで折れ線グラフに描画します。
import serial
import time
import matplotlib.pyplot as plt
import matplotlib.animation as animation
PORT = '/dev/ttyUSB0' # 環境に合わせて変更
BAUD_RATE = 9600
ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
time.sleep(2)
# データを格納するリスト
temperatures = []
times = []
start_time = time.time()
fig, ax = plt.subplots()
def update(frame):
"""アニメーションの更新関数"""
line = ser.readline().decode('utf-8').strip()
if line:
try:
temp = float(line) # 文字列を浮動小数点に変換
elapsed = time.time() - start_time
temperatures.append(temp)
times.append(elapsed)
# 直近50件だけ表示(グラフが見やすくなる)
ax.clear()
ax.plot(times[-50:], temperatures[-50:], color='tomato', linewidth=2)
ax.set_title('LM35 リアルタイム温度モニター', fontsize=14)
ax.set_xlabel('経過時間(秒)')
ax.set_ylabel('温度(℃)')
ax.set_ylim(0, 50) # 表示範囲を調整
ax.grid(True)
except ValueError:
pass # 変換できないデータは無視
# 500msごとにupdate関数を呼び出す
ani = animation.FuncAnimation(fig, update, interval=500)
plt.tight_layout()
plt.show()
ser.close()
このコードの仕組みを簡単に説明します。
- FuncAnimation:指定した間隔(interval)ごとに
update関数を繰り返し呼び出してグラフを更新します。 - times[-50:]:直近50件のデータだけを表示することで、グラフが右にスクロールするようなリアルタイム感が生まれます。
- try / except ValueError:通信ノイズや不完全なデータで変換エラーが起きても止まらないようにしています。
🔍 よくあるトラブルと対処法
初めて試すと、いくつかハマりやすいポイントがあります。代表的なものをまとめておきます。
- ❌ 「ポートが見つからない」エラー:Arduino IDEのツールメニューで表示されているポート名をそのままコピーして使いましょう。
- ❌ グラフが真っ白・数値がおかしい:Arduino IDEのシリアルモニターを閉じてください。Pythonと同時にポートを開くことはできません。
- ❌ 文字化けする:
time.sleep(2)を忘れていないか確認。Arduinoのリセット直後は不完全なデータが来ることがあります。 - ❌ 温度が明らかにおかしい値:センサーの配線を確認。LM35はVCC・GND・OUTの3ピンです。向きを間違えると正しく動作しません。
🚀 次のステップ:応用アイデア
基本の流れがつかめたら、こんな拡張にもチャレンジしてみてください!
- 💡 CSVに記録する:
csvモジュールを使えば、計測データをファイルに保存できます。後から分析も可能です。 - 💡 複数センサーを同時に扱う:Arduinoのアナログピンは複数あるので、湿度センサーなどを追加して多チャンネル化できます。
- 💡 Webブラウザで表示する:FlaskとChart.jsを組み合わせると、ブラウザ上でグラフを見られるダッシュボードも作れます。
✅ まとめ
今回の内容を振り返ってみましょう。
- ArduinoとPythonはシリアル通信(USB)でデータをやり取りする
- Arduinoスケッチでセンサー値を読み取り、
Serial.println()で送信する - Pythonの
pyserialでデータを受信し、matplotlibでリアルタイムグラフを描画する - ポート名・ボーレートの一致と、接続直後の
time.sleep(2)がつまずきポイント
構成自体はとてもシンプルです。まずは動かしてみることが一番の近道!ぜひ手元のArduinoで試してみてください。😊
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。





