l3g4200d.lua 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. --[[
  2. @module l3g4200d
  3. @summary l3g4200d 三轴数字陀螺仪传感器
  4. @version 1.0
  5. @date 2022.04.12
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. local l3g4200d = require "l3g4200d"
  11. i2cid = 0
  12. i2c_speed = i2c.FAST
  13. sys.taskInit(function()
  14. i2c.setup(i2cid,i2c_speed)
  15. l3g4200d.init(i2cid)--初始化,传入i2c_id
  16. while 1 do
  17. local l3g4200d_data = l3g4200d.get_data()
  18. log.info("l3g4200d_data", l3g4200d_data.x,l3g4200d_data.y,l3g4200d_data.z)
  19. sys.wait(1000)
  20. end
  21. end)
  22. ]]
  23. local l3g4200d = {}
  24. local sys = require "sys"
  25. local i2cid
  26. local L3G4200D_ADDRESS_ADR
  27. local L3G4200D_ADDRESS_ADR_LOW = 0x68
  28. local L3G4200D_ADDRESS_ADR_HIGH = 0x69
  29. local L3G4200D_CHIP_ID_CHECK = 0x0F
  30. local L3G4200D_CHIP_ID = 0xD3
  31. ---器件所用地址
  32. local L3G4200D_CTRL_REG1 = 0x20
  33. local L3G4200D_CTRL_REG2 = 0x21
  34. local L3G4200D_CTRL_REG3 = 0x22
  35. local L3G4200D_CTRL_REG4 = 0x23
  36. local L3G4200D_CTRL_REG5 = 0x24
  37. local L3G4200D_REFERENCE = 0x25
  38. local L3G4200D_OUT_TEMP = 0x26
  39. local L3G4200D_STATUS_REG = 0x27
  40. local L3G4200D_OUT_X_L = 0x28
  41. local L3G4200D_OUT_X_H = 0x29
  42. local L3G4200D_OUT_Y_L = 0x2A
  43. local L3G4200D_OUT_Y_H = 0x2B
  44. local L3G4200D_OUT_Z_L = 0x2C
  45. local L3G4200D_OUT_Z_H = 0x2D
  46. local L3G4200D_FIFO_CTRL_REG = 0x2E
  47. local L3G4200D_FIFO_SRC_REG = 0x2F
  48. local L3G4200D_INT1_CFG = 0x30
  49. local L3G4200D_INT1_SRC = 0x31
  50. local L3G4200D_INT1_TSH_XH = 0x32
  51. local L3G4200D_INT1_TSH_XL = 0x33
  52. local L3G4200D_INT1_TSH_YH = 0x34
  53. local L3G4200D_INT1_TSH_YL = 0x35
  54. local L3G4200D_INT1_TSH_ZH = 0x36
  55. local L3G4200D_INT1_TSH_ZL = 0x37
  56. local L3G4200D_INT1_DURATION = 0x38
  57. --器件ID检测
  58. local function chip_check()
  59. i2c.send(i2cid, L3G4200D_ADDRESS_ADR_HIGH, L3G4200D_CHIP_ID_CHECK)--读器件地址
  60. local revData = i2c.recv(i2cid, L3G4200D_ADDRESS_ADR_HIGH, 1)
  61. if revData:byte() ~= nil then
  62. L3G4200D_ADDRESS_ADR = L3G4200D_ADDRESS_ADR_HIGH
  63. else
  64. i2c.send(i2cid, L3G4200D_ADDRESS_ADR_LOW, L3G4200D_CHIP_ID_CHECK)--读器件地址
  65. sys.wait(50)
  66. local revData = i2c.recv(i2cid, L3G4200D_ADDRESS_ADR_LOW, 1)
  67. if revData:byte() ~= nil then
  68. L3G4200D_ADDRESS_ADR = L3G4200D_ADDRESS_ADR_LOW
  69. else
  70. log.info("Can't find L3G4200D device")
  71. return false
  72. end
  73. end
  74. i2c.send(i2cid, L3G4200D_ADDRESS_ADR, L3G4200D_CHIP_ID_CHECK)--读器件地址
  75. local revData = i2c.recv(i2cid, L3G4200D_ADDRESS_ADR, 1)
  76. if revData:byte() == L3G4200D_CHIP_ID then
  77. log.info("Device i2c id is: L3G4200D")
  78. return true
  79. else
  80. log.info("Can't find L3G4200D device")
  81. return false
  82. end
  83. end
  84. --[[
  85. l3g4200d 初始化
  86. @api l3g4200d.init(i2c_id)
  87. @number 所在的i2c总线id
  88. @return bool 成功返回true
  89. @usage
  90. l3g4200d.init(0)
  91. ]]
  92. function l3g4200d.init(i2c_id)
  93. i2cid = i2c_id
  94. if chip_check() then
  95. i2c.send(i2cid, L3G4200D_ADDRESS_ADR, {L3G4200D_CTRL_REG1,0x0F})
  96. i2c.send(i2cid, L3G4200D_ADDRESS_ADR, {L3G4200D_CTRL_REG2,0x00})
  97. i2c.send(i2cid, L3G4200D_ADDRESS_ADR, {L3G4200D_CTRL_REG3,0x08})
  98. i2c.send(i2cid, L3G4200D_ADDRESS_ADR, {L3G4200D_CTRL_REG4,0x30})
  99. i2c.send(i2cid, L3G4200D_ADDRESS_ADR, {L3G4200D_CTRL_REG5,0x00})
  100. end
  101. return true
  102. end
  103. --[[
  104. 获取 l3g4200d 数据
  105. @api l3g4200d.get_data()
  106. @return table l3g4200d 数据
  107. @usage
  108. local l3g4200d_data = l3g4200d.get_data()
  109. log.info("l3g4200d_data", l3g4200d_data.x,l3g4200d_data.y,l3g4200d_data.z)
  110. ]]
  111. function l3g4200d.get_data()
  112. local l3g4200d_data = {}
  113. i2c.send(i2cid, L3G4200D_ADDRESS_ADR,L3G4200D_OUT_X_L)
  114. local data = i2c.recv(i2cid, L3G4200D_ADDRESS_ADR, 6)
  115. _, l3g4200d_data.x, l3g4200d_data.y, l3g4200d_data.z = pack.unpack(data, "<h3")
  116. return l3g4200d_data
  117. end
  118. return l3g4200d