このページの目次

センサー

物理量から I2C レジスタ値への完全なリンク


センサーインターフェースの選定

インターフェース距離速度消費電力複数デバイス代表的なセンサー
I2CPCB 上100k~1M低い✅ (アドレス)ほとんどのデジタルセンサー
SPIPCB 上MHz 帯中程度チップセレクト必要高速 ADC, IMU
UART長距離115k~1M中程度❌ 1対1GPS, ライダー測距
アナログPCB 上-極めて低いNTC, 光敏, マイクロホン
1-Wire長距離低速極めて低い✅ (ROM ID)DS18B20
パルス/PWMPCB 上-低いホール素子, 回転数

温度センサー

NTC 熱敏抵抗 (最安値)

回路: 分圧法
  Vcc
   │
   R_fixed (10k, 1%)
   │
   ├── ADC 入力
   │
   NTC
   │
  GND

温度計算:
  R_ntc = R_fixed × (Vcc - V_adc) / V_adc
  T = 1 / (1/T25 + ln(R_ntc/R25)/B) - 273.15
  T25 = 298.15K, R25 = 25°C時の公称抵抗値, B = B 定数

精度: ±0.5°C (B 値が正確かつ抵抗が1%の場合)。多くの用途で十分。
利点: 安い (数セント)、応答が速い、小型
欠点: 非線形、MCU の ADC が必要、テーブル参照または B 定数式が必要

DS18B20 (デジタル 1-Wire)

プロトコル: 1-Wire (データ線1本、寄生給電可选)
精度: ±0.5°C (-10~85°C)
分解能: 9~12 bit
各デバイスに一意の 64-bit ROM ID あり → 1本のバスに複数接続可能

利点: ADC が不要、工場出荷時に校正済み、長距離対応、マルチポイント対応
欠点: 割高 (~¥3)、低速 (12bit で 750ms)、プロトコルが複雑

熱電対 (高温用)

原理: 2種類の異なる金属の接合部で熱起電力が発生 (シーベック効果)
タイプ: K 型 (最も一般的、-200~1250°C)、J/T/E/N 型
必要: 冷接点補償 (冷接点温度の測定 + テーブル参照)

チップ: MAX6675 (K型, SPI), MAX31855/MAX31856
用途: 3D プリンターのホットエンド、オーブン、工業用炉

選定クイックリファレンス

シーン                      推奨
────────────────────────────────────
室温 ±2°C で十分            NTC (最安値)
工場校正済みで ADC 不要      DS18B20
高温 (>150°C)               熱電対 (K 型)
高精度 (±0.1°C)             PT100/PT1000 (白金抵抗)
人体体温測定                医療用専用赤外線
PCB 基板温度                内蔵温度センサーまたは NTC

IMU (慣性計測ユニット)

代表的なチップ

チップ加速度計ジャイロ磁気センサーインターフェース特徴
MPU60503軸3軸I2Cクラシック入門用
MPU92503軸3軸3軸I2C/SPI9軸一体型
ICM-209483軸3軸3軸I2C/SPI低消費電力 9軸
BMI1603軸3軸I2C/SPI超低消費電力
LSM6DS33軸3軸I2C/SPIST 主流モデル
BNO0553軸3軸3軸I2C/UART内蔵姿勢解算!

IMU の出力

加速度計: 加速度 (m/s² または g)
  静止時: Z軸 = 1g (重力)
  重力方向を利用してピッチとロール角を算出可能

ジャイロ: 角速度 (°/s または rad/s)
  積分して角度を得る → ただしドリフトが発生
  静止時の理想値 = 0 (実際にはオフセットあり)

磁気センサー: 磁場強度 (μT)
  方位角 (コンパス) を算出可能

9軸融合 = 加速度 + ジャイロ + 磁気センサー → ドリフトのない絶対姿勢
  (ジャイロは速いがドリフトあり、加速度+磁気はドリフトなしだが応答が遅くノイズ大)
  → 相補フィルタ / カルマンフィルタ / Madgwick アルゴリズム

実際のトラブルシューティング

- MPU6050 は起動後にキャリブレーションが必要 (静止状態で数百回サンプリングし、オフセットを取得)
- I2C アドレスの競合 (MPU6050 のデフォルトは 0x68、AD0 をハイにすると 0x69 に)
- 振動環境では加速度計は使用不可 (より複雑なフィルタが必要)
- 磁気センサーは干渉を受けやすい (モーター/電流/強磁性体から遠ざけること!)
- BNO055 は融合コードを省略できるが割高

環境センサー

温湿度

DHT11/DHT22: 1-Wire、安価だが低速 (1回あたり2秒)、精度は普通
SHT30/31: I2C、±2%RH、高速、信頼性が高い
BME280: I2C/SPI、温度+湿度+気圧、1チップで3役 ★推奨
AHT20: I2C、SHT30 の安価な代替

注意点: DHT11 は >80%RH または <10%RH で著しく不正確になる
    SHT/BME シリーズははるかに優れている

気圧

BMP280/BME280: I2C/SPI、精度 ±1hPa (高度換算で ±8.5m)
LPS22HB: I2C/SPI、±0.5hPa
MS5611: I2C/SPI、±0.15hPa (高精度)

用途: 高度計、気象観測ステーション、ドローンの高度維持

照度

BH1750: I2C、ルクス値を直接出力 (キャリブレーション不要!)
VEML7700: I2C、広範囲、低消費電力
OPT3001: I2C、人間の目に対応した分光応答

光敏抵抗 (LDR): アナログ、安価だが非線形 + キャリブレーションが必要

空気質 / ガス

CCS811: I2C、eCO2 + TVOC (48時間のアライメント必要、消費電力大)
SGP30: I2C、eCO2 + TVOC (CCS811 より優れている)
PMS5003: UART、レーザー式 PM2.5/PM10 (物理測定、正確!)
MH-Z19: UART、NDIR 方式 CO2 (物理測定)
MQ シリーズ (MQ-2/MQ-135...): アナログ、予熱必要、精度が低い

センサーデバッグの定型手順

1. 電源投入 → WHO_AM_I / デバイス ID レジスタを読み取る
   読み取れない → 電源/はんだ付け/I2C アドレス/プルアップ抵抗を確認
   読み取れた → センサーは動作中、続行

2. 生データを読み取る → 値が妥当か確認
   すべて 0 または 0xFF → 設定問題 (有効化されていない/変換が開始されていない)
   データが激しく変動 → 電源ノイズ / タイミング不整合

3. 参照値と比較
   NTC で計算した温度 vs 室温 → 差が >5°C の場合、B 定数または R_fixed を確認
   IMU 静止時の加速度 ≈ 1g → 異なる場合、レンジ設定を確認

4. フィルタを追加
   単純移動平均 → 高周波ノイズを除去
   中央値フィルタ → 突発的なスパイクを除去

5. キャリブレーション (必要な場合)
   温度: 氷水 0°C + 湯 100°C の2点校正
   IMU: 6面キャリブレーション (各面で静止サンプリング)

キーワード: NTC, DS18B20, 熱電対, MPU6050, IMU, BME280, SHT30, I2Cセンサー, キャリブレーション