VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von e69-fan »

Hallo Franz,

ich dreh am Rad
Am Rad drehen.jpg
Am Rad drehen.jpg (21.09 KiB) 947 mal betrachtet


wenn der Sketch längere Zeit ( ohne Änderung des Meßweges) bei mir läuft - "friert" die Messung bei einem oder allen beiden Sensoren ein.

Am Display wird der Wert -1 ausgegeben und keine neuen Messungen sind mehr möglich.

Manchmal hilft reset oder nur Stromversorgung AUS - AN,
dann läuft wieder alles.

:agt:

Tritt das auch bei Dir auf ?.
Vielleicht könnte man die Ausgabe auf den seriellen Monitor umleiten und dabei die Zeit bis zum Fehler erkennen.

Schönes Wochenende - Wolfgang
Dateianhänge
Anzeige.JPG
Anzeige.JPG (29.82 KiB) 947 mal betrachtet
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Ich lasse es bei mir mal länger laufen. Wie lange hat es bei dir in etwa gedauert, bis es abgestürzt ist?

Ich habe es jetzt mal in einer ruhige Ecke angesteckt.

Ich habe das Programm hier am laufen:

Code: Alles auswählen

/* Dieses Beispiel zeigt, wie man eine Einzelschussreichweite erhält
  Messungen vom VL53L0X. Der Sensor kann optional sein
  mit unterschiedlichen Ranging-Profilen konfiguriert, wie in . beschrieben
  das VL53L0X API-Benutzerhandbuch, um eine bessere Leistung für
  eine bestimmte Anwendung. Dieser Code basiert auf den vier
  "SingleRanging"-Beispiele in der VL53L0X-API.

  Die voreingestellte I2C Adresse (0x29)

  Die Entfernungsmesswerte sind in mm angegeben. */

#include <Wire.h>
#include <VL53L0X.h>
VL53L0X sensor;
#include <LiquidCrystal_I2C.h> // LCD Display
LiquidCrystal_I2C lcd(0x27, 20, 4);

#include <MobaTools.h>

#include <Arduino.h>            // I2C Multiplexer einrichten
#include "TCA9548A.h"
TCA9548A I2CMux;

// Festlegen der Ports Wechselblink
const int Blinker1P  =  6;  // Die beiden Led's des
const int Blinker2P  =  7;  // Wechselblinkers.
// Weitere Konstanten
const int wbZykl = 1100;    // Zykluszeit des Wechselblinkers
const int wbSoft = 400;     // Auf/Abblendzeit der Lampen
boolean Gleis1    = false;  // Gleis 1 belegt/frei
boolean SchalterP = false;  // Blinkschaltung on/off

int messung1 = 0;
int messung2 = 0;
const byte LS_Relais01 = 2; // Pin 2 ist für Relais Lichtschranke
byte MerkerLS1 = 0;
unsigned long LS_Laufzeit01 = 0; // Lichtschranke01 Ablauf Zeit
const unsigned long LS_Pausezeit01 = 3000; // Lichtschranke01 Prüfzeit Überbrückung 3 Sek.
unsigned long milli_aktuell = 0;
byte LS_Status01 = 0;
byte LS_Status02 = 0;

// Zustand des Wechselblinker
byte wblZustand = 0;        // In dieser Variable wird hinterlegt, in welchem Zustand
// sich der Wechselblinker gerade befindet
#define   WBL_AUS     0     // beide Lampen sind aus
#define   WBL_START   1     // Startphase: beide Lampen sind an
#define   WBL_BLINKT  2     // Die Lampen blinken normal im Wechsel
byte ledState;              // HIGH : Blinker1 ist an, LOW Blinker2 ist an

MoToSoftLed Blinker1;
MoToSoftLed Blinker2;
MoToTimer BlinkUhr;

// Entkommentieren Sie diese Zeile, um den Langstreckenmodus zu verwenden. Diese
// erhöht die Empfindlichkeit des Sensors und verlängert seine
// potenzielle Reichweite, erhöht aber die Wahrscheinlichkeit, dass
// eine ungenaue Lesung aufgrund von Reflexionen von Objekten
// anders als das beabsichtigte Ziel. Es funktioniert am besten im Dunkeln
// Bedingungen.

