前提・実現したいこと
お世話になっております。
ESP初心者です。
ESP-WROOM-32のwifi通信機能を使って、
ESP2個で親機、子機で通信するラジコンを製作しようとしています。
その前段階として、親機に接続したスイッチを押すと、子機がLED点灯する
というプログラムを作成しています。
少し詳細ですが、
親機にタクトスイッチを複数個用意して、
ボタンに応じた指令を子機が受信し、スイッチに応じたLEDが点灯するというものです。
スイッチ14のいずれかと、スイッチ5が同時に押されたら、4用のLEDと、スイッチ5用のLEDが同時に点灯するように、
スイッチ1
配列を組んでいます。
発生している問題・エラーメッセージ
コンパイル、書き込みまではできるのですが
実際に親機、子機にUSBで接続して、起動しても
子機側は動きませんでした。
シリアルモニタで子機側を確認すると、
下記エラーメッセージが表示されます。
AP IP address: (ここにIPアドレスが表示されます) Starting UDP Local port: 10000 Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled. Core 1 register dump: PC : 0x40081031 PS : 0x00060a30 A0 : 0x800d0631 A1 : 0x3ffb1f40 A2 : 0x00000011 A3 : 0x00000002 A4 : 0x0000000a A5 : 0x3ffb1f88 A6 : 0x00000000 A7 : 0x00000004 A8 : 0x3f40069c A9 : 0x00000000 A10 : 0xffffffff A11 : 0x00000050 A12 : 0x08000000 A13 : 0x00000000 A14 : 0xffffffff A15 : 0x00000032 SAR : 0x0000001a EXCCAUSE: 0x0000001c EXCVADDR: 0xffffffff LBEG : 0x400014fd LEND : 0x4000150d LCOUNT : 0xffffffff ELF file SHA256: 0000000000000000 Backtrace: 0x40081031:0x3ffb1f40 0x400d062e:0x3ffb1f60 0x400d1ede:0x3ffb1fb0 0x400897fa:0x3ffb1fd0 Rebooting... ets Jun 8 2016 00:22:57 rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT) configsip: 0, SPIWP:0xee clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00 mode:DIO, clock div:1 load:0x3fff0018,len:4 load:0x3fff001c,len:1216 ho 0 tail 12 room 4 load:0x40078000,len:10944 load:0x40080400,len:6388 entry 0x400806b4
受信側
#include <WiFi.h> #include <WiFiUdp.h> int LED1 = 2; int LED2 = 4; int LED3 = 16; int LED4 = 17; int LED5 = 18; int RcvData=0; int Rcvstate=0; int RcvBuf[1];//配列数は送られてきたデータの数n カウント数はn-1 int RcvCount; int Cmotor;//Crowlerモータswitch条件分岐変数 int Bmotor;//Basterモータswitch条件分岐変数 const char ssid[] = "SSID"; // SSID const char pass[] = "password"; // password const int localPort = 10000; // ポート番号 const IPAddress ip(IPアドレス); // IPアドレス(ゲートウェイも兼ねる) const IPAddress subnet(255, 255, 255, 0); // サブネットマスク WiFiUDP udp;//WifiUDPをudpという変数に変換 void setup() { Serial.begin(115200); WiFi.softAP(ssid, pass); // SSIDとパスの設定 delay(100); // 追記:このdelayを入れないと失敗する場合がある WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定 Serial.print("AP IP address: "); IPAddress myIP = WiFi.softAPIP(); Serial.println(myIP); Serial.println("Starting UDP"); udp.begin(localPort); // UDP通信の開始(引数はポート番号) Serial.print("Local port: "); Serial.println(localPort); pinMode(2, OUTPUT); pinMode(4, OUTPUT); pinMode(6, OUTPUT); pinMode(17, OUTPUT); pinMode(18, OUTPUT); } void loop() { /*if (udp.parsePacket()) { char i = udp.read(); //ceramie追記 askiiから文字列へ ← もともとあったコード Serial.println(i); // UDP通信で来た値を表示 ←もともとあったコード }*/ while(udp.parsePacket()){ RcvData=udp.read(); //Serial.println(RcvData); //Serial.println(RcvState); switch(Rcvstate){ case 0: RcvBuf[RcvCount]=RcvData; RcvCount++; if(RcvCount >=2){ RcvCount=0; Rcvstate = 1; //Serial.print(" RcvData*"); //Serial.println(RcvData); } break; case 1: MotorCnt(); Rcvstate=0; break; } } delay(3000); } void MotorCnt(){ Cmotor = RcvBuf[0];//試験用としてLED1~4を点灯する Serial.print(Cmotor); switch(Cmotor){ // Perform an action depending on the command case 1://Move Forward digitalWrite(LED1,HIGH); delay(10); /* LED1を接続したpinの電圧をLOWにする */ digitalWrite(LED1,LOW); break; case 2://Move Forward digitalWrite(LED2,HIGH); delay(10); /* LED1を接続したpinの電圧をLOWにする */ digitalWrite(LED2,LOW); break; case 3://Move Forward digitalWrite(LED3,HIGH); delay(10); /* LED1を接続したpinの電圧をLOWにする */ digitalWrite(LED3,LOW); break; case 4://Move Forward digitalWrite(LED4,HIGH); delay(10); /* LED1を接続したpinの電圧をLOWにする */ digitalWrite(LED4,LOW); break; } Bmotor=RcvBuf[1];//Bastermotor制御 if(Bmotor=1){ digitalWrite(LED5,HIGH); delay(10); /* LED1を接続したpinの電圧をLOWにする */ digitalWrite(LED5,LOW); } }
送信側
#include <WiFi.h> #include <WiFiUdp.h> int S1 = 2; int S2 = 4; int S3 = 16; int S4 = 17; int S5 = 5; /*↑スイッチ1~5*/ int valMotor; int valBCanon; int i; int sendbuf[1]; const char ssid[] = "SSID"; // SSID const char pass[] = "password"; // password static WiFiUDP wifiUdp; static const char *kRemoteIpadr = "IPアドレス"; //送信先のIPアドレス static const int kRmoteUdpPort = 10000; //送信先のポート static void WiFi_setup() { static const int kLocalPort = 5000; //自身のポート WiFi.begin(ssid, pass); while( WiFi.status() != WL_CONNECTED) { delay(500); } wifiUdp.begin(kLocalPort); } static void Serial_setup() { Serial.begin(115200); Serial.println(""); // to separate line } void setup() { Serial_setup(); WiFi_setup(); /* S1は入力であることを示す */ pinMode(S1,INPUT); /* S2は入力であることを示す */ pinMode(S2,INPUT); /* S3は入力であることを示す */ pinMode(S3,INPUT); /* S4は入力であることを示す */ pinMode(S4,INPUT); /* S5は入力であることを示す */ pinMode(S5,INPUT); } void loop() { wifiUdp.beginPacket(kRemoteIpadr, kRmoteUdpPort); void bring(); wifiUdp.endPacket(); } void bring(){ /* S1の状態を読み、HIGHだったら(押されていたら) {}内を実行 */ if(digitalRead(S1) == HIGH){ valMotor=1; } else if(digitalRead(S2) == HIGH){ valMotor=2; } else if(digitalRead(S3) == HIGH){ valMotor=3; } else if(digitalRead(S4) == HIGH){ valMotor=4; } else{ valMotor=0; } if(S5==HIGH){ valBCanon=1; } else{ valBCanon=0; } sendbuf[0]=valMotor; sendbuf[1]=valBCanon; for(i=0;i<2;i++){ wifiUdp.write(sendbuf[i]); } }
試したこと
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.
がエラーメッセージ文なので調べてみました。
どうも、メモリ関係に関するエラーみたいで、再起動がかかってしまっているようです。
下記文献で、対策が書いていたので、同様の方法をとったのですが、
エラーメッセージは変わらず表示され、解決できず、大変困っております。
https://www.1ft-seabass.jp/memo/2017/07/31/esp32-developer-aws-iot-tips/
補足情報(FW/ツールのバージョンなど)
Arduino 1.8.16
ESPは下記両方のバージョンを試しました。
https://github.com/espressif/arduino-esp32
https://dl.espressif.com/dl/package_esp32_index.json
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/26 06:41
2023/06/29 03:14 編集