Несколько датчиков расстояния VL6180X интерактивная проблема

Я пытаюсь использовать датчик расстояния VL6180X и плату Arduino Uno для индивидуального датчика, выполняющего индивидуальное измерение расстояния. Этот датчик следует протоколу I2C. Поскольку для одного и того же типа датчика протокол I2C говорит, что все они будут иметь один и тот же адрес, я подумываю об использовании PIN включения чипа (GPIO00) на чипе датчика для переключения датчика при измерении расстояния.

Теперь я могу обновить адрес группы датчиков. Но я думаю, что для получения индивидуальных результатов от разных датчиков на последовательном мониторе Arduino прямо сейчас я могу сделать только одну настройку датчика времени (например, я не мог обновить и переключить разные датчики). Как только я начал это делать, результаты последовательного монитора оказались неверными. Любой совет, как я могу продолжать переключать датчик и заставлять их работать с помощью контакта GPIO00?

Код, который я использую, таков:

#include <Wire.h>
#include <VL6180X.h>
#define Address1 0x20
#define Address2 0x22
#define Address3 0x24

VL6180X sensor;

int pin2 = 2;
int pin3 = 3;
int pin4 = 4;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  pinMode(pin2,OUTPUT);
  pinMode(pin3,OUTPUT);
  pinMode(pin4,OUTPUT);
  digitalWrite(pin2,HIGH);
  digitalWrite(pin3,HIGH);
  digitalWrite(pin4,HIGH);
  sensor.init();
  sensor.configureDefault();
  sensor.writeReg(VL6180X::SYSRANGE__MAX_CONVERGENCE_TIME, 30);
  sensor.writeReg16Bit(VL6180X::SYSALS__INTEGRATION_PERIOD, 50);
  sensor.writeReg16Bit(VL6180X::INTERLEAVED_MODE__ENABLE,0);
  sensor.setTimeout(500);
  sensor.stopContinuous();
  delay(300);
  sensor.startInterleavedContinuous(100);
}

void loop() {
  hello2();
  delay(1000);
}

void hello1(){
  sensor.setAddress(0x29);
  Serial.println(sensor.readReg(0x212),HEX);
  sensor.setAddress(Address1);
  sensor.writeReg(0x212,Address1);
  Serial.println(sensor.readReg(0x212),HEX);
  Serial.println();
  digitalWrite(pin2,HIGH);
  digitalWrite(pin3,LOW);
  digitalWrite(pin4,LOW);
  Serial.print("Ambient 1: ");
  Serial.print(sensor.readAmbientContinuous());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.print("\tRange 1: ");
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.println();
  sensor.writeReg(0x212,0x52);
  digitalWrite(pin2,HIGH);
  digitalWrite(pin3,HIGH);
  digitalWrite(pin4,HIGH);
}

void hello2(){
  sensor.setAddress(0x52);
  Serial.println(sensor.readReg(0x212),HEX);
  sensor.setAddress(Address2);
  sensor.writeReg(0x212,Address2);
  Serial.println(sensor.readReg(0x212),HEX);
  Serial.println();
  digitalWrite(pin2,LOW);
  digitalWrite(pin3,HIGH);
  digitalWrite(pin4,LOW);
  Serial.print("Ambient 2: ");
  Serial.print(sensor.readAmbientContinuous());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.print("\tRange 2: ");
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.println();
  sensor.writeReg(0x212,0x52);
}

void hello3(){
  sensor.setAddress(0x52);
  Serial.println(sensor.readReg(0x212),HEX);
  sensor.setAddress(Address3);
  sensor.writeReg(0x212,Address3);
  Serial.println(sensor.readReg(0x212),HEX);
  Serial.println();
  digitalWrite(pin2,LOW);
  digitalWrite(pin3,LOW);
  digitalWrite(pin4,HIGH);
  Serial.print("Ambient 3: ");
  Serial.print(sensor.readAmbientContinuous());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.print("\tRange 3: ");
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }
  Serial.println();
  sensor.writeReg(0x212,0x52);
}

Любая помощь будет оценена по достоинству!

, 👍0

Обсуждение

Я пытаюсь сделать то же самое. Вы случайно не заставили его работать?, @jmoon

Существуют микросхемы, которые расширяют шину I2C, позволяя иметь несколько устройств с одним и тем же идентификатором (не помню, как они называются в мо)., @Code Gorilla


3 ответа


0

Вы используете только один объект VL6180, а затем неоднократно меняете его адрес. В вашей setup(), поскольку все датчики включены и имеют один и тот же адрес, вы отправляете команды init всем им; Я не уверен, что произойдет (несколько ACK / NACKs?), Но это, вероятно, не очень хорошо. Ваши функции hello() фактически изменяют адрес всех датчиков (дважды?), Если команды даже работают, а затем позволяют считывать только один из них. Ожидается множество неопределенных проблем.

Чтобы исправить это, вы должны сделать все изменения конфигурации и адреса в setup():

  • Перед setup() создайте 3 объекта VL6180: sensor1, sensor2, sensor3
  • В setup() включите ТОЛЬКО ОДИН датчик и вызовите все команды инициализации датчика на одном из созданных вами объектов (возможно, sensor1), как обычно. Затем вызовите setAddress() для этого объекта датчика, чтобы изменить его адрес на уникальный. Этот объект теперь привязан к физическому датчику, который был включен; все будущие операции, связанные с этим датчиком, должны быть выполнены на этом объекте.
  • Затем отключите этот первый датчик, включите другой и повторите те же действия, что и раньше, на другом объекте (sensor2), убедившись, что адрес каждого датчика уникален. Таким образом, вы настраиваете только один датчик за раз.
  • После настройки всех трех объектов теперь вы можете использовать их соответствующие объекты для получения показаний в loop().
,

0

Я считаю, что если я правильно прочитал это несколько VL6180x, то вы можете изменить адреса I2C датчиков. Вам нужно удерживать все датчики в режиме сброса, а затем отправить ему сообщение об изменении идентификатора. Я не уверен, является ли это постоянным или вы должны делать это при каждом включении питания.

Это помогает?

,

1

Вы можете использовать мультиплексор I2C (TCA9548A). Один вход I2C может быть выведен на один из восьми выходов I2C.

Он имеет 8 настраиваемых адресов, поэтому вы можете подключить 64 устройства I2C с одним и тем же адресом, используя 8 микросхем мультиплексора.

,