JJY-SIM R3 ハマり編 ESP8684はArduino非対応?

ESP8684とESP32モジュールを見比べて困った表情のろらたん、JJY-SIM R3のハマり編を表現したアイキャッチ ESP32

JJY-SIM R3 ハマり編 ESP8684はArduino非対応?

この記事について

前回の #052 では、JJY-SIM R3 の基板とケースが届いて、
実際に実装してみたところまで書きました。
Ali で買った薄型のスライドスイッチもぴったり収まり、
ケースの仕上がりもかなりいい感じ。低温ハンダを試したり、
OLED を載せるための台座もうまく機能したりして、
全体としてはかなり順調でした。

しかも、ESP-IDF で軽く動作確認した範囲では、
LED も光るし OLED も表示できる。
RESET と BOOT の回路もちゃんと効いていて、
オートで書き込みモードにも入る。

ここまで来ると、だいぶ安心するんですよね。
回路ミスやパターンミスがあると、
だいたいこの辺で何か起きるので。

で、次は当然、Arduino 側のソフトを入れていこうと思ったわけです。
もともと JJY-SIM は Arduino ベースで進めてきたので、
R3 でもそのまま行けるつもりでいました。

……ところが、ここで思わぬ罠に引っかかりました。

今回はその話です。
実装はできた。ハードもたぶん大丈夫。
なのに、ソフトを書き込もうとしたところで、
いきなり足元が抜ける。
そういう、なんとも言えないハマり方でした。

🎀 “実装編の次は動かして終わり”の空気だったのに、急に床が抜けるやつ

PCで悩んでるろらたん


まずは順調

R3 の実装が終わった時点では、正直かなり気分が良かったんです。
スライドスイッチは基板にぴったりだったし、
ケースもちゃんとはまる。
OLED の位置決め用に作った台座も思った通りに効いていて、
表示窓との位置関係も悪くない。
黒いケース越しに LED がうっすら透ける感じも、
予想以上に見た目がよかったんですよね。

低温ハンダも、細かい反省点はいろいろあるんですけど、
少なくとも「樹脂パーツを熱でやらかした」ということはなかったし、
ホットプレート実装そのものは成立していました。
ハンダボールが出るとか、セルフアライメントが弱いとか、
そのへんは今後の調整課題として残っていますが、
少なくとも「今回のR3は失敗作だった」という感じではなかったです。

で、ESP-IDF で軽く L チカと OLED 表示を確認してみたら、
そこもちゃんと動いた。
ああ、これなら行けるな、と。

ここまでは本当に、素直にうまく行ってたんです。

だからこそ、そのあと Arduino 側でハマったときに、
余計に「えっ、そっち?」ってなりました。
回路じゃなくて、そこなんだ……という。

🎀 ハードが無事だと油断するんだよね。罠って、だいたいそのあとに置いてある


Arduino でボードが無い

じゃあ、いつものように Arduino IDE から書いてみるか、
となったわけです。
ところが、
ボードマネージャーに ESP8684 が見当たらないんです。

最初は、あれ? 見落としたかなと思いました。
Espressif 系って種類が多いし、似たような名前も多いので、
単に自分が探しきれてないだけかもしれない、
くらいに思ってたんですよね。

でも、いくら見ても無い。
ESP32-C3 はある。
S2 も S3 もある。けど、ESP8684 が無い。

ここでちょっとややこしいのが、ESP8684 と ESP32-C2 の関係です。
自分も最初、ここをちゃんと分かっていなかったんですが、
ESP8684 は製品名というか、モジュールやチップの名前で、
ESP32-C2 はシリーズ名なんですよね。
だから「ESP32-C2 という製品」が並んで売られているわけではなくて、
実際の部品名としては ESP8684 になっている。

つまり、「ESP8684 = ESP32-C2」と言ってもいいのですが、
製品名とシリーズ名が一致していないので、
最初の時点でちょっと罠っぽいんです。

