* ESP32(ESP-WROOM32)のTips [#m08c9183] 筆者は純粋なハードウエアエンジニアです。~ ソフトウエア開発はほとんどしたことがなく、ソフト屋からしたら常識的な部分がわかっていません。~ そういったハード屋視線でのソフト開発のTipsを記録しています。~ ** 開発環境は2通りある [#y0dab866] *** Arduino IDE [#l3c9af36] Arduinoの開発環境にボードデータを追加することで、ATMEL AVRと同じ感覚で開発が可能。~ 現在主流と思われる開発環境で、Arduino Uno等の経験がある人はこれで良いでしょう。 *** ESP-IDF [#g60263b0] こちらが公式な開発環境。~ 昔ながらのLinuxを知っている人なら入りやすい。~ >make config, make all と、コマンドライン操作でビルドする。 ** 使うと填まるIOポート(実質的に使用禁止) [#ab9c8207] - IO-0/2:boot modeを確定するピン - IO6/7/8/9/10/11:Serial FLASHに接続されている - IO-12:Serial FLASHの電圧を確定するピン(Reset時にOpenになってないと起動失敗にする) - IO-34/35/36/39:IN専用ピン(OUT出来ない) - ADC8-15(WiFi使用時のみ) - ADC8-15(WiFi使用時のみ使用不可) これらは起動時や動作時に特殊な機能をもっているピンもあるため、特別なケアをしないと使いこなせない。~ 例えばIO-12はプルアップしておくと起動に失敗する。起動後にプルアップするなら大丈夫なので、IOピンをHにしてプルアップの電源にしたら動くようになった。~ しかしそれでも割り込み動作に不安定さが残るため(例えばIO-12をLに維持していると、他のピンが読めなくなる)使わないことにした。~ ArduinoではIO-12とIO-13が割り込みピンなので、それを使用した作例が多いので、そのまま移植すると填まることになる。 ** 外部割り込み [#nd7dbb21] ESP32はIO-0からIO-15が外部割り込みのピンに使用できるという情報があるが、実際に実験してみるとこの制限によらないみたいだ。~ ほぼすべてのデジタルピンが割り込みに使えるように見える。~ 公式に使用できるIOピンは不明。~ ** 割り込みピンの初期化 [#jb0c3d3e] attachInterrupt(割り込み番号, 呼び出す関数, ピン状態) ピン状態は次の種類がある~ - LOW:ピンがLOWのとき - CHANGE:ピンの状態が変化したとき(L→HまたはH→Lのエッジ) - RISING:ピンの状態がLOWからHIGHに変わったとき(L→Hの立ち上がりエッジ) - FALLING:ピンの状態がHIGHからLOWに変わったとき(H→Lの立ち下がりエッジ) *** 割り込み番号はチップ依存があるので、関数を使って置き換えると良い [#m87f67e0] attachInterrupt(digitalPinToInterrupt(ENC_A), ENC_READ, CHANGE); attachInterrupt(digitalPinToInterrupt(ENC_B), ENC_READ, CHANGE); ENC_AはデジタルピンのIO番号。ここに繋いだスイッチの変化で割り込みを発生させる。~ ENC_READは割り込みが入ったときに実行したい関数名。~ CHANGEはピンに変化したときに割り込みを発生させる指定。~ これはロータリーエンコーダーを読み込むときの例で、ENC_A(A相)またはENC_B(B相)が変化したときに割り込みが発生し、ENC_READ関数を呼ぶ動作を設定している。 ** ADC2_n(ADC8-15)はWiFi使用時は使えない [#d4976cb7] ESP32には2個のADCを搭載しており、それぞれADC1とADC2となっています。~ また、それぞれのADCはMUXを通して各8chに拡張されていて、合計16chあります。~ しかしADC2側のポートはWiFiと排他になっており、WiFI使用時にADCはADC0-7までしか使えません。~ したがって、WiFiと同時に使用できるADCチャンネルは下記の通り6chになります。~ - ADC0 IO36 - ADC1 -- - ADC2 -- - ADC3 IO39 - ADC4 IO32 - ADC5 IO33 - ADC6 IO34 - ADC7 IO35 ** プラットホームの種類と特徴 [#nfb4c001] *** ESP32-DevKitC [#zc123fb1] スイッチサイエンスや秋月で買えるリファレンスモジュール。~ このモジュールは多くのIOピンが使える。 *** WeMos D1 R32 [#j10d499e] Arduino Uno互換形状のモジュール。~ 使用できるIOピンはDevKitから大幅に減っている。~ メスのピンヘッダが付いているので開発は楽。 *** WeMos LOLIN [#wa64ce45] 形状はDevKitに似ていて、Li-ion電池を接続できるコネクタが付いている。~ LiPo電池を繋ぐと充電してワイヤレスポータブル機器を簡単に作れそう。~ ただし、このモジュールはDevKitと似ているが、充電コネクタを置いた分、使えるIOピンが削除されている。~ 具体的にはSDカードインタフェースのピンが無い。 ** 買ってはならないモジュール [#fd078d03] *** Amazon等で買える「HiLetgoのESP-32S NodeMCU開発ボード」 [#p482d91b] https://www.amazon.co.jp/gp/product/B0718T232Z/~ 現在注文できない状態になっている。(レポートしたからか?)~ このモジュールは回路が間違っていて、修正しないとArduino IDEから通常操作では書き込みが出来ない。~ 書き込みのタイミングでプッシュスイッチを操作してやれば可能。~ 修正方法は、抵抗1個削除、コンデンサ3個追加(空中配線)が必要。ハードウエアの非常に細かい作業。 ** 開発の作例ページ [#gf7c4d80] - Bluetoosh接続で、ESP32をキーボードやマウスの振る舞いをさせる例~ →BT LEのHIDデバイスとして動かすことが出来る。~ http://neocat.hatenablog.com/entry/2019/09/28/151947~ キーボードライブラリ~ https://github.com/T-vK/ESP32-BLE-Keyboard~ マウスライブラリ~ https://github.com/T-vK/ESP32-BLE-Keyboard - デュアルコアを生かしたマルチタスク~ DevKitのArduino環境はRTOSで動いている。~ 例えばWiFi等の重い処理はコア0に、ユーザプログラムはコア1で動かすことができる。~ コアを指定したスレッドの作成方法。~ https://www.mgo-tec.com/blog-entry-arduino-esp32-multi-task-dual-core-01.html ** その他の情報ページ [#md377605] - DevKitの電源周りに注意~ 3.3V系のLDO AMS1117が電圧ドロップを起こしている。~ WiFiの突入電流が大きいのか?~ http://nemuisan.blog.bai.ne.jp/?eid=220875