VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Benutzeravatar
Admin
Administrator
Beiträge: 1196
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 24. Jul 2021, 20:47
Schau Mal bei " Neuvorstellungen* nach.
Ja, du meinst diese Idioten mit ihrem Pornokram, den man immer mal wieder löschen muß. Da sind die mit ihren Foren besser drann, die einige Mod´s haben, so dass immer irgend jemand im Forum ist, der das gleich sieht und löschen kann. Diese Penner sind überall unterwegs, und versuchen ihren Kram unter die Leute zu bringen.

Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Sandra hat heute den Dreck von Unwetter aus dem Pool gefischt. Bei uns läuft wieder alles rund. Ist schon ein toller Sommer :O: Ich schätze der Sommer wird ein Totalausfall. :sad:
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Ich werde Anfang kommende Woche das Relais noch in das Programm einbauen, das du brauchst. Dann funktioniert das auf jeden Fall erst mal so wie du es brauchst.
Und dann muss ich mal nochmal auf den Sensor ohne Multiplexer zurück. Um mal zu vergleichen, ob die Sensoren wirklich mit Multiplexer genauso laufen wie ohne. Das glaube ich eher nicht. Die Dinger bekommen mit Multiplexer eigentlich nur noch 25 bis 30 cm Messbereich hin. Ich glaube das war ohne den Multiplexer deutlich mehr. Aber ich weiß es gar nicht sicher, weil ich mich eigentlich auf deine Entfernungen 1-2 Gleise konzentriert habe. Wenn da ein Unterschied ist, dann klappt es mit der Grundeistellung der Sensoren über den Multiplexer nicht so gut. Vielleicht habe ich da was übersehen und verrgeigt. Das wird sich aber zeigen.

Gute Nacht
Franz

PS: Morgen bin ich von Vormittags bis Kaffeezeit erst mal in München beim arbeiten.
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 »

:(V):

Danke für die Infos.

Wenn alle Stricke reißen, könnten wir doch an jeden Sensor einen eigenen nano anschließen und ein gemeinsames Relais ansteuern. War nur so eine
Schnapsidee - oder?

Schönes :agt: Wochende
Grüße aus der Heimat der E69
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Nöööö, ist nicht nötig. Es funktioniert schon so wie es jetzt ist. Aber ich habe das Gefühl, dass bei der Einstellung zu Beginn irgendwas nicht so passt. Aber das ist nichts was man nicht hinbekommen kann. Ich muss nur nochmal zurück zum Grundprogramm ohne Multiplexer, dass ich sehen kann ob ich da bei erweitern auf den Multiplexer irgendwas nicht integriert habe. Da sind zu beginn Einstellungen zum Thema Genauigkeit und Messweite. Da muss ich wohl irgendwas nicht richtig integriert haben, denke ich.
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Jetzt habe ich hier im Programm mit Multiplexer das Relais wieder dazu eingebaut. Funktioniert wunderbar. Ich habe jetzt mal den Bereich auf 20cm eingestellt. Also wenn vor einem Sensor etwas im Bereich von 20cm auftaucht, dann kommt das Relais und bleibt mindestens 3 Sekunden, wenn in der Zeit wieder was an einem Sensor im Bereich von 20cm auftacht, wird die Relaiszeit um 3 Sek. verlängert, u.s.w.

Franz

Also das funktioniert jetzt erst mal gut. So kannst du es schon mal installieren. Dann kommt nur noch ein Programm Update, wenn ich den Fehler gefunden habe.

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, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

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

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;

// 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()
{
  digitalWrite (LS_Relais01, HIGH); // Relaisausgang beim Start "aus"
  pinMode(LS_Relais01, OUTPUT);

  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(20, 4);
  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()
{
  // ---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
    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
      MerkerLS1 = 0;
    }
  }
  //---Lichtschranke01 Ende------------------------
  //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"));
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Ich wäre morgen, 03.08. Nachmittag da, wenn du Lust hast hier aufzuschlagen :(V):
Dann kannst du den Multiplexer mitnehmen und deine beiden Bewegungsmelder in Betrieb nehmen.

Servus
Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
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: Mi 4. Aug 2021, 13:00 Für unseres nächstes Treffen sollten wir etwas mehr Zeit einplanen.
Ich würde gerne meinen nano gleich verdrahten und in Betrieb nehmen. Dazu müsste ich auch Deine Libraries abspeichern.

Also sobald am Ende des Tunnels ein Licht auftaucht, melde ich mich.
Ja, rühre dich wenn du Zeit hast.

Franz

PS: Ich habe das Fahrrad Thema verschoben in Franzls Kaffee
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

OK, ich habe jetzt nochmal den einzelnen Sensor ohne Multiplexer aufgebaut. Der misst bis 30cm zufriedenstellend. Dann habe ich wieder zwei sensoren mit Multiplexer aufgebaut, und dann misst einer genauso zufriedenstellend, der andere misst ~25mm zuviel. Beim letzten Aufbau sind beide Sensoren bei grösser 25cm nicht mehr zuverlässig gewesen. Ich vermute jetzt, dass es an den Kabeln liegt. Die haben 30cm länge. Und da werden ziehmlich viele Störsignale reinkommen. Der Unterschied ist wohl im Moment einfach nur, wie die Kabel zufällig gerade daliegen. Ich baue mir jetzt mal geschirmte Kabel für die Datenwege. Dann dürfte der Spuck vorbei sein. Du wirst ja bei deiner Eisenbahn sowieso die Kabel geschirmt verlegen. Dann wird das Problem Geschichte sein.

Franz

Wie schauts bei der aus?
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 »

Servus Franz,

schaut nicht schlecht aus. Bin gestern Abend in ein gigantisches Unwetter bei Landau / Isar gefahren - aber Glück gehabt.

Der Terminplaner sagt: jeden Nachmittag frei - außer Mittwoch.

Also gib bitte Bescheid.

Schönen Tag
Grüße aus der Heimat der E69
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 3 Gäste