同じものなのに、呼び方がズレてる。

こういうの、分かってしまえばそういうものか、で済むんですけど、
最初にハマるには十分なんですよね。
しかも Arduino IDE 側では ESP8684 という名前では出てこないので、なおさらです。

🎀 この時点でちょっと嫌な予感するよね。“正式には別名です”ってやつ


boards.txt にあった

じゃあ内部的にはどうなってるんだろうと思って、
Arduino の esp32 関連ファイルを見に行きました。
こういうとき、結局いちばん早いのは中を見ることだったりします。

そうしたら、boards.txt の中に、
ちゃんと ESP32-C2 に関する定義があったんです。
あ、いるじゃん、と。

でも、よく見たら esp32c2.hide=hide みたいな記述がある。
隠されてるんですよね。
まるで最初から「まだ出しません」と言わんばかりに。

ちょっと、
隠しキャラを見つけたような気分になりました。

それならということで、その行をコメントアウトしてみました。
そうしたら、
ボードマネージャー上に ESP32C2 Dev Module が出てきたんです。
やったね!
なんだ、これで行けるじゃん。

たぶん、この瞬間がいちばん期待していたと思います。
こういうのって、見えなかったものが急に見えると、
それだけで進んだ気になっちゃうんですよね。

でも、もちろん、そんなに甘くなかったです。

🎀 出てきただけで一回テンション上がるの、すごく分かる。で、だいたい次で落ちる


でもビルドは通らない

ESP32C2 Dev Module を選べるようになったので、
そのままビルドしてみました。
ここで普通に通れば、記事の方向性も全然違っていたはずなんですが、現実はそうじゃなかった。

いきなりエラーです。
即エラー!

最初は設定値かなと思ったんですよ。
例えば周波数の選択肢が足りないとか、ボード定義の細かいミスとか、
その程度ならまだ話は簡単です。
でも実際には、もっと根本的な感じでした。
必要なファイルが足りない。lib が揃っていない。
名前だけ出しても、中身が伴っていない。

つまり、boards.txt に定義があるからといって、
そのまま Arduino で使える状態になっているわけではなかったんです。

これはちょっとがっかりしました。
いや、かなりがっかりしたかな。
隠されていたものを見つけた時点で、半分くらい解決した気分になっていたので。

でも、よく考えれば、それだけで使えるなら最初から隠してないんですよね。
ま、そうなんですけど。

🎀 “選べる”と“使える”は別なんだよね。そこ、かなり意地悪


“自分で lib を作ってね”

じゃあ公式はどうなってるんだろう、と思って、Espressif の GitHub を見に行きました。
Arduino 用のリポジトリですね。

ここで、もしかしたら最新版では C2 対応が進んでるかも、と思ったんですが、
見た感じ、少なくとも素直に使える状態ではなかったです。

そして、TOPページの README に、以下のような記述がありました。

Note

ESP32-C2 and ESP32-C61 are also supported by Arduino-ESP32 but require using Arduino as an ESP-IDF component or rebuilding the static libraries. For more information, see the Arduino as an ESP-IDF component documentation or the Lib Builder documentation, respectively.

要するに「C2 を Arduino で使いたいなら、自分で lib をビルドしてね」という話になっていました。

これ、なかなか重いです。

一応、esp32-arduino-lib-builder というリポジトリがあって、
ビルド環境自体は用意されているんですよね。
しかも Ubuntu、Raspberry Pi、macOS あたりでは確認済み、
という感じで書かれている。つまり、完全に門前払いではない。

ただ、「Arduino IDE で気軽に使う」という世界ではないんです。
もちろん本気で使うならやるんでしょうけど、少なくとも“ちょっと試す”の延長ではない。

この時点で、かなり悩みました。
ここまでして ESP8684 を Arduino で使うのか?
という話になってくるんですよね。

