目次
  1. はじめに:なぜ Raspberry Pi × センサー IoT なのか
  2. 接続するセンサーとハードウェア構成
  3. I2C センサーの読み取り(温湿度・CO₂)
  4. SPI センサーの読み取り(加速度・気圧)
  5. MQTT でクラウドへデータ送信
  6. AWS IoT Core への接続設定
  7. 実装上の注意点とトラブルシューティング
  8. まとめ

はじめに:なぜ Raspberry Pi × センサー IoT なのか

製造現場・農業・ビルマネジメントなど、あらゆる現場で「データを取って見える化したい」というニーズが急増しています。Raspberry Pi はその要件を低コストかつ短期間で実現できる最有力プラットフォームです。

Raspberry Pi が IoT 開発に選ばれる主な理由は以下の通りです。

  • GPIO・I2C・SPI・UART・USB をすべて標準搭載
  • Linux 環境で Python による高レベルな実装が可能
  • Wi-Fi・Ethernet で即座にクラウド連携できる
  • 豊富なライブラリと情報量で開発速度が速い
  • 本番環境移行後も Raspberry Pi Compute Module で量産対応可能
ポイント

弊社では Raspberry Pi 4/5 を用いた IoT システムの受託開発を多数手がけています。本記事は実際の案件で得たノウハウをもとに構成しています。

接続するセンサーとハードウェア構成

今回は以下のセンサーを使用します。いずれも入手性が高く、Raspberry Pi との組み合わせ実績が豊富です。

センサー 型番 通信方式 計測対象
温湿度センサー BME280 I2C / SPI 温度・湿度・気圧
CO₂センサー SCD41 I2C CO₂・温度・湿度
加速度センサー ADXL345 I2C / SPI 3軸加速度
照度センサー BH1750 I2C 照度(lux)

配線の基本:I2C の場合

Raspberry Pi の I2C ピンは GPIO2(SDA)GPIO3(SCL) です。複数センサーを同一バスに接続する場合、それぞれのセンサーに異なる I2C アドレスを割り当てる必要があります。

I2C を有効化する手順

# raspi-config でI2Cを有効化
sudo raspi-config
# → Interface Options → I2C → Enable

# I2Cデバイスの確認
sudo apt install i2c-tools
i2cdetect -y 1
# → 接続されたセンサーのアドレス(例: 0x76, 0x44)が表示される

I2C センサーの読み取り(温湿度・CO₂)

BME280 温湿度・気圧センサー

BME280 は Bosch 製の高精度環境センサーです。Python では smbus2 ライブラリを使って直接レジスタにアクセスするか、adafruit-circuitpython-bme280 ライブラリで簡単に取得できます。

import board
import adafruit_bme280.basic as adafruit_bme280

# I2Cバスの初期化
i2c = board.I2C()
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c, address=0x76)

# データ取得
print(f"温度: {bme280.temperature:.1f} ℃")
print(f"湿度: {bme280.humidity:.1f} %")
print(f"気圧: {bme280.pressure:.1f} hPa")

SCD41 CO₂センサー

SCD41 は Sensirion 製の高精度 CO₂・温湿度センサーです。工場内の空気環境モニタリングや農業ハウスの CO₂ 管理に活用できます。

import time
import board
import adafruit_scd4x

i2c = board.I2C()
scd4x = adafruit_scd4x.SCD4X(i2c)
scd4x.start_periodic_measurement()

time.sleep(5)  # 最初の測定待ち

if scd4x.data_ready:
    print(f"CO₂: {scd4x.CO2} ppm")
    print(f"温度: {scd4x.temperature:.1f} ℃")
    print(f"湿度: {scd4x.relative_humidity:.1f} %")

SPI センサーの読み取り(加速度)

SPI は I2C より高速なデータ転送が可能で、加速度センサーや ADC など高サンプリングレートが必要なセンサーに向いています。ADXL345 は SPI・I2C 両対応のデジタル加速度センサーです。

import board
import busio
import adafruit_adxl34x

# SPIバスの初期化(SPI0: MOSI=GPIO10, MISO=GPIO9, SCLK=GPIO11)
spi = busio.SPI(board.SCLK, board.MOSI, board.MISO)
cs = digitalio.DigitalInOut(board.CE0)  # GPIO8: Chip Select
accelerometer = adafruit_adxl34x.ADXL345(spi, cs)

# 3軸加速度の取得
x, y, z = accelerometer.acceleration
print(f"X: {x:.2f} m/s²  Y: {y:.2f} m/s²  Z: {z:.2f} m/s²")
実案件でのポイント

振動監視システムでは、ADXL345 を 1kHz サンプリングで動作させ、FFT 解析で異常振動を検出する実装を行いました。SPI の高速転送がここで威力を発揮します。

