remove: 移除多余的mind目录
[LuatOS.git] / script / libs / gy53l1.lua
blob44b9481b52c8a9fa2a17c4f20f68fa70ee291e7e
1 --[[
2 @module gy53l1
3 @summary gy53l1激光测距传感器
4 @version 1.0
5 @date 2023.11.14
6 @author dingshuaifei
7 @usage
8 测量说明:
9 测量范围:5-4000mm(可选择短、中、长测量模式)
10 单次测量:测量一次后需要重新发送单次输出距离数据指令
12 --注意:因使用了sys.wait()所有api需要在协程中使用
13 -- 用法实例
14 gy53l1=require"gy53l1"
15 local uart2=2
16 sys.taskInit(function()
18 sys.wait(2000)
19 --初始化
20 gy53l1.init(uart2)
22 --设置模式,不设置为默认模式,设置模式要有一定的间隔时间
23 sys.wait(1000)
24 gy53l1.mode(uart2,gy53l1.measuring_short)
25 sys.wait(1000)
26 gy53l1.mode(uart2,gy53l1.measuring_time_1)
28 local data,mode,time
29 while true do
30 sys.wait(100)
31 --设置单次测量,设置一次返回一次值
32 --gy53l1.mode(uart2,gy53l1.out_mode_query)
34 data,mode,time=gy53l1.get()
35 log.info('距离',data,'模式',mode,'时间',time)
36 end
37 end)
40 gy53l1={}
42 --接收的数据
43 local uart_recv_val=""
44 --数据包table
45 local recv_data={}
46 --数据帧
47 --recv_data.data=0
48 --帧头1
49 recv_data.head1=0
50 --帧头2
51 recv_data.head2=0
52 --本帧数据类型
53 recv_data.type=0
54 --数据量
55 recv_data.amount=0
56 --数据高8位
57 recv_data.hight=0
58 --数据低八位
59 recv_data.low=0
60 --测量模式
61 recv_data.mode=0
62 --校验和
63 recv_data.check_sum=0
64 --距离
65 local range=0
67 -----------------------------------------------可选择测量模式---------------------------------------------------
69 --默认模式连续输出、中距离、测量时间110ms、波特率9600
71 --输出模式设置指令:
72 gy53l1.out_mode_coiled=string.char(0xA5,0x45,0xEA) ---------------连续输出距离数据---1
73 --[[若设置为查询指令,则发一次指令测量一次]]
74 gy53l1.out_mode_query=string.char(0xA5,0x15,0xBA) ---------------单次输出距离数据---2
76 --保存配置指令:
77 gy53l1.save=string.char(0xA5,0x25,0xCA) ---------------掉电保存当前配置;包括波特率(重新上电起效)、测量模
78 ---------------式、测量时间、输出模式设置
79 --测量模式设置指令:
80 gy53l1.measuring_short=string.char(0xA5,0x51,0xF6) ---------------短距离测量模式---1
81 gy53l1.measuring_middle=string.char(0xA5,0x52,0xF7) ---------------中距离测量模式(默认)---2
82 gy53l1.measuring_long=string.char(0xA5,0x53,0xF8) ---------------长距离测量模式---3
83 --测量时间设置指令:
84 gy53l1.measuring_time_1=string.char(0xA5,0x61,0x06) ---------------测量时间 110ms(默认)---1
85 gy53l1.measuring_time_2=string.char(0xA5,0x62,0x07) ---------------测量时间 200ms ---2
86 gy53l1.measuring_time_3=string.char(0xA5,0x63,0x08) ---------------测量时间 300ms ---3
87 gy53l1.measuring_time_4=string.char(0xA5,0x64,0x09) ---------------测量时间 55ms ---0
88 --波特率配置:
89 gy53l1.ste_baut_1=string.char(0xA5,0xAE,0x53) ---------------9600(默认)---1
90 gy53l1.ste_baut_2=string.char(0xA5,0xAF,0x54) ---------------115200---2
92 --例:
93 -- uart.write(2,measuring_short) 设置工作模式为短距离
94 -----------------------------------------------可选择测量模式---------------------------------------------------
96 --[[
97 参数:str 传入串口接收到的string类型的数据
98 返回值:失败返回-1
100 local function data_dispose(str)
101 recv_data.head1=string.byte(str,1)
102 recv_data.head2=string.byte(str,2)
103 recv_data.type=string.byte(str,3)
104 recv_data.amount=string.byte(str,4)
105 recv_data.hight=string.byte(str,5)
106 recv_data.low=string.byte(str,6)
107 recv_data.mode=string.byte(str,7)
108 recv_data.check_sum=string.byte(str,8)
110 if recv_data.head1 ~= 0x5A then
111 log.info('帧头错误')
112 return -1
114 --校验和计算
115 local sum=recv_data.head1+recv_data.head2+recv_data.type+ recv_data.amount+recv_data.hight+recv_data.low+recv_data.mode
116 sum=sum & 0xff
117 if sum ==recv_data.check_sum then
118 --输出距离值
119 range=(recv_data.hight<<8)|recv_data.low
120 --log.info("距离:mm",range,"测量模式:",recv_data.mode & 0x03,"测量时间:",(recv_data.mode>>2) & 0x03)
121 else
122 log.info('校验错误')
123 return -1
127 --[[
128 gy53l1初始化
129 @api gy53l1.init(id)
130 @number id 串口id
131 @return bool 成功返回true失败返回false
132 @usage
133 gy53l1.init(2)
135 function gy53l1.init(id)
136 -- 初始化
137 local uart_s=uart.setup(id, 9600, 8, 1)
138 if uart_s ~=0 then
139 return false
142 --设置工作模式
143 -- 收取数据会触发回调, 这里的"receive" 是固定值
144 uart.on(id, "receive", function(id, len)
145 local s = ""
146 repeat
147 -- s = uart.read(id, 1024)
148 s = uart.read(id, len)
149 if #s > 0 then -- #s 是取字符串的长度
150 -- 如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
151 -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
152 --log.info("uart", "receive", id, #s, s)
153 data_dispose(s)
155 if #s == len then
156 break
158 until s == ""
159 end)
160 return true
163 --[[
164 gy53l1设置工作模式
165 @api gy53l1.mode(id,mode)
166 @number id 串口id
167 @string mode 可选择配置模式
168 @return bool 成功返回true失败返回false
169 @usage
170 gy53l1.mode(2,gy53l1.save)--掉电保存当前配置
171 gy53l1.mode(2,gy53l1.measuring_time_3)--测量时间 300ms
172 gy53l1.mode(2,gy53l1.measuring_long)--测量距离选择
174 function gy53l1.mode(id,mode)
175 local ret_data=uart.write(id,mode)
176 if recv_data ~=0 then
177 return true
178 else
179 return false
183 --[[
184 gy53l1获取数据
185 @api gy53l1.get()
186 @return number data 距离数据
187 @return number mode 当前测量模式
188 @return number time 当前测量时间
189 @usage
190 local data,mode,timer=gy53l1.get()
191 log.info("距离",data,"模式",mode,"时间",timer)
193 function gy53l1.get()
194 local data,mode,time= range , recv_data.mode & 0x03 , (recv_data.mode>>2) & 0x03
195 return data,mode,time
198 return gy53l1