工作用の超小型マイコンを比較検討してみた

私は、普段使いのマイコンとしてESP32-DevKitC(ESP-WROOM-32E)を使用して様々なプロダクトの開発を行っています。モーター制御のためボタン操作でPWM信号を切り替える機能が必要になったのですが、ESP32-DevKitCではオーバースペック気味でコストも割高です。そこで、より安価なマイコンを探すことにしました。

候補に挙がったマイコン

Arduino Pro Mini:Arduinoシリーズの中でも小型かつ安価。Arduino言語で手軽に扱える ESP32 SuperMini:ESP32シリーズのESP32-C3が搭載された非常に安価なマイコン。日本国内ではWi-Fi/Bluetoothの技術認証が通っておらず、そのまま使うと電波が出て違法な状態になってしまう懸念がある。

技術基準適合証明(いわゆる技適)について

Wi-FiやBluetoothなどの電波を出す機材を日本国内で利用する場合は技適が必要になるのですが、電波を出すために必要なソフトウェアがハードウェアに搭載されていなければ問題ないようです。 (参考)ハードはそのまま技適を通ってないWi-Fi、BLEボードを合法的に使う 上記参考記事ではドライバを削除する対応を行なっていますが、ESP32シリーズの場合はWi-FiとBluetooth周りの静的ライブラリを含めないよう(リンクさせないよう)にすれば問題ないという認識です。 そのため、今回はESP32で対象のライブラリをリンクさせない方法を確認した上で、ESP32 SuperMiniを購入し調査することにしました。

Arduino Pro Miniで試作

Arduino IDEは簡単なLチカなどで使用したことはありましたが、実用的なプロダクトに組み込むのは今回がほぼ初めてです。プログラムは生成AI (Anthropic Claude 3.7 Sonnet) を利用して作成しました。

プロンプト

Arduino向けのプログラムを書いてください。
* 入力用のタクトスイッチを1つ利用できます
* ボタン入力にはチャタリング対応を入れてください。
* 起動直後はPWM出力は無効です
* タクトスイッチを長押しするとPWM出力の有効・無効が切り替わります
* PWM出力の段階は20%、50%、100%の3段階が存在します
* PWM出力が無効から有効に切り替わった時は20%で出力します
* PWM出力が有効の状態でボタンを押すと、PWM出力の段階が大きい方に切り替わります
* PWM出力が100%の次は20%に戻ります

生成AIによって、機能要件を満たすプログラムが生成されましたが、コードの品質はあまり高くありませんでした。 そのため、Arduino言語とC++の違いや、PWMの周波数設定などに注意しながら、大幅にコードを修正しました。 最終的なコードはGitHubで公開しています。

https://github.com/ayumu-bekki/simple-pwm-controller/blob/main/simple-pwm-controller.ino

Arduino Pro Miniの所感

Arduino IDEは、豊富なサンプルコードやライブラリが用意されているため、マイコン初心者でも比較的簡単に扱うことができます。生成AIを活用すれば、簡単なプログラムであればすぐに作成できるでしょう。今回のPWM制御のように、比較的単純な処理であれば十分実用になります。しかし、より高度なハードウェア制御や、リアルタイム性が求められる処理には、機能が不足していると感じました。また、シリアル変換モジュールが必要なので、人によっては少しハードルがあるかもしれません。

ESP32 SuperMinで試作 (Rust on ESP32)

ESP32 SuperMiniに利用されているESP32-C3は、ESP32-WROOM-32Eと同等の機能を持つSoCですが、上記に述べた通りWi-FiとBluetoothの認証がないため、対策せずにそのまま使うと違法な状態になってしまいます。 対象の無線通信用静的ライブラリ(libesp_wifi.ai libwifi_provisioning.a)をリンクさせないことで技適の問題を回避することができます。

esp-idfでは、CMakeLists.txtに

set(COMPONENTS esp32 main)

と定義することで、wifiライブラリ(libesp_wifi.ai libwifi_provisioning.a)をリンクさせないことで技適の問題を回避することができることを確認しました。

ただし、今回はRust on ESP32な開発環境で実装を行なっていたので、別の対応が必要です。 追加で調査したところ、Cargo.tomlに以下のように指定することで同様の対応を行う事ができました。(cargo build -vvで静的リンクされるライブラリ一覧が確認可能)

[package.metadata.esp-idf-sys]
esp_idf_components = ["esp32", "main"]

Rustを使用した場合は、生成AI (Anthropic Claude 3.7 Sonnet) でのコード生成は非推奨の関数が使用されるなどの問題のほか、そのままではビルドできないコードが生成されました。Rust on ESP32はまだ発展途上であり、Web上の情報が少ないため生成AIの精度が悪いようです。サンプルコードを参考にしながら実装を進めるのが良いでしょう。 最終的なコードはGitHubで公開しています。(Arduinoの倍くらいのコード量となっています)

https://github.com/ayumu-bekki/simple-pwm-controller-rs/blob/main/src/main.rs

ESP32 SuperMinの感想

ESP32 SuperMinは日本国内だと技適の問題もありWi-Fi/Bluetoothなどの無線機能は利用できませんが、ESP32シリーズと同じ開発環境とコードが使える、より安いマイコンとして活用できます。 またESP32 SuperMinのSoCはUSBのドライバが組み込まれているので、コンピュータとマイコンを直接USB Type-Cのケーブルで繋ぐだけで利用できる手軽さがあります。

まとめ

検証を通して、それぞれのマイコンの特性を改めて確認できました。 Arduino Pro Mini:手軽に始められるが、複雑な制御には不向き・シリアル変換モジュールが必要 ESP32 SuperMin:安価で高機能だが、日本国内では無線機能は無効化する必要がある ESP32-DevKitC:高機能で安定しているが、用途によってはオーバースペック

今回の用途では、ESP32 SuperMinを電波を発しない状態で使用するのが、コストと機能のバランスが取れているという結論になりました。

この記事へのコメント