MCP server by todateman
dho804_ecu_mcp
DHO804 デジタルオシロスコープを Claude Code から制御し、
UNOR4_Chtbi-T_EFI (Arduino UNO R4 エコラン車両用 ECU) の
信号タイミングを測定・評価する MCP サーバー。
概要
ECU プログラム (main.cpp) のソースコードに基づいた理論値と、
DHO804 で実測した統計値を自動比較し、処理遅れの有無を判定する。
Claude Code
│ MCP (stdio)
▼
dho804_ecu_mcp ──VISA (LAN/USB)──▶ DHO804
│ プローブ
▼
UNO R4 ECU
(Chibi-T International)
測定対象信号
| CH | 信号 | ピン | 論理 | 説明 | |-----|------------|------|--------|---------------------------------| | CH1 | NE_Z_IN | 9 | HIGH | クランク 0° 基準 / トリガ基準 | | CH2 | G_IN | 5 | LOW | カムパルス (74HC14 反転入力) | | CH3 | INJ_OUT | A0 | LOW=ON | 燃料噴射出力 | | CH4 | IGN_OUT | A1 | LOW=ON | 点火出力 |
注意: INJ/IGN は LOW アクティブ出力のため、パルス幅は
NWIDth(負パルス幅)で測定する。
評価項目
ECU ソースコード (main.cpp) から導出した理論値と実測値を比較する。
| 測定項目 | 理論値 / 根拠 | OK 判定 |
|----------|---------------|---------|
| NE_Z↑ → INJ↓ 処理遅れ | ROUTINE_CYCLE_US = 24 μs (AGTimer 周期) | < 72 μs |
| NE_Z↑ → IGN↓ 点火タイミング | MAP 進角角度から計算した予測値 | 差 < 500 μs |
| INJ パルス幅 | calculatedINJ_time × 100 μs | 差 < 200 μs |
| IGN パルス幅 | IGNITION_HOLD_US = 5000 μs | 差 < 100 μs |
| 噴射 → 点火 順序 | INJ 終了後に IGN 開始 (正の値) | > 0 ms |
| NZ→INJ ジッタ (σ) | AGTimer 周期以内 | σ < 24 μs |
処理フロー (ソースコード由来)
[ISR] NE_A_IN RISING → ReadNe_ISR()
Ne_deg += 1
NE_Z_IN=HIGH && Ne_deg>360 && G_Pulse_Flag
→ CycleReset = true
[24 μs 周期] Routine()
if CycleReset:
cycleReset() ← Ne_deg=0, INJ_His=false, IGN_His=false
if Ne_deg >= INJ_STR_CA(=0):
INJ_OUT = LOW ← ★ NE_Z_IN↑ からの処理遅れ: 0〜24 μs のはず
if Ne_deg >= (360 - calculatedIGN_CA):
IGN_OUT = LOW ← ★ MAP 進角角度に達したタイミングで発火
ディレクトリ構成
dho804_ecu_mcp/
├── .gitignore # Git無視ファイル設定
├── CLAUDE.md # Claude Code スキル定義・操作手順
├── pyproject.toml # パッケージ設定
├── README.md # このファイル
├── src/dho804_ecu_mcp/
| ├── __init__.py
| ├── ecu_config.py # ECU 定数・MAP テーブル (main.cpp より抽出)
| ├── oscilloscope.py # DHO804 VISA/SCPI ラッパー
| ├── evaluator.py # 理論値 vs 実測値 評価ロジック
| └── server.py # FastMCP サーバー本体 (7 ツール)
└── doc/
├── DHO800_ProgrammingGuide_EN.pdf # DHO800のVISAプログラミングガイド
├── DHO800_QuickGuide_EN.pdf # DHO800のクイックガイド
└── DHO800_UserGuide_EN.pdf # DHO800のユーザーが緯度
インストール
依存ライブラリ
- Python 3.11+
- mcp >= 1.0.0
- pyvisa >= 1.13.0
- pyvisa-py >= 0.7.0 (LAN 接続の場合)
- pyusb >= 1.2.1 (USB 接続の場合、
pyproject.tomlのコメントを外す)
インストール手順
cd dho804_ecu_mcp
pip install -e .
動作確認
# 構文チェック
python -m py_compile src/dho804_ecu_mcp/server.py
# MCP Inspector でツール一覧を確認
npx @modelcontextprotocol/inspector python -m dho804_ecu_mcp.server
Claude Code への登録
プロジェクトルート (または ~/.claude/) の .mcp.json に追加する。
{
"mcpServers": {
"dho804_ecu": {
"command": "python",
"args": ["-m", "dho804_ecu_mcp.server"],
"env": {
"DHO804_ADDRESS": "TCPIP::192.168.1.100::INSTR"
}
}
}
}
DHO804 の IP アドレスは Utility > Setup > LAN で確認する。
USB 接続の場合: USB0::0x1AB1::0x0515::<シリアル番号>::INSTR
MCP ツール一覧
| ツール | 説明 |
|--------|------|
| dho804_connect | DHO804 に VISA 接続する (最初に呼ぶ) |
| dho804_setup_ecu | CH・タイムベース・トリガ・統計を一括設定 |
| dho804_set_timebase | wide (5ms/div) ↔ zoom (20μs/div) 切り替え |
| dho804_collect | 統計サンプルの収集を待機する |
| dho804_measure | 全測定項目の統計値を取得する |
| dho804_evaluate | ECU 理論値と比較して処理遅れを評価する |
| dho804_run_full_measurement | 上記を一括実行するショートカット |
MCP リソース (ecu://channel_map, ecu://default_map, ecu://thresholds) も提供する。
使い方
基本計測 (最短手順)
Claude Code に話しかけるだけ:
「DHO804 に接続して ECU の処理遅れを測定して」
内部では以下のシーケンスが実行される:
1. dho804_connect address="TCPIP::..."
2. dho804_run_full_measurement wait_seconds=8, timebase="wide"
3. evaluation.overall_status を確認 → OK / WARN / NG を報告
処理遅れ詳細確認 (ズームモード)
1. dho804_connect
2. dho804_setup_ecu timebase="wide", stat_count=300
3. dho804_collect wait_seconds=8
4. dho804_evaluate → NE_Z↑→INJ↓ の avg/stddev を確認
5. dho804_set_timebase timebase="zoom" # 20μs/div に拡大
6. dho804_collect wait_seconds=5, reset_first=true
7. dho804_evaluate → ジッタ(stddev) を詳細確認
回転数別評価
エンジン回転数を変えながら dho804_run_full_measurement を繰り返し、
各回転数での処理遅れ・点火タイミング差を比較する。
よくある問題
| 症状 | 原因 | 対処 |
|------|------|------|
| NZ_to_INJ が負値 | CH1/CH3 の接続またはトリガ設定ミス | 配線確認・トリガレベル調整 |
| NZ_to_INJ > 1 ms | ISR と FreeRTOS の優先度競合 | AGTimer 優先度・vTaskSuspendAll 確認 |
| INJ_Width が MAP 理論値と大きく乖離 | calculatedINJ_time の更新タイミング | cycleReset() 内の updateEngineMap() 確認 |
| IGN_Width ≠ 5000 μs | IGNITION_HOLD_US または AGTimer 周期 | ROUTINE_CYCLE_US の実測確認 |
| 全項目 NO_DATA | ENG_ON = false | ENGOFF_IN(pin7)=LOW + STR_IN(pin6)=LOW を確認 |
| rpm = 0 | NE_Z_IN 未接続またはトリガレベル不一致 | CH1 波形を zoom で確認後、トリガレベル調整 |
README 記載の既知課題との対応
UNOR4_Chtbi-T_EFI の README には次の記載がある:
処理遅れに起因すると思われる過大な進角角度を設定している
dho804_evaluate の "NE_Z↑→IGN↓ 点火タイミング" チェックの diff 値が
実際の進角補正量に相当する。この値を参考に defaultMap の ign_ca を調整することで
点火タイミング精度の改善が期待できる。
対応ハードウェア
| 機器 | 型番 / 備考 | |------|-------------| | オシロスコープ | RIGOL DHO804 (DHO800 シリーズ) | | ECU | Arduino UNO R4 Minima / カスタム RA4M1 ボード | | 接続 | LAN (推奨) または USB DEVICE |
ライセンス
MIT