IoT

ArduinoとPython連携で作るIoT入門|センサーデータをリアルタイム可視化しよう

Arduino Python連携って難しそう…センサーのデータをグラフにするなんて、自分には無理かも」

そんなふうに感じている方、けっこう多いんじゃないでしょうか。でも実は、必要なライブラリとちょっとしたコードさえあれば、初心者でも意外とすんなり動くんです。今回は「IoT入門」として、Arduinoで拾ったセンサーデータをPythonでリアルタイムにグラフ表示するところまで、一緒に試してみましょう! 🚀

対象読者:プログラミング初〜中級者 / Arduinoの基本操作ができる方 / Pythonの基礎文法がわかる方

そもそもArduino×Pythonで何ができるの?

arduino sensor electronics
arduino sensor electronics / Photo by Lisha Dunlap via Pexels

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する

IoT data visualization
IoT data visualization / Photo by Jakub Zerdzicki via Pexels

まずは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でリアルタイムグラフ表示した
  • dequeFuncAnimationの組み合わせが、リアルタイム可視化のキモだとわかった

Arduino Python連携の基本パターンを押さえると、センサーを替えるだけで湿度・照度・距離などあらゆるデータに応用できます。IoT入門としては最高の出発点だと思っています。

「むずかしそう」が「できそう」に変わってきたんじゃないでしょうか 🎉 ぜひ実際にブレッドボードを組んで、リアルタイムでグラフが動く瞬間を体験してみてください!

次回はこのデータをCSVに保存したり、Webブラウザ上で表示する方法にも挑戦してみる予定です。お楽しみに!

Pythonライブラリのインストール
Pythonライブラリのインストール

📡 Arduinoをもっと深く学ぼう!

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

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です