I2C Multiplexer TCA9548A:
danke für den Hinweis. Sowas hatte ich auch schon mal erwogen, kannte aber diese gut ausgestattete Platine (Steckeranschlüsse etc.) noch nicht. Sehr gut!
I2C Multiplexer TCA9548A:
danke für den Hinweis. Sowas hatte ich auch schon mal erwogen, kannte aber diese gut ausgestattete Platine (Steckeranschlüsse etc.) noch nicht. Sehr gut!
Ich bekomme das oben referierte Beispiel nicht zum Laufen unter ESP32. Adafruit_VL530X hat andere Funktionsnamen. Im Prinzip habe ich dasselbe jetzt auch programmiert, habe aber Probleme beim Lauf des Programms.
Was sind die Fehler, die ich mache? (Das Programm ist von der Logik noch nicht ganz fertig):
...
Hab schon gesehen, Programmierfehler. Korrektur folgt.
Ich würde das mal korrigieren.
Ich ziehe meine Frage zurück und muß noch mal drüber nachdenken, ob der Ansatz über das Array von C++ Instanzen der richtige Ansatz ist. Wohl eher nicht.
Es gibt ein Beispiel in der Adafruit VL530X Library, benannt vl53l0x_multi_extended, das 4 Device implementiert. Werde mich damit mal rantasten und wenn's mit 4 funktioniere, dann den 5 dazunehmen.
Ich habe ein Problem mit dem Code gleich zu Beginn des Beispiels:
#include <Adafruit_VL53L0X.h>
#include <Wire.h>
// Define which Wire objects to use, may depend on platform
// or on your configurations.
#define SENSOR1_WIRE Wire <----- ?
#define SENSOR2_WIRE Wire
#if defined(WIRE_IMPLEMENT_WIRE1)
#define SENSOR3_WIRE Wire
#define SENSOR4_WIRE Wire
#else
#define SENSOR3_WIRE Wire
#define SENSOR4_WIRE Wire
#endif
// Setup mode for doing reads
Was bedeutet das "Wire"? Ich muß doch irgendwo die Pinnummern angeben, an die ich XSHUT hänge.
So sieht die Struktur aus:
sensorList_t sensors[] = {
#ifndef ARDUINO_ARCH_AVR // not enough memory on uno for 4 objects
{&sensor1, &SENSOR1_WIRE, 0x30, 0, 1,
Adafruit_VL53L0X::VL53L0X_SENSE_LONG_RANGE, 0, 0},
{&sensor2, &SENSOR2_WIRE, 0x31, 2, 3,
Adafruit_VL53L0X::VL53L0X_SENSE_HIGH_SPEED, 0, 0},
{&sensor3, &SENSOR3_WIRE, 0x32, 4, 5,
Adafruit_VL53L0X::VL53L0X_SENSE_DEFAULT, 0, 0},
{&sensor4, &SENSOR4_WIRE, 0x33, 6, 7,
Adafruit_VL53L0X::VL53L0X_SENSE_DEFAULT, 0, 0}
};
Weiß hier niemand eine Antwort auf meine Frage, wie ich mit dem "Wire Objekt" umgehe, das hier angesprochen ist?
Das vordefinierte Wire Objekt verwaltet den I2C Bus. Schau Dir mal die zugehörigen Methoden und IDE Beispiele an. Solange Du die Grundlagen nicht verstanden hast, kommst Du nicht weiter.
In den bisherigen AdafruitVL53LXX Beispielen war ich davon ausgegangen, daß ich mich um I2C-Bus außer, an welchen Pins er liegt, nicht besonders kümmern mußte. Dieses Beispiel scheint dann von einer anderen Hardwarekonfiguration auszugehen. Dann kann ich es für meinen Zweck momentan nicht gebrauchen.
Ich habe ja nur einen I2C Bus, wo alle 5 VL53LXX Module dranhängen.
Mir war ja die einzelne Umprogrammierung nach dem Timingdiagramm für die RESET-Sequenz mittels des XSHUT-Pins gelungen.
Dann habe ich mich dem Beispielprogramm VL53L0x_dual zugewandt. Dieses läuft auch bei mir. Das habe ich zunächst auf 3 Devices erweitern wollen, was aber nicht funktioniert.
Momentan habe ich das Problem, daß nur zwei der Devices die Adreßänderung mitbekommen. Und anschließend sagt mir das I2C-Scannerprogramm, es finde nur 0x29 und 0x32.
Ich poste mal den Code:
#include "Adafruit_VL53L0X.h"
// address we will assign if dual sensor is present
#define LOX1_ADDRESS 0x30
#define LOX2_ADDRESS 0x31
#define LOX3_ADDRESS 0x32
// set the pins to shutdown
#define SHT_LOX1 15
#define SHT_LOX2 16
#define SHT_LOX3 17
// objects for the vl53l0x
Adafruit_VL53L0X lox1 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox2 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox3 = Adafruit_VL53L0X();
// this holds the measurement
VL53L0X_RangingMeasurementData_t measure1;
VL53L0X_RangingMeasurementData_t measure2;
VL53L0X_RangingMeasurementData_t measure3;
/*
Reset all sensors by setting all of their XSHUT pins low for delay(10), then set all XSHUT high to bring out of reset
Keep sensor #1 awake by keeping XSHUT pin high
Put all other sensors into shutdown by pulling XSHUT pins low
Initialize sensor #1 with lox.begin(new_i2c_address) Pick any number but 0x29 and it must be under 0x7F. Going with 0x30 to 0x3F is probably OK.
Keep sensor #1 awake, and now bring sensor #2 out of reset by setting its XSHUT pin high.
Initialize sensor #2 with lox.begin(new_i2c_address) Pick any number but 0x29 and whatever you set the first sensor to
*/
void setID() {
// all reset
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
digitalWrite(SHT_LOX3, LOW);
delay(10);
// all unreset
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, HIGH);
digitalWrite(SHT_LOX3, HIGH);
delay(10);
// activating LOX1 and resetting LOX2
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, LOW);
digitalWrite(SHT_LOX3, LOW);
delay(10);
// initing LOX1
if(!lox1.begin(LOX1_ADDRESS)) {
Serial.println(F("Failed to boot first VL53L0X 1"));
while(1);
}
delay(10);
Serial.println(F("Setting address done for VL53L0X 1"));
// activating LOX2
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, HIGH);
digitalWrite(SHT_LOX3, LOW);
delay(10);
//initing LOX2
if(!lox2.begin(LOX2_ADDRESS)) {
Serial.println(F("Failed to boot second VL53L0X 2"));
while(1);
}
Serial.println(F("Setting address done for VL53L0X 2"));
// activating LOX3
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
digitalWrite(SHT_LOX3, HIGH);
delay(10);
//initing LOX3
if(!lox3.begin(LOX3_ADDRESS)) {
Serial.println(F("Failed to boot second VL53L0X 3"));
while(1);
}
delay(10);
Serial.println(F("Setting address done for VL53L0X 3"));
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, HIGH);
digitalWrite(SHT_LOX3, HIGH);
delay(10);
Serial.println(F("All VL53L0X enabled"));
}
void read_all_sensors() {
boolean debug=true;
lox1.rangingTest(&measure1, debug); // pass in 'true' to get debug data printout!
lox2.rangingTest(&measure2, debug); // pass in 'true' to get debug data printout!
lox3.rangingTest(&measure3, debug); // pass in 'true' to get debug data printout!
/*
// print sensor one reading
Serial.print(F("1: "));
if(measure1.RangeStatus != 4) { // if not out of range
Serial.print(measure1.RangeMilliMeter);
} else {
Serial.print(F("1 Out of range"));
}
Serial.print(F(" "));
*/
// print sensor two reading
Serial.print(F("2: "));
if(measure2.RangeStatus != 4) {
Serial.print(measure2.RangeMilliMeter);
} else {
Serial.print(F("2 Out of range"));
}
Serial.print(F(" "));
// print sensor two reading
Serial.print(F("3: "));
if(measure3.RangeStatus != 4) {
Serial.print(measure3.RangeMilliMeter);
} else {
Serial.print(F("3 Out of range"));
}
Serial.println();
}
void setup() {
Serial.begin(115200);
// wait until serial port opens for native USB devices
while (! Serial) { delay(1); }
pinMode(SHT_LOX1, OUTPUT);
pinMode(SHT_LOX2, OUTPUT);
pinMode(SHT_LOX3, OUTPUT);
Serial.println(F("Shutdown pins inited..."));
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
digitalWrite(SHT_LOX3, LOW);
Serial.println(F("All in reset mode...(pins are low)"));
Serial.println(F("Starting..."));
setID();
}
void loop() {
read_all_sensors();
delay(100);
}
im dem Beispiel steht wie man die Adressen setzt und eventuell löscht
Adafruit_VL53L0X/ examples /vl53l0x_dual.
Habe die Dinger nicht somit kann nicht testen
#include "Adafruit_VL53L0X.h"
// address we will assign if dual sensor is present
#define LOX1_ADDRESS 0x30
#define LOX2_ADDRESS 0x31
// set the pins to shutdown
#define SHT_LOX1 7
#define SHT_LOX2 6
// objects for the vl53l0x
Adafruit_VL53L0X lox1 = Adafruit_VL53L0X();
Adafruit_VL53L0X lox2 = Adafruit_VL53L0X();
// this holds the measurement
VL53L0X_RangingMeasurementData_t measure1;
VL53L0X_RangingMeasurementData_t measure2;
/*
Reset all sensors by setting all of their XSHUT pins low for delay(10), then set all XSHUT high to bring out of reset
Keep sensor #1 awake by keeping XSHUT pin high
Put all other sensors into shutdown by pulling XSHUT pins low
Initialize sensor #1 with lox.begin(new_i2c_address) Pick any number but 0x29 and it must be under 0x7F. Going with 0x30 to 0x3F is probably OK.
Keep sensor #1 awake, and now bring sensor #2 out of reset by setting its XSHUT pin high.
Initialize sensor #2 with lox.begin(new_i2c_address) Pick any number but 0x29 and whatever you set the first sensor to
*/
void setID() {
// all reset
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
delay(10);
// all unreset
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, HIGH);
delay(10);
// activating LOX1 and resetting LOX2
digitalWrite(SHT_LOX1, HIGH);
digitalWrite(SHT_LOX2, LOW);
// initing LOX1
if(!lox1.begin(LOX1_ADDRESS)) {
Serial.println(F("Failed to boot first VL53L0X"));
while(1);
}
delay(10);
// activating LOX2
digitalWrite(SHT_LOX2, HIGH);
delay(10);
//initing LOX2
if(!lox2.begin(LOX2_ADDRESS)) {
Serial.println(F("Failed to boot second VL53L0X"));
while(1);
}
}
void read_dual_sensors() {
lox1.rangingTest(&measure1, false); // pass in 'true' to get debug data printout!
lox2.rangingTest(&measure2, false); // pass in 'true' to get debug data printout!
// print sensor one reading
Serial.print(F("1: "));
if(measure1.RangeStatus != 4) { // if not out of range
Serial.print(measure1.RangeMilliMeter);
} else {
Serial.print(F("Out of range"));
}
Serial.print(F(" "));
// print sensor two reading
Serial.print(F("2: "));
if(measure2.RangeStatus != 4) {
Serial.print(measure2.RangeMilliMeter);
} else {
Serial.print(F("Out of range"));
}
Serial.println();
}
void setup() {
Serial.begin(115200);
// wait until serial port opens for native USB devices
while (! Serial) { delay(1); }
pinMode(SHT_LOX1, OUTPUT);
pinMode(SHT_LOX2, OUTPUT);
Serial.println(F("Shutdown pins inited..."));
digitalWrite(SHT_LOX1, LOW);
digitalWrite(SHT_LOX2, LOW);
Serial.println(F("Both in reset mode...(pins are low)"));
Serial.println(F("Starting..."));
setID();
}
void loop() {
read_dual_sensors();
delay(100);
}
Ja, genau. Das schrieb ich doch:
"Dann habe ich mich dem Beispielprogramm VL53L0x_dual zugewandt. Dieses läuft auch bei mir."
Das, was ich jetzt zuletzt gepostet habe, ist genau dieses VL53L0x_dual, jedoch erweitert um ein weiteres Device.
Und da funktioniert es auf einmal nicht mehr.
Kann man eigentlich davon ausgehen, daß digitalWrite() "glitchfrei" arbeiten? Daß es bei mehrmaligen Schreiben gleicher Pegel keinen "glitch" dazwischen geben kann?
ok gehe meine Brille putzen ![]()
Was passiert wenn du den Teil weglässt?
Wenn ich die Passage weglasse, wird kein Modul auf eine neue Adresse gesetzt. Es bleibt alles auf 0x29.
Oki dann lass den Teil drinnen. Aber änder die Adressen so, das der 1. 0x30, 2. 0x31 und der letzte immer 0x29 ist. Probiere das mal
Link weil hier geht es zwar um die lib von pololu, aber wenn ich das da richtig rauslese, muss der letzte Sensor immer 0x29 sein.
Edit. Mein englisch ist halt doch nicht das beste. 0x29 kann für den letzten behalten werden, muss aber scheinbar nicht. Aber in der pololu lib zählen die von 0x2A aufwärts, probiere es mal damit statt mit 0x30 usw.
Wie zitiert man hier?
0x2A,0x2B,0x2C versucht. Ergebnis: 0x29 blieb und 0x2C war programmiert. 2A und 2B fielen durch.
Aufm Handy indem du den Text markierst, dann wirds dir angeboten.
Und was macht er bei 0x30, 0x31 und 0x29? Oder 0x2A, 0x2B und 0x29?
Dann brauche ich ja den letzten gar nicht zu programmieren. Aber ich versuch's gleich...
Dann bleibt nur die 0x29 adressierbar. Keine andere Adresse wird programmiert oder vom Scanner gefunden.
(habe alle drei Adressen programmiert, also nicht die 0x29 weggelassen).
Mir ist gerade was aufgefallen, in dem adafruit beispiel wird ein sensor nach dem anderen aus dem low state gehollt und dann eine adresse zugewiesen. Du holst deine sensoren von low zu high gibst ihnen eine adresse, setzt den vorhergehenden aber wieder auf low. Lass die bereits programmierten mal auf high. Ich würde dir den code auch entsprechend umschreiben, sitze hier aber grade nur am handy und da ist mir das zu anstrengend, deswegen hoffe ich du verstehst was ich meine.
// activating LOX2 digitalWrite(SHT_LOX1, LOW); digitalWrite(SHT_LOX2, HIGH); digitalWrite(SHT_LOX3, LOW); delay(10);
Also z.b. hier lasse lox1 high usw.
Mir ist gerade was aufgefallen, in dem adafruit beispiel wird ein sensor nach dem anderen aus dem low state gehollt und dann eine adresse zugewiesen. Du holst deine sensoren von low zu high gibst ihnen eine adresse, setzt den vorhergehenden aber wieder auf low. Lass die bereits programmierten mal auf high. Ich würde dir den code auch entsprechend umschreiben, sitze hier aber grade nur am handy und da ist mir das zu anstrengend, deswegen hoffe ich du verstehst was ich meine.
Voilá:
Scanning...
I2C device found at address 0x30
I2C device found at address 0x31
I2C device found at address 0x32
done