Claude Opus 4.6(2026年2月リリース最新版)を使い、STM32組み込みファームウェアに
Silver Star Pluto 550 Hybrid × 12台 の制御を
1回のチャットセッションで追加・検証まで完了しました。MVRファイル解析 → GDTFチャンネルマッピング → C言語実装 → ビルド → MA3 3Dビュー検証 → バグ修正を、AIとの対話だけで進行した全工程を公開します。
1. プロジェクト背景
1.1 EyeTrack システムとは
STM32F407VGマイコンで ムービングライト(知能照明器具) をリアルタイム自動追尾するシステムです。
[ジョイスティック/ADC] → [STM32F407VG] → [DMX512出力] → [ムービングライト×12]
↑ ↓
[ILI9341 LCD] [grandMA3 onPC で3D検証]
| 項目 | スペック |
|---|---|
| MCU | STM32F407VG (Cortex-M4, 168MHz) |
| 表示 | ILI9341 320×240 TFT LCD |
| DMX出力 | USART1 + USART3 (デュアル) |
| 開発環境 | Keil uVision 5 + VS Code |
| 検証環境 | grandMA3 onPC (3Dビューア) |
1.2 今回の目標
既存の4台制御コード(NH1 / MAC One)ベースに、Silver Star Pluto 550 Hybrid × 12台 を新規追加する。
- MVR(grandMA3ショーファイル)から器具位置・回転行列を自動抽出
- GDTFから29chチャンネルマッピングを正確に実装
- 12台すべてが同一ターゲットに収束するPan/Tilt計算
- LCD表示の12台対応
- 全フェーダー(Dimmer/Color/Zoom/Focus/Iris)の12台制御
2. 作業タイムライン(実測)
以下は、1セッション中の作業進行を時系列で記録したものです。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 時刻(概算) 作業内容 状態
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1 00:00 依頼: Pluto 550 ×12台を追加 🟦 開始
2 00:02 既存コード調査 (NH1/MACOne構造分析) 🔍 調査
3 00:05 MVRファイル展開・XML解析 🔍 調査
4 00:08 GDTF description.xml 解析 🔍 調査
5 00:12 fixture_silverstar_pluto550.h 作成 ✅ 完了
6 00:15 fixtures_pluto550.h 作成 (12台座標) ✅ 完了
7 00:18 auto_iris_pluto550.h 作成 ✅ 完了
8 00:20 main.c 統合 (PLUTO550関数等) ✅ 完了
9 00:22 初回ビルド → 0 Error, 0 Warning ✅ ビルド成功
10 00:25 LCD表示修正 (12台フォント縮小) ✅ 完了
11 00:28 ラベル消失修正 (Y+15オフセット) ✅ 完了
12 00:30 数字列揃え (%2d → 固定幅) ✅ 完了
13 00:33 Dimmer/Color 12台拡張 (odd/even) ✅ 完了
14 00:36 Shutter修正 (DMX255→0: Open) ✅ 完了
15 00:40 Zoom/Focus/Iris 12台拡張 ✅ 完了
16 00:43 起動時センター集合+ビーム最小 ✅ 完了
17 00:45 Zoom最大ナロー (DMX255=3°) ✅ 完了
18 00:50 ビーム収束ずれ → GDTF再解析 🔍 調査
19 00:52 PAN_MAX/TILT_MAX修正 (540→522等) ✅ 完了
20 00:55 最終ビルド → 0 Error, 0 Warning ✅ ビルド成功
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
進捗ゲージ:
[████████████████████████████████████████] 100% (20/20タスク完了)
≈55分
3. AIとの対話:何を依頼し、何が返ってきたか
3.1 Phase 1 — 構造調査とMVR/GDTF解析
依頼:
「プロジェクトに新しいシリーズ Pluto 550 12台の制御を追加したい」
「MVR show から読み込みませんか」
AIの行動:
- 既存ファイル構造(
fixtures_nh1.h,fixtures_macone.h)をスキャン -
_bak/PLUTO550x12/20260129_PH5_12P.mvrをZIP展開 -
GeneralSceneDescription.xmlから12台の座標・回転行列を自動抽出 - GDTF
description.xmlから29chマッピングを完全に読み取り
抽出された座標データ(MVR → コード化):
/* MVR GeneralSceneDescription.xml から自動抽出 */
/* 器具1: (-17, -11) Y-側 → 内側(Y+方向)向き */
{ -17.000f, -11.000f, 6.500f, 180.0f },
/* 器具2: (-17, +11) Y+側 → 内側(Y-方向)向き */
{ -17.000f, 11.000f, 6.500f, 0.0f },
/* ... 12台分 ... */
3.2 Phase 2 — ファイル作成と統合
作成されたファイル一覧:
| ファイル | 役割 | 行数 |
|---|---|---|
fixture_silverstar_pluto550.h |
器具定義・29chマッピング | 120行 |
fixtures_pluto550.h |
12台座標・システム設定 | 246行 |
auto_iris_pluto550.h |
Zoom/Focus/Irisテーブル | 256エントリ |
main.cへの主な変更:
// PLUTO550() 関数 — 29chのDMX送信マッピング
void PLUTO550(int TxC){
int n = ((TxC - 1) / KchM) + 1;
switch (TxC - (n - 1)*KchM) {
case 1 : USendData(Dmx[n][ 1]) ; break ;// Pan Coarse
case 2 : USendData(Dmx[n][ 2]) ; break ;// Pan Fine
case 3 : USendData(Dmx[n][ 3]) ; break ;// Tilt Coarse
case 4 : USendData(Dmx[n][ 4]) ; break ;// Tilt Fine
// ... 全29ch ...
case 26 : USendData(Dmx[n][ 5]) ; break ;// Dimmer
case 28 : USendData(0 ) ; break ;// Shutter OPEN
}
}
3.3 Phase 3 — 実機フィードバック → 即時修正
Shutter問題(ストロボ点滅)
依頼: 「MA3 で ストロボ になっています 点滅しないように」
AIの分析:
GDTF Shutterチャンネル定義:
DMX 0-9 = Open(開放) ← ここが正解
DMX 10-99 = Strobe(ストロボ)
DMX 190-255 = Random Strobe ← コードが255を送信していた!
修正: USendData(255) → USendData(0) — 即座に解決。
ビーム収束ずれ(最重要バグ)
依頼: 「この ずれを 直せますか?」(MA3 3Dビュー画像添付)
AIの分析:
GDTFファイルには Basic Mode と Standard Mode で異なる物理レンジが定義されていた!
<!-- Basic Mode (使っていない) -->
<ChannelFunction PhysicalFrom="-270.000000" PhysicalTo="270.000000" ... /> <!-- Pan: 540° -->
<ChannelFunction PhysicalFrom="-135.000000" PhysicalTo="135.000000" ... /> <!-- Tilt: 270° -->
<!-- Standard Mode (★実際に使用中) -->
<ChannelFunction PhysicalFrom="-270.000000" PhysicalTo="252.000000" ... /> <!-- Pan: 522° !! -->
<ChannelFunction PhysicalFrom="-132.000000" PhysicalTo="132.000000" ... /> <!-- Tilt: 264° !! -->
| 項目 | 修正前 (Basic Mode) | 修正後 (Standard Mode) | 影響 |
|---|---|---|---|
PAN_MAX |
540.0° | 522.0° | 最大4.1°のずれ |
TILT_MAX |
270.0° | 264.0° | 最大1.6°のずれ |
距離20mでの誤差: Pan 4.1° × 20m ≈ 1.4m のビーム位置ずれ
// 修正後(+0.5f で四捨五入も追加)
#define PAN_MAX 522.0f // -270°〜+252° (GDTF Standard)
#define TILT_MAX 264.0f // -132°〜+132° (GDTF Standard)
tilt_16bit = (int)(0x8000 + ((tilt_deg_clamped - 90.0f) / TILT_MAX) * 65535.0f + 0.5f);
pan_16bit = (int)(((pan_deg + 270.0f) / PAN_MAX) * 65535.0f + 0.5f);
4. Claude Opus 4.6 が「効いた」ポイント
4.1 MVR/GDTF解析能力
MVRファイル(ZIP形式)を展開し、XMLの回転行列(3×3マトリクス {-1,0,0}{0,-1,0}{0,0,1})を角度(180°)に正しく変換。12台分の座標を1回で正確に抽出しました。
4.2 既存コードの設計パターン認識
NH1(25ch)やMAC One(20ch)の既存実装パターン(fixtures.hのVENUE_SELECT分岐、auto_iris.hのFIXTURE_SELECT分岐)を自動検出し、同じ設計思想でPluto 550を統合。
4.3 GDTF BasicとStandardの差異検出
これが最大の功績。人間が見逃しがちな「同一GDTFファイル内のBasic ModeとStandard ModeでPan/Tiltレンジが異なる」という罠を、XMLを再読込して自力で発見。
4.4 組み込みC特有の制約理解
-
float演算の精度問題(+0.5f四捨五入追加) - 配列サイズ拡張(
[6]→[16]、全箇所を漏れなく更新) - LCD描画のピクセル単位レイアウト調整(フォント1/2切替、Y座標計算)
- DMXタイミング割込み(TIM5)への影響がないことの確認
5. 下位AIでもできるのか? モデル別・最適な使い方ガイド
添付画像のモデル一覧(VS Code GitHub Copilot、2026年2月時点)を元に、開発タスク別の推奨モデル をまとめました。
5.1 コスト倍率一覧
| モデル | 倍率 | 特徴 |
|---|---|---|
| GPT-4.1 | 0x (無料) | コード補完向け |
| GPT-4o | 0x (無料) | 汎用チャット |
| GPT-5 mini | 0x (無料) | 軽量・高速 |
| Grok Code Fast 1 | 0x (無料) | コード特化・高速 |
| Raptor mini (Preview) | 0x (無料) | 軽量プレビュー |
| Claude Haiku 4.5 | 0.33x | 高速・低コスト |
| Claude Sonnet 4 | 1x | バランス型 |
| Claude Sonnet 4.5 | 1x | Sonnet上位 |
| Claude Opus 4.5 | 3x | 高精度 |
| Claude Opus 4.6 | 3x | 最新・最高精度 |
| Claude Opus 4.6 (fast) | 9x | 最速・最高コスト |
| Gemini 2.5 Pro | 1x | Google最新 |
| Gemini 3 Flash | 0.33x | 高速 |
| Gemini 3 Pro | 1x | バランス型 |
| GPT-5 | 1x | OpenAI最新 |
| GPT-5-Codex | 1x | コード特化 |
| GPT-5.1 | 1x | 改良版 |
| GPT-5.1-Codex | 1x | コード特化改良 |
| GPT-5.1-Codex-Max | 1x | 最大コンテキスト |
| GPT-5.2 | 1x | さらなる改良 |
| GPT-5.2-Codex | 1x | コード特化 |
| GPT-5.3-Codex | 1x | 最新Codex |
5.2 タスク別おすすめモデル
🟢 下位AI(0x〜0.33x)で十分なタスク
| タスク | 推奨モデル | 理由 |
|---|---|---|
| 単純なコード補完 | GPT-4.1 (0x) | インライン補完は軽量AIで十分 |
| コメント追加・翻訳 | Claude Haiku 4.5 (0.33x) | 文章生成は低コストで十分 |
| 定型的なリファクタリング | Grok Code Fast 1 (0x) | パターン変換は高速AIが得意 |
| エラーメッセージの解説 | GPT-5 mini (0x) | 知識参照型は無料モデルで対応可 |
| 単体テスト生成 | GPT-5.1-Codex-Mini (0.33x) | テンプレート的な生成 |
🟡 中位AI(1x)が最適なタスク
| タスク | 推奨モデル | 理由 |
|---|---|---|
| 関数の新規実装 | Claude Sonnet 4 (1x) | コード品質とコストのバランス |
| バグ修正(単一ファイル) | GPT-5.1-Codex (1x) | 1ファイル内の修正は中位で十分 |
| ドキュメント生成 | Gemini 2.5 Pro (1x) | 長文生成が得意 |
| REST API実装 | GPT-5-Codex (1x) | Web系はGPT Codexが強い |
🔴 上位AI(3x〜)でないと難しいタスク
| タスク | 推奨モデル | 理由 |
|---|---|---|
| 複数ファイル横断の大規模統合 | Claude Opus 4.6 (3x) | 10+ファイルの整合性を保つ |
| ドメイン固有プロトコル解析 | Claude Opus 4.6 (3x) | GDTF/MVR/DMX等の専門知識 |
| 既存設計パターンの認識と踏襲 | Claude Opus 4.5+ (3x) | アーキテクチャ理解力 |
| ハードウェア制約の組み込み開発 | Claude Opus 4.6 (3x) | float精度、割込み、メモリ |
| XMLの微細な差異検出 | Claude Opus 4.6 (3x) | Basic vs Standard等の罠 |
5.3 今回のセッションで下位AIでは何がダメだったか(予測)
下位AI 中位AI Opus 4.6
MVR展開+XML解析 △ 可能 ○ 可能 ◎ 正確
GDTF 29ch解析 △ 部分的 ○ 概ね正確 ◎ 完全
12台座標抽出 × 手動必要 △ エラー混入 ◎ 自動
既存パターン踏襲 × 独自実装 △ 部分的 ◎ 完全踏襲
Basic/Standard差 × 検出不可 × 検出不可 ◎ 自力発見
LCD画素計算 △ 試行錯誤 ○ 概ね正確 ◎ 即座に算出
全体の一貫性 × バラバラ △ 要手動修正 ◎ 20ファイル整合
結論: 単発の修正なら中位AIで十分。しかし 「1セッションで新規器具追加を完遂する」 という today's task は、大量のコンテキストを保持しながら多数のファイルを整合的に編集し続ける能力が必要であり、Opus 4.6が圧倒的に適していました。
6. 変更ファイル一覧と修正サマリ
新規作成ファイル
| ファイル | 説明 |
|---|---|
src/fixtures/fixture_silverstar_pluto550.h |
Pluto 550 器具定義(29ch, 物理仕様) |
src/fixtures_pluto550.h |
12台配置・システム設定(VENUE 6) |
src/auto_iris_pluto550.h |
Auto Iris/Zoom/Focus テーブル |
変更ファイル
| ファイル | 変更内容 |
|---|---|
src/main.c |
PLUTO550()関数追加、SendDMX分岐、12台ループ化 (Dimmer/Color/CTC/Zoom/Focus/Iris)、center_set()、起動シーケンス変更 |
src/main.h |
NUM_FIXTURES 条件付き定義、配列サイズ16化 |
src/fixtures.h |
VENUE_SELECT=6 追加 |
src/auto_iris.h |
FIXTURE_SELECT=6 追加 |
主な修正ポイント(全20項目)
| # | 問題 | 修正内容 |
|---|---|---|
| 1 | LCDに12台表示が入らない | フォントサイズ2→1、行間20→11px |
| 2 | ヘッダラベルが消える | Y座標+15オフセットで重なり防止 |
| 3 | 列が揃わない |
"(%d) " → "(%2d)" 固定幅 |
| 4 | Dimmer 4台のみ出力 | switch/case → forループ (odd/even) |
| 5 | Color 4台のみ | 同上 |
| 6 | CTC 4台のみ | 同上 |
| 7 | Shutter ストロボ | DMX 255(Random)→0(Open) |
| 8 | Zoom 4台のみ | I1up/I1dw forループ化 |
| 9 | Focus 4台のみ | I2up/I2dw forループ化 |
| 10 | Iris 4台のみ | ジョイスティック12台対応 |
| 11 | 起動時に前回データ復帰 |
I2C_r_Scene(1) コメントアウト |
| 12 | Dimmer起動値 100 |
Id[i]=0 に変更 |
| 13 | Zoom起動値がワイド |
Dmx[i][16]=255 (ナロー) |
| 14 | auto_irisがZoom上書き | PR_cnv()の後にZoom再設定 |
| 15 | auto_iris初期Zoom値236 | 255に増加(最大ナロー) |
| 16 | 配列サイズ不足 |
[6]/[8] → [16] 全箇所 |
| 17 | PAN_MAX 540° | 522° (GDTF Standard) |
| 18 | TILT_MAX 270° | 264° (GDTF Standard) |
| 19 | DMX値切り捨て誤差 |
+0.5f 四捨五入追加 |
| 20 | ビルド検証 | 全修正後 0 Error, 0 Warning |
7. 技術詳細: Pan/Tilt DMX計算
7.1 座標系
Y+(奥側)+11m
↑
│ #2 #4 #6 #8 #10 #12
│ (-17,+11) (-10.5,+11) (-3.5,+11) (+3.5,+11) (+10.5,+11) (+17,+11)
─────┼────────────────────────────────────────────────────────→ X+
│ (0,0) ← ターゲット
│ #1 #3 #5 #7 #9 #11
│ (-17,-11) (-10.5,-11) (-3.5,-11) (+3.5,-11) (+10.5,-11) (+17,-11)
↓
Y-(手前・卓側)-11m
7.2 計算コア(C言語)
void calculatePanTiltDMX16bit(int fixture_id,
float fixture_x, float fixture_y, float fixture_z,
float target_x, float target_y, float target_z,
float fixture_rotation_deg,
int *pan_coarse, int *pan_fine, int *tilt_coarse, int *tilt_fine)
{
float dx = target_x - fixture_x;
float dy = target_y - fixture_y;
float dz = fixture_z - target_z; // 下向きが正
// Pan: ターゲット角度 − 器具設置角度
float target_rad = atan2f(dy, dx);
float fixture_rad = fixture_rotation_deg * PI / 180.0f;
float pan_rad = target_rad - fixture_rad;
// -π〜+π に正規化
while (pan_rad <= -PI) pan_rad += 2.0f * PI;
while (pan_rad > PI) pan_rad -= 2.0f * PI;
float pan_deg = pan_rad * 180.0f / PI;
// Tilt: 水平距離と高低差から仰角
float distance = sqrtf(dx*dx + dy*dy);
float tilt_deg = atan2f(dz, distance) * 180.0f / PI;
// GDTF Standard Mode → DMX 16bit 変換
// Pan: -270° → DMX 0, +252° → DMX 65535
// Tilt: -132° → DMX 0, +132° → DMX 65535
int pan_16bit = (int)(((pan_deg + 270.0f) / 522.0f) * 65535.0f + 0.5f);
int tilt_16bit = (int)(0x8000 + ((tilt_deg - 90.0f) / 264.0f) * 65535.0f + 0.5f);
*pan_coarse = (pan_16bit >> 8) & 0xFF;
*pan_fine = pan_16bit & 0xFF;
*tilt_coarse = (tilt_16bit >> 8) & 0xFF;
*tilt_fine = tilt_16bit & 0xFF;
}
8. まとめ
8.1 成果
- 1セッション(約55分) で12台分のファームウェア統合を完了
- 0 Error, 0 Warning のビルド成功
- MVR/GDTFから正確なデータ抽出
- GDTFの BasicとStandard Modeのレンジ差異を自動検出
8.2 Claude Opus 4.6 の印象
| 観点 | 評価 |
|---|---|
| 長大コンテキスト保持 | ◎ 20+ファイル、1500行のmain.cを把握し続けた |
| ドメイン知識 (DMX/GDTF) | ◎ 照明プロトコルの専門用語を正確に理解 |
| 組み込みC言語 | ◎ float精度、配列境界、割込みを意識した実装 |
| デバッグ能力 | ◎ Basic/Standard差異を自力発見、物理角度→DMX値の検算 |
| コスト効率 (3x) | ○ この規模のタスクでは1x AIの3回やり直しより安い |
8.3 推奨ワークフロー
1. 最初の設計 → Opus 4.6 (3x) で一発統合
2. 日常の微調整 → Sonnet 4 (1x) で十分
3. コードレビュー → Haiku 4.5 (0.33x) で高速チェック
4. インライン補完 → GPT-4.1 (0x) で無料
大規模統合タスクこそ上位AIの真価が発揮される場面です。 1回で正確に完了することが、結果的に最もコスト効率が良い選択になります。
参考リンク
ムービングライト12台
https://www.youtube.com/watch?v=MLfiBq-gHss
MA3シミュレーターでカラー制御に挑戦した話
https://qiita.com/tkurume/private/daffa17a4e86f49c7784
M5Stack+DMX_Baseで DMXcat-E 多機能テストツールを目指す
https://qiita.com/tkurume/private/b220e0c4b58db5d0d559
Wio Terminal で使う DMX モニタ — 取り扱い説明書
https://qiita.com/tkurume/private/5a9530935ac802de47f1
WioTerminal Dmx-Art-Net Tool 製作説明
https://qiita.com/tkurume/private/95e686eb46fadea8f589
Claude Haiku × Windows Forms で便利な診断ツール 2 本を制作 - デバイス自動識別機能付
https://qiita.com/tkurume/private/b376194398b83432e9b8
M5Stack CoreS3 + WiFi配信対応 DMX512モニターを作った
https://qiita.com/tkurume/private/1d18b88eae661892a4fb

