ファームウェアの概要
デバイス上で実際に何が動いているのか、そして1文字がどのように光に変わるのかを説明します。
ファームウェアは、デバイスのチップ(Waveshare RP2040-Zero)の上で直接動く小さなプログラムです。パソコン上で動くものではありません。Arduinoフレームワークを使ったC++で書かれていて、やることはシンプルです。USB経由で1文字のコマンドを待ち受け、対応するLEDを点灯させる、それだけです。
このデバイスの初期バージョンでは、LEDテープの代わりに3個の独立した色のLEDを使っていました。そのファームウェアも参考として残っていますが、現在も開発が続いているのはテープ方式の方です。以下の内容はすべて、現行のテープ方式のバージョンについて説明しています。
このページはファームウェア自体(コード、依存ライブラリ、書き込みとテストの方法)について扱います。ハンダ付けや配線といった物理的な組み立てについては、組み立て作業の一次情報源である組み立てガイドを参照してください。
依存しているもの
WS2812系のアドレサブルLEDは、非常に精密なタイミングでの信号制御が必要です。単純な「ピンをオンオフする」だけの命令では実現できないレベルです。Adafruit_NeoPixel はこの制御のための標準的なライブラリで、このファームウェアもそれを使っています。このチップのタイミング制御用ハードウェアに対応しているため、信号が安定します。
セットアップ
- Arduino IDE 2.x、
arduino-picoボードパッケージをインストール済みであること。 - Arduino Library Managerからインストールした、Adafruit NeoPixelライブラリ。
andon_light_firmware.inoを開きます:Arduino IDEが、関連するled_controller.h/.cppとwatchdog.hを自動的に別タブとして読み込みます。
まだ実機を組み立てていない場合は、先にそちらを済ませてください。組み立てガイドの第2章を参照し、終わったらここに戻って書き込みとテストに進んでください。
書き込みとテスト
- ボードとして「Waveshare RP2040-Zero」を選び、書き込みます。
- シリアルモニタをボーレート115200、改行コード「Newline」で開きます。
- 1番目のLEDが薄い白色で点灯し、残りは消灯しているはずです。これが電源投入直後の正常な状態です。
G、Y、Rを順に入力し、それぞれエンターを押します。入力するたびに、その状態に対応する3個ずつのグループだけが点灯し、残りは消灯したままになるはずです。Cを入力し、下記で説明する順次点灯パターンになることを確認します。- 30分待たずに「接続が途切れた状態」のパルス表示を確認したい場合は、コード内の
kWatchdogTimeoutMsを一時的に15000に変更して書き込み、赤色がゆっくり明滅するのを確認したら、1800000に戻してもう一度書き込んでください。
もう少し詳しく
電力について
明るさはあえて上限を設けています(led_controller.cpp 内の kBrightness = 130/255)。消費電流を抑え、直接見たときにまぶしすぎないようにするためです。拡散カバーの奥で使うなど、光が拡散される用途であれば上げても構いません。ちらつきや色がおかしい場合は、ハードウェア側の問題(組み立て方によってハンダ付けか配線のどちらか)です。組み立てガイドのよくある間違いを参照してください。ファームウェアの設定で直すものではありません。
LEDの並び方
| LED | 役割 | 色 |
|---|---|---|
| 1 | 常時点灯する「起動中」のサイン | 薄い白色 |
| 2-4 | 作業中 | 緑色(G) |
| 5-7 | あなたの対応待ち | 黄色(Y) |
| 8-10 | アイドル | 赤色(R);接続が途切れるとゆっくり明滅 |
いくつか補足です。
- LED 1は、電源が切られている場合を含め、すべての状態を通して薄い白色のまま点灯し続けます:「基板に電源が入り、ファームウェアが動いている」ことだけを示す、他の
G/Y/Rの状態とは独立したサインです。 - 各状態は、それぞれ対応する3個のグループだけを点灯させます:LED 1以外の他のグループは消灯したままです。
- 接続が途切れた状態のパルス表示は、順次点灯パターンと同じフェードのカーブを使い、8-10番のグループだけに限定して明滅します。
- 順次点灯パターン(コンパクト中)は、状態表示用ではない9個のLED(2-10番)すべてを使います。1個のLEDがLED 10からLED 2に向かって順番に移動しながら点灯し、そこで固定されます。次の周回では、その隣のLEDが固定され……というように、9個すべてが点灯するまで続き、そこでリセットされて繰り返されます。
正確な数値が気になる方は、led_controller.cpp の kGreenStart/kYellowStart/kRedStart/kStatusPixel を参照してください。
通信プロトコルのリファレンス
| コマンド | 効果 | 意味 |
|---|---|---|
G | LED 2-4が緑色に点灯 | エージェントが作業中 |
Y | LED 5-7が黄色に点灯 | 権限確認や入力など、あなたの対応待ち |
R | LED 8-10が赤色に点灯 | アイドル、停止、または接続が切れた状態 |
C | LED 2-10で順次点灯パターン | 内部整理中(「コンパクト中」):ライトは点いたまま、片付け作業をしているだけです |
H | 見た目の変化なし | ハートビート:ライトの色を変えずにウォッチドッグをリセットします |
30分間パソコンから応答がない場合、デバイスは接続が失われたと判断し、それまでの表示のまま固まるのではなく、自動的にゆっくり明滅する赤色のパターンに切り替わります。