由于项目需求,我在淘宝买了两个激光测距模块。
模块接口:
- RS485 接口:A/B
- 电源接口:Vin+/GND
实物图:
以下是关于这个模块的简单使用方法:
硬件连接
- 激光测距模块电源端可接9-36 v的电压,我这里使用的是12v的电池。
- 树莓派貌似无法没有485的接口,我们可以使用485转串口模块连接树莓派与激光测距模块。
- 将正负接好,485接口A端与485转串口模块的A端连接,同样的将B端连接,再将两个模块的GND连接起来,也就是共地。
- 根据树莓派40pin 引脚对照表,树莓派1号引脚为3.3v电源,6号为GND。我们将这两个引脚分别于485转串口模块的vcc和GND连接起来。8号和10号引脚分别为TXD, RXD,这两个引脚分别接到485转串口模块的RXD, TXD,也就是对调连接。
接入树莓派使用之前,我先使用windows电脑串口助手进行测试:
- 使用默认的115200的串口波特率,根据ASCII通信协议,发送单次测量指令iSM,若激光测距模块能返回“距离 + 回光量”这样的数据,则模块能够正常使用。
- 根据Modbus 协议,使用串口助手发送16进制指令0x01 0x03 0x00 0x0F 0x00 0x02 0xF4 0x08,看是否得到正常响应。
- 由于我要使用到两个激光测距模块,所以现在使用ASCII协议更改其中一个激光测距模块的地址为0x02,另一个不做改变,仍为0x01。更改方法为发送ASCII指令iSET:6,02 ,设置成功会返回“OK”。
现在接入树莓派来使用:
- 树莓派的串口使用要将蓝牙功能关闭,将8号、10号引脚作为串口使用。
- 测试这两个模块的代码如下
import serial
import binascii
port = serial.Serial("/dev/ttyAMA0", baudrate=115200, timeout=3.0)
while True:
print("Please input the command:")
cmd = raw_input()
if(cmd == "d1"):
print("Modbus test...")
Single_measure_cmd ="\x01\x03\x00\x0F\x00\x02\xF4\x08"
port.write(Single_measure_cmd)
rcv = port.read(16)
new_receive = int(binascii.hexlify(rcv[5:7]), 16)
print("The detected instance is " + str(new_receive) + " mm")
if(cmd == "d2"):
print("Modbus test...")
Single_measure_cmd ="\x02\x03\x00\x0F\x00\x02\xF4\x3B"
port.write(Single_measure_cmd)
rcv = port.read(16)
new_receive = int(binascii.hexlify(rcv[5:7]), 16)
print("The detected instance is " + str(new_receive) + " mm")