Tech Notes

スイッチ操作不要のTWE-Lite書き込み機を自作する

TWE-Liteという無線マイコンモジュールがある。みんな大好きESP32より値は張るが、μAオーダーの超低消費電力が持ち味で、乾電池で年単位の稼働が見込める。こうした芸当はESP32やRaspberry Pi Pico Wなどには出来ない。競合としてはnRFマイコンなどが挙げられるだろう。

(画像は秋月電子より)

TWE-Liteにファームウェアを書き込む場合には専用ライタを使うのが確実だが、ライタの中身はFTDI社のUSBシリアル変換ICなので、少し知識のある人であれば簡単に自作できる。配線例が公式にもあるので恐らく公式も認めたものだ。(リンク)

一方でこの配線による非公式ライタの場合、書き込む前にリセット端子とPRG端子を手動でポチポチする必要がある。公式のライタならば要らない操作だ。

一体どうすれば公式のライタ同様に、挿して書き込んで抜くだけという開発体験を手に入れられるのだろうか?この疑問を解くため調査隊はジャングルの奥地に向かった。

前知識

いくつかの前知識を書いておく。

TWE-Liteのプログラムモードについて

まず、TWE-Liteモジュールの「プログラムモード」について説明する。

通常TWE-LiteのUART端子(TX/RX)はプログラムが自由にシリアル通信に使えるようになっている。しかし書き込み時はそれを書き込みに使うため、専用のモードにしておく必要がある。これがプログラムモードだ。

具体的には

  1. PRG端子をLOWにする
  2. そのままの状態でリセット
  3. PRG端子をLOWからHIにする

そうするとプログラムモードになる。公式ライタはこの操作を勝手にやってくれるが、ただのUSBシリアル変換ICではRX/TXの制御しか持たないのでやりようがない。ボタンをポチポチしてプログラムモードにする必要がある。

TWELITE STAGE APPについて

TWE-Liteにファームウェアを書き込むには、公式で提供されているTWELITE STAGE APPというソフトを使う必要がある。ライタ↔TWE-Lite間の通信は基本的にシリアル通信(UART)ではあるが、その上に乗った詳細な内部プロトコルまでは公開されていないので公式の同ソフトを使うほかない。

FTDI社のUSBシリアル変換モジュールについて

重要なこととして、TWE-Lite用書き込み機を自作する場合、FTDI社のUSBシリアル変換ICでなければならない。 例えば最近安く手に入るようになったCH340というUSBシリアル変換ICがあるが、これは使えない。必ずFTDI社のFT230,FT231,FT232などである必要がある。公式ライタにはFT230XSが載っている。

FTDI社のICでなければならない理由は単純で、そうでないとTWELITE STAGE APPから検出されないからである。TWELITE STAGE APPを起動するとシリアルポートを選択する画面が出るが、ここにはFTDI社のICによるポートしか出てこない。

では、どうしてFTDIのICしか使えないようになっているのだろうか?

それは公式ライタがFTDI社のUSBシリアル変換ICにしか無い機能を使ってライタ機能を実現しているからである。

FT2XXにおけるCBUSについて

FTDI社の作るUSBシリアル変換ICはただUSBとUARTの間を取り持っているだけではない。データシートを見れば分かる通り、CBUSという特徴的な機能があるのである。FT230/FT231にはCBUS0~3の4つの端子があり、FT232にはCBUS0~4の5つの端子がある。

CBUSはFTDIのシリアル変換ICにおいて付加的な機能を持たせることが出来る端子で、ステータス表示用LED機能、クロック出力機能、さらにGPIO機能などを自由に割り当てることができる。これを上手く使うことでシリアル変換+αの機能を持たせることができる。

各CBUS端子にどのような機能が割当たっているかはFT23Xの設定用内部メモリに保存され、書き換えたい場合はFT_Progという専用のツールを使う。GPIOなどを使いたい場合、FTDIの独自APIを触ることになる。

TWE-Lite用の公式書き込み機は、CBUS端子をGPIOとして使うことでリセット/PRGの自動処理を実現している。 これを踏まえれば、同じようにCBUSを配線・設定してやると自作ライタでも同じことが出来るのではないかと思われる。

ライタ自作

実際にライタを作ってみたのでその技術的詳細を書く。

CBUSの配線

ありがたいことに、公式ライタ(TWE-Lite R3)のCBUSの配線は公式に公開されている。(リンク)

どうやらCBUS1~3の3本を使っているらしい。この回路図に倣って同じように配線した。ダイオードには適当に手元にあった1SS178を使った。高速でも高電圧でも大電流でもないので、よっぽど変なダイオードでなければ使えると思う。

FT_PROGによるCBUSの機能設定

とりあえずCBUS1~3をGPIOにすれば間違いなかろうと思ってそのように設定した。

CBUS0は自由に使えそうなので、RX/TXLEDに設定してみた。

FT_PROGによるデバイス名の設定

配線と設定さえすれば行けるものと思っていたが、上手くいかない。TWELITE STAGE APPから検出されるしシリアル通信も正常に行えるのだが、どうやらPRG/RST端子に対する制御は行われていない。これは恐らく公式ライタではないのでPRG/RSTの操作をやってくれていないのだと考えた。

しかしTWELITE STAGE APPはどこかしらで公式ライタと非公式ライタを見分けているはずである。そこを欺ければ勝機はある。

調べてみたところ、どうやらデバイス名の設定が重要なのだということが分かった。FT_PROGでデバイス名をTWE-Lite-R3に書き替えてみる。

そうすると、TWELITE STAGE APPにおいてポート検出時の表示がFTDI_GENからTWELITE Rに変化することが確認できた。おそらくFTDI_GENとはFTDI Genericの意で、非公式自作ライタを指す意味なのだろう。それがデバイス名を変えることで、公式ライタと誤認させることに成功した。

さらにこの自作"公式偽装"ライタは、公式ライタと同様にデバイスリセット・プログラムモード化を自動で行えることを確認した。従来の自作ライタでは手動でプログラムモード化をしていたのが、単にTWELITE STAGE APPの「アプリ書換」を選ぶだけで良いのである。

若干グレーな手法という気もするが、これで目的のものができた。開発が非常に快適になる。

注意として、FT_PROGで書き換えた設定はデバイスを接続し直して初めて反映される。FT_PROGで書き込んだら一旦抜き差しする必要がある。

補足1: 利用するIC

公式ライタはFT230XSを載せているので他の型番で問題ないのかは疑問があったが、少なくともFT231では全く正常に動くことを確認できた。実験していないがFT232やFT2232などでも、配線と設定を適切に行えば同様のことが出来る可能性は高い。

補足2: 今後の変化

モノワイヤレス社としては自社製品が売れた方が嬉しいはずなので、こういう記事はそんなに嬉しいものではないのではないかと思う。今後モノワイヤレス社の気分次第では、TWELITE STAGE APPがもっと厳密にライタの公式/非公式を判定するものになったり、別の箇所で判定するようになる可能性が一応ないではない。

一方で、その場合でも旧バージョンのTWELITE STAGE APPがホームページから消される可能性は低いと思われるし、そもそも公式にライタの自作方法を広めている点からしてライタ自作には寛容な方針に思える。そのためこの記事のやり方が不可能になる可能性については楽観的に考えている。

コメント