Raspberry Pi

【実践】Pythonとラズパイで本格IoT!センサーデータをクラウドで可視化する方法

草壁シトヒ
記事内に商品プロモーションを含む場合があります

PythonとRaspberry Pi(ラズパイ)を使えば、あなたのアイデアを現実世界で動く形にできます。センサーでデータを集め、インターネットを経由してどこからでも確認する、そんな本格的なIoTプロジェクトも夢ではありません。この記事を読めば、電子工作の初心者でも、ラズパイのセットアップからセンサー制御、そしてクラウドを使ったデータの可視化まで、一連の流れを体系的にマスターできます。

私が普段から実践している具体的なコードや開発のコツを交えながら、一つずつ丁寧に解説していきます。この記事が、あなたのIoT開発の第一歩を踏み出すための、確かな道しるべとなるはずです。

ラズパイの基盤を固める|Python開発の準備

どんなに素晴らしいプロジェクトも、安定した土台がなければ始まりません。ラズパイをIoT開発の強力なツールとして活用するために、不可欠な初期設定と環境構築を行います。この準備を正確に行うことが、後のトラブルを未然に防ぐ鍵となります。

Raspberry Pi OSのインストールと初期設定

ラズパイの冒険は、OSのインストールから始まります。公式ツールの「Raspberry Pi Imager」を使えば、このプロセスは驚くほど簡単です。

OSには主に2つの選択肢があります。

  • Raspberry Pi OS with desktop|GUIを備えたフル機能のデスクトップ環境です。モニターやキーボードを繋いでPCのように使いたい初心者に最適です。
  • Raspberry Pi OS Lite|GUIを持たないコマンドラインベースの軽量なOSです。サーバー用途やリモート操作に向いています。

Raspberry Pi ImagerでOSを選択し、microSDカードに書き込む前に、詳細設定でホスト名、ユーザー名とパスワード、Wi-Fi情報、そしてSSHを有効にしておくと、最初の起動からスムーズにリモートアクセスができます。書き込みが完了したmicroSDカードをラズパイに挿して起動したら、ターミナルからsudo raspi-configコマンドで設定ツールを起動します。

ここで最低限やっておくべき設定は2つです。

  1. パスワードの変更|セキュリティ上、初期パスワードは必ず推測されにくいものに変更します。
  2. 地域設定|タイムゾーンをAsia/Tokyoに、キーボードレイアウトを日本語配列に設定し、快適な開発環境を整えます。

Python環境の整備とインターフェースの有効化

現在のRaspberry Pi OSでは、Python 3が標準でインストールされています。私が開発する際は、常にpython3とパッケージ管理ツールpip3を明示的に使うことで、古いPython 2との意図しない混同を避けています。

ライブラリをインストールする前に、sudo apt update && sudo apt upgrade -yコマンドでシステムを最新の状態に保つことを習慣にしましょう。

サードパーティのライブラリをインストールする際は、必ず「仮想環境」を利用します。これはプロジェクトごとに独立したPython環境を作る仕組みで、システムの環境を汚さずに済みます。

仮想環境の作成と利用手順は以下の通りです。

  1. プロジェクト用のディレクトリを作成し、移動します。 mkdir my_project && cd my_project
  2. 仮想環境を作成します。 python3 -m venv venv
  3. 仮想環境を有効化します。 source venv/bin/activate

プロンプトの先頭に(venv)と表示されれば準備完了です。この状態でpip3 installを使えば、ライブラリはこの仮想環境内にのみインストールされます。

GPIOを完全マスター|物理世界との接続

ラズパイの真価は、GPIOピンを通じて電子部品を直接コントロールできる点にあります。ここでは、電子工作の「Hello, World!」であるLチカ(LEDの点滅)とボタン入力に挑戦し、物理世界との対話方法を学びます。

GPIOの基礎|Lチカとボタン入力

