adxl34x.lua 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. --[[
  2. @module adxl34x
  3. @summary adxl34x 3轴加速度计 目前支持 adxl345 adxl346
  4. @version 1.0
  5. @date 2022.04.11
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. local adxl34x = require "adxl34x"
  11. i2cid = 0
  12. i2c_speed = i2c.FAST
  13. sys.taskInit(function()
  14. i2c.setup(i2cid,i2c_speed)
  15. adxl34x.init(i2cid)--初始化,传入i2c_id
  16. while 1 do
  17. local adxl34x_data = adxl34x.get_data()
  18. log.info("adxl34x_data", "adxl34x_data.x"..(adxl34x_data.x),"adxl34x_data.y"..(adxl34x_data.y),"adxl34x_data.z"..(adxl34x_data.z))
  19. sys.wait(1000)
  20. end
  21. end)
  22. ]]
  23. local adxl34x = {}
  24. local sys = require "sys"
  25. local i2cid
  26. local ADXL34X_ADDRESS_ADR
  27. local ADXL34X_ADDRESS_ADR_LOW = 0x53
  28. local ADXL34X_ADDRESS_ADR_HIGH = 0x1D
  29. local ADXL34X_CHIP_ID_CHECK = 0x00
  30. local ADXL345_CHIP_ID = 0xE5
  31. local ADXL346_CHIP_ID = 0xE6
  32. ---器件所用地址
  33. local ADXL34X_THRESH_TAP = 0x1D --敲击阈值
  34. local ADXL34X_OFSX = 0x1E --X轴偏移
  35. local ADXL34X_OFSY = 0x1F --Y轴偏移
  36. local ADXL34X_OFSZ = 0x20 --Z轴偏移
  37. local ADXL34X_DUR = 0x21 --敲击持续时间
  38. local ADXL34X_Latent = 0x22 --敲击延迟
  39. local ADXL34X_Window = 0x23 --敲击窗口
  40. local ADXL34X_THRESH_ACT = 0x24 --活动阈值
  41. local ADXL34X_THRESH_INACT = 0x25 --静止阈值
  42. local ADXL34X_TIME_INACT = 0x26 --静止时间
  43. local ADXL34X_ACT_INACT_CTL = 0x27 --轴使能控制活动和静止检测
  44. local ADXL34X_THRESH_FF = 0x28 --自由落体阈值
  45. local ADXL34X_TIME_FF = 0x29 --自由落体时间
  46. local ADXL34X_TAP_AXES = 0x2A --单击/双击轴控制
  47. local ADXL34X_ACT_TAP_STATUS = 0x2B --单击/双击源
  48. local ADXL34X_BW_RATE = 0x2C --数据速率及功率模式控制
  49. local ADXL34X_POWER_CTL = 0x2D --省电特性控制
  50. local ADXL34X_INT_ENABLE = 0x2E --中断使能控制
  51. local ADXL34X_INT_MAP = 0x2F --中断映射控制
  52. local ADXL34X_INT_SOURCE = 0x30 --中断源
  53. local ADXL34X_DATA_FORMAT = 0x31 --数据格式控制
  54. local ADXL34X_DATAX0 = 0x32 --X轴数据0
  55. local ADXL34X_DATAX1 = 0x33 --X轴数据1
  56. local ADXL34X_DATAY0 = 0x34 --Y轴数据0
  57. local ADXL34X_DATAY1 = 0x35 --Y轴数据1
  58. local ADXL34X_DATAZ0 = 0x36 --Z轴数据0
  59. local ADXL34X_DATAZ1 = 0x37 --Z轴数据1
  60. local ADXL34X_FIFO_CTL = 0x38 --FIFO控制
  61. local ADXL34X_FIFO_STATUS = 0x39 --FIFO状态
  62. local ADXL346_TAP_SIGN = 0x3A --单击/双击的符号和来源
  63. local ADXL346_ORIENT_CONF = 0x3B --方向配置
  64. local ADXL346_Orient = 0x3C --方向状态
  65. --器件ID检测
  66. local function chip_check()
  67. i2c.send(i2cid, ADXL34X_ADDRESS_ADR_LOW, ADXL34X_CHIP_ID_CHECK)--读器件地址
  68. local revData = i2c.recv(i2cid, ADXL34X_ADDRESS_ADR_LOW, 1)
  69. if revData:byte() ~= nil then
  70. ADXL34X_ADDRESS_ADR = ADXL34X_ADDRESS_ADR_LOW
  71. else
  72. i2c.send(i2cid, ADXL34X_ADDRESS_ADR_HIGH, ADXL34X_CHIP_ID_CHECK)--读器件地址
  73. sys.wait(50)
  74. local revData = i2c.recv(i2cid, ADXL34X_ADDRESS_ADR_HIGH, 1)
  75. if revData:byte() ~= nil then
  76. ADXL34X_ADDRESS_ADR = ADXL34X_ADDRESS_ADR_HIGH
  77. else
  78. log.info("i2c", "Can't find adxl34x device")
  79. return false
  80. end
  81. end
  82. i2c.send(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_CHIP_ID_CHECK)--读器件地址
  83. sys.wait(50)
  84. local revData = i2c.recv(i2cid, ADXL34X_ADDRESS_ADR, 1)
  85. if revData:byte() == ADXL345_CHIP_ID then
  86. log.info("Device i2c id is: ADXL345")
  87. elseif revData:byte() == ADXL346_CHIP_ID then
  88. log.info("Device i2c id is: ADXL346")
  89. else
  90. log.info("i2c", "Can't find adxl34x device")
  91. return false
  92. end
  93. return true
  94. end
  95. --[[
  96. adxl34x 初始化
  97. @api adxl34x.init(i2c_id)
  98. @number 所在的i2c总线id
  99. @return bool 成功返回true
  100. @usage
  101. adxl34x.init(0)
  102. ]]
  103. function adxl34x.init(i2c_id)
  104. i2cid = i2c_id
  105. sys.wait(20)--20 毫秒等待设备稳定
  106. if chip_check() then
  107. i2c.send(i2cid, ADXL34X_ADDRESS_ADR, {ADXL34X_BW_RATE,0X0D})
  108. i2c.send(i2cid, ADXL34X_ADDRESS_ADR, {ADXL34X_POWER_CTL,0X08})
  109. i2c.send(i2cid, ADXL34X_ADDRESS_ADR, {ADXL34X_DATA_FORMAT,0X2B})
  110. log.info("adxl34x init_ok")
  111. sys.wait(20)
  112. return true
  113. end
  114. return false
  115. end
  116. --[[
  117. 获取 adxl34x 数据
  118. @api adxl34x.get_data()
  119. @return table adxl34x 数据
  120. @usage
  121. local adxl34x_data = adxl34x.get_data()
  122. log.info("adxl34x_data", "adxl34x_data.x"..(adxl34x_data.x),"adxl34x_data.y"..(adxl34x_data.y),"adxl34x_data.z"..(adxl34x_data.z))
  123. ]]
  124. function adxl34x.get_data()
  125. local accel={x=nil,y=nil,z=nil}
  126. i2c.send(i2cid, ADXL34X_ADDRESS_ADR,ADXL34X_DATAX0)
  127. _,accel.x = pack.unpack(i2c.recv(i2cid, ADXL34X_ADDRESS_ADR, 2),">h")
  128. i2c.send(i2cid, ADXL34X_ADDRESS_ADR,ADXL34X_DATAY0)
  129. _,accel.y = pack.unpack(i2c.recv(i2cid, ADXL34X_ADDRESS_ADR, 2),">h")
  130. i2c.send(i2cid, ADXL34X_ADDRESS_ADR,ADXL34X_DATAZ0)
  131. _,accel.z = pack.unpack(i2c.recv(i2cid, ADXL34X_ADDRESS_ADR, 2),">h")
  132. return accel
  133. end
  134. --[[
  135. 获取 adxl34x 中断源
  136. @api adxl34x.get_int_source()
  137. @number 所在的i2c总线id
  138. @usage
  139. adxl34x.get_int_source(i2cid)
  140. ]]
  141. function adxl34x.get_int_source(i2cid)
  142. i2c.readReg(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_INT_SOURCE, 2)
  143. end
  144. --[[
  145. 设置 adxl34x 活动和静止阀值
  146. @api adxl34x.set_thresh(i2cid, activity, inactivity, time_inactivity)
  147. @number 所在的i2c总线id
  148. @number 活动阀值
  149. @number 静止阀值
  150. @number 静止时间
  151. @usage
  152. adxl34x.set_thresh(i2cid, string.char(0x05), string.char(0x02), string.char(0x05))
  153. log.info("adxl34x_data", "adxl34x_data.x"..(adxl34x_data.x),"adxl34x_data.y"..(adxl34x_data.y),"adxl34x_data.z"..(adxl34x_data.z))
  154. ]]
  155. function adxl34x.set_thresh(i2cid, activity, inactivity, time_inactivity)
  156. i2c.writeReg(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_THRESH_ACT, activity)
  157. i2c.writeReg(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_THRESH_INACT, inactivity)
  158. i2c.writeReg(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_THRESH_INACT, time_inactivity)
  159. end
  160. --[[
  161. adxl34x 中断设置
  162. @api adxl34x.set_irqf(i2cid, irqf_map, irqf_act_ctl, irqf_enable)
  163. @number 所在的i2c总线id
  164. @number 中断映射
  165. @number 中断活动控制
  166. @number 中断使能
  167. @usage
  168. adxl34x.set_irqf(i2cid, string.char(0x10), string.char(0xff), string.char(0x10))
  169. ]]
  170. function adxl34x.set_irqf(i2cid, irqf_map, irqf_act_ctl, irqf_enable)
  171. i2c.writeReg(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_INT_ENABLE, string.char(0x00)) -- 关闭所有中断
  172. i2c.writeReg(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_INT_MAP, irqf_map)
  173. i2c.writeReg(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_ACT_INACT_CTL, irqf_act_ctl)
  174. i2c.writeReg(i2cid, ADXL34X_ADDRESS_ADR, ADXL34X_INT_ENABLE, irqf_enable) -- 开启中断
  175. end
  176. return adxl34x