R3 の設計をした時点では、ESP32-C3-WROOM が入手しにくいから、
その代わりとして ESP8684-WROOM も使えるようにしておこう、という気持ちが大きかったんです。
ピン配もほぼ同じだし、フットプリントも無理やり両対応にしたし、
だったらソフトもそこそこ共通で行けるだろう、と。

でも、現実はそんなに単純じゃなかった。

🎀 “互換っぽいからいけるでしょ”って思う気持ちは自然なんだけど、だいたいそこに沼がある


C3 の lib を流用できる?

ここまで来ると、ちょっと悪あがきしたくなるんですよね。
C2 も C3 も RISC-V じゃないか、と。周辺も見た感じかなり近い。
だったら、C3 用の lib をそのまま持ってきて、
フォルダ名とかファイル名だけ整えれば、
案外なんとかならないか……と。

やってみました。

まあ、ダメでした。

さすがにそんな簡単じゃないですよね。
もしそれで動くなら、すでに誰かがやってるはずですし、
もっと普通に使えるようになっているはずです。

で、少し調べていくと、どうも C2 と C3 では、
同じ RISC-V 系でもレジスタ構成や命令に差があるらしい。
調べた結果が以下のような感じです。

比較項目ESP32-C3ESP32-C2 (ESP8684)
ISA (命令セット)RV32IMCRV32EMC
物理レジスタ数32個 (x0 〜 x31)16個 (x0 〜 x15)
x16〜x31の操作正常に動作Illegal Instruction (例外)
標準ABIilp32ilp32e
引数用レジスタ8個 (a0 〜 a7)6個 (a0 〜 a5)
一時レジスタ7個 (t0 〜 t6)3個 (t0 〜 t2)
バイナリ互換性あり (C2用はC3で動く)なし (C3用はC2で即死)

C2 は C3 の下位互換だったんですね。
それじゃあ単純流用は無理だよなと。
中身が違うのに、見た目だけ合わせてもどうにもならない。

このへん、最初に「RISC-V でほぼ同じ」と思ってしまうと危ないですね。
似てる、でも同じではない。

正直、このあたりでかなり雲行きが怪しくなってきました。
Arduino でそのまま行くつもりだった前提が、少しずつ崩れていく感じです。

思い込みだったなあ、と思いました。
Arduino で使えるものだと、なんとなく思っていたんですよね。
いや、ちゃんと調べれば分かったのかもしれないんですけど、
そこは完全に甘かったです。

🎀 “同じRISC-Vだし”は危険ワードだったね。そこ、たぶん何人も落ちてる


ESP-IDF で UART が文字化け

Arduino がすぐには難しそう、
となると、じゃあとりあえず ESP-IDF で進めるか、
という話になります。
実際、L チカと OLED の確認はすでに ESP-IDF でやっていたので、
まったくのゼロからではないですし。

で、あらためてログをちゃんと見ようと思ったんです。
動いてはいるけど、BOOT LOG も含めて UART の出力をきちんと確認しておこうと。

ところが、ここでもハマりました。

COM ポートはちゃんと見えるんです。
書き込みもできる。
だから物理的には問題ない。
CH340K まわりも生きてる。
なのに、ログがまともに読めない。
文字化けして、何か呪文みたいなものしか出てこないんですよね。

最初は単純にボーレート違いだと思いました。
これはまあ、ありがちな話なので。
115200 じゃないのかな、9600 かな、19200 かな……みたいに、
典型的な速度をいくつか試していったんですけど、なんかしっくりこない。

menuconfig 側では 115200 に設定してるのに、
bootloader も printf() もまともに読めない。
ただ、何かが出力されてるってことは分かります。
これは変だな、と。

そこでオシロで見てみたら、
実際には 74880bps くらいになっていたんです。
何その中途半端な値、ってなりました。

🎀 文字化けって、最初は“設定ミスかな”で済ませたくなるんだけど、たまに本物の罠が混ざってる


XTALの問題

