このページの目次
センサー
物理量から I2C レジスタ値への完全なリンク
センサーインターフェースの選定
| インターフェース | 距離 | 速度 | 消費電力 | 複数デバイス | 代表的なセンサー |
|---|---|---|---|---|---|
| I2C | PCB 上 | 100k~1M | 低い | ✅ (アドレス) | ほとんどのデジタルセンサー |
| SPI | PCB 上 | MHz 帯 | 中程度 | チップセレクト必要 | 高速 ADC, IMU |
| UART | 長距離 | 115k~1M | 中程度 | ❌ 1対1 | GPS, ライダー測距 |
| アナログ | PCB 上 | - | 極めて低い | ❌ | NTC, 光敏, マイクロホン |
| 1-Wire | 長距離 | 低速 | 極めて低い | ✅ (ROM ID) | DS18B20 |
| パルス/PWM | PCB 上 | - | 低い | ❌ | ホール素子, 回転数 |
温度センサー
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 (慣性計測ユニット)
代表的なチップ
| チップ | 加速度計 | ジャイロ | 磁気センサー | インターフェース | 特徴 |
|---|---|---|---|---|---|
| MPU6050 | 3軸 | 3軸 | ❌ | I2C | クラシック入門用 |
| MPU9250 | 3軸 | 3軸 | 3軸 | I2C/SPI | 9軸一体型 |
| ICM-20948 | 3軸 | 3軸 | 3軸 | I2C/SPI | 低消費電力 9軸 |
| BMI160 | 3軸 | 3軸 | ❌ | I2C/SPI | 超低消費電力 |
| LSM6DS3 | 3軸 | 3軸 | ❌ | I2C/SPI | ST 主流モデル |
| BNO055 | 3軸 | 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センサー, キャリブレーション