# Raspberry Piでセンサーデータ取得＆クラウド連携 完全ガイド｜株式会社テクノスフィア

> Raspberry PiでI2C/SPI接続センサー（温湿度・加速度・CO₂）を読み取り、MQTT経由でAWS IoT Coreへ送信するまでを実装付きで解説。IoT・組込み制御の入門から実践まで。

URL: https://technosphere.co.jp/blog/raspberry-pi-sensor-iot

** 目次
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
# → 接続されたセンサーのアドレス（例: BME280=0x76, SCD41=0x62）が表示される
```

## 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 digitalio
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 システムの開発・設計でご不明な点がありましたら、株式会社テクノスフィアにお気軽にご相談ください。要件ヒアリングから設計・実装・クラウド連携・保守まで一気通貫で対応します。    ／この内容の受託開発・PoC相談はこちら＼

### Raspberry Pi 産業 IoT・センサー監視システムの受託開発

温湿度・振動・電流など現場センサーをラズパイで収集して AWS IoT / Azure IoT に連携する産業 IoT システム、PoC から現場設置・保守運用まで一気通貫でお引き受けします。  [組込み開発サービスを見る](https://technosphere.co.jp/embedded) [産業IoT・ラズパイ受託相談](https://technosphere.co.jp/contact)     # Raspberry Pi # I2C # SPI # センサー制御 # IoT # MQTT # AWS IoT # 組込み制御

 センサーで集めたデータをスマートフォンから確認・操作したい場合は、[BLEでスマホと機器をつなぐアプリ開発](https://technosphere.co.jp/blog/ble-device-app-integration)もあわせてご覧ください。機器とアプリを一貫して開発する[スマホアプリ開発サービス](https://technosphere.co.jp/app-development)もご用意しています。   [技術コラム一覧に戻る](https://technosphere.co.jp/blog/)
