ClaudeやCodexに、GBS-ControlをESP-IDFに移植してもらった

https://github.com/ntsklab/gbs-control/tree/esp-idf

  • ターゲット
    • 元プロジェクト:ESP8266
    • 今回:ESP32-C3及びC6
  • 開発環境
    • 元プロジェクト:Arduino ESP8266
    • 今回:ESP-IDF
  • 方針
    • 自分でコードを書かない
    • LLMだけでどこまでできるのか、遊ぶ

移植方針など

ターゲットデバイスは、XIAO ESP32-C3とC6。ピンヘッダ用の穴に直接JST-XHコネクタなどを実装することで、基板などを起こさなくても比較的楽にGBS8200ボードへ接続可能。(ピッチが違うため、良い子は真似してはいけません)

元がArduinoコードなので、Arduinoコンパチレイヤでラッピングしてなるべく元のソースをそのまま使用できるようにした。

C3/C6はESP8266と違いBLEがついていたりするので、Nordic UART Serviceベースのshell機能が追加になっている。元々は機能拡張版を作る予定がなく、GBS-Cが動作するまでのデバッグ用にBLE経由ログ出力などの機能を追加し始めてからブランチを分けた結果こうなっている。計画性のなさ。

Debugピンの入力や外部クロック処理など、こちらの環境で使用していない機能については動作未チェック。

追加機能あり版

https://github.com/ntsklab/gbs-control/tree/esp-idf-ext

某所で必要な機能を追加したバージョン。これが作りたくて、ESP-IDFへforkした節がある。

ロータリーエンコーダではなく物理ボタンによるジオメトリ、PreCoast、PostCoastレジスタの調整を可能としている。これにより画面のズレや、上部の歪みなどが発生した場合に、ある程度ソフト的に調整が効くようになっている。1

また、ESP8266用は現在のコードでは古いMVSなどが映らない(スタッタリング、同期取れず画面が流れるなど)する。2これは、SyncWatcherが動的にtv5725の同期系レジスタをいじる仕組みが原因の様子。3

こちらのIssueに記載があるが、古いバージョンではMVSも映っていたとのこと

これらの情報から、旧GBS-Control互換モードを実装してもらい、無事古いMVSでも同期が取れるようになった。

他にも、複数台運用に耐え得るように各種無線の識別子を任意の文字列に変更する機能などを実装。

一旦こちらを運用に乗せて試験中です。


  1. Coast系パラメータを正しく調整するには、後述するレガシモードで動作させるか、set syncwatcher offコマンドなどでSyncWatcherを明示的に無効化する対応が必要。 ↩︎

  2. 自宅のMV-1Bでは動いていたのに、本番環境で使うMV-1FZでは動かず、大分悩んだ ↩︎

  3. MVSの同期信号が終わってるのが真因ではあるのですが。。。 ↩︎