MQTT でクラウドへデータ送信

取得したセンサーデータをクラウドに送信するプロトコルとして、IoT では MQTT(Message Queuing Telemetry Transport)が標準的に使われます。HTTP に比べて軽量・低遅延で、不安定なネットワーク環境にも強いのが特徴です。

paho-mqtt によるデータ送信

import json
import time
import paho.mqtt.client as mqtt

# MQTT ブローカー設定(ここでは AWS IoT Core エンドポイント)
ENDPOINT   = "xxxxxxx.iot.ap-northeast-1.amazonaws.com"
PORT       = 8883
TOPIC      = "factory/line1/sensors"
CLIENT_ID  = "rpi-sensor-node-01"

# TLS 証明書(AWS IoT Core から取得)
CA_CERT    = "/certs/AmazonRootCA1.pem"
CERT_FILE  = "/certs/device-certificate.pem.crt"
KEY_FILE   = "/certs/private.pem.key"

def on_connect(client, userdata, flags, rc):
    print(f"接続完了: {rc}")

client = mqtt.Client(client_id=CLIENT_ID)
client.tls_set(CA_CERT, certfile=CERT_FILE, keyfile=KEY_FILE)
client.on_connect = on_connect
client.connect(ENDPOINT, PORT)
client.loop_start()

# センサーデータを定期送信
while True:
    payload = json.dumps({
        "temperature": bme280.temperature,
        "humidity":    bme280.humidity,
        "pressure":    bme280.pressure,
        "co2":         scd4x.CO2,
        "timestamp":   int(time.time())
    })
    client.publish(TOPIC, payload, qos=1)
    print(f"送信: {payload}")
    time.sleep(30)  # 30秒ごとに送信

AWS IoT Core への接続設定

AWS IoT Core はマネージド型の IoT ブローカーサービスです。デバイス証明書による相互 TLS 認証を使うため、セキュリティが担保された状態でデータを送受信できます。

接続までの手順

  1. AWS IoT Core コンソールで「モノ」を作成
  2. 証明書を作成・ダウンロード(デバイス証明書・秘密鍵・ルート CA)
  3. 証明書にポリシーをアタッチ(iotConnect / iotPublish 権限)
  4. エンドポイント URL を確認(設定 → デバイスデータエンドポイント)
  5. 上記の Python スクリプトにエンドポイントと証明書パスを設定して実行
活用例

弊社が手がけた工場の温湿度・CO₂ 管理システムでは、複数ラインの Raspberry Pi ノードから AWS IoT Core にデータを集約し、Amazon Timestream に蓄積、Grafana でリアルタイムダッシュボードを構築しました。設置から稼働まで約 2 週間で実現しています。

実装上の注意点とトラブルシューティング

よくあるトラブルと対策

症状原因対策
i2cdetect でデバイスが見えない I2C 未有効化 / 配線ミス / プルアップ抵抗不足 raspi-config で I2C 有効化・SDA/SCL に 4.7kΩ プルアップ抵抗を追加
センサー値が異常・ノイズが多い 電源ノイズ / 長いケーブル 100nF デカップリングコンデンサを VCC-GND 間に追加・ケーブルを 30cm 以内に
MQTT 接続が切断される ネットワーク不安定 / keepalive タイムアウト paho-mqtt の loop_start() と自動再接続 reconnect_delay_set() を設定
システム起動時に自動実行されない systemd サービス未設定 systemd ユニットファイルを作成し sudo systemctl enable で自動起動登録

本番運用で必須の対策

  • watchdog タイマー:スクリプトのフリーズを検出して自動再起動(/dev/watchdog または systemd の WatchdogSec
  • ログローテーション:長期運用でログが肥大化しないよう logrotate を設定
  • OTA アップデート:AWS IoT Jobs を使ってリモートからファームウェアを更新
  • 電源断対策:UPS モジュール(PiSugar / Witty Pi)またはシャットダウンスクリプトで SD カードの破損を防止

まとめ

この記事のまとめ

  • Raspberry Pi は I2C・SPI・UART をすべて標準搭載し、多様なセンサーと接続できる
  • BME280(温湿度・気圧)・SCD41(CO₂)は I2C で簡単に読み取れる
  • ADXL345 など高速サンプリングが必要なセンサーは SPI が有利
  • paho-mqtt + AWS IoT Core でセキュアなクラウド送信が実現できる
  • 本番運用には watchdog・ログローテーション・OTA・電源断対策が必須

Raspberry Pi を使った IoT システムの開発・設計でご不明な点がありましたら、株式会社テクノスフィアにお気軽にご相談ください。要件ヒアリングから設計・実装・クラウド連携・保守まで一気通貫で対応します。