1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ESP32でつまずいたこと

Last updated at Posted at 2021-09-23

Micro Python

Connecting.....からのfaital error

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

Connecting....._____....
faital error

が発生してはじめ困りました。(書いてるときは解決して再現できない・・・)

5.png

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

VScode環境の構築

を参考にしました。
image.png
のエラーが出ます。
未解決

Arduino環境-VScode

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

6.png
左下のフォルダマークをクリック
7.png

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

これでOKです。

はぁ疲れた。

でも便利・・・

IDF

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

OTA(Over the air)

ネットワークポートがない

PC自体の再起動が必要
Arduino開発環境の再起動では表示されず
悩んで次の日、開いたらあった

No response from device

書き込もうとすると出るエラー

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

の通りやると、Webブラウザ経由でプログラムのアップロードはできました。
est.png

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

est2.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

このエラーは、エラー文章が原因ではありません。
エラーの上にある長い文章、の方が原因です。

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

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

HardwareSerial Serial1(2);

が必要なかった感じです。

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

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

PacketSerial

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

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

Serialポート接続

setup
Serial3.begin(115200);
myPacket.setStream(&Serial3);

これで、Serial3のポートを使って、通信することを宣言します。

myPacketSerial.begin(115200);

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

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

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に関しては上記の方法を使えと言っています。

データ送信

uint8_t myPacket_data[2] = {255,10};
myPacket.send(myPacket_data,2);

で送れます。数値は送りたいデータ、データサイズに変更してください。

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

myPacket.setPacketHandler(&onPacketReceived);

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

呼び出し関数設定

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が渡されるという原理です。

監視

myPacket.update();

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

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

非常に単純でしょう。

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

サンプルプログラム

esp32を2つ使用して実験しています。
RX2->TX2
TX2->RX2
GND->GND
に接続し、以下を書き込み動作を確認しました。

送信側

# 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);
}

受信側

# 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);
}
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?