1

I need to read the distance data from a lidar in I2C using an Arduino Nano. Currently, this is the code I've written.

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
}

But I have a feeling I'm requesting from the wrong data address', since I'm not getting the results I expect (ie. varying distance data). Furthermore, I used an I2C scanner which 100% confirms the lidar is on the (default address) of 0x10.

Datasheet of (TF02 Pro): https://www.unmannedtechshop.co.uk/wp-content/uploads/2020/01/TF02-Pro-Product-Manual-Alpha.pdf

Question: am i reading from the right data address Any help would be appreciated.

4
  • which information on which page are you following?
    – jsotola
    Jun 21 at 21:38
  • i'm quite new to arduino so please bear with me. are you talking about the datasheet for the lidar which I'm getting the address' from? that's @ unmannedtechshop.co.uk/wp-content/uploads/2020/01/…
    – Salih MSA
    Jun 21 at 22:21
  • It looks to me like you have to send the same things through i2c as you would through UART. It's not your typical i2c device.
    – Majenko
    Jun 21 at 22:42
  • What results are you getting exactly? If your code is not stalling or failing then I doubt it’s an address issue. Do you maybe have access to an oscilloscope or I2C test device to see what’s happening on the I2C bus?
    – RowanP
    Jul 29 at 13:15
2

Long story short, some i2c devices are configured such that data is only present in said registers after continually issuing 'read commands'.

In this case, the read command was: 5A 05 00 01 60

Amended code:

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
}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.