qmc5883l.lua 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. --[[
  2. @module qmc5883l
  3. @summary qmc5883l 地磁传感器
  4. @version 1.0
  5. @date 2022.04.12
  6. @author Dozingfiretruck
  7. @usage
  8. --注意:因使用了sys.wait()所有api需要在协程中使用
  9. -- 用法实例
  10. local qmc5883l = require "qmc5883l"
  11. i2cid = 0
  12. i2c_speed = i2c.FAST
  13. sys.taskInit(function()
  14. i2c.setup(i2cid,i2c_speed)
  15. qmc5883l.init(i2cid)--初始化,传入i2c_id
  16. while 1 do
  17. local qmc5883l_data = qmc5883l.get_data()
  18. log.info("qmc5883l_data", qmc5883l_data.x,qmc5883l_data.y,qmc5883l_data.z,qmc5883l_data.heading,qmc5883l_data.headingDegrees)
  19. sys.wait(1000)
  20. end
  21. end)
  22. ]]
  23. local qmc5883l = {}
  24. local sys = require "sys"
  25. local i2cid
  26. local QMC5883L_ADDRESS_ADR
  27. local QMC5883L_ADDRESS_ADR_LOW = 0x0C
  28. local QMC5883L_ADDRESS_ADR_HIGH = 0x0D
  29. local QMC5883L_CHIP_ID_CHECK = 0x0D
  30. local QMC5883L_CHIP_ID = 0xFF
  31. ---器件所用地址
  32. local QMC5883L_X_LSB = 0x00
  33. local QMC5883L_X_MSB = 0x01
  34. local QMC5883L_Y_LSB = 0x02
  35. local QMC5883L_Y_MSB = 0x03
  36. local QMC5883L_Z_LSB = 0x04
  37. local QMC5883L_Z_MSB = 0x05
  38. local QMC5883L_STATUS = 0x06
  39. local QMC5883L_T_LSB = 0x07
  40. local QMC5883L_T_MSB = 0x08
  41. local QMC5883L_CONTROL1 = 0x09
  42. local QMC5883L_CONTROL2 = 0x0A
  43. local QMC5883L_PERIOD = 0x0B
  44. --器件ID检测
  45. local function chip_check()
  46. i2c.send(i2cid, QMC5883L_ADDRESS_ADR_HIGH, QMC5883L_CHIP_ID_CHECK)--读器件地址
  47. local revData = i2c.recv(i2cid, QMC5883L_ADDRESS_ADR_HIGH, 1)
  48. if revData:byte() ~= nil then
  49. QMC5883L_ADDRESS_ADR = QMC5883L_ADDRESS_ADR_HIGH
  50. else
  51. i2c.send(i2cid, QMC5883L_ADDRESS_ADR_LOW, QMC5883L_CHIP_ID_CHECK)--读器件地址
  52. sys.wait(50)
  53. local revData = i2c.recv(i2cid, QMC5883L_ADDRESS_ADR_LOW, 1)
  54. if revData:byte() ~= nil then
  55. QMC5883L_ADDRESS_ADR = QMC5883L_ADDRESS_ADR_LOW
  56. else
  57. log.info("Can't find QMC5883L device")
  58. return false
  59. end
  60. end
  61. i2c.send(i2cid, QMC5883L_ADDRESS_ADR, QMC5883L_CHIP_ID_CHECK)--读器件地址
  62. local revData = i2c.recv(i2cid, QMC5883L_ADDRESS_ADR, 1)
  63. if revData:byte() == QMC5883L_CHIP_ID then
  64. log.info("Device i2c id is: QMC5883L")
  65. return true
  66. else
  67. log.info("Can't find QMC5883L device")
  68. return false
  69. end
  70. end
  71. --[[
  72. qmc5883l 初始化
  73. @api qmc5883l.init(i2c_id)
  74. @number 所在的i2c总线id
  75. @return bool 成功返回true
  76. @usage
  77. qmc5883l.init(0)
  78. ]]
  79. function qmc5883l.init(i2c_id)
  80. i2cid = i2c_id
  81. if chip_check() then
  82. i2c.send(i2cid, QMC5883L_ADDRESS_ADR, {QMC5883L_PERIOD,0x01})
  83. i2c.send(i2cid, QMC5883L_ADDRESS_ADR, {QMC5883L_CONTROL1,0x1D})
  84. end
  85. return true
  86. end
  87. --[[
  88. 获取 qmc5883l 数据
  89. @api qmc5883l.get_data()
  90. @return table qmc5883l 数据
  91. @usage
  92. local qmc5883l_data = qmc5883l.get_data()
  93. log.info("qmc5883l_data", qmc5883l_data.x,qmc5883l_data.y,qmc5883l_data.z,qmc5883l_data.heading,qmc5883l_data.headingDegrees)
  94. ]]
  95. function qmc5883l.get_data()
  96. local qmc5883l_data = {}
  97. i2c.send(i2cid, QMC5883L_ADDRESS_ADR,QMC5883L_X_LSB)
  98. local data = i2c.recv(i2cid, QMC5883L_ADDRESS_ADR, 6)
  99. _, qmc5883l_data.x, qmc5883l_data.y, qmc5883l_data.z = pack.unpack(data, "<h3")
  100. local heading = math.atan (qmc5883l_data.y ,qmc5883l_data.x)
  101. qmc5883l_data.heading = heading
  102. local declinationAngle = 0.0404
  103. heading = heading+declinationAngle
  104. if heading < 0 then heading = heading+2*math.pi end
  105. if heading > 2*math.pi then heading = heading-2*math.pi end
  106. qmc5883l_data.headingDegrees = heading * 180/math.pi
  107. return qmc5883l_data
  108. end
  109. return qmc5883l