Как прочитать правильный адрес данных ЛИДАРА с помощью Arduino в I2C?

i2c

Мне нужно считывать данные о расстоянии с лидара в I2C с помощью Arduino Nano. В настоящее время это код, который я написал.

unsigned int readDistance()
{
  unsigned int dist = 0 ; // LiDAR actually measured distance value. static so we can return previous dist
  
  // step 1: instruct sensor to read echoes
  Wire.beginTransmission(0x10) ; // transmit to device 0x10
  Wire.write(2) ; // sets distance data address (addr)
  Wire.write(3) ; // sets distance data address (addr)
  Wire.endTransmission() ; // stop transmitting
  
  // step 2: wait for readings to happen
  delay(100) ; // datasheet suggests at least 100ms
  
  // step 3: request reading from sensor
  Wire.requestFrom(0x10, 2) ; // request 2 bytes (DIST_L, DIST_H) from slave device #0x10
  dist = Wire.read() ; dist += Wire.read() << 8; // calculate distance value, bit shift high distance
  return dist ; // return updated dist
}

Но у меня такое чувство, что я запрашиваю не с того адреса данных", так как я не получаю ожидаемых результатов (т. Е. данные о различном расстоянии). Кроме того, я использовал сканер I2C, который на 100% подтверждает, что лидар находится по адресу (по умолчанию) 0x10.

Спецификация (TF02 Pro): https://www.unmannedtechshop.co.uk/wp-content/uploads/2020/01/TF02-Pro-Product-Manual-Alpha.pdf

Вопрос: я читаю с правильного адреса данных Любая помощь будет признательна.

, 👍1

Обсуждение

какую информацию на какой странице вы отслеживаете?, @jsotola

я совсем новичок в arduino, поэтому, пожалуйста, потерпите меня. вы говорите о техническом описании лидара, из которого я получаю адрес? это @ https://www.unmannedtechshop.co.uk/wp-content/uploads/2020/01/TF02-Pro-Product-Manual-Alpha.pdf, @Salih MSA

Мне кажется, что вы должны отправлять те же самые данные через i2c, что и через UART. Это не ваше типичное устройство i2c., @Majenko

Какие именно результаты вы получаете? Если ваш код не зависает или не выходит из строя, то я сомневаюсь, что это проблема с адресом. Может быть, у вас есть доступ к осциллографу или тестовому устройству I2C, чтобы увидеть, что происходит на шине I2C?, @RowanP


1 ответ


Лучший ответ:

2

Короче говоря, некоторые устройства i2c сконфигурированы таким образом, что данные присутствуют только в указанных регистрах после постоянной выдачи "команд чтения".

В этом случае команда чтения была: 5A 05 00 01 60

Измененный кодекс:

unsigned int readDistance()
{
  unsigned int dist = 0 ; // LiDAR actually measured distance value
  
  // step 1: instruct sensor to read echoes
  Wire.beginTransmission(0x10) ; // transmit to device 0x10
  Wire.write(0x5A) ; // some read command.
  Wire.write(0x05) ;
  Wire.write(0x00) ;
  Wire.write(0x01) ;
  Wire.write(0x60) ;
  Wire.endTransmission() ; // stop transmitting
  
  // step 2: wait for readings to happen
  delay(100) ; // datasheet suggests at least 100ms
  
  // step 3: request reading from sensor
  Wire.requestFrom(0x10, 4) ; // request first 4 bytes from slave device #0x10
  Wire.read() ; Wire.read() ; //ignore header bytes
  // remaining two bytes for distance (DIST_L, DIST_H) 
  dist = Wire.read() ; dist += Wire.read() << 8 ; // calculate distance value, bit shift high distance
  return dist ; // return updated dist
}
,