Chapter 07
アナログ周辺とセンサ — ADC・DAC・PWM と実世界の注入
この章のゴール.
ADC・DAC・PWM・アナログセンサという「実世界との境界」を、 信号を注入し反応を観測することでテストでき、 校正・非線形性・タイミングのオラクルを立てられるようになること。
この章で使う既出の用語(定義は各リンク先). USB(01 章 2 節)、アナログ(01 章 2 節)、オラクル(01 章 8 節)、デバッグポート(01 章 2 節)、判定(02 章 1 節)、電源(02 章 2 節)、オシロ(04 章 8 節)、ロジックアナライザ(04 章 1 節)、UART(05 章 1 節)、I²C(06 章 1 節)、エラー処理(06 章 6 節)
1. 実世界との境界を試す
MCU は、温度・光・音・電圧・電流・角度といったアナログ量を ADC で読み、PWM や DAC でモーター・LED・音を駆動する。 デジタルバス(06 章)が「MCU と IC の会話」なら、アナログ周辺は「MCU と物理世界の会話」である。 ここをブラックボックスで試すには、物理世界の側を電気的に模擬する——本物の温度を変える代わりに、温度センサが出すはずの電圧を注入する。
2. ADC 入力を試す — 電圧を注入する
MCU の ADC 入力ピンに、既知の電圧を与えて、ファームがそれをどう読むかを観測する(UART の状態表示、無線での報告、LED など)。
| 注入方法 | 特徴 |
|---|---|
| 可変抵抗(ポテンショメータ) | 手軽。手で電圧を振る |
DAC(USB-DAC、マイコンの DAC、pyvisa 制御の電源) | 精密・自動化可。掃引(ramp)や既知パターンを与える |
| 信号発生器 | 交流・波形。音声や振動センサの模擬 |
| 抵抗分圧・ブリッジ模擬 | サーミスタ・ロードセルなどの模擬 |
観測して作るオラクル:
- 校正の正しさ: 既知の電圧列(0.5V, 1.0V, 1.5V…)を注入し、報告値が正しく換算されているか。「1.0V = 25 ℃」の対応が仕様どおりか
- 線形性: 電圧を滑らかに掃引し、報告値も滑らかに変わるか(段付き・飛びは量子化/バグ)
- 範囲・飽和: 0V と最大電圧、範囲外(負・過大)を与えたときのクリップ・エラー処理(境界テスト、AI コードの弱点)
- ノイズ耐性・平均化: ノイズを乗せた入力でも安定した値を出すか
# DAC で電圧を掃引し、機器の報告値と照合(骨格)
for v in [0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.3]:
dac.set_voltage(v)
time.sleep(0.2)
reported = read_reported_value() # UART/BLE 等で取得
expected = v / 3.3 * 100 # 例: 0–3.3V を 0–100 % に
assert abs(reported - expected) < 2, f"{v}V で誤差大: {reported} vs {expected}"3. PWM・DAC 出力を試す — 駆動を観測する
MCU が出す側(LED 調光、モーター、音、アナログ出力)は、オシロやロジックアナライザで観測する。
- PWM: デューティ比(オン時間の割合)と周波数を測る。「明るさ 50 % 指令 → デューティ 50 %」。モーターなら回転数(別途タコメータ・光センサ)と対応
- DAC 出力: 指令値と出力電圧の対応、非線形性、更新レート
- タイミング: 指令から出力が変わるまでの遅延、複数出力の同期(多相モーター、14 章)
- 安全: 指令範囲外や通信断のとき、出力が安全側(停止・既定値)に倒れるか(フェイルセーフ)
4. センサ全体をなりすます
06 章の「偽 I²C センサ」のアナログ版。センサの出力信号そのものを治具で作る。
- アナログ出力センサ(温度、圧力)→ DAC で電圧を作る
- パルス出力センサ(ホール、エンコーダ、流量)→ マイコンでパルス列を生成し、回転・流量を模擬
- 「エンコーダが逆回転」「パルスが乱れる」「センサ断線(開放/短絡)」といった異常を注入し、ファームの応答を見る
AI 生成のセンサ処理コードは、断線・ノイズ・範囲外を想定していないことが多い。ここは意図的に厚くテストする(16 章)。
5. 出力から実世界の量を測り返す
機器が実世界に何かする(光る、鳴る、動く、熱を出す)なら、その物理量を測ってオラクルにする。
| 出力 | 測る道具 |
|---|---|
| 光(LED・ディスプレイ) | フォトダイオード・照度計・カメラ(点滅パターンの自動判定) |
| 音(ブザー・スピーカー) | マイク + FFT(周波数・パターン)。エフェクター編の周波数解析の考え方がそのまま使える |
| 動き(モーター) | 光学式タコメータ、エンコーダ、加速度計 |
| 温度 | 熱電対・サーモカメラ |
| 力・圧力 | ロードセル |
「LED が 1 Hz で点滅」「ブザーが 4 kHz」「モーターが 3000 rpm」——物理量を数値で捉えれば、自動判定できる。
6. 何をオラクルにするか(まとめ)
- 入力: 校正・線形性・範囲/飽和・ノイズ耐性
- 出力: 指令との対応・非線形性・タイミング・同期
- 安全: 範囲外・断線・通信断でのフェイルセーフ
- 実世界: 光・音・動き・温度を測り返して仕様と照合
7. 手を動かす
電圧を掃引して校正を確かめる
この章のポイント
- アナログ周辺は MCU と物理世界の会話。物理を電気で模擬して試す
- ADC 入力は電圧注入(DAC/ポテンショ/信号発生器)で校正・線形性・範囲・ノイズを検証
- PWM/DAC 出力はオシロでデューティ・電圧・タイミング・フェイルセーフを観測
- センサ全体をなりすまし、断線・逆転・範囲外を注入(AI コードの弱点)
- 出力の物理量を測り返す(光・音・動き・温度)と自動判定できる