gy53l1.lua 6.1 KB

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