Как прочитать правильный адрес данных ЛИДАРА с помощью Arduino в 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
Вопрос: я читаю с правильного адреса данных Любая помощь будет признательна.
@Salih MSA, 👍1
Обсуждение1 ответ
Лучший ответ:
Короче говоря, некоторые устройства 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
}
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- Как отправить строку на мастер с помощью i2c
- Как выбрать альтернативные контакты I2C на ESP32?
- Что означает в I2C «NACK получен»?
- NodeMCU с RFID RC522 и LCD-модулем интерфейса I2C вместе
- Несколько датчиков I2C с одинаковым адресом
какую информацию на какой странице вы отслеживаете?, @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