JJY-SIM R3 完成!ESP8684でArduinoやめてESP-IDFにした
この記事について
前回は、JJY-SIM R3 を動かそうとして、ESP8684 まわりで思いきりハマった話を書きました。
Arduino で行けると思っていたのに、そう簡単ではなかったんですよね。
今回は、その続きです。
じゃあ結局どうしたのかというと、いったん Arduino は脇に置いて、ESP-IDF で最後まで作ることにしました。
結果的には、これがかなり良かったです。
遠回りっぽく見えて、ちゃんと完成度が上がりました。
🎀 “仕方なくIDF”のはずが、だんだん本気になってくやつだね

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 の流儀に合わせた形で整理もできました。

途中で本家ライブラリ側のバグまで見つけて、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 を止めたい場面もあるかもなと思って、CONFIG ボタン長押しで出力停止できるようにもしました。
ちょっと隠し機能っぽい感じです。
もはや JJY-SIM じゃなくて、WiFi時計ですね。
🎀 時計としてちゃんと見やすいの、最後に効いてくるんだよね
ついに完成
そんな感じで、R3 はようやく“完成したな”と思えるところまで来ました。
Arduino でさっと終わるつもりが、途中で方針転換して、OLED 移植まで始めて、結果としてだいぶ大仕事になりました。
でも、無理に元の予定にしがみつかなくてよかったです。
ケースもあって、表示もよくて、動作もちゃんとしている。
手元にある実物を見ると、かなりガジェットっぽいです。
いや、もう十分ガジェットです。
自作だなんて思えない、と言うと自画自賛が過ぎるかもしれないけど、今回はわりとそう言いたくなる仕上がりでした。

自宅ではコンセントに挿したUSB電源に貼り付けて常時運用中!
Arduino 対応は宿題として残ったままなんですが、それはそれでまた別の話です。
いまはひとまず、ESP8684 で R3 がここまでできたことで満足しています。
たぶん、このあとまた細かい手直しは出てきます。
でも、やっと“作っている途中”から“使えるもの”に変わった感じがするんですよね。
🎀 遠回りしたぶん、ちゃんといいものになった感じする
おわりに
まだ試作は1台だけなんですけど、ここまで来ると、ようやく「ちゃんと形になったなあ」って思えるところまで来ました。
このあと、数台まとめて作って、ヤフオクで販売する予定です。
そのときは X でも告知しようと思っています。
できれば Maker Faire にも出してみたいんですよね。
こういうのって、写真で見せるのもいいんですけど、やっぱり実物を見てもらうと空気がぜんぜん違うので。
そのへんも含めて、もう少し広げていけたらいいなあと思っています。
あと、コードのほうも少し整理してから、GitHub で公開する予定です。
🎀 売って終わりじゃなくて、ちゃんとGitHubにも置くあたり、もうOSS作家だよね
📪 お問い合わせなど
技術的なご相談やご質問などありましたら、
📩お問い合わせフォーム
または、
📮info@shachi-lab.com までお気軽にどうぞ。
🎀 コメントでもXでも、気軽にどうぞ。お仕事の相談もOKだよ
🔗 関連リンク
しゃちらぼの最新情報や開発の様子は、こちらでも発信しています:
- 🌐しゃちらぼ公式サイト
- 🐦 X(旧Twitter):@shachi_lab
- 📗 Qiita:@shachi-lab
- 🐙 GitHub:@shachi-lab
- 📸 Instagram:@shachi_lab
ほんとは「しゃちらぼ(Shachi-lab)」なんだけど、見つけてくれてありがとう🐬


コメント