美文网首页
机器元素-激光测距模块程序

机器元素-激光测距模块程序

作者: 邯山之郸 | 来源:发表于2021-01-10 07:58 被阅读0次

    问题

    只能测静态目标。动态目标会出现随机数字。所以,不能测动态目标的距离。所以,应该寻找TOF原理的激光测距模块,而不是使用机器元素这款相位法的模块。

    接线

    • 红色:VCC(5V-12V)
    • 黑:GND
    • 黄:A
    • 白:B

    程序如下:

    import serial
    import time
    import serial.tools.list_ports
    
    import pandas as pd
    
    def serial_list():
        port_list = list(serial.tools.list_ports.comports())
        print(port_list)
        if len(port_list) == 0:
            print('无可用串口')
        else:
            for i in range(0,len(port_list)):
                print(port_list[i])    
    
    def read_once(portx):
        # portx="COM5"
        bps=9600
        timex=1
        laser_open = b'\x80\x06\x02\x78'
        try:       
            ser = serial.Serial(portx,bps,timeout=timex)
            # time.sleep(1)
            # hex_cmd = bytes([128,6,2,120]) # 读一次距离 bytes([0x80,0x06, 0x02, 0x78]) #
            
            # print(hex_cmd)
            result=ser.write(laser_open)
            
            result2=ser.readline()#ser.inWaiting())
            # print(result2)
            result2 = list(result2)
            if result2[0] == 128 and result2[1] == 6 and result2[2] == 130:
                distance = (result2[3]-48)*100 + (result2[4]-48)*10 + (result2[5]-48) + (result2[7]-48)/10 + (result2[8]-48)/100 + (result2[9]-48)/1000
                distance = round(distance,4)
            # print("result2",result2)
            print("distance:",distance,"米")
                
    
            ser.close()#关闭串口
        except:
            
            print("串口没打开")
    
    def read_many(portx):
        # portx="COM5"
        bps=9600
        timex=1
        laser_close = b'\x80\x06\x05\x00\x75' # 关闭激光
        laser_open = b'\x80\x06\x03\x77'
        try:       
            ser = serial.Serial(portx,bps,timeout=timex)
            # time.sleep(1)
            # hex_cmd = bytes([128,6,3,119]) # 连续读距离
            
            result=ser.write(laser_open)
            while True:
                result2=ser.read(11)#ser.inWaiting())
                if result2:
                    result2 = list(result2)
                    if result2[0] == 128 and result2[1] == 6 and result2[2] == 131:
                        distance = (result2[3]-48)*100 + (result2[4]-48)*10 + (result2[5]-48) + (result2[7]-48)/10 + (result2[8]-48)/100 + (result2[9]-48)/1000
                        distance = round(distance,4)
                        save_data = [(time.time(),distance)]
                        labels = ['time','data']
                        df = pd.DataFrame.from_records(save_data, columns=labels)
                        df.to_csv('D:/testdata.csv',mode='a',header=False,index = False)
                        print("distance:",distance,"米")
                        if distance <0.1: # 设置区间
                            ser.write(laser_close)
                            ser.close()
                            break
                            pass
                
                else:
                    print("something wrong")
    
            ser.close()#关闭串口
        except:
            
            print("串口没打开")
    
    if __name__ == "__main__":
        portx = "COM5"
        read_once(portx)
        # serial_list()
        read_many(portx)
    
    
    • 机器元素-激光测距模块通讯协议
      波特率9600bps, 8位数据位,1位起始位,一位停止位,无奇偶校验.
    功能描述 命令代码 返回代码 备注
    读取参数 FA 06 01 FF FA 06 81 ADDR xx xx xx..... CS 读取常数,地址,回光量,温度
    读取机器号 FA 06 04 FC FA 06 84 “DAT1 DAT2……DAT16”CS DATn为ASCII格式
    设置地址 FA 04 01 ADDR CS FA 04 81 81 操作成功
    FA 84 81 02 FF 写入地址错误返回
    距离修改 FA 04 06 符号(正或者负,负为0x2d,正为0x2b),0xXX(修正值,一个字节),CS FA 04 8B 77 操作成功
    FA 84 8B 01 F6 操作失败
    连续测量时设置数据返回时间间隔 FA 04 05 MeaInterver CS FA 04 85 7D 操作成功
    FA 84 85 01 FC 写入时间间隔错误
    FA 84 85 01 FA 操作失败
    设置距离起止点 FA 04 08 Position CS FA 04 88 7A 操作成功
    FA 84 88 01 F9 操作失败
    设定量程 FA 04 09 Range CS Range : 05,10,30,50,80m FA 04 89 79 操作成功
    FA 84 89 01 F8 操作失败
    设定频率 FA 04 0A Freq CS Freq : 05 10 20 FA 04 8A 78 操作成功
    FA 84 8A 01 F7 操作失败
    设定分辨率 FA 04 0C Resolution CS Resolution :1(1mm),2(0.1mm) FA 04 8C 76 操作成功
    FA 84 8C 01 F5 操作失败
    设定上电即测 FA 04 0D Start CS Start : 0(关闭),1(开启) FA 04 8D 75 操作成功
    FA 84 8D 01 F4 操作失败
    单次测量(广播命令,返回结果存入模块缓存) FA 06 06 FA 无返回返回代码,模块测量后将结果存入缓存
    读取缓存 ADDR 06 07 CS 同 单次测量 返回代码
    单次测量(1mm) ADDR 06 02 CS ADDR 06 82”3X 3X 3X 2E 3X 3X 3X”CS 正确返回
    ADDR 06 82”’E’ ’R’ ’R’ ’-’ ’-’ ’3X’ ’3X’ ”CS 错误返回
    单次测量(0.1mm) ADDR 06 02 CS ADDR 06 82”3X 3X 3X 2E 3X 3X 3X 3X”CS 正确返回
    ADDR 06 82”’E’ ’R’ ’R’ ’-’ ’-’ ‘-‘’3X’ ’3X’ ”CS 错误返回
    连续测量(1mm) ADDR 06 03 CS ADDR 06 83” 3X 3X 3X 2E 3X 3X 3X”CS 正确返回
    ADDR 06 83” ’E’ ’R’ ’R’ ’-’ ’-’ ’3X’ ’3X’”CS 错误返回
    连续测量(0.1mm) ADDR 06 03 CS ADDR 06 83” 3X 3X 3X 2E 3X 3X 3X 3X”CS 正确返回
    ADDR 06 83” ’E’ ’R’ ’R’ ’-’ ’-’ ‘-‘’3X’ ’3X’”CS 错误返回
    控制激光打开或关闭 ADDR 06 05 LASER CS (LASER : 00 关闭,01 开启) ADDR 06 85 01 CS 正确返回
    ADDR 06 85 00 CS 错误返回
    关机 ADDR 04 02 CS ADDR 04 82 CS

    注:以上命令及返回数据均为16进制格式

    • ADDR 为机器地址
    • Postion为1时由顶端算起,为0时由尾端算起,默认设置为尾端(程序中有测距仪长度,由距离修正到顶端后,再加此长度即可设置到尾端)
    • CS 为校验字节,其为前面所有字节求和,返回取反加1
    • 在单次测量和连续测量返回数据中,引号中为数据部分,其格式为ASCII格式 如:123.456米 显示为31 32 33 2E 34 35 36
    • ADDR 默认值为80(128)

    参数为出厂设置时,读取数据的命令:
    单次测量:80 06 02 78
    连续测量:80 06 03 77
    关机:80 04 02 7A

    设置地址 : FA 04 01 80 81
    距离修改 : FA 04 06 2D 01 CE -1
    FA 04 06 2B 01 D0 +1
    时间间隔(1S) : FA 04 05 01 FC
    时间间隔(取消):FA 04 05 00 FD
    设置起始点 : FA 04 08 01 F9 顶端
    FA 04 08 00 FA 尾端
    设置量程 : FA 04 09 05 F4 5m
    FA 04 09 0A EF 10m
    FA 04 09 1E DB 30m
    FA 04 09 32 C7 50m
    FA 04 09 50 A9 80m
    设置频率 : FA 04 0A 00 F8
    FA 04 0A 05 F3 5
    FA 04 0A 0A EE 10
    FA 04 0A 14 E4 20
    设定分辨率 : FA 04 0C 01 F5 1mm
    FA 04 0C 02 F4 0.1mm
    设定上电就测 : FA 04 0D 00 F5 关闭
    FA 04 0D 01 F4 开启

    单次测量(广播)FA 06 06 FA
    读取缓存 : 80 06 07 73

    控制激光 : 80 06 05 01 74 开启
    80 06 05 00 75 关闭

    相关文章

      网友评论

          本文标题:机器元素-激光测距模块程序

          本文链接:https://www.haomeiwen.com/subject/yackaktx.html