74880 という数字を見たときに、ようやく気づいたんです。
あ、これ、XTAL の比じゃないかと。

ESP8684-WROOM は 26MHz の水晶なんですよね。
一方で、ESP32-C3 系は 40MHz が多い。
自分もそっちの感覚でずっと見ていたので、無意識に「40MHz 前提」で考えていたんです。

でももし、内部の設定が 40MHz 前提のままで UART を組んでいたら、26/40 の比でずれる。
115200 に設定しても、実効値は 74880 付近になる。

計算が合う。

これか、と思いました。

試しに、逆算して 177230 くらいの値を設定してみたら、
115200 のターミナルでちゃんと読めたんです。
さすがにこれは、原因がそこだと見ていい。

設定 115200 なのに実際は 74880。
いや、かなり罠です。
書き込みできているから、余計に見落としやすいんですよね。
配線は合ってるし、USB-UART も生きてる。
なのにログだけ読めない。

こういうの、分かってしまえば「ああそういうことね」なんですが、知らないと結構長く迷うやつです。

🎀 “通信できるのに読めない”がいちばんいやらしい。ちゃんと半分成功してるのが余計に混乱する


データシートをみるべき

で、こういうときのお約束なんですが、あとからデータシートを見ると、ちゃんと書いてあるんです。

  • XTAL 周波数の自動検出なし
  • 起動時は 40MHz 前提で UART=115200 に設定

先にそこを読んでおけばよかったんですよね。
ほんとに。

ただ、実際には、先に全部読むというのもなかなか難しいんです。
特に「ESP32 系だから、まあだいたい同じでしょ」と思って入ってしまうと、
余計に細かい差分を読み飛ばしがちになる。
今回まさにそれでした。
データーシートはちゃんと読んでおきましょうっていう事ですね。

Espressif社にもコストとかの事情があるんでしょうけど、
ESP8684-WROOM は 40MHz で作ってほしかったなあって思いました。
使う側からすると、かなりハマるポイントです。

しかも、これ UART だけの話じゃないかもしれないんですよね。
クロックに依存するものなら、PWM やタイマも同じことが起きるはずで。

そう思って見てみたら、案の定でした。

🎀 “読んでなかった自分が悪い”で終わらないんだよね。普通に引っかけ問題っぽい


menuconfig で設定する

UART だけなら、まだログが読みにくいだけで済むかもしれません。
でも JJY-SIM は PWM を使うので、そこが狂うと話が変わってきます。

試しに PWM 側も見てみたら、これもやっぱり 26/40 の影響を受けていました。
つまり、40kHz で出したいと思って設定しても、26kHz になっていました。

これはさすがに困るんです。
JJY-SIM でそこがズレると、根本のところに効いてきますからね。

もちろん、ソフトではそれを見越した値を設定すればいいのですけど、
なんだか釈然としませよね。

で、ここで AI に相談してみたら、menuconfig に XTAL の設定あるよ、と。
えっ、そんなのあったのか、となりました。

今まで C3 を使っていたので、あまり意識していなかったんです。
見てみたら、Main XTAL frequency が 40MHz のままになっていた。
そりゃズレるわけです。

これを 26MHz に直したら、115200 の UART はちゃんと 115200 になったし、PWM も期待通りの周波数になりました。
ああ、そこか、と。

原因が分かった瞬間はかなりすっきりしました。
ただし、bootloader には効かなかったので、起動直後のログは相変わらず文字化けです。
そこは別なんでしょうね。

とはいえ、少なくとも app_main 以降は正常になった。
PWM もまともになった。
ここはちゃんと前進でした。

🎀 設定ひとつで全部つながる瞬間あるよね。あの“あっ、これだ”感はちょっと気持ちいい


結局どうする?

で、ここまで来て残るのが、結局どうするのか、という話です。

素直に C3 に寄せるのか。
あるいは ESP-IDF ベースで進めるのか。
それとも Espressif の言う通り、C2 用の Arduino lib を自分でビルドするのか。

どれも一長一短なんですよね。

C3 にすれば、Arduino 側はかなり平和です。実績もあるし、こちらの想定にも近い。
ただ、R3 はせっかく ESP8684-WROOM でも使えるように基板を作ったわけで、
それを無かったことにするのも少しもったいない。

ESP-IDF で進めるなら、少なくとも C2/ESP8684 をちゃんと扱える。
でも、JJY-SIM を今さら全部 ESP-IDF 寄りに持っていくのか、
という気持ちは正直あります。そこまでのつもりではなかったので。

lib-builder で C2 用の環境を作る、というのは技術的には筋が通ってるんでしょうけど、さすがに少し重いです。
気軽にやるにはレベルが高い。
いや、やれないわけではないんでしょうけど、そこまで踏み込むと
「なぜそこまでして C2 にこだわるのか」という別の問いが出てくる。

今のところ、気持ちとしてはかなり揺れています。
C3 で割り切るのがいちばん穏当な気もするし、
でも ESP8684 のこともここまで調べてしまったので、
このまま引き下がるのもなんだかな、という感じもある。

ほんとに、悩みます。

🎀 ここで“よし決めた!”ってならないの、逆にリアル。たぶんまだ考えるやつ


思い込みへの反省

今回いちばん大きかったのは、やっぱりそこかもしれません。
ESP8684 は ESP32 系だし、Arduino でもまあ使えるだろう、と勝手に思っていたことです。

完全に思い込みでした。

もちろん、調べれば分かったはずなんです。
でも、こういうのって、あまりにも“使えそうな顔”をしていると、そこを疑わなくなるんですよね。
ピン配も近いし、開発フローも似ているように見えるし、
ボードも組めてしまった。
だから余計に、ソフト側もその延長で行けると思ってしまった。

実際には、そこにちゃんと段差があった。

しかも見た目では分かりにくい段差です。
boards.txt に定義があるのに隠されているとか、lib は自分で作れとか、
XTAL の差で UART と PWM がズレるとか、そういうのが少しずつ積み重なってくる。

こういうの、まさに“罠”という感じでした。

ただ、逆に言えば、今回そこにちゃんと引っかかったことで、
R3 の設計上の意味も少し変わってきた気がします。
単に「C3 が手に入りにくいから代替も使えるようにしておいた」というだけじゃなくて、
実際にやってみると、その先にあるソフトウェア側の扱いやすさまで含めて考えないといけないんだなと。

部品が載る、だけでは終わらないんですよね。
そこから先が長い。

🎀 “載るからOK”じゃないんだよね。組み込みって、だいたいその先のほうが長い


おわりに

R3 の実装自体は、かなりうまく行きました。
ケースも基板も、思っていた以上にちゃんと形になっていて、
その点ではかなり手応えがあります。

でも、その先で ESP8684 にハマった。
しかも、いかにも“後から効いてくるタイプ”のハマり方でした。

Arduino ですぐ使えると思っていたら、そもそも表に出ていない。
無理やり出しても lib が足りない。
ESP-IDF で逃げても、今度は XTAL 26MHz が牙をむく。

ここまで来ると、さすがに「ちゃんと調べてから使うべきだったなあ」と思います。

とはいえ、こういうのも含めて開発記録なんですよね。
最初から全部うまく分かっていたら記事にならないし、逆にこういうところでハマると、
あとで見返したときにいちばん記憶に残る。
たぶん、今後 ESP8684 を触るたびに、この 74880 を思い出すと思います。

さて、R3 をこのまま C3 中心でまとめるのか、ESP8684 も何とか活かす方向で粘るのか。
まだ少し悩み中です。

こういう時間も含めて、ものづくりなんですけどね。

🎀 “作る”って、部品が届いてからじゃなくて、悩み始めた瞬間からもう始まってる気がする


📪 お問い合わせなど

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

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


🔗 関連リンク

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

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

コメント

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