VL53L1X Distance Sensor van SparkFun

Hardware die niet past in bovenstaande onderwerpen
Berichten: 25
Geregistreerd: 24 Jan 2018, 17:03

VL53L1X Distance Sensor van SparkFun

Berichtdoor Est29 » 23 Nov 2020, 12:58

De VL53L1X is een afstandssensor die to ca 4m kan meten. De aansturing werkt met I2C en twee pinnen, shutdowns en interrupt. Deze sensor heeft een vast I2C-adres (0x52). Nu wil ik meerdere sensoren tegelijk aansturen. Dit kan met een truc. Zet alle sensoren uit met de shutdowns-pin en schakel ze dan een voor een aan en lees de afstand uit. Maar dat is langzaam. Ik wil ze aan kunnen sturen via de I2C-bus. Nou is er in de Library een instructie om het I2C-adres te wijzigen
Dat werk, maar dan wil ik die sensor ook met dat nieuwe adres kunnen aansturen. Dat lukt niet.

Nu kan je aan het begin van het programma de sensor definiëren als volgt:
SFEVL53L1X distanceSensor1(Wire, XSHUT1_PIN, INTERRUPT_PIN);
SFEVL53L1X distanceSensor2(Wire, XSHUT2_PIN, INTERRUPT_PIN);
Ik heb hier twee sensors gedefinieerd, Sensor1 en Sensor2. Dat werk, maar het I2C-adres blijft het zelfde.
Hoe moet ik een nieuw adres in de sensor-definitie stoppen? Waarschijnlijk bij "Wire", maar hoe???
Wie weet hier raad?

Gegevens:

De Library: "SparkFun_VL53L1X.h"

De Sensordefinitie in de Library:
SFEVL53L1X::SFEVL53L1X(TwoWire &i2cPort, int shutdownPin, int interruptPin)
{
_i2cPort = &i2cPort;
_shutdownPin = shutdownPin;
_interruptPin = interruptPin;
_device = new VL53L1X(&i2cPort, shutdownPin, interruptPin);
}

Mijn programma:
#include <U8g2lib.h>
#include <Wire.h>
#include "SparkFun_VL53L1X.h"

//Optional interrupt and shutdown pins.
#define XSHUT1_PIN 4
#define XSHUT2_PIN 5
#define INTERRUPT_PIN 2

SFEVL53L1X distanceSensor1(Wire, XSHUT1_PIN, INTERRUPT_PIN);
SFEVL53L1X distanceSensor2(Wire, XSHUT2_PIN, INTERRUPT_PIN);
U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);

void setup(void)
{
Wire.begin();
u8g2.begin();
Serial.begin(9600);
Serial.println("VL53L1X Qwiic Test");

distanceSensor1.sensorOn(); //sensor1 aan
distanceSensor1.setI2CAddress(82); //Set I2C-adres
distanceSensor1.init();
distanceSensor1.sensorOff(); //uit
}

