MENU
IoT・電子工作

Python×ArduinoでIoTデバイスを自作しよう!センサーデータをリアルタイム可視化する入門ガイド

「ArduinoとPythonを組み合わせてIoTって、なんだか上級者向けじゃない?」そう思っている方、多いんじゃないでしょうか。😊

実は、必要な知識はそこまで多くないんです。Arduinoでセンサーのデータを読み取って、Pythonでグラフにリアルタイム表示する——この流れさえつかめば、あなただけのオリジナルIoTデバイスがサクッと完成します。

今回は「センサーデータの可視化」を題材に、Python×Arduino連携の入門ガイドを丁寧に解説していきます。ぜひ手を動かしながら読んでみてください!

📌 この記事の対象者と難易度

Arduino sensor real-time graph
Arduino sensor real-time graph / Photo by Bmonster Lab via Pexels
  • ✅ 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ライブラリ:pyserialmatplotlib

ライブラリのインストールは以下のコマンド一発で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コースや電子部品もまとめています。

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

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