ラズパイの基板には40本のピンが並んでおり、それぞれに役割があります。

  • 電源ピン|3.3Vと5Vの電力を供給します。
  • GNDピン|回路の基準となる0Vのピンです。
  • GPIOピン|プログラムから入出力を制御できる汎用ピンです。

GPIOピンを扱う上で最も重要な注意点は、ピンに3.3Vを超える電圧をかけないこと、そしてLEDなどを接続する際は必ず電流制限抵抗を入れることです。これを怠ると、ラズパイ本体を破損させる恐れがあります。

私が初心者に強く推奨するライブラリがgpiozeroです。このライブラリは電子部品をオブジェクトとして扱えるため、非常に直感的で短いコードでやりたいことを実現できます。

Lチカのコード例

Python
from gpiozero import LED
from time import sleep

# GPIO17に接続されたLEDをオブジェクトとして定義
led = LED(17)

# 無限ループで点滅を繰り返す
while True:
    led.on()      # LEDを点灯
    sleep(1)      # 1秒待機
    led.off()     # LEDを消灯
    sleep(1)      # 1秒待機

ボタン入力でLEDを制御するコード例

gpiozeroの強力な機能が「イベント駆動」です。ボタンが押された時、離された時といったイベントをきっかけに、指定した処理を自動で実行します。

Python
from gpiozero import LED, Button
from signal import pause

led = LED(17)
# GPIO2に接続し、内部プルアップ抵抗を有効にしたボタンを定義
button = Button(2, pull_up=True)

# イベントと処理を結びつける
button.when_pressed = led.on   # ボタンが押されたらled.on()を実行
button.when_released = led.off # ボタンが離されたらled.off()を実行

pause() # スクリプトをバックグラウンドで実行し続ける

最適なライブラリの選択|gpiozeroとRPi.GPIO

PythonでGPIOを制御するライブラリは複数ありますが、主にgpiozeroRPi.GPIOが使われます。

特徴gpiozeroRPi.GPIO
コンセプトオブジェクト指向で直感的低レベルな直接制御
主な利用者初心者、教育、迅速なプロトタイピング上級者、既存コードのメンテナンス
コード量非常に少ない多い(初期設定や後片付けが必須)
可読性高い (led.on())やや低い (GPIO.output(17, GPIO.HIGH))

私は、新しいプロジェクトを始める際は、ほぼ常にgpiozeroを選択します。コードが簡潔になり、プロジェクトの本質的なロジックに集中できるからです。一方で、RPi.GPIOはGPIOの動作原理を深く理解するのには役立ちます。

さらに高度な制御、例えばサーボモーターのジッター(微振動)をなくしたい場合や、ネットワーク経由でGPIOを操作したい場合はpigpioというライブラリが有効です。gpiozeroの優れた点は、基盤となるライブラリをRPi.GPIOからpigpioへ簡単に切り替えられる「ピンファクトリー」という仕組みを持っていることです。これにより、アプリケーションのコードを書き換えることなく、性能を向上させられます。

世界を感知し操作する|センサーとモーターの活用

GPIOの基本をマスターしたら、次は様々なセンサーやアクチュエータ(動力装置)を使いこなし、プロジェクトの幅を広げます。世界を感知し、物理的に操作する方法を学びましょう。

デジタル・I2Cセンサーからのデータ取得

センサーには様々な種類がありますが、ここでは代表的な2つを紹介します。

PIRモーションセンサー(デジタル入力)

PIRセンサーは、人や動物の動き(赤外線の変化)を検知します。動きを検知するとGPIOピンにHIGH(3.3V)信号を送るだけのシンプルな仕組みです。gpiozeroMotionSensorクラスを使えば、動きを検知した時の処理を簡単に書けます。

Python
from gpiozero import MotionSensor, LED
from signal import pause

pir = MotionSensor(4) # GPIO4に接続
led = LED(17)

# 動きを検知したらLEDを点灯、動きがなくなったら消灯
pir.when_motion = led.on
pir.when_no_motion = led.off

pause()

BME280温湿度・気圧センサー(I2C通信)

I2Cは、2本の信号線だけで複数の高機能デバイスと通信できる便利なプロトコルです。BME280は、温度・湿度・気圧を一度に測定できる人気のI2Cセンサーです。複雑な通信は専用のライブラリがすべて行ってくれるため、私たちは簡単なコードでデータを読み取れます。

まず、ライブラリをインストールします。

pip3 install adafruit-circuitpython-bme280

Python
import time
import board
import adafruit_bme280.basic as adafruit_bme280

# I2Cインターフェースを作成
i2c = board.I2C()
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)

while True:
    print(f"温度: {bme280.temperature:.1f} C")
    print(f"湿度: {bme280.relative_humidity:.1f} %")
    print(f"気圧: {bme280.pressure:.1f} hPa")
    time.sleep(2)

モーター制御でプロジェクトに動きを

プロジェクトに動きをもたらすモーターの制御は、電子工作の醍醐味の一つです。

DCモーター

DCモーターは、ラズパイのGPIOピンから直接駆動できません。必ず「モータードライバー」というICを介して、外部電源から電力を供給する必要があります。gpiozeroMotorクラスを使えば、正転・逆転・速度制御を簡単に行えます。

Python
from gpiozero import Motor
from time import sleep

# forwardピンとbackwardピンを指定してオブジェクトを作成
motor = Motor(forward=17, backward=18)

motor.forward() # 正転(フルスピード)
sleep(2)
motor.backward(speed=0.5) # 逆転(半分のスピード)
sleep(2)
motor.stop() # 停止

サーボモーター

サーボモーターは、指定した角度に回転し、その位置を保持できます。ロボットアームなど、正確な位置決めが必要な場面で活躍します。

Python
from gpiozero import Servo
from time import sleep

servo = Servo(18)

servo.min() # 最小角度へ
sleep(1)
servo.mid() # 中間角度へ
sleep(1)
servo.max() # 最大角度へ
sleep(1)

ここで私がよく直面するのが、サーボのジッター問題です。gpiozeroのデフォルト設定ではサーボが小刻みに震えることがありますが、これは前述のpigpioライブラリをピンファクトリーとして設定することで、見事に解決できます。

データを集め、可視化する|ロギングと分析の第一歩

センサーで取得したデータを記録し、分析・可視化することで、プロジェクトの価値は飛躍的に高まります。ここでは、カメラの使い方から、データの保存、グラフ化までを解説します。

カメラで世界を切り取る|picamera2の活用

ラズパイの公式カメラモジュールは、プロジェクトの可能性を大きく広げます。現在のRaspberry Pi OSでは、picamera2という新しいライブラリを使用します。

まず、aptでインストールします。pipではない点に注意してください。

sudo apt install -y python3-picamera2

静止画を撮影するコード例

Python
from picamera2 import Picamera2, Preview
import time

picam2 = Picamera2()
# プレビュー用の設定を作成し、適用
camera_config = picam2.create_preview_configuration()
picam2.configure(camera_config)

# プレビューを開始
picam2.start_preview(Preview.QTGL)
picam2.start()
time.sleep(2) # オートフォーカスなどのための待機

# ファイルに保存
picam2.capture_file("test_photo.jpg")

picam2.stop_preview()
picam2.stop()

センサーデータの記録|CSVとSQLite

収集したデータを永続化するには、ファイルに保存します。用途に応じて2つの方法を使い分けます。

CSVファイルによるシンプルな記録

CSV形式は、Excelなどの表計算ソフトで簡単に開けるため、手軽なデータ記録に最適です。Pythonのcsvモジュールを使って、タイムスタンプと共にデータを記録します。

Python
import csv
from gpiozero import CPUTemperature
from time import sleep
from datetime import datetime

cpu = CPUTemperature()

# ファイルを追記モード('a')で開く
with open('cpu_log.csv', 'a', newline='') as f:
    writer = csv.writer(f)
    # データをリストとして書き込む
    now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    row = [now, cpu.temperature]
    writer.writerow(row)

SQLiteによる堅牢なデータストレージ

データ量が増え、検索や集計が必要になった場合は、データベースの出番です。SQLiteは、サーバー不要で単一のファイルとして機能する軽量データベースで、ラズパイに最適です。SQLという言語を使って、効率的にデータを管理できます。

Python
import sqlite3

def log_to_db(temp, hum, pres):
    # データベースファイルに接続(なければ新規作成)
    conn = sqlite3.connect('sensor_data.db')
    cursor = conn.cursor()
    # SQLインジェクションを防ぐため、プレースホルダ(?)を使用
    cursor.execute("INSERT INTO readings (temperature, humidity, pressure) VALUES (?,?,?)",
                   (temp, hum, pres))
    conn.commit()
    conn.close()

Matplotlibでデータをグラフ化

データを視覚化すると、傾向や異常が一目でわかります。Pythonの標準的なグラフ描画ライブラリMatplotlibを使えば、高品質なグラフを簡単に作成できます。

ライブラリをインストールします。

pip3 install matplotlib

CSVデータからグラフを生成するコード例

Python
import csv
import matplotlib.pyplot as plt
from datetime import datetime

timestamps = []
temperatures = []

# CSVファイルを読み込み、データをリストに格納
with open('cpu_log.csv', 'r') as f:
    reader = csv.reader(f)
    next(reader) # ヘッダー行をスキップ
    for row in reader:
        timestamps.append(datetime.strptime(row[0], "%Y-%m-%d %H:%M:%S"))
        temperatures.append(float(row[1]))

# グラフを描画
plt.figure(figsize=(10, 6))
plt.plot(timestamps, temperatures, label='CPU Temperature')
plt.title('CPU Temperature Over Time')
plt.xlabel('Time')
plt.ylabel('Temperature (°C)')
plt.grid(True)
plt.legend()
plt.savefig('cpu_temperature_graph.png') # ファイルに保存
plt.show() # 画面に表示

本格IoTへ|ネットワークとクラウド連携

ラズパイをネットワークに接続することで、その可能性は無限に広がります。Webサーバーの構築から、IoTの標準プロトコルMQTT、そしてクラウドプラットフォームとの連携まで、本格的なIoTシステムを構築する技術を探求します。

FlaskでWebサーバーを構築

Flaskは、手軽にWebサーバーを立ち上げられるPythonの軽量フレームワークです。これを使えば、スマホやPCのブラウザからラズパイのGPIOを制御するWebアプリを作成できます。

ライブラリをインストールします。

pip3 install Flask

Python
from flask import Flask, render_template, redirect, url_for
from gpiozero import LED

app = Flask(__name__)
led = LED(17)

# ルートURLにアクセスした時の処理
@app.route('/')
def index():
    return render_template('index.html') # HTMLファイルを表示

# /led/on や /led/off にアクセスした時の処理
@app.route('/led/<string:state>')
def led_control(state):
    if state.lower() == 'on':
        led.on()
    elif state.lower() == 'off':
        led.off()
    return redirect(url_for('index'))

if __name__ == '__main__':
    # ネットワーク内の他デバイスからアクセスできるようにする
    app.run(debug=True, port=5000, host='0.0.0.0')

このPythonスクリプトと簡単なHTMLファイルを用意するだけで、Webブラウザ上のボタンで物理的なLEDをON/OFFできます。

MQTTでデバイス間通信を実現

MQTTは、IoTデバイス間の通信に特化した軽量なメッセージングプロトコルです。「発行/購読(Publish/Subscribe)」モデルを採用しており、デバイス同士が疎結合に通信できます。

ラズパイにMosquittoというMQTTブローカー(メッセージを仲介するサーバー)をインストールすれば、家庭内IoTハブとして機能させられます。

ブローカーとクライアントツールをインストールします。

sudo apt install mosquitto mosquitto-clients

PythonからMQTT通信を行うにはpaho-mqttライブラリを使います。