void loop(void)
{
//Sensor1 aan
Serial.print("Sensor-1: ");
digitalWrite(XSHUT1_PIN, HIGH);

int add = distanceSensor1.getI2CAddress(); //I2C-adres opvragen!!!!!
Serial.print("I2CAddress: "); Serial.print(add,HEX);

distanceSensor1.init(); //initialisatie Sensor1
distanceSensor1.startRanging(); //Write configuration bytes to initiate measurement
int distance1 = distanceSensor1.getDistance(); //Get the result of the measurement from the sensor
distanceSensor1.stopRanging();
distance1=distance1/10;
Serial.print(" Distance(cm): "); Serial.println(distance1);
//Sensor1 uit
digitalWrite(XSHUT1_PIN, LOW);

//Sensor2
Serial.print("Sensor-2: ");
digitalWrite(XSHUT2_PIN, HIGH);

distanceSensor2.init(); //initialisatie Sensor1
distanceSensor2.startRanging(); //Write configuration bytes to initiate measurement
int distance2 = distanceSensor2.getDistance(); //Get the result of the measurement from the sensor
distanceSensor2.stopRanging();
distance2=distance2/10;
Serial.print("Distance(cm): "); Serial.println(distance2);
//Sensor2 uit
digitalWrite(XSHUT2_PIN, LOW);

Serial.println();

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: VL53L1X Distance Sensor van SparkFun

Berichtdoor shooter » 23 Nov 2020, 18:44

in I2C is er maar een adres en dat is 52, maar je kunt wel met shut down een sensor uitzetten, en dan kun je er dus meerdere aansluiten, en dat moet dan achter elkaar, maar je kunt tot 50 Hz gaan denk ik.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: VL53L1X Distance Sensor van SparkFun

Berichtdoor Koepel » 24 Nov 2020, 00:57

Est29, kun je dit eens lezen: https://github.com/sparkfun/SparkFun_VL53L1X_Arduino_Library/issues/7.

Als je dit doet:
Code: Alles selecteren
SFEVL53L1X distanceSensor1(Wire, XSHUT1_PIN, INTERRUPT_PIN);
SFEVL53L1X distanceSensor2(Wire, XSHUT2_PIN, INTERRUPT_PIN);
dan staan ze beiden (in de software) op hun default I2C adres. Vanaf dat moment gaat vanzelfsprekend alles verkeerd.

Kun je er eentje aansluiten en het I2C adres wijzigen en dat controleren met een I2C Scanner ? Dan bedoel ik niet de anderen uitzetten met de reset of shutdown pin, maar echt verwijderen van de bus.
Kun je de power er af halen, en daarna nog eens kijken met de I2C Scanner ?
Blijft het nieuwe adres in de sensor ? Dat is mooi, maar de Sparkfun library is te onduidelijk om dat normaal te gebruiken.

Misschien werkt dit:
Zet ze allemaal op een anders adres, dus geen sensor meer op de default waarde.
Gebruik de "Set I2C Adress" functie in setup() voor elke sensor, en doe dat voordat je een andere functie aanroept. Daarna kun je SensorOn() en init() doen en zo, en doe dat voor alle sensors.

Werkt dat niet, probeer dan over te stappen naar de code van Pololu.

Berichten: 25
Geregistreerd: 24 Jan 2018, 17:03

Re: VL53L1X Distance Sensor van SparkFun

Berichtdoor Est29 » 24 Nov 2020, 16:53

Dag shooter,
Bedankt voor je reactie. De truc van het om en om aan en uitzetten van de sensoren heb ik al in mijn programma toegepast (zie programma). Dat werkt. De sensoren hebben allen het zelfde I2C-adres, maar kost veel tijd omdat de sensor iedere keer opnieuw moet worden geïnitialiseerd. In mijn voorbeeld 150msec. De tijd van 20msec (50Hz) is alleen het kleinste timing budget.

Dag Koepel,
SFEVL53L1X distanceSensor1(Wire, XSHUT1_PIN, INTERRUPT_PIN);
SFEVL53L1X distanceSensor2(Wire, XSHUT2_PIN, INTERRUPT_PIN)
Als je zo de sensoren definieert werken ze beide met het zelfde adres. Maar als je de aan/uit truc met de XSHUT-pinnen gebruikt werkt dit wel omdat je maar met een adres werkt en er altijd maar een aanstaan staat.

Een paar opmerkingen:
1) "Wire" in de sensordefinitie wijst de TwoWire bus aan in je computer, maar waar is het adres?
2) Als je een adres definieert in een sensor blijft dat behouden tot de power wegvalt. Daarna weer gewoon 0x52.
3) Voor zover ik heb begrepen is adres 0x29 voor de VL53L0X, en 0x52 voor de VL53L1X.

Wat ik niet begrijp is dat je een sensorsysteem hebt, waarvan je de sensoradressen (tijdelijk) kan instellen en er negers een instructie is waarmee je de betreffende sensoren kan aanroepen.
Ik heb van je GitHub-link alleen begrepen dat zij het ook niet begrijpen.
Ik heb ook in Polohu-Libraries gekeken maar niet gevonden wat ik zocht n.l. adressturing. Overigens weet ik niet goed wat Polohu is.
Bedankt Est29.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: VL53L1X Distance Sensor van SparkFun

Berichtdoor Koepel » 24 Nov 2020, 18:43

Ik weet niet zeker of een sensor de I2C interface ook uit zet met de XSHUT pinnen.
Maar als dat werkt, dan doe je dat niet in setup().

In setup() doe je dit:
Code: Alles selecteren
distanceSensor1.sensorOn(); //sensor1 aan
distanceSensor1.setI2CAddress(82); //Set I2C-adres
distanceSensor1.init();
distanceSensor1.sensorOff(); //uit

Dat gaat dus naar beide sensors ! Daarom schreef ik: "Vanaf dat moment gaat vanzelfsprekend alles verkeerd".

