JJY-SIM R3 完成!ESP8684でArduinoやめてESP-IDFにした

JJY-SIM R3を手にしたろらたんとESP8684・ESP-IDF開発をテーマにしたしゃちらぼブログのアイキャッチ画像 ESP32

JJY-SIM R3 完成!ESP8684でArduinoやめてESP-IDFにした

この記事について

前回は、JJY-SIM R3 を動かそうとして、ESP8684 まわりで思いきりハマった話を書きました。
Arduino で行けると思っていたのに、そう簡単ではなかったんですよね。

今回は、その続きです。
じゃあ結局どうしたのかというと、いったん Arduino は脇に置いて、ESP-IDF で最後まで作ることにしました。
結果的には、これがかなり良かったです。
遠回りっぽく見えて、ちゃんと完成度が上がりました。

🎀 “仕方なくIDF”のはずが、だんだん本気になってくやつだね

PCでコーディングするろらたんの画像


ESP-IDF でやることに決断

正直、最初はあまり乗り気じゃなかったんです。
JJY-SIM はもともと Arduino で作ってきた流れがあるし、R3 もその延長で行けるつもりでいました。
ところが ESP8684 は、思っていたより素直じゃなかったんですよね。

ボード定義の扱いも微妙だし、必要なライブラリも揃っていない。
見えている入口はあるのに、その先の床が抜けている感じでした。

もちろん、頑張れば Arduino 用の C2 ライブラリを自前でビルドして進める道もあります。
でも、そこに時間を使うのは、いま作りたいものの本筋とはちょっと違うかなと思ったんです。
R3 を完成させたいのであって、Arduino の足りない部分を自分が埋める大会を始めたいわけではないので。

というわけで、ここは割り切りました。
Arduino 対応は後日の課題。
まずは ESP-IDF で、ちゃんと動くものを仕上げることにしました。

🎀 寄り道も大事だけど、今回は本線に戻った感じ


再出発

ハードウェアの確認自体は、すでに ESP-IDF で少し進めてありました。
LED の点滅もできていたし、OLED にロゴも出せていたので、基板そのものに大きな問題はなさそうだったんです。
UART 経由の書き込みも特に困らない。そこは救いでした。

なので、方針転換といっても、完全にゼロからではありません。
土台はある。問題はその上に、Arduino 版で当たり前に使っていたものをどう載せるか、でした。

大きく分けると課題は二つです。
Wi-Fi 設定用のポータル画面と、OLED の表示まわり。
どちらも、ただ動けばいいというより、ちゃんと“使える感じ”にしたい部分なんですよね。

このあたり、雑に作ろうと思えばいくらでも雑にできます。
でも R3 はケースまで含めて形になってきていたので、中身もそれに見合う感じにしたかったんです。
見た目だけガジェットで、中を開けると急ごしらえ、というのはちょっと避けたかった。

🎀 外装が育つと、中身にもちゃんとした服を着せたくなるんだよね


WiFi マネージャーを作る

Wi-Fi 設定のポータル機能は、今回かなり AI に助けられました。
要件を投げたら、それっぽいコードがかなりいい感じで返ってきたんです。
これ、そのまま製品版とはいかないにしても、ひな形としては十分すぎるくらいでした。

こういう、やることが比較的はっきりしていて、世の中に似た実装も多そうな機能は、AI と相性がいいんだなと思いました。
自分で一から全部組むより、だいぶ速いです。

手直しは必要でしたが、HTML を含めた全体の叩き台が最初からあるのは、かなり楽です。
少なくとも、白紙から始める感じではありません。

あと、こういう設定画面って、自分で作ると機能は足りていても妙に無骨になりがちなんです。
その点、AI が作った HTML は最初からそこそこ整っていて、なんだか悔しいけど、普通に使えるレベルでした。

ポータルの設定画面
スマホでのWifiマネージャー設定画面

WiFiマネージャーには、設定機能のほかに、通常時のWiFi接続機能があります。
この部分については、AIがつくったままでは済まない部分もありました。
切断時の挙動とか、再接続のさせ方とか、少し待って諦めるのか、しつこく食らいつくのか、そのへんは結局ちゃんと調整が必要でした。

この部分、いずれ整理してコンポーネント化しても面白いかもしれません。
R3 のために作ったつもりが、別の機器でも使える形に育つ可能性はありそうです。

🎀 地味な機能ほど、ちゃんとしてると効くんだよね


OLED ライブラリを移植

