はじめてESP32でLチカするまでに苦労したこと

#目的
　趣味の工作でArduinoだけではスペックが足りなくなったため、ESP32を導入することとした。価格が安いのでKKHMFのESP32を使うことにしたのだが、これがちょっとクセ者。ArduinoIDEで書いたLED点灯（通称Lチカ）スクリプトをアップロードするまでバグ回避みたいな事をしたのでここに纏める。同様の記事がすでにあると思うが、ESP32はバリエーション（意味深）が豊富らしい。

#準備
###購入品
・[KKHMF ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetooth デュアルコアCPU低消費電力]
(http://amzn.asia/d/bGzbbcI)
　特徴：安い。上から見たときにPIN番号のシルク印刷が読める。PIN幅が広いため通常のブレッドボード１枚では片側しかテストできない。![image.png](https://qiita-image-store.s3.amazonaws.com/0/175472/964634e0-481c-31e6-44f3-49ae03f2b9ac.png)

・[サンハヤト SAD-101 ニューブレッドボード]
(http://amzn.asia/d/1s6Eq2N)
　特徴：上記のような開発ボードにも対応した、1列広く使えるブレッドボード。
※【注意】ここでは紹介しないがNodeMCU-32SになるとPIN番号が裏側になり確認が難しくなる。そのかわり、幅が1PIN分狭くなり通常のブレッドボードに刺して両側が使える。

#ArduinoへのESP32初期設定
>1.Arduino IDEを起動
2.[環境設定]-[設定]タブ-[追加のボードマネージャのURL]に以下を入力
　　https://dl.espressif.com/dl/package_esp32_index.json
3.[OK]で閉じる
4.[ツール]-[ボード]-[ボードマネージャ]で"ESP32"を検索し[インストール]
5.[ツール]-[ボード]-[ESP32 Dev Module]を選択
6.[ツール]-[シリアルポート]を選択

###Lチカスクリプト
```
void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  digitalWrite(2, HIGH);
  delay(250);
  digitalWrite(2, LOW);
  delay(250);
}
```
※基板上のLEDは２つあるが、今回はpin4を対象とした。
　下記シートを見るとわかるが、pin4をコード上で指定する際はGPIO2（ジーピーアイオーツー）なので "2" となる。
![ESP32.jpg](https://qiita-image-store.s3.amazonaws.com/0/175472/a9a7b613-d9e6-cfc4-2db2-9f0a4223d6d6.jpeg)




#ESP32へのスクリプトアップロードの注意点！
###これが本題。
USBで接続した中華ESP32は、モノによってスクリプトアップロードに失敗する（！）ものがある。通常のアップロードに失敗したESP32は、以下のタイミングでESP32のBOOTボタンを押下する対応をすることで解決するかもしれない。

> 1.ArduinoIDEで[マイコンボードへ書き込む]をして、ボードへの書き込みを開始した際、「最大～バイトのフラッシュメモリのうち、スケッチが～バイト（xx%）を使っています。最大～バイトのRAMのうち、グローバル変数が～バイト（xx%）を使っていて、ローカル変数で～バイト使うことができます。」のような白文字表示が出たら、本体のBOOTと書いてあるボタンを押し続ける。
2.Connecting...の表示から切り替わって色々書き込まれ始めたらBOOTボタンを押すのをやめる。
これで書き込みが成功するはず。


##ESP32info
購入したESP32の内部機能などがどのバージョンか確認するスクリプトがある。（どこから引っ張ってきたか失念した…）
>1.スクリプトアップロードして、シリアルモニタを開く
2.115200 bpsに設定し、
3.本体のENボタンを押すとシリアルモニタでデータが表示される
4.その中の上から14行目くらいにChip Revision 1とあれば良い。
　（2018/09現在、ここがゼロとイチのリビジョンがあり、日本にはまだリビジョン２は入ってきていないらしい。リビジョンゼロの場合、GPIOにノイズが乗るバグがあるそうだ。他にも何か色々あるらしいので、悲しくもチップリビジョンゼロだった人は気を付けて。）
###ソース
```ESP32info.ino
void setup(void) {
  Serial.begin(115200);
  Serial.println("-----------------------------");
  uint64_t chipid;
  chipid=ESP.getEfuseMac();//The chip ID is essentially its MAC address(length: 6 bytes).
  Serial.printf("ESP32 Chip ID = %04X\r\n",(uint16_t)(chipid>>32));//print High 2 bytes
  Serial.printf("Chip Revision %d\r\n", ESP.getChipRevision());
  esp_chip_info_t chip_info;
  esp_chip_info(&chip_info);
  Serial.printf("Number of Core: %d\r\n", chip_info.cores);
  Serial.printf("CPU Frequency: %d MHz\r\n", ESP.getCpuFreqMHz());  
  Serial.printf("Flash Chip Size = %d byte\r\n", ESP.getFlashChipSize());
  Serial.printf("Flash Frequency = %d Hz\r\n", ESP.getFlashChipSpeed());
  Serial.printf("ESP-IDF version = %s\r\n", esp_get_idf_version());
  Serial.printf("Free Heap Size = %d\r\n", esp_get_free_heap_size());
  Serial.printf("System Free Heap Size = %d\r\n", system_get_free_heap_size());
  Serial.printf("Minimum Free Heap Size = %d\r\n", esp_get_minimum_free_heap_size());
  Serial.println();
  uint8_t mac0[6];
  esp_efuse_mac_get_default(mac0);
  Serial.printf("Default Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac0[0], mac0[1], mac0[2], mac0[3], mac0[4], mac0[5]);
  uint8_t mac1[6];
  esp_efuse_read_mac(mac1);
  Serial.printf("EFuse Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac1[0], mac1[1], mac1[2], mac1[3], mac1[4], mac1[5]);
  uint8_t mac2[6];
  system_efuse_read_mac(mac2);
  Serial.printf("System Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac2[0], mac2[1], mac2[2], mac2[3], mac2[4], mac2[5]);
  uint8_t mac3[6];
  esp_read_mac(mac3, ESP_MAC_WIFI_STA);
  Serial.printf("[Wi-Fi Station] Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac3[0], mac3[1], mac3[2], mac3[3], mac3[4], mac3[5]);
  uint8_t mac4[7];
  esp_read_mac(mac4, ESP_MAC_WIFI_SOFTAP);
  Serial.printf("[Wi-Fi SoftAP] Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac4[0], mac4[1], mac4[2], mac4[3], mac4[4], mac4[5]);
  uint8_t mac5[6];
  esp_read_mac(mac5, ESP_MAC_BT);
  Serial.printf("[Bluetooth] Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac5[0], mac5[1], mac5[2], mac5[3], mac5[4], mac5[5]);
  uint8_t mac6[6];
  esp_read_mac(mac6, ESP_MAC_ETH);
  Serial.printf("[Ethernet] Mac Address = %02X:%02X:%02X:%02X:%02X:%02X\r\n", mac6[0], mac6[1], mac6[2], mac6[3], mac6[4], mac6[5]);
}
void loop() {
}
```

###その他
たまたま発生した事象についても記載しておく。
コンパイル時、 "「WiFi.h」に対して複数のライブラリが見つかりました。" というエラーが出た。私の場合は使用しているFastLEDのバージョンが古いせいだった。（WiFi.h関係ない…）ArduinoIDE環境は一度インストールしたライブラリ等は自動アップデートしない。たまには使用しているライブラリの更新がないか確認してみるのも良いと思う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/175472/d7d531d4-55be-cec3-f5d5-aa260e997436.png)

感謝
これらの情報は殆どdrunkbearに聞いた内容を書き出したものである。私ではこれだけでも苦労したと思うので、教えてくれたことに感謝したい。