例程讲解24-I2C_Lidar_Lite_V3_example_code I2C控制激光雷达
# OpenMV M7 I2C接口与Garmin Lidar Lite V3 - By: Grant Phillips - 2018年4月8日
# 返回距激光雷达的目标点的基本距离(以厘米为单位),并打印到控制台
# 使用默认的激光雷达设置。有关更多高级设置,请参见手册中的I2C命令:
# https://static.garmin.com/pumac/LIDAR_Lite_v3_Operation_Manual_and_Technical_Specifications.pdf
# I2C Control of LIDAR Lite V3
# 1. 将0x04写入寄存器0x00
# 2. 读取寄存器0x01。重复直到位0(LSB)变为低电平。
# 3. 从0x8f读取两个字节(高字节0x0f,然后低字节0x10),以厘米为单位获得16位测量值
# 硬件连接:
# 连接激光雷达SCL线(绿色)到OpenMV上的I2C 2 SCL(引脚4)
# 连接激光雷达SDA线(蓝色)到OpenMV上的I2C 2 SDA (引脚5)
# 与激光雷达并联的680uF滤波电容器
# SCL和SDA线路上的10k上拉电阻至+5Vdc
import pyb
from pyb import I2C
lidarReady = bytearray([0xff]) # 保存返回的数据以备随时检查
lidarReadyCheck = bytes([1]) # 比较lidarReady的第0位
startBuf = bytearray([0x00,0x04]) # 1.地址和数据
readyBuf = bytearray([0x01]) # 2.准备检查地址
distBuf = bytearray([0x8f]) # 3.距离读取地址
distance = -1 # 距离读取变量
# I2C设置
Lidar=I2C(2,I2C.MASTER) # 在主模式下初始化I2C 2总线
while(True):
distance = -1 # 重置为-1,这样我们就知道什么时候会得到真正的读数
try: # 如果发生I2C错误,则处理抛出的错误
# 步骤1将0x04写入寄存器0x00
Lidar.send(startBuf,0x62) # 这是读取(激光可见)
# 步骤2读取寄存器0x01并等待位0变低
while (lidarReady[0] & readyBuf[0]):
Lidar.send(readyBuf,0x62)
lidarReady=Lidar.recv(1,0x62)
pyb.delay(50) # 这似乎有助于减少I2C总线上的错误
lidarReady=bytearray([0xff]) # 重新设置准备好的检查数据,以便下一次读取
# 步骤3从0x8f(0x0f和0x10)读取距离测量值
Lidar.send(distBuf,0x62)
dist=Lidar.recv(2,0x62)
distance=dist[0]
distance<<=8 # 将2个字节移动到16位int中
distance|=dist[1]
pyb.delay(100) # 两次读取之间的时间较短,可以更快但会出现更多错误
except OSError: # 如果出现错误,重新初始化i2c总线
Lidar.init(I2C.MASTER)
print("error, reinitialising")
if distance > -1:
print("Distance:", distance, "cm")