OLED は、もう少し苦戦しました。
最初は、文字表示も AI に書いてもらえばいけるかなと思ったんです。
固定幅フォントで簡単に出すところまでは、わりとすぐ行けました。

でも、R2 と同じ雰囲気にしたかったんですよね。
thingpulse のライブラリでやっていた、あのプロポーショナル表示をそのまま持ってきたい。
フォントも同じものを使って、見た目もできるだけそっくりにしたかったんです。

そこを AI にやらせると、途端に怪しくなりました。
文字が崩れたり、変な表示になったり、しまいにはハングしたり。
動くようで動かない。惜しいようで惜しくない。
ああ、これはもう違うなって。

結局、AI に OLED 表示コードを書かせるのは諦めて、thingpulse のライブラリを ESP-IDF に移植することにしました。
Arduino 用なので元は C++ です。
でも今回はコンポーネントとして扱いたかったから、思い切って C に書き換えました。

これ、作業量としてはかなり重かったです。
体感で言うと、今回の開発時間のかなりの割合をここが持っていったと思います。
ただ、そのぶん得たものも大きかったです。
R2 と全く同じ表示ができるようになったし、IDF の流儀に合わせた形で整理もできました。

JJY-SIM R3の画面表示

途中で本家ライブラリ側のバグまで見つけて、issue を出したらすぐに PR されたんですよね。
長く使われているライブラリでも、まだそういうことあるんだなあと。
この移植の話だけでも、たぶん別記事が1本書けます。
っていうか書く予定です。

🎀 “表示するだけ”が一番重いの、組み込みあるあるすぎる


JJY 送信の構造変更

JJY の送信処理も、この機会にかなり見直しました。
R2 では、NTP で時刻同期したあと、00秒が来るのを待って送信を始める構造だったんです。
最初に作ったときはそれでよかったんですが、いま振り返ると、だいぶ力技でした。

0秒から59秒までの処理を、ほぼ並べていただけなんですよね。
だからタイミングとしては分かりやすいけど、同期した直後でも最大59秒待つことになります。
これは、使ってみるとちょっと間が悪いです。

今回は、分が変わったときに1分ぶんのフレームを先に作ってしまって、そこから途中参加できるようにしました。
なので、NTP 同期が終わったら、待たされずにその時点の秒位置から送信に入れます。

こういうの、最初からそうしておけばよかった気もするんですが、試作ってやっぱり最短距離で走っちゃうんですよね。
あとで見ると、わりと素朴な作りがそのまま残っていたりします。
R3 では、そのあたりをようやくちゃんと直せた感じです。

🎀 初期実装って、“とりあえず動いた”が強すぎるんだよね


非同期処理に変更

もうひとつ大きかったのが、待ち方の見直しです。
これまでは JJY の 0 / 1 / マーカーの長さを、delay ベースで作っていました。
でも ESP-IDF だと、そこがなんとなくしっくりこなかったんです。

FreeRTOSの設定は、デフォルトの Tick が 10msec なので、LEDの点滅とかならまだしも、こういう細かい長さを気持ちよく扱うにはちょっと粗い。
もちろん、delayを使ってCPUを待たせればいいのだけど、何のためにIDFでRTOS使ってるのかって感じです。
そこで、出力開始のあとに停止タイミングだけタイマコールバックで予約する形に変えました。usec 単位で扱えるのも気分がいいです。

これで、メイン側は「今の秒で JJY を ON にした」「LED を点けた」「必要な停止コールバックを仕込んだ」までやったら、あとは OLED の更新に回れます。
以前みたいに、表示して、待って、LED を消して、また待って…と順番に詰め込む必要がなくなりました。

この違いは、思っていたより大きかったです。
thingpulse 系の表示は差分描画なので、画面内容によって描画時間が変わるんですよね。
R2 の構造だと、その揺れがじわっと全体に効いてくる。
R3 ではその影響を切り離せたので、かなりすっきりしました。

見た目はあまり変わらなくても、中身はちゃんと進化しています。
こういう部分は、作った本人だけがニヤッとするやつかもしれません。

🎀 地味だけど、こういう改良がいちばん効くやつ


設定のセキュアな保存

ここまでで、R2 相当の機能はだいたい揃いました。
でも、それで終わりにするにはちょっと物足りなかったんです。

いままでは、Wi-Fi の SSID とパスワードをそのまま NVS に保存していました。
自分だけで使うなら、まあいいかで済ませていたんですけど、
R3 は多くの人に使ってもらいたいと思っているので、そのままはちょっと雑かなと思いました。

なので今回は、SSIDとパスワードは暗号化して保存するようにしました。
もちろん、コードがあってキーも分かれば復号できますし、完璧な防御というわけではありません。
セキュアブートを本気で使うなら別の話になるんですが、
そこまでやると今度は扱いにくさも出てきます。
efuse を焼く世界まで行くと、趣味ガジェットの気軽さが少し減るんですよね。

そのへんは、ちょっと現実的な落としどころです。
Flash を吸い出しただけではすぐ見えない。そこまでで十分じゃないかな、と。
バイナリコードを解析してまでハックする人もいないだろうって感じです。
GitHub に出すときはキーもダミーにするつもりですし、売り物として最低限の配慮はしたかったんです。

🎀 “完璧じゃないけど平文よりはずっといい”って、実装では大事


表示まわりの拡張

表示まわりも、今回かなり手を入れました。
まず、上側に Wi-Fi の接続状態アイコンを入れました。
待ち中は少し動くようにしてあります。
こういう小さい変化って、情報量というより“生きてる感じ”が出るんですよね。

それより大きいのは、時計表示モードの追加です。
いままでも時刻は出していたんですが、SSID だの状態だのが並んでいて、時計として見るには少し落ち着かなかったんです。
そこに、妻から「これ、時計として使うならちょっと見にくいよね」と言われて、たしかにそうだなと。

JJY-SIM なんだから電波を出す装置として成立していれば十分、という考え方もあるんですけど、せっかく普段置いておくなら、ちゃんと時計としても気持ちよく使いたいじゃないですか。

そこで、余計な情報をほぼ消して、時刻を大きく見せるモードを追加しました。
時分を主役にして、日付や秒は控えめ。他の情報はほぼ出さない。

JJY-SIM R3の時計表示

これが思った以上に見やすくて、最初はサブ扱いだったのに、結局こちらをメイン表示にしました。
ポータルから初期画面を選べるようにもしてあります。

さらに、そこまでやるなら、JJY を止めたい場面もあるかもなと思って、CONFIG ボタン長押しで出力停止できるようにもしました。
ちょっと隠し機能っぽい感じです。
もはや JJY-SIM じゃなくて、WiFi時計ですね。

🎀 時計としてちゃんと見やすいの、最後に効いてくるんだよね


ついに完成

そんな感じで、R3 はようやく“完成したな”と思えるところまで来ました。
Arduino でさっと終わるつもりが、途中で方針転換して、OLED 移植まで始めて、結果としてだいぶ大仕事になりました。
でも、無理に元の予定にしがみつかなくてよかったです。

ケースもあって、表示もよくて、動作もちゃんとしている。
手元にある実物を見ると、かなりガジェットっぽいです。
いや、もう十分ガジェットです。
自作だなんて思えない、と言うと自画自賛が過ぎるかもしれないけど、今回はわりとそう言いたくなる仕上がりでした。

自宅で運用中のJJY-SIM R3
自宅ではコンセントに挿したUSB電源に貼り付けて常時運用中!

Arduino 対応は宿題として残ったままなんですが、それはそれでまた別の話です。
いまはひとまず、ESP8684 で R3 がここまでできたことで満足しています。

たぶん、このあとまた細かい手直しは出てきます。
でも、やっと“作っている途中”から“使えるもの”に変わった感じがするんですよね。

🎀 遠回りしたぶん、ちゃんといいものになった感じする


おわりに

まだ試作は1台だけなんですけど、ここまで来ると、ようやく「ちゃんと形になったなあ」って思えるところまで来ました。

このあと、数台まとめて作って、ヤフオクで販売する予定です。
そのときは X でも告知しようと思っています。

できれば Maker Faire にも出してみたいんですよね。
こういうのって、写真で見せるのもいいんですけど、やっぱり実物を見てもらうと空気がぜんぜん違うので。
そのへんも含めて、もう少し広げていけたらいいなあと思っています。

あと、コードのほうも少し整理してから、GitHub で公開する予定です。

🎀 売って終わりじゃなくて、ちゃんとGitHubにも置くあたり、もうOSS作家だよね


📪 お問い合わせなど

技術的なご相談やご質問などありましたら、
📩お問い合わせフォーム  
または、
📮info@shachi-lab.com までお気軽にどうぞ。

🎀 コメントでもXでも、気軽にどうぞ。お仕事の相談もOKだよ


🔗 関連リンク

しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:

💬「シャチラボ」で検索してきた方も大歓迎!
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬

コメント

タイトルとURLをコピーしました