Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

Claude Opus 4.6 × STM32 — ムービングライト12台追加を1セッションで完遂した全記録

0
Last updated at Posted at 2026-02-12

Claude Opus 4.6(2026年2月リリース最新版)を使い、STM32組み込みファームウェアに
Silver Star Pluto 550 Hybrid × 12台 の制御を
1回のチャットセッションで追加・検証まで完了しました。MVRファイル解析 → GDTFチャンネルマッピング → C言語実装 → ビルド → MA3 3Dビュー検証 → バグ修正を、AIとの対話だけで進行した全工程を公開します。

image.png

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分

スクリーンショット 2026-02-12 150844.png


3. AIとの対話:何を依頼し、何が返ってきたか

3.1 Phase 1 — 構造調査とMVR/GDTF解析

依頼:

「プロジェクトに新しいシリーズ Pluto 550 12台の制御を追加したい」
「MVR show から読み込みませんか」

AIの行動:

  1. 既存ファイル構造(fixtures_nh1.h, fixtures_macone.h)をスキャン
  2. _bak/PLUTO550x12/20260129_PH5_12P.mvr をZIP展開
  3. GeneralSceneDescription.xml から12台の座標・回転行列を自動抽出
  4. 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 ModeStandard 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

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?