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

2021-01-10  本文已影响0人  邯山之郸

问题

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

接线

程序如下:

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)

功能描述 命令代码 返回代码 备注
读取参数 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进制格式

参数为出厂设置时,读取数据的命令:
单次测量: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 关闭

上一篇下一篇

猜你喜欢

热点阅读