ESP8266 con due VL53L1X

Salve ragazzi!
Ho collegato ad una ESP8266 due sensori TOF VL53L1X.
Uno dei due ha il XSHUT quindi li ho collegati in modo che avessero indirizzi I2C differenti (0x29 e 0x30 nello specifico).

In realtà collegato c'è anche un buzzer.
Sono collegati tramite questi pin:

BUZZER
GND --> G
I/O --> D7 (13)
VCC --> 3V

VL53L1X v2
VIN --> 3V
GND --> G
SCL --> D1 (5)
SCA --> D2 (4)
GPI01 --> //
XSHUT --> D4 (2)

VL53L1X
3-6v --> 3V
SDA --> D2 (4)
SCL --> D1 (5)
INT --> //
GND --> G

Se uso un solo sensore alla volta funziona, altrimenti si riavvia in continuazione.

L'errore è questo:

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

>>>stack>>>

ctx: cont
sp: 3ffffce0 end: 3fffffd0 offset: 01a0
3ffffe80:  00000001 3ffee62d 3ffee794 00000002  
3ffffe90:  3ffee794 00000001 3ffee794 40203199  
3ffffea0:  3ffee794 00000003 00000040 40203257  
3ffffeb0:  3ffee794 3ffee5a0 00000004 40203406  
3ffffec0:  00000000 00000029 00000000 3ffee6cc  
3ffffed0:  0000001a 4023c0a8 00000000 00000000  
3ffffee0:  0000004b 3fffff50 3ffee598 40201ddc  
3ffffef0:  0000004b 3fffff50 3ffee564 402016df  
3fffff00:  00004b00 00000030 3fffff41 3ffee580  
3fffff10:  00000029 00000001 3fffff40 00000087  
3fffff20:  3fffff71 3ffee548 3ffee598 3ffee580  
3fffff30:  3ffee564 00000014 3fffff70 402017c0  
3fffff40:  00008700 00000122 10624dd2 40201905  
3fffff50:  3ffee580 00000000 3ffee548 40203ff8  
3fffff60:  3ffe882d fffffffc 3ffee564 40201940  
3fffff70:  40201ef0 3ffe882b 3ffee6cc 3ffee580  
3fffff80:  3ffee564 3ffee548 3ffee564 4020156c  
3fffff90:  3ffee564 3ffee548 3ffee6cc 402011a2  
3fffffa0:  feefeffe feefeffe feefeffe 3ffee74c  
3fffffb0:  3fffdad0 00000000 3ffee720 402029d4  
3fffffc0:  feefeffe feefeffe 3fffdab0 4010149d  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3424, room 16 
tail 0
chksum 0x2e
load 0x3fff20b8, len 40, room 8 
tail 0
chksum 0x2b
csum 0x2b
v00044120
~ld
Sensore 1 OK!
Sensore 2 OK!
Sensore 1: Ranging started
Sensore 2: Ranging started

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

il codice lo potete vedere qui: esp8266 2 - Pastebin.com

Secondo voi cosa lo fa riavviare?
Ho controllato ed effettivamente i due sensori hanno indirizzi I2C diversi ed in effetti, come da stampa in console, li trova.
Non capisco dove sbaglio!
Qualcuno può aiutarmi?

Installati nell'IDE il "Arduino ESP8266/ESP32 Exception Stack Trace Decoder" che trovi QUI e, seguendo le istruzioni, decodifica il crash.

Guglielmo

Comunque vedo un "Soft WDT reset" ... c'è probabilmente qualche cosa che blocca il singolo "core" di cui è dotato il ESP8266 per un tempo troppo lungo e quindi, non riuscendo a far girare altri task che sarebbero prioritari, scatta il WatchDog.

E' un problema che affligge essenzialmente gli ESP8266 quando si fanno operazioni lunghe e che non ritornano il controllo entro un determinato periodo; il ESP32, che è un dual "core" e che dedica uno dei due "core" ai processi di sistema è, nella maggior parte dei casi, esente dal problema.

Onestamente, al costo che hanno oggi gli ESP32, non si capisce perché continuare ad usare i vecchi ESP8266 ... :roll_eyes:

Guglielmo

Purtroppo su questo pc ho Arduino IDE 2.0.4 e i plugin non funzionano ancora. (Non ho avuto tempo di rimettere il vecchio IDE. Dopo che avevo formattato ho messo l'ultimo IDE purtroppo)

Di ESP ne ho varie, sia 8266 che 32.
In qualche modo queste esp8266 che ho (ne avrò almeno 5 o 6) le volevo usare. Siccome ne avevo già una con un VL53L1X montato, ho usato la stessa aggiungendo il secondo.

Ho spostato tutto sulla ESP32.
Adesso i collegamenti sono questi:

BUZZER --> ESP8266   -->  ESP32
GND    --> G         --> G
I/O    --> D7 (13)   --> 16
VCC    --> 3V        --> 3V

VL53L1X v2  --> ESP8266   -->  ESP32
VIN         --> 3V        --> 3V
GND         --> G         --> G
SCL         --> D1 (5)    --> 22
SDA         --> D2 (4)    --> 21
GPI01       --> //        --> //
XSHUT       --> D4 (2)    --> 17

VL53L1X     --> ESP8266   -->  ESP32
3-6v        --> 3V        --> 3V
SDA         --> D2 (4)    --> 21
SCL         --> D1 (5)    --> 22
INT         --> //        --> //
GND         --> G         --> G

considerando che la scheda è questa:
ESP32 pin devkit

Solo che adesso ho un errore come se stessi sbagliando i pin:

I2C device found at address 0x29 !
I2C device found at address 0x30 !
Scanning finished

E (64) gpio: gpio_set_level(226): GPIO output gpio_num error
E (74) gpio: gpio_set_level(226): GPIO output gpio_num error
Sensore 1 OK!
E (237) gpio: gpio_set_level(226): GPIO output gpio_num error
E (247) gpio: gpio_set_level(226): GPIO output gpio_num error
Sensore 2 OK!
Sensore 1: Ranging started
Sensore 2: Ranging started
E (885) ledc: ledc_get_duty(739): LEDC is not initialized

Metti il codice (mi raccomando marcato con il tag <code/>) che vediamo ... :roll_eyes:

Guglielmo

L'ho messo già nel post principale con Pastebin perchè era lungo:
esp8266 2 - Pastebin.com

Sono passati mesi dall'ultima volta che sono riuscita a trovare un po' di tempo libero per dedicarmi a queste cose. Spero di poter riprendere questo weekend.
Ma ero rimasta ferma a questo punto.
Non ci sono risposte, quindi suppongo nessuno sappia aiutarmi, ma lo riporto un attimo su perchè magari nel frattempo qualcuno ha provato qualcosa di simile, ma si era perso questo post.
Grazie

Il codice, come ti è stato detto, va messo qui, non altrove (pochi hanno voglia di aprire siti esterni ed inoltre li oggi il codice c'è domani magari non c'è più) e va racchiuso negli appositi tag CODE (selezioni il codice e premi l'icona <code/> nella barra degli strumenti per contrassegnarla come tale).

Grazie.

Guglielmo

Era un clic. Io l'ho fatto per non mettere questo codice lunghissimo qui

/******************************************************************************
BUZZER
GND    --> G
I/O    --> D7 (13)
VCC    --> 3V

VL53L1X v2
VIN   --> 3V
GND    --> G
SCL    --> D1 (5)
SCA    --> D2 (4)
GPI01  --> //
XSHUT  --> D4 (2)

VL53L1X
3-6v   --> 3V
SDA    --> D2 (4)
SCL    --> D1 (5)
INT    --> //
GND    --> G

******************************************************************************/

#include "Adafruit_VL53L1X.h"
#include <Wire.h>
#define Sensor1_XSHUT_pin D4
//#define IRQ_PIN 2
#define BUZZER D7
#define FREQ 800
#define DURATION 300

Adafruit_VL53L1X sensor1;// = Adafruit_VL53L1X(Sensor1_XSHUT_pin, IRQ_PIN);
Adafruit_VL53L1X sensor2;

void setup() {
  Serial.begin(115200);

/*
  Wire.begin();
  while (!Serial) delay(10);
  Serial.println("Scanning for I2C devices...");
  byte error, address;
  int devices = 0;
  for (address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) Serial.print("0");
      Serial.print(address, HEX);
      Serial.println(" !");
      devices++;
    }
    else if (error == 4) {
      Serial.print("Unknow error at address 0x");
      if (address < 16) Serial.print("0");
      Serial.println(address, HEX);
    }    
  }
  if (devices == 0) Serial.println("No I2C devices found\n");
  else Serial.println("Scanning finished\n");
  */

  pinMode(Sensor1_XSHUT_pin, OUTPUT);
  digitalWrite(Sensor1_XSHUT_pin, LOW);
  delay(10);
  digitalWrite(Sensor1_XSHUT_pin, HIGH);
  
  // imposta la modalità di misurazione per il primo sensore
  //sensor1.VL53L1X_SetDistanceMode(33000);
  
  // imposta la modalità di misurazione per il secondo sensore
  //sensor2.VL53L1X_SetDistanceMode(20000);


  while (!Serial) delay(10);

  Wire.begin();

  if (!sensor1.begin(0x29, &Wire)) {
    Serial.print(F("Error on init of VL sensor: "));
    Serial.println(sensor1.vl_status);
    while (1)       delay(10);
  }
  Serial.println(F("Sensore 1 OK!"));

  if (!sensor2.begin(0x30, &Wire)) {
    Serial.print(F("Error on init of VL sensor: "));
    Serial.println(sensor2.vl_status);
    while (1)       delay(10);
  }
  Serial.println(F("Sensore 2 OK!"));

  if (!sensor1.startRanging()) {
    Serial.print(F("Couldn't start ranging: "));
    Serial.println(sensor1.vl_status);
    while (1)       delay(10);
  }
  Serial.println(F("Sensore 1: Ranging started"));

  if (!sensor2.startRanging()) {
    Serial.print(F("Couldn't start ranging: "));
    Serial.println(sensor2.vl_status);
    while (1)       delay(10);
  }
  Serial.println(F("Sensore 2: Ranging started"));



  // Valid timing budgets: 15, 20, 33, 50, 100, 200 and 500ms!
  sensor1.setTimingBudget(20);
  sensor2.setTimingBudget(20);
 
  /*
  vl.VL53L1X_SetDistanceThreshold(100, 300, 3, 1);
  vl.VL53L1X_SetInterruptPolarity(0);
  */
 
}

  void buzz(int targetPin, long frequency, long length) {
    long delayValue = 1000000/frequency/2;
    long numCycles = frequency * length/ 1000;
    for (long i=0; i < numCycles; i++){
        digitalWrite(targetPin,HIGH);
        delayMicroseconds(delayValue);
        digitalWrite(targetPin,LOW);
        delayMicroseconds(delayValue);
    }
  }

void loop() {
  uint16_t distance1 = sensor1.distance();
  uint16_t distance2 = sensor2.distance();

  if (sensor1.dataReady()) {
    // new measurement for the taking!
    distance1 = sensor1.distance();
    if (distance1 == -1) {
      // something went wrong!
      Serial.print(F("Couldn't get distance1: "));
      Serial.println(sensor1.vl_status);
      return;
    }
    Serial.print(F("distance1: "));
    Serial.print(distance1);
    Serial.println(" mm");

    //buzz(BUZZER, FREQ, 10);
    //tone(BUZZER, FREQ, DURATION);
    tone(BUZZER, distance1);

    // data is read out, time for another reading!
    sensor1.clearInterrupt();
  }
  
  //Serial.print("Distance Sensor1: ");
  //Serial.print(distance1);
  //Serial.println(" mm");
  //Serial.print(" - Distance Sensor2: ");
  //Serial.print(distance2);
  //Serial.println("mm");

}

... e dove da l'errore? Copia quanto riporta il compilatore quando compili il codice o spiega bene che errore incontri.

Guglielmo

P.S.:

... emmm ... un codice comincia ad essere lunghissimo quando supera alcune centiaia di righe :grin:

credimi, lo so.
Ma per metterlo in un post su un forum per me è già lungo quello.
Poi non sapevo mettesse la scrollbar.

Io ci rimetterò mano nel weekend, ma l'errore lo avevo già riportato.

Da quando l'ho messo su ESP32 (invece che 8266), come detto nel post #5, mi da un errore come se stessi sbagliando i pin:

I2C device found at address 0x29 !
I2C device found at address 0x30 !
Scanning finished

E (64) gpio: gpio_set_level(226): GPIO output gpio_num error
E (74) gpio: gpio_set_level(226): GPIO output gpio_num error
Sensore 1 OK!
E (237) gpio: gpio_set_level(226): GPIO output gpio_num error
E (247) gpio: gpio_set_level(226): GPIO output gpio_num error
Sensore 2 OK!
Sensore 1: Ranging started
Sensore 2: Ranging started
E (885) ledc: ledc_get_duty(739): LEDC is not initialized

Non capisco da dove arrivi questa riga ... sai indicarmelo?

Guglielmo

Sono messaggi di debug inclusi nel core quando attivi un "core debug level" diverso da none anche se non capisco dove venga utilizzata la periferica ledc (LED control) dell'ESP32.

Probabilmente dall'istruzione tone() per generare un segnale PWM
Comunque per esperienza personale, con il framework Arduino anche se mostra quel messaggio di errore, il segnale PWM viene generato lo stesso.

Mi rispondo da solo...

Mai avuto bisogno e mai fatto ... per questo non li ho mai visti :grin:

Si, infatti, credo sia un messaggio da ignorare ... :roll_eyes:

@pulce: disabilità il debug del core e mettilo a "none".

Guglielmo

Anche questo messaggio può ignorare senza problemi e credo dipenda da questa inizializzazione assurda...

Adafruit_VL53L1X(uint8_t shutdown_pin = -1, uint8_t irq_pin = -1);

Come diavolo fa un uint8_t (unsigned char) ad assumere il valore di -1 secondo quei geni incompresi di Adafruit?

:joy: :joy: :joy:

... non per nulla, quando posso, li evito ... di solito producono delle librerie che sono dei veri mattoni e, cercando in giro, spesso si trovano librerie equivalenti molto più snelle e leggere :wink:

Guglielmo

1 Like

Ad esempio, per i VL53L1X c'è la libreria di Pololu che è decisamente migliore, più completa e molto più leggera ... :roll_eyes:

Guglielmo

ok, questo weekend che dovrei avere del tempo, ci provo.

Se riesco provo anche l'altra libreria che mi hai indicato!