VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

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

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

OK, wann du Lust und Zeit hast. Ich kann auch mal vorbei kommen und sie abholen, wenn dir das lieber ist.

Schönes Wochenende
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 »

:(V): ich bin morgen / Samstag den ganzen Tag zu Hause.

Ich baue dann mal die Infrarot ein.


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

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

OK, wenns passt würde ich am Nachmittag kommen. :(V):
Benutzeravatar
Admin
Administrator
Beiträge: 1194
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: Di 13. Jul 2021, 18:03 Bei denen braucht man für die Bus Adressen 3 Pins wenn man alle 8 Busse adressieren muß. In deinem Fall sollte es reichen, wenn man A1 und A2 auf Low legt, und dann nur A0 mit einem Pin vom Arduino High / Low, Bus 0 oder Bus 1 auswählt.
Ja, so habe ich mir das jedenfalls vorgestellt. War aber nix :(o):

Ich habe es jetzt schon hinbekommen. Mit der entsprechenden Library :) Zumindest habe ich die grundsetzlich schon kapiert, jetzt muss ich noch die Aktivierung der einzelnen VL53L0X hinbekommen, weil wir ja dann zwei auf verschiedenen I2C-Adressen haben. Auch das Display hat jetzt eine eigene Adresse. Also die Grundeinstellungen muss ich dann ja für jeden einzeln VL53L0X im Setup machen. I2C auf den ersten VL53L0X stellen, Grundeinstellungen schicken, dann I2C auf den zweiten VL53L0X stellen, und wieder Grundeinstellungen schicken. Mache ich morgen noch, heute bin ich müüüüüüüüde. :roll:
Benutzeravatar
Admin
Administrator
Beiträge: 1194
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

houston wir haben ein problem :O:

Ich kämpfe gerade mit dem Programm.
Wenn ich einen Channel schließen will, muss ich normal schreiben, "I2CMux.closeChannel(x);" Das "x" steht für die Nummer dess Channels. Funktioniert aber nicht :eek: Mit dem Befehl "I2CMux.openChannel(x);" öffnet man den Channel, das funktioniert. Aber der close Befehl zeigt keine Wirkung. Der Kanal bleibt offen und stört somit die Kommunikation mit dem jeweiligen Sensor, weil dann beide Sensoren parallel am I2C hängen :evil: Das Prgramm unten funktioniert schon so weit, weil ich alle close Befehle gegen "I2CMux.closeAll();" ausgetauscht habe. Das geht auch, ist aber nicht Sinn der Sache. Man muss ja das, was man mit "I2CMux.openChannel(x);" geöffnet hat, auch wieder mit "I2CMux.closeChannel(x);" schließen können. Aber leider Arschkarte. Da stehe ich gerade ein bischen am Schlauch. :O:

Hier ist mal das Programm:

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;

// 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()
{
  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.closeChannel(0);       // I2C Multiplexer Display Kanal 0 deaktivieren
  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) {}
  }
  //I2CMux.closeChannel(1);       // I2C Multiplexer IR-Sensor 1 Kanal 1 deativieren
  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) {}
  }

#if defined LONG_RANGE
  // Verringern Sie die Begrenzung der Rücksendesignalrate (Standard ist 0,25 MCPS)
  // Sensor 1
  //I2CMux.closeChannel(2);       // I2C Multiplexer IR-Sensor 2 Kanal 2 deativieren
  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);
  //Sensor 2
  //I2CMux.closeChannel(1);       // I2C Multiplexer IR-Sensor 1 Kanal 1 deativieren
  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

  // Sensor 1
  //I2CMux.closeChannel(2);       // I2C Multiplexer IR-Sensor 2 Kanal 2 deativieren
  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

  // Sensor 2
  //I2CMux.closeChannel(1);       // I2C Multiplexer IR-Sensor 1 Kanal 1 deativieren
  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
}

void loop()
{
  //Sensor 1
  //I2CMux.closeChannel(2);       // I2C Multiplexer IR-Sensor 2 Kanal 2 deativieren
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(1);        // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
  messung1 = (sensor.readRangeSingleMillimeters());
  I2CMux.closeChannel(1);       // I2C Multiplexer IR-Sensor 1 Kanal 1 deativieren
  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.closeChannel(1);       // I2C Multiplexer IR-Sensor 1 Kanal 1 deativieren
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(2);        // I2C Multiplexer IR-Sensor 2 Kanal 2 ativieren
  messung2 = (sensor.readRangeSingleMillimeters());
  //I2CMux.closeChannel(2);       // I2C Multiplexer IR-Sensor 2 Kanal 2 deativieren
  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);

  //Serial.print(sensor.readRangeSingleMillimeters());
  //I2CMux.closeChannel(0);        // I2C Multiplexer Display Kanal 0 deaktivieren
  I2CMux.closeAll();        // Close all
  I2CMux.openChannel(1);         // I2C Multiplexer IR-Sensor 1 Kanal 1 ativieren
  if (sensor.timeoutOccurred()) {
    Serial.print(" TIMEOUT");
  }
}
Benutzeravatar
Admin
Administrator
Beiträge: 1194
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

OK, das mit den Kanal schießen geht tatsächlich nicht. Ich habe jetzt einfach closeALL() zum schließen genommen das klappt wunderbar.

Hier nochmal der Code:

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;

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

  // 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
  // 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
}

void loop()
{
  //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: 1194
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Wolfgang,
dein I2C Bus Multiplexer ist gelötet und wartet auf abholen.

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

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Na du. Wir hatten gerade ziehmlich starken Sturm und Regen. Aber alles vorbei. Nur ein paar Blumentöpfe haben aufgegeben. Die hat es etwas durch den Garten geblasen :O:
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 »

:agt:

Helga war am schaufeln, nach 20 Min war das erledigt, der Rest kommt morgen auf

Schau Mal bei " Neuvorstellungen* nach.


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

Re: VL53L0X ToF Sensor Laser Entfernungsmessung am Arduino

Beitrag von Admin »

Jetzt muss da mal das Relais noch mit rein, dass du die Schranke damit schließen kannst.

Dann ist das wohl so weit.

Ich habe dann mal noch diese LED Ringe, die ich mir besorgt habe. Ich wollte zwar eigentlich nie LED´s ansteuern, weil ich das für Kitsch gehalten habe, aber jetzt muss ich mich doch mal mit den LED Streifen beschäftigen :(o): Und die Sd Kartenspeicher muss ich testen, und die SSR DC-Relais habe ich auch gerade mal ausprobiert. Ich dachte die kann man auch als Motorregler benutzen, aber das war nix :(o):

Viel zu tun, greifen wir´s an :O:
Antworten

Zurück zu „Hardware / Schaltungstechnik“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast