
先日作成した「マンデルブロ集合(ESP32-C3使用)」を改良しました。 自作のジョイスティックライブラリの試用目的でしたが、 高速描画アルゴリズムを導入、一回り大きな画面に交換、ケースも作成して作品らしく仕上げてみました。
1回の拡大操作で拡大レベルが1上がります。1レベル上がるごとに解像度は4倍になります。
マンデルブロ集合自体に拡大の上限はありませんが、プログラム上はdouble型の精度による制約を受けます
レベル24で4^24倍(約280兆倍)となり、このあたりで集合領域の区間がdouble型の精度では表現できなくなります。レベル25以上は描画が粗くなります。
※集合領域の縦横の長さ(+Reと-Reの差、+Imと-Imの差)が32bit-double型において計算上なくなってしまうので。
いくつか知られている高速化の方法のうち、境界探索アルゴリズムを利用します。 当アプリでは適度に狭い領域内で計算の反復回数が同じになるかどうかを判定しています。
前作はボタン2つで同時押しも駆使して操作していました。
これがあまりにも使いづらく、直感的にも操作が分かりにくいので方向入力ができるデバイスに変更することにしました。
十字ボタンだと通常はGPIOを4つ使うことになります。
ESP32-C3-WROOMにはGPIOの数に余裕がないのでアナログレバーを使うことにしました。GPIOは2つで済みます。
これに合わせてジョイスティックライブラリを作成しました。X軸/Y軸のADC値を取得し、レバーの入力方向のオン/オフを判定するものです。
※当アプリではアナログレバーとしては使用していない。
後にジョイスティックライブラリは、複数のボタンスイッチの入力にも対応したゲームパッドライブラリへ拡張されました。
| ESP32-C3 | 部品 |
|---|---|
| GPIO_NUM_10 (SPI-SS) | LCD-CS |
| GPIO_NUM_7 (SPI-MOSI) | LCD-SDA |
| GPIO_NUM_6 (SPI-SCK) | LCD-SCL |
| GPIO_NUM_4 | LCD-DC |
| GPIO_NUM_0 | Joystick-AxisX |
| GPIO_NUM_1 | Joystick-AxisY |
| GPIO_NUM_3 | Joystick-PushSwitch |
GitHub - ESP32-C3 マンデルブロ集合(ジョイスティックライブラリ応用作)
ケースはプラ板で試作、形状を確認したあと3Dプリンタで作成。 その際、4方向制限のガードも何個か作ってみましたが、レバーキャップの形状が球面ではないことに気付き、ガード部品は作れないことが分かりました。 レバーキャップの曲面はラグビーボール状なので、レバーを倒すとキャップの裾部分がガードの内側でつっかえるか、頭頂部分がガードの外側でつっかえます。 一般的なゲームパッドにこのようなガードは付いておらず、レバー入力を4方向/2方向に制限するならソフト側で対応するのが普通のようです。
応用としてマンデルブロ集合の描画アプリを改良した。https://t.co/mFe00nHvxV
— 『昼夜逆転』工作室 (@jsdiy) April 8, 2026
秋月B基板に載せた。高さを抑えたかったのでマイコンボードとジョイスティックはピンソケットなし、モジュール直付け(ESP32-C3自体は外せる)。次ステップとしてケースを作る。 pic.twitter.com/TaB6l2VRGh
— 『昼夜逆転』工作室 (@jsdiy) April 23, 2026
「ちょっと作ってみよう」だったものが、操作系を改良したりケースを作成したりで一丁前の作品に仕上がりました。 中身はマンデルブロ集合描画専用機なんですけどね。