pip3 install “paho-mqtt<2.0.0”

MQTTでメッセージを発行する(Publisher)

Python
import paho.mqtt.client as mqtt
import time
from gpiozero import CPUTemperature

client = mqtt.Client()
client.connect("localhost") # ブローカーに接続

cpu = CPUTemperature()

while True:
    # 'rpi/cpu_temp'というトピックにCPU温度を発行
    client.publish("rpi/cpu_temp", f"{cpu.temperature:.2f}")
    time.sleep(5)

MQTTメッセージを購読する(Subscriber)

Python
import paho.mqtt.client as mqtt
from gpiozero import LED

led = LED(17)

def on_message(client, userdata, msg):
    payload = msg.payload.decode()
    if payload.upper() == "ON":
        led.on()
    elif payload.upper() == "OFF":
        led.off()

client = mqtt.Client()
client.on_message = on_message # メッセージ受信時の処理を登録
client.connect("localhost")
client.subscribe("rpi/led_control") # トピックを購読

client.loop_forever() # 永久に待機

クラウドでデータをどこからでも可視化

データをインターネット上のクラウドサービスに送れば、どこからでもアクセスできるダッシュボードを簡単に作成できます。ここでは無料で始められる2つの人気プラットフォームを紹介します。

ThingSpeak

ThingSpeakは、センサーデータを手軽にグラフ化するのに特化しています。アカウントを作成し、「チャンネル」と「APIキー」を取得すれば、HTTPリクエストで簡単にデータを送信できます。

Python
import requests
import time

THINGSPEAK_WRITE_KEY = "YOUR_WRITE_API_KEY"
THINGSPEAK_URL = "https://api.thingspeak.com/update"

payload = {
    'api_key': THINGSPEAK_WRITE_KEY,
    'field1': 25.5, # 温度データ
    'field2': 50.2  # 湿度データ
}
requests.get(THINGSPEAK_URL, params=payload)

スクリプトを実行すると、ThingSpeakのサイト上でリアルタイムにグラフが更新されていきます。

Adafruit IO

Adafruit IOは、ドラッグアンドドロップでインタラクティブなダッシュボードを構築できるのが魅力です。ゲージやスイッチ、グラフなどを自由に配置できます。専用のPythonライブラリを使うと、データの送受信が簡単になります。

ライブラリをインストールします。

pip install adafruit-io

Python
from Adafruit_IO import Client, Feed

AIO_USERNAME = "YOUR_AIO_USERNAME"
AIO_KEY = "YOUR_AIO_KEY"
aio = Client(AIO_USERNAME, AIO_KEY)

# データを送信
aio.send_data('temperature', 25.5)
aio.send_data('humidity', 50.2)

# データを受信(ダッシュボードのスイッチ操作など)
led_data = aio.receive('led-control')
if led_data.value == 'ON':
    print("LEDをオンにする")

まとめ

このガイドでは、ラズパイの基本的なセットアップから始まり、Pythonを使ったGPIO制御、センサーやモーターの活用、データロギングと可視化、そしてネットワークとクラウドを利用した本格的なIoTアプリケーションの構築まで、一貫した流れで解説しました。

私がこの旅路で最も重要だと考えるのは、以下のベストプラクティスです。

  • 仮想環境 (venv) の徹底|クリーンな開発環境を保ち、プロジェクトの再現性を高めます。
  • 抽象化 (gpiozero) の活用|複雑さを隠蔽し、創造的なロジックに集中します。
  • 段階的な開発|スタンドアロンからローカルネットワーク、そしてクラウドへと、一歩ずつ着実にプロジェクトを発展させます。

ここで得た知識とスキルは、あなたのアイデアを形にするための強力な武器となります。ホームオートメーション、ロボット、環境モニタリングシステムなど、次なるプロジェクトに向けて、ぜひ挑戦を続けてください。公式ドキュメントや活発なオンラインコミュニティを参考にしながら、創造の翼を広げていきましょう。

記事URLをコピーしました