ESP32でマイクロマウスを作るメリットとデメリット
この記事は Micro Mouse Advent Calendar 2020 の 11 日目の記事です。
昨日の記事は、FND さんの「今年買ったもの」でした。
めっちゃいろんなもの買っててやっぱ社会人パワー最高ですね!!
ぼくもグラボほしーーー
はじめに
さてさて今回の記事では、私が今までに ESP32 でマウスを作ってきてよかったことと辛かったことを紹介したいと思います。
今後 ESP32 でマウスを作ろうと思っている方の参考になれば幸いです。
ESP32 とは?
ESP32 とは、 Espressif Systems 社が発売しているワンチップマイコンです。
WiFi & Bluetooth を搭載しているにも関わらず 500 円以下という安価なので、 IoT 界隈でかなり注目されているマイコンです。
私はこのマイコンの前身である ESP8266 を愛用していたので、 2016 年に ESP32 が新発売されたときはすぐに目をつけて、 その魅力に惹きつけられていました。
ちなみに、 KERISE v1, KERISE v2 は STM32F405RGT6 マイコンを使用していましたが、 それ以降の KERISE v3, KERISE v4, KERISE v5 では ESP32 を使っています。
ESP32 でマウスを作るメリット
まずは ESP32 でマウスを作っていてよかった点を紹介します。
スペックが高い
なんと言っても、ESP32 の魅力はスペックです。
CPU が 240MHz の Dual-Core で、メモリが 520kB もあります!!
Flash メモリも 4MB もあって、メモリに困ることはほとんどありません。
ちなみに、Dual-Core は RTOS によってマネジメントされており、 簡単にマルチスレッドのプログラムを書くことができます。
詳しくは こちら の記事をご覧ください。
I/O ピンの割り当てが楽
ESP32 のペリフェラルの I/O ピンは一部のピンを除いて再割り当て可能となっています。
PWM, SPI, I2C などのピンを好きなピンに割り当てることができるので、機能の重複を避けたりする必要がありません。
さらに、配線の都合をみながらピンを入れ替えることさえできてしまいます。
ただし、ADC のピンは固定されています。
標準ライブラリが充実している
ESP32 のライブラリは C++標準のライブラリをほぼ完全にサポートしています。
例えばシステムクロック std::chrono
やマルチスレッド std::thread
なども使用可能です。
マイコンというよりも PC のプログラムを書いているかのようにコーディングが可能です。
公式ドキュメントがめっちゃわかりやすい
ESP32 は製造元の Espressif がけっこう熱心で、ドキュメント や サンプルコード がかなりわかりやすく書いてあります。
ESP32 のコードを書こうとしたとき、ググって調べることはほとんどなくて公式ドキュメントだけですべて解決してしまいます。
ハードフォルトの際にはコアダンプでどの部分で落ちたか教えてくれる
ESP32 は RTOS の組み込みやベース実装がしっかりしていて、 ハードフォルトなどでクラッシュしたときにはスタックトレースが表示されて、 どこで落ちたかがわかるようになっています。
これによって、未定義動作などで「なぜか落ちる」というような闇がほとんど起きません。
ハードウェア開発をする上でのこの安心感は、他のマイコンにはあまりない良さだと思います。
フラッシュメモリの空き領域がファイルシステムになっている
ESP32 には SPIFFS というライブラリが実装されていて、 フラッシュメモリの空き領域をファイルシステムにすることができます。
迷路情報やログ、パラメータなどをファイルの形式で保存できるのでとても便利です。
ESP32 でマウスを作るデメリット
次は ESP32 でマウスを作っていて残念だった点、苦労した点を紹介します。
消費電流と技適の問題で WiFi が使えない
私は ESP-WROOM-32 モジュールではなく、ESP32 チップ単体をマウスに載せています。
そのため、技適が通っていないので日本で WiFi/Bluetooth を使用することができません。
また、たとえ使えたとしても消費電流が多すぎてハーフマウスのバッテリーや DCDC コンバータでは非力でまともに使うことができないと思います。
使用できるピンが少ない
ESP32 はフラッシュメモリが QSPI で接続されていたり、 電源ピンが多かったりで実際に使える I/O ピンが 26 本程度しかありません。
これはマイクロマウスを構成するにはギリギリのピン数です。
I2C や SPI のバスはなるべく共通にして、 LED をたくさん光らせたければ I2C LED ドライバなどを使用するのがいいでしょう。
ADC の割り込みがない
ESP32 を使っていて一番困ったのが ADC です。
マイクロマウスでは赤外線リフレクタをサンプリングする際に ADC を使用しますが、森永式発行回路のフラッシュ点灯の場合読み取りのタイミングが命です。
ADC 割り込みがないので仕方なくタイマー割り込みで頃合いを見計らって読み取りを行っています。
また、ESP32 には ADC が 2 器ついているんですが、ADC2 は WiFi と同時に使えないという仕様で、 使用している例がほとんどありません。
RTOS に慣れないといけない
ESP32 の Dual-Core を有効活用するには RTOS の使い方を勉強しなければなりません。
また、RTOS が動いているマイコンではあまりタイマー割り込みは使わずに RTOS に時間の管理を任せるので、 プログラムの書き方が若干変わってきます。
Flash の書き込み時にフリーズする (?)
これは私の使い方が悪いからかもしれませんが、 Flash メモリのファイルシステムにデータを書き込もうとすると RTOS のタスクがブロックされて処理が滞ることがあります。
おそらくファイルシステムに使用しているフラッシュメモリはプログラムメモリでもあるので、 バスがビジー状態になってしまうのでしょう。
マウスの走行中にファイルシステムに書き込みをすると危険なので、袋小路などで止まってから保存するようにしています。
まとめ
今回の記事では私が今までに ESP32 でマウスを作ってきて良かった点と悪かった点を紹介しました。
私からすると ESP32 はとても魅力的なマイコンです。
まだ使ったことがない方はぜひ使ってみてください。
この記事がこれから ESP32 マウスを作ろうとしている方の参考になれば幸いです。
明日の Micro Mouse Advent Calendar 2020 の担当はそらさんです。 お楽しみに!