Gebruik je autocorrectie of heeft de schrijfpiet een pepernootje op je toetsenbord laten vallen ?

Ik schreef: "Werkt dat niet, probeer dan over te stappen naar de code van Pololu".
Dan doe je dit: http://letmegooglethat.com/?q=pololu.
Dan ga je naar die website, daar zoek je op "VL53L1X", dan klik je op die module, dan klik je op de "Resources" tab, daar zoek je naar de code, en die blijkt op Github te staan: https://github.com/pololu/vl53l1x-arduino. Die is heel wat eenvoudiger dan de code van Sparkfun.

Dat waren mijn opmerkingen ;)
Nu die van jou:
1) Dat adres zit er helemaal niet bij. Het is altijd het default adres. Pas na het aanroepen van de "set I2C address" functie wordt het nieuwe I2C adres gebruikt.
2) Dat is jammer :!: Dat is misschien ook de reden dan Sparkfun de library altijd met het default adres laat beginnen :?
3) Het hangt er maar van af hoe je het adres ziet. De datasheet van de sensor gebruikt 8-bit en Arduino gebruikt 7-bit shifted adres. Dus eigenlijk is de "Arduino-0x29" gelijk aan de "datasheet-0x52". Kun je het nog volgen :?:

Helaas zitten anderen net zo te tobben met meerdere sensors zoals jij :cry: De fabrikant van die sensor had beter moeten nadenken toen ze die sensor ontwierpen.

Berichten: 25
Geregistreerd: 24 Jan 2018, 17:03

Re: VL53L1X Distance Sensor van SparkFun

Berichtdoor Est29 » 26 Nov 2020, 12:39

Dag Koepel,
Bedankt voor je reactie.
Het is wel duidelijk dat de VL53L1X niet zomaar meerdere keren op de zelfde bus te gebruiken is. Ik heb nu hiervoor twee oplossingen gevonden.
Oplossing 1,
Dit is de methode zoals ik in mijn eerste programmaatje heb toegepast. Hierbij worden de sensoren een voor een aan en uitgezet met de XSHUT-pin. Dit werkt, maar is niet erg handig.
Oplossing 2,
Deze komt van SparkFun. Als je naar de website gaat van het Breakoutboard met de VL53L1X, dan staat daar dat je deze sensor maar met een I2C-adres kan gebruiken. Er staat ook dat als je meerdere sensoren op de zelfde bus wil gebruiken je een I2CMUX nodig hebt op basis van de TCA9548A. Dit is een 8-kanaals I2C-multiplex waarmee je naar ieder I2C-device rechtst een kanaal kan openen. Een tegelijk.
Je kan de library van deze MUX vinden https://github.com/sparkfun/SparkFun_I2 ... no_Library
Example-2 is precies het voorbeeld wat ik zocht, twee VL53L1X-sensoren op de zelfde bus.
Ik heb dus maar een paar van die bordjes besteld.
Bedankt voor de hulp.
Groeten EST29.

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: VL53L1X Distance Sensor van SparkFun

Berichtdoor Koepel » 26 Nov 2020, 23:40

Prima ! als het maar werkt.
Een I2C multiplexer had ik eigenlijk meteen bij mijn eerste reactie als fall-back mogelijkheid moeten noemen :oops: Dat is typisch een beginnersfout van mij om met oogkleppen op te veel te focussen op een klein deel :lol:

Toch zie ik (theoretisch) nog wel een mogelijkheid om Oplossing 1 te doen.
In setup() kun je ze eerst allemaal uit moet zetten met die XSHUT-pin, dan er eentje aan zetten, dan als eerste functie de "I2C Change Address functie", en zo stuk voor stuk ze op een ander adres zetten. In je setup() ging je meteen functies gebruiken en die gingen naar alle sensors.
Dan zul je dus veel moeten proberen, en steeds met de I2C Scanner kijken en misschien kom je dan stapje-voor-stapje steeds wat verder.
Als je tijd hebt, dan is het misschien leuk om te proberen :?

Berichten: 25
Geregistreerd: 24 Jan 2018, 17:03

Re: VL53L1X Distance Sensor van SparkFun

Berichtdoor Est29 » 31 Dec 2020, 16:32

De I2C-Mux bordjes met TCA9845A zijn binnen. Werken prima met de VL53L1X sensoren.
Maar ................................ Zie nieuw onderwerp I2CMUX met TCA9548A.

Terug naar Overige hardware

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten