---
title: センサー
url: https://doc.liz6.com/ja/hardware/09-embedded-systems/03-sensors
locale: ja
area: hardware
tags:
- センサー
- I2C
- 温度
- IMU
- 環境
- 組み込み
- hardware
- embedded-systems
date: 2026-06-30
modified: 2026-07-16
description: 物理量から I2C レジスタ値への完全なリンク
---

# センサー

> 物理量から 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センサー, キャリブレーション*