//#define LONG_RANGE


// Entkommentieren Sie EINE dieser beiden Zeilen, um folgendes zu erhalten.
// - höhere Geschwindigkeit auf Kosten einer geringeren Genauigkeit oder
// - höhere Genauigkeit auf Kosten einer geringeren Geschwindigkeit

//#define HIGH_SPEED
#define HIGH_ACCURACY


void setup() //=============================================== SETUP =========================
{
  digitalWrite (LS_Relais01, HIGH); // Relaisausgang beim Start "aus"
  pinMode(LS_Relais01, OUTPUT);

  Blinker1.attach(Blinker1P);     // die Ausgänge werden automatisch auf OUTPUT gesetzt
  Blinker1.riseTime( wbSoft );    // Aufblendzeit in ms

  Blinker2.attach(Blinker2P);
  Blinker2.riseTime( wbSoft );    // Aufblendzeit in ms

  I2CMux.begin(Wire);             // Wire-Instanz wird an die Bibliothek übergeben für I2C Multiplexer
  I2CMux.closeAll();              // Alle Kanäle schließen

  Serial.begin(9600);
  Wire.begin();
  I2CMux.openChannel(0);         // I2C Multiplexer Display Kanal 0 ativieren
  lcd.begin();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor (2, 0);
  lcd.print (F("Abstandsmessung 1"));
  lcd.setCursor (2, 1);
  lcd.print (F("mm:"));
  lcd.setCursor (2, 2);
  lcd.print (F("Abstandsmessung 2"));
  lcd.setCursor (2, 3);
  lcd.print (F("mm:"));

  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(1);    // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Sensor 1 konnte nicht erkannt und initialisiert werden!");
    while (1) {}
  }
  delay(200);
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(2);    // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Sensor 2 konnte nicht erkannt und initialisiert werden!");
    while (1) {}
  }
  delay(200);
#if defined LONG_RANGE
  // Verringern Sie die Begrenzung der Rücksendesignalrate (Standard ist 0,25 MCPS)
  // Sensor 1
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(1);        // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
  sensor.setSignalRateLimit(0.1);
  // Laserpulsperioden erhöhen (Standardwerte sind 14 und 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
  delay(200);
  //Sensor 2
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(2);        // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
  sensor.setSignalRateLimit(0.1);
  // Laserpulsperioden erhöhen (Standardwerte sind 14 und 10 PCLKs)
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodPreRange, 18);
  sensor.setVcselPulsePeriod(VL53L0X::VcselPeriodFinalRange, 14);
#endif
  delay(200);
  // Sensor 1
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(1);        // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
#if defined HIGH_SPEED
  // Timing-Budget auf 20 ms reduzieren (Standard ist etwa 33 ms)
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // Timing-Budget auf 200 ms erhöhen
  sensor.setMeasurementTimingBudget(200000);
#endif
  delay(200);
  // Sensor 2
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(2);        // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
#if defined HIGH_SPEED
  // Timing-Budget auf 20 ms reduzieren (Standard ist etwa 33 ms)
  sensor.setMeasurementTimingBudget(20000);
#elif defined HIGH_ACCURACY
  // Timing-Budget auf 200 ms erhöhen
  sensor.setMeasurementTimingBudget(200000);
#endif
  delay(200);
}

void loop() //=================================================== LOOP =======================
{
  // ---Millis übergeben----------------------------
  milli_aktuell = millis();
  // ---Lichtschranke01 Kontrolle-------------------
  if (messung1 <= 200) {
    LS_Status01 = LOW;
  }
  else {
    LS_Status01 = HIGH;
  }
  if (messung2 <= 200) {
    LS_Status02 = LOW;
  }
  else {
    LS_Status02 = HIGH;
  }
  if ((LS_Status01 == LOW) || (LS_Status02 == LOW)) {
    digitalWrite (LS_Relais01, LOW); // Relais01 auf Pin2 einschalten
    Gleis1 = true;
    LS_Laufzeit01 =  milli_aktuell;
    MerkerLS1 = 1;
  }
  else {
    if ((milli_aktuell - LS_Laufzeit01 >= LS_Pausezeit01) && (MerkerLS1 == 1)) // Überbrückungszeit abgelaufen ?
    {
      digitalWrite (LS_Relais01, HIGH); // Relais01 auf Pin2 ausschalten
      Gleis1 = false;
      MerkerLS1 = 0;
    }
  }
  //------------------------------------------Gleis belegt Sensoren ------------------------
  SchalterP = Gleis1; // Blinken, wenn Gleis 1 belegt
  //Sensor 1
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(1);        // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
  messung1 = (sensor.readRangeSingleMillimeters());
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(0);        // I2C Multiplexer Display Kanal 0 aktivieren
  lcd.setCursor (10, 1);
  lcd.print (F("     "));
  lcd.setCursor (10, 1);
  lcd.print (messung1);

  //Sensor 2
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(2);        // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
  messung2 = (sensor.readRangeSingleMillimeters());
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(0);        // I2C Multiplexer Display Kanal 0 aktivieren
  lcd.setCursor (10, 3);
  lcd.print (F("     "));
  lcd.setCursor (10, 3);
  lcd.print (messung2);

  // Sensor 1
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(1);    // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
  if (sensor.timeoutOccurred()) {
    Serial.print(F(" TIMEOUT Sensor 1"));
  }
  // Sensor 2
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(2);    // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
  if (sensor.timeoutOccurred()) {
    Serial.print(F(" TIMEOUT Sensor 2"));
  }
  // Wechselblinker -------------------------------------------------------------------
  switch (wblZustand) {
    case WBL_AUS:
      // Beide Lampen sind aus, warten auf einschalten
      if ( SchalterP == true && BlinkUhr.running() == false ) {
        // Beide Leds einschalten, Timer für gemeinsames Startleuchten
        Blinker1.on();
        Blinker2.on();
        BlinkUhr.setTime( wbSoft );
        wblZustand = WBL_START;
      }
      break;
    case WBL_START:
      // Startphase: Nach Zeitablauf erste Led wieder aus
      if ( BlinkUhr.running() == false ) {
        // Die Startzeit ist abgelaufen, Übergang zur normalen Blinkphase
        ledState = HIGH;
        Blinker2.off();
        BlinkUhr.setTime(wbZykl / 2); // Zeitverzögerung setzen
        wblZustand = WBL_BLINKT;
      }
      break;
    case WBL_BLINKT:
      if ( BlinkUhr.running() == false ) {
        BlinkUhr.setTime(wbZykl / 2); // Zeitverzögerung setzen
        if ( ledState == LOW ) {
          Blinker1.on();
          Blinker2.off();
          ledState = HIGH;
        } else {
          ledState = LOW;
          Blinker2.on();
          Blinker1.off();
        }
      }
      if ( SchalterP == false ) {
        // Wechselblinker abschalten
        Blinker1.off();
        Blinker2.off();
        wblZustand = WBL_AUS;
        BlinkUhr.setTime(wbZykl);   // minimale 'Aus' zeit des Blinkers
        //( schützt vor Schalterprellen )
      }
      break;
  } // Ende switch Wechselblinker -------------------------------------------------
}
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Admin hat geschrieben: Fr 29. Okt 2021, 19:52 Ich habe mir auch mal ein geschirmtes Kabel bei Polin bestellt. Ich muss mal schauen welche Drahstärke sich gut verarbeiten lässt. Ich meine wegen dem aufkrimpen der Stecker. Deshalb habe ich mal ein Kabel mit einer anderen Drahtstärke bestellt, als es dein Kabel ist. Dann können wir mal schauen, was sich besser verarbeiten lässt.

Servus
Franz
Das ging richtig schnell. Gestern bestellt, heute da :eek:
Also wenn wir wieder bei dir oder bei mir sind, könnten wir mal schauen welche Drahtstärken sich besser krimpen lassen. Deines ist ja 0,14 stark, meines 0,25 Drahtstärke. Und die Krimpzangen testen, wenn deine besser ist, besorge ich mir die auch. Meine ist schon recht alt und war wohl auch nicht die tollste.
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von e69-fan »

Hallo Franz,

mit 0,25 qmm habe ich sehr gute Erfahrungen gemacht und ist deshalb bei mir Standard.
Ich habe diese
https://www.amazon.de/gp/product/B07ZKD ... UTF8&psc=1

Mist - ist nicht lieferbar.

Bei mir läuft genau dieser Sketch, mit einer Ausnahme: Anstelle von einem Relais habe ich an Pin2 eine LED angeschlossen und im setup high,
und in der loop HIGH und LOW vertauscht - jetzt sehe wenn das Programm "steht".

Mfg Wolfgang
Grüße aus der Heimat der E69
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von e69-fan »

Hallo Franz,

richte doch die benötigten Kabel (0,25qmm) schon mal her und dann können wir bei mit crimpen. Du weißt ja - eine große Lupe wird von mir benötigt. :lol: :lol: :lol:

Servus
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Mein Kabel ist schon mal sehr unflexsibel. Ich dachte erst es ist nur etwas starr, weil es kalt ist, direkt nach der Lieferung. Aber auch jetzt, bei Zimmertemperatur ist es noch sehr starr. Bin gespannt, wie das mit deinen Kabeln ist.

OK, aber jetzt wieder zu deinem Problem, dass das Programm einfriert. Bei mir friert bis jetzt nichts ein. Das läuft jetzt seit 11:40 Uhr und jetzt ist es 16:00 Uhr. Das sind gute 4 Std. Und es läuft und läuft. Wie lange dauert es bei dir, bis dem Programm die Füße einschlafen?

Franz
Benutzeravatar
e69-fan
Beiträge: 282
Registriert: Mi 20. Jan 2021, 10:32
Wohnort: Murnau am Staffelsee

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von e69-fan »

Hallo Franz,

ich habe jetzt den nano und die Stromversorgung ausgetauscht und lasse den Aufbau länger laufen. Schaut jedoch schon besser aus.

Servus
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Ja, bei mir sind es jetzt gute 6 Std. ohne Stress.
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Hallo Wolfgang.
Gerade hat mich meine ESP32 NTP Uhr angepiept, weil sie um 00:00 Uhr ja die Zeit im Internet neu abfragt. Bei der Gelegenheit habe ich gleich noch unser Projekt hier, VL53L0X Sensoren mit Multiplexer, im Dauerlauf kontrolliert. Das Ding läuft immer noch. Es sind jetzt also 13 Std. und es ist immer noch aktiv wie zu Anfang.

Also den Grund für den Ausfall wirst du wohl wo anders suchen müßen. Aber ich lasse es natürlich auf jede Fall noch weiter laufen.

Gute Nacht, wir hatten heute nen Spieleabend, aus dem ich wieder als Verlierer hervor ging. Aber ich habe ja eh noch eine andere Auffassung von Spielen. Bei mir gilt Mitspielen ist alles, Gewinnen ist auch OK. :oo:

Wenn vier Leute drei Spiele machen, muss ja nun mal ein Verlierer dabei sein :(o): :(o):
Benutzeravatar
Admin
Administrator
Beiträge: 1197
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

e69-fan hat geschrieben: Sa 30. Okt 2021, 12:06 Hallo Franz,

mit 0,25 qmm habe ich sehr gute Erfahrungen gemacht und ist deshalb bei mir Standard.
Ich habe diese
https://www.amazon.de/gp/product/B07ZKD ... UTF8&psc=1

Mist - ist nicht lieferbar.
Das ist nicht schlimm. Ich möchte erst mal deine und meine Zange in der Handhabung vergleichen. Wenn dann deine einwandfrei besser ist, dann besorge ich mir so eine. Ich glaube eben dass meine beim Vergleich eher die Arschkarte hat. Oder ich bin nur zu blöd zum benutzen :lol:
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste