ESP32でつまずいたこと

#Micro Python
###Connecting.....からのfaital error

https://wak-tech.com/archives/1008

を参考に導入をしました。

```
Connecting....._____....
faital error
```
が発生してはじめ困りました。（書いてるときは解決して再現できない・・・）

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/01cb0238-39e0-9d1c-de46-2a0b06a94fa0.png)

のbootボタンを押したところ解決しました。

###VScode環境の構築

https://qiita.com/kotaproj/items/b53006aef9d04053a5ee

を参考にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/dd257c0a-4365-df93-b390-dc68c090c25e.png)
のエラーが出ます。
未解決

#Arduino環境-VScode
https://www.media.lab.uec.ac.jp/?page_id=1414

で解決、Platform IOを使用
以前、Nucleoを使用していたため、その設定解除が必要だった
マジでずっと、Nucleoのファイルしかをビルドしてくれなくてきつかった。
どこにビルドの対象を変える方法があるか探すのきつかった。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/5e085a31-903a-8986-6acf-e9f38c9e9cb5.png)
左下のフォルダマークをクリック
![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/1b4683cc-9957-3869-079b-a41efc3f640d.png)

上にメニューが出るので選択

これでOKです。

はぁ疲れた。

でも便利・・・

#IDF

https://www.mgo-tec.com/esp32-idf-howto-01

を参考にしたら、すんなりビルド・書き込みができました。
問題は、ビルドに時間がかかることですね。

#OTA(Over the air)
###ネットワークポートがない
PC自体の再起動が必要
Arduino開発環境の再起動では表示されず
悩んで次の日、開いたらあった

###No response from device
書き込もうとすると出るエラー

ネットでも、Q&Aがいくつか見られるが、解決法が見つからず・・・

https://randomnerdtutorials.com/esp32-over-the-air-ota-programming/

の通りやると、Webブラウザ経由でプログラムのアップロードはできました。
![est.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/f93e95c4-13ba-25cb-cc52-6e26dbd6c2f1.png)

モバイルホットスポットを有効にすれば、wifiを5GHzで接続しながら、esp32とは2.4GHzで接続できます。

![est2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/4db3a402-ef7b-0454-5431-4198955f5617.png)

コンパネから、ネットワークのファイアウォールを変更したところ解決しました！

Arduino otaの項目か、python.exeの項目か、java.exeの項目かは不明

変更するときは、書いてあるが、「設定の変更」をクリックしてからでないと変更できない。

疲れた

###Listen failed
原因不明。再度書き込もうとすると発生せず、Upload完了


#「WiFi.h」に対して複数のライブラリが見つかりました

```
Arduino：1.8.13 (Windows 10), ボード："ESP32 Dev Module, Disabled, Default 4MB with ffat (1.2MB APP/1.5MB FATFS), 240MHz (WiFi/BT), QIO, 80MHz, 4MB (32Mb), 921600, Core 1, Core 1, Error"

c:/program files (x86)/arduino/hardware/espressif/esp32/tools/xtensa-esp32-elf/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: C:\Users\ISHIHA~1\AppData\Local\Temp\arduino_cache_965207\core\core_72edcc83e01c4caa677ae51fb80f40c1.a(HardwareSerial.cpp.o):C:\Program Files (x86)\Arduino\hardware\espressif\esp32\cores\esp32/HardwareSerial.cpp:85: multiple definition of `Serial1'; sketch\ota_serial.ino.cpp.o:C:\Users\IshiharaHiroki\Documents\Arduino\miniProject\2021_11\ota_serial/ota_serial.ino:6: first defined here

collect2.exe: error: ld returned 1 exit status

「WiFi.h」に対して複数のライブラリが見つかりました

使用済：C:\Program Files (x86)\Arduino\hardware\espressif\esp32\libraries\WiFi

未使用：C:\Program Files (x86)\Arduino\libraries\WiFi
```
このエラーは、エラー文章が原因ではありません。
エラーの上にある長い文章、の方が原因です。

https://raspberrypi.mongonta.com/m5stack-beginner-tips/

この筆者さんありがとう。はまらずに済んだよ

ちなみに原因は、Serial1を追加するために宣言した

```
HardwareSerial Serial1(2);
```
が必要なかった感じです。

```
Serial1.begin(115200,SERIAL_8N1,RX,TX);
```

https://qiita.com/suruseas/items/14ae3c7514775f0b1fc4

より、ちょっといつもと違った宣言がいります。

#PacketSerial
複数バイトのマイコン同士の通信をする際に非常に便利なライブラリ（初めて使う）

あほみたいに沼にはまったので、一応記述

###Serialポート接続

```C:setup
Serial3.begin(115200);
myPacket.setStream(&Serial3);
```
これで、Serial3のポートを使って、通信することを宣言します。


```
myPacketSerial.begin(115200);
```

サンプルプログラム「PacketSerialReverseEcho」としてある、これ単体では動かないと思われます。
私はここに1時間使いました（泣）Serial.beginして、setStreamで接続すると考えてください

実際、中身の"PacketSerial.h"を見ても

```C:PacketSerial.h
 ///
    /// This `Stream` could be a standard `Serial` `Stream` with a non-default
    /// configuration such as:
    ///
    ///     PacketSerial myPacketSerial;
    ///
    ///     void setup()
    ///     {
    ///         Serial.begin(300, SERIAL_7N1);
    ///         myPacketSerial.setStream(&Serial);
    ///     }
    ///
    /// Or it might be a `SoftwareSerial` `Stream` such as:
    ///
    ///     PacketSerial myPacketSerial;
    ///     SoftwareSerial mySoftwareSerial(10, 11);
    ///
    ///     void setup()
    ///     {
    ///         mySoftwareSerial.begin(38400);
    ///         myPacketSerial.setStream(&mySoftwareSerial);
    ///     }
    ///

```

Serialに関しては上記の方法を使えと言っています。

###データ送信

```C
uint8_t myPacket_data[2] = {255,10};
myPacket.send(myPacket_data,2);
```
で送れます。数値は送りたいデータ、データサイズに変更してください。

###データ受信完了時呼び出し関数設定

```
myPacket.setPacketHandler(&onPacketReceived);
```

これで、onPacketReceivedが受信完了時呼び出されます。

###呼び出し関数設定

```C
void onPacketReceived(const uint8_t* buffer,size_t size){
serial_update_flag = true;
for(int i=0;i< size; i++){
  tempBuffer[i] = buffer[i];
}
```
bufferに読んだデータが、size_tにsize量が入っています。
仕組みとしては、update()によって呼び出されたとき、

```
 _onPacketFunction(_decodeBuffer, numDecoded);
```
が呼び出されて_decodeBufferが渡されるという原理です。


###監視

```C
myPacket.update();
```
ループ内に、これを入れて頻繁に実行しろと書いてありますが、何をしているかというと
よくある「Serial.available()」の状態監視です。

データが送られていれば、そのデータが、送信完了情報か確認します
->そうならば、setPacketHandlerで設定した関数が呼び出されます
->違うなら、読み出し、配列に保存します。

非常に単純でしょう。

Serial自体のデータバッファは64byteまでらしいので、updateを忘れていると上書きされるので注意してください。
2パケット分たまっていた場合、二回、onPacketFunctionが呼び出されることになります。available()はwhileTrueでbreakがないのでたぶんそうです。
 

#サンプルプログラム
esp32を2つ使用して実験しています。
RX2->TX2
TX2->RX2
GND->GND
に接続し、以下を書き込み動作を確認しました。

###送信側

```C
#include <PacketSerial.h>

PacketSerial myPacket;
PacketSerial myPacket2;
volatile uint8_t tempBuffer[10];
volatile boolean serial_update_flag = false;
volatile uint8_t tempBuffer2[10];
volatile boolean serial_update_flag2 = false;

void onPacketReceived(const uint8_t* buffer,size_t size){
  serial_update_flag = true;
  for(int i=0;i< size; i++){
    tempBuffer[i] = buffer[i];
  }
}

void setup() {
  //myPacket.begin(115200);
  Serial2.begin(115200);
  myPacket.setStream(&Serial2);
  myPacket.setPacketHandler(&onPacketReceived);
  
}

void loop() {
  float a = 0.1;

  uint8_t myPacket_data[2] = {255,10};
  myPacket.send(myPacket_data,2);
  
  if(serial_update_flag == true){
    serial_update_flag = false;
    Serial.println("-------- ");
    for(int i = 0;i<10;i++){
      Serial.println(tempBuffer[i]);
      
      
    }
  }
  delay(200);
}
```

###受信側

```C
#include <PacketSerial.h>

PacketSerial myPacket;
volatile uint8_t tempBuffer[10];
volatile boolean serial_update_flag = false;

void onPacketReceived(const uint8_t* buffer,size_t size){
  serial_update_flag = true;
  for(int i=0;i< size; i++){
    tempBuffer[i] = buffer[i];
  }
}
void setup() {
  Serial3.begin(115200);
  myPacket.setStream(&Serial3);
  myPacket.setPacketHandler(&onPacketReceived);
}

void loop() {
  float a = 0.1;

  uint8_t myPacket_data[2] = {255,10};
  myPacket.send(myPacket_data,2);
  
  if(serial_update_flag == true){
    serial_update_flag = false;
    Serial.println("-------- ");
    for(int i = 0;i<10;i++){
      Serial.println(tempBuffer[i]);
      
      
    }
  }
  delay(200);
}
```