ESP32/Arduino 覚え書き

↓　S2についての項目は　S3の下です。

# ESP32-S3　についてメモ
S3に技適がついて値段もAliexpressで送料込み1000円くらいで買えるようになってきたので
無印からS3に重点を移していくつもり。

### S3 の オンボードLED（neopixel）について注意
オンボード3色LEDはありがたいが、
だがしかし　neopixelWrite() を　間隔開けずに連呼すると、なんと
ESP32本体が固まる！！？？
なんて恐ろしいコ
（Espressif正規品じゃないからか？？）
10msくらい間空くように使っています（1ms秒でも十分かも）

### S3 の BLE について注意
S3 の BLE は、後方互換性に乏しく
Apple製品ではつながらない？？かもしれない。（2023年）



# Arduino IDE 関連
* メニューにないupload速度の追加はboards.txtを編集する。
* boards.txtが反映されないときはユーザーデータを一旦削除する必要がある
    * こちらを参照→　https://github.com/arduino/arduino-ide/issues/1030
    * Windowsの場合は　C:\Users\ user name \AppData\Roaming\arduino-ide\　を空にしてArduinoIDE再起動とのこと。
* Serial.printf() はESP32独自。Arduino全般には不存在。移植性配慮するなら使わないが吉。

# ESP32　についてメモ
（コメント欄に補足情報頂いてます。ご覧ください）
※筆者の手元にあるのはESP32-DevKitC-32D(WROOM32Dが乗った38ピンのボード)
Espressif公式　→　https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/index.html
* 38/32ピンのピン一覧はここがまとまりいいかも　→　https://www.upesy.com/blogs/tutorials/esp32-pinout-reference-gpio-pins-ultimate-guide
    * ここもあり(30ピン) →　https://lastminuteengineers.com/esp32-pinout-reference/
* Macはドライバインストール必須（CH34xVCPDriver_signed.pkg）
* クロック落として使う際、
    * 40MHzが駄目で26MHzや13MHzならいけるときがあった。（ArduinoIDE）
    →「26MHz XTAL」「40MHz XTAL」クリスタルのクロック？に依存なのかな？
    → Espressif本家は40MHz前提なのかな？ https://esp32.com/viewtopic.php?t=2800
* 消費電力測定例
    * 240MHz（フルスピード）：ADC 6基使うスケッチで40~70mAとか
    * 13MHz　：　30～60mA　　そんなに劇的には変わらない。
※ 破損したESP32は消費電力600mAに達してるときがあった。（USB電圧も4.5Vくらいまで落ちる）
触ってられないほど熱くなる。こういうトラブルもあるのでUSB電力計はあったほうが吉
* ~~ArduinoIDEとは相性悪いらしい~~
* 2023年4月現在、BLEは問題が生じてる？~~。Advertizingできるけど接続失敗する。使い物にならない状況。~~
・ 標準BLEが動かない時は　NimBLE by h2zero を使うとよい。
* WiFi使用時のGPIOの干渉
    * WiFi使用中はADC2が使えなくなるとのこと
    * 36ピンも使えないような？？
* EN（Enable）ボタンはリセットみたいなもの(RST/RESETに相当と考えてよいらしい?)
    * ENピンがHiに上がっていないと効かない?そんなことない？
        * 電源投入またはPCとの接続の時にENピンがHiに上がっていないと不正なのかも。
        * 正常であればENピンをGNDに落とすと（ENボタン押すのと同様）リスタートする。
    * ENボタンが効くと隣の赤LEDが一瞬わずかに暗くなる？。ならなくても効いてるのか。
* GPIOピンのうちInput-onlyのピンのうち34より大きい番号のピンは、プルアップ/ダウンがついてない。
・ attachInterrupt() は使える。
* ADコンバータのリファレンス関連　→  https://docs.espressif.com/projects/esp-idf/en/release-v3.3/api-reference/peripherals/adc.html
    * ESP32のADコンバータは無駄に遅くなっているらしいです。参考→http://radiopench.blog96.fc2.com/blog-entry-1185.html
    * うちの環境esp32 by Espressif 2.0.14では23ksps程度でした。
    * ADCの**キャリブレーション**は”電池駆動時”を対象に実施されているのかも（？）
    USBでPCに繋いでるときの計測値は10%近くずれるのでてっきりキャリブレーションされてない個体だろうとか思ってましたが、DCDC経由の電池駆動にするとすごくまとも（テスターとの差は1%よりはるかに小さい満）でいい感じ。
* HID.h が不存在。故に"Keyboard.h"も使えない。"USBHIDMouse.h" "USBHIDKeyboard.h"　はあるけど使えない（？）。
    * ESP32-S2 / ESP32-S3 は、USB-OTG 対応なのでUSB機器構成できる。他は無理模様。
* Lチカに使えるオンボードLEDはWROOMにはついてないみたい。
* USBHostShield mini　について　　https://chome.nerpa.tech/usb-host-shield-hardware-manual/
    * 使ってるのは互換機。正規品のように電源ルーティングのパッド（ハンダ盛るやつ）は無い
    * そのままだとUSB子機への給電電圧は3.3Vくらいになる。
        * ELECOMのキーボードは正常作動した。
        * SANWA SUPPLY のトラックボールは正常。
        * 百均（キャンドゥ）マウスは駄目だった。ESP32の5V（実質4V）をUSBHSを迂回して供給したら動いた。

## Upload失敗の対処
* GPIOの接続不良とかで接続失敗（Upload失敗）に陥ることがたまにある。
    * 筆者は安価なブレッドボードを多用しているせいかも。
    * 電池やモーターを（変なやり方で）繋いじゃったりするからかも。
* リセットで駄目な時は電源切ってしばらく（数分）放置してみる。これ重要。
* 少々乱暴ですがGNDに繋いだ線をGPIOすべて順繰りに触らせる（ただし電源の端子には触れない）
* ENポートのコンデンサはつけといたほうがよい。

* 接続エラーでコンパイルも通らなくなったことがありました。
    * ESP32側がおかしくなっていたような印象。ENボタンを押しても再起動しなかった（気がする）。
    * IDEを再起動やUSBの挿し直しでは変化なし。PCの再起動は試していない。
    * ネット情報ではArduinoIDEのバージョン依存のバグ的な意見がある
    * 一旦PlatformIOでコンパイルアップロードを実施た後ArduinoIDEに戻ったところ、正常にもどりました。
    * どうやらArduinoIDEがESP32になにかを仕込んでしまってそれが原因で接続エラーを起こす。のかなあ。
    * 関係あるかわからないがデバマネ上の名称が「USB-Enhanced-SERIAL CH9102」で、いつのまにか変わったような（？）

* PlatformIOで駄目でArduinoIDEは正常というケースもありました。
    * ArduinoIDEを落とさないとPlatformIOのUploadできないときがある。
* GPIO 0,2,5,12はbootに干渉するポート。とはいえ他のポートの接触不良（？）が原因で起動失敗することもあったので気にする必要はないのか。

### スケッチのUploadで成功したり失敗したりと不安定な時に疑うこと
・電流過大
・グランドされてないピン
・Upload時に繋いであるとまずいピン（ブートやSPI関連）
* GPIO0、2　あたりBootに影響する。Upload時には繋いであるとまずい。
#### Portおよびデバマネに表示されないときの対処：
・ENピンを3.3Vにつないどく。Bootボタンを長く押す。ENボタンを押す。→何度か繰り返すとPort番号出現。
・デバマネ上のポート（COMとLPT）の項目の下に「Silicon Labs CP210x USB to UART Bridge (COM5)」みたいに出る。
（警告マークついてるときはやり直す）
・ENピンを開放　→　デバマネとPort一覧は変化しない
・ArduinoIDEでなにかのスケッチをUpload　→　成功すれば次からはEN操作不要の状態に戻る。はず。


## バリエーションについて

### ESP32 本体

（筆者にとって）よく見るのは　ESP32無印とESP32-S3
* **無印**
    * アリエクで500円くらいで買える。
    * USB機能はない。USB機器を構成するにはシールドが必要。

* S2
    * 無印のLX6より後発のLX7コアだがシングルコア。
    * USB-OTGがある。
    * Bluetoothが無い。
    * 有線LAN廃止
* **S3**
    * LX7の2コア
    * USB-OTG/JTAG（USB端子が2つ載ってるボードが標準的）
    * 有線LANなし、アナログ出力（DAC）が廃止
    * ~~技適取得がまだ。~~
    * 標準でPSRAM搭載(?)
    * 「N16R8」といった接尾辞が付いている。「フラッシュメモリが16MB、PSRAMが8MB」といった意味らしい。

* **WROOM-32**
    * -32D -32E っていう末尾の文字はバージョンらしくEが最新でバグが解消されており、32無印と32Dはすでに非推奨とのこと。
    * -32U はアンテナ外付け版
* WROOM-03
    * WROOM32のベータ版とのこと。


### ボード

* WROVER
    * 8MBのPSRAMが増設されている。
* 各種カメラ付きボード
    * カメラ付きの製品にはWROVER同様にPSRAM増設製品の場合がある。
* ESP32S
    * シングルコアのESP32らしい。
* **NodeMCU-32S(ESP32-NodeMCU)**
    * シルク無しでピン列間隔とボード横幅が（ブレッドボード1列分）細い
    * プログラマブル、つまりLチカに使える、オンボードLED搭載。
    * NodeMCUとはファームウェアの名前だとか、使用方法には大差ない模様。
* **DevKitC**
    * WROOM-32を乗せたボード
    * 秋月が取り扱って日本で最もメジャーらしい

## 電池駆動（10MHz稼働）
試したesp32は正規品ではないかも。
### 消費電流（テスターで測った。大雑把ですよ。）
10MHz　：　起動時38mA弱、loop関数中は20mA
※小さなOLEDやLEDアレイ、I2Cの磁気センサ（AS5600）を使用。
※WiFiやBLEは動いてないはず。

### CR2032
* CR2032は定格3Vのコイン電池です。容量は225mAhとかその程度。
* この電池の大抵の製品で、使用開始直後の無負荷電圧が3.Vをはるかに上回るので、esp32の3.3Vに接続して起動できる。
* 電圧が3V以下に落ちた後は、2個を直列にして5V端子に入れて起動する。※ただし他の5V機器にダメージがありうる。
* 起動はするのだけど数十秒から数分で落ちます。
* 上述の消費電流20mAは、コイン電池には強すぎるようです。2直で3.V強（定格の1/2）までじわじわと電圧が落ちていってしまう。
* コイン電池でのESP32の稼働は、スリープモードを駆使しない限りは無理でしょう。


## USB<->シリアル
* CP210(*)、CH9102(*)、CH340(*)　とバリエがある。通信速度がそれぞれ12、4、2MHｚらしい。
* 筆者の手元にある製品はCH9102X
* Upload speed
    * ArduinoIDEは最高921600
    * Upload speed　の追記先の例↓
C:\Users\username\AppData\Local\Arduino15\packages\esp32\hardware\esp32\2.0.14\boards.txt

## Bluetooth/BLE
2023年4月現在、BLEは問題が生じてる？。~~Advertizingできるけど接続失敗する。使い物にならない状況。~~
・ 標準BLEが動かない時は　NimBLE by h2zero を使うとよい。

3sp32S3はBT5.0のみ対応で
BT-Serial(SPP)は非対応だそうです。
https://github.com/espressif/arduino-esp32/issues/6882


## 関連記事
マルチスレッドとSPI　：　https://qiita.com/emuai/items/01ee1770a59b864d3a08

## ありがたいWebサイト

### バリエーションの説明
####
https://lang-ship.com/blog/work/esp32-2022-01/

#### フォント生成
* GFX(for TFT panel) : https://rop.nl/truetype2gfx/