ソースを参照

add:添加qmc5883l驱动

Dozingfiretruck 4 年 前
コミット
55e1d72fc5
2 ファイル変更132 行追加0 行削除
  1. 9 0
      script/libs/qmc5883l/package.json
  2. 123 0
      script/libs/qmc5883l/qmc5883l.lua

+ 9 - 0
script/libs/qmc5883l/package.json

@@ -0,0 +1,9 @@
+{
+    "type" : "lua", // 可以是lua(纯lua), c(纯c), 或者lua-c(混合)
+    "enterpoint" : "qmc5883l.lua",
+    "compatibility" : {
+        "soc" : true,
+        "air" : true
+    },
+    "dependency" : ["i2c"] // 需要何种硬件或软件接口
+}

+ 123 - 0
script/libs/qmc5883l/qmc5883l.lua

@@ -0,0 +1,123 @@
+--[[
+@module qmc5883l
+@summary qmc5883l 地磁传感器
+@version 1.0
+@date    2022.04.12
+@author  Dozingfiretruck
+@usage
+--注意:因使用了sys.wait()所有api需要在协程中使用
+-- 用法实例
+local qmc5883l = require "qmc5883l"
+i2cid = 0
+i2c_speed = i2c.FAST
+sys.taskInit(function()
+    i2c.setup(i2cid,i2c_speed)
+    qmc5883l.init(i2cid)--初始化,传入i2c_id
+    while 1 do
+        local qmc5883l_data = qmc5883l.get_data()
+        log.info("qmc5883l_data", qmc5883l_data.x,qmc5883l_data.y,qmc5883l_data.z,qmc5883l_data.heading,qmc5883l_data.headingDegrees)
+        sys.wait(1000)
+    end
+end)
+]]
+
+
+local qmc5883l = {}
+local sys = require "sys"
+local i2cid
+
+local QMC5883L_ADDRESS_ADR
+
+local QMC5883L_ADDRESS_ADR_LOW   =   0x0C
+local QMC5883L_ADDRESS_ADR_HIGH  =   0x0D
+
+local QMC5883L_CHIP_ID_CHECK     =   0x0D
+local QMC5883L_CHIP_ID           =   0xFF
+
+---器件所用地址
+
+local QMC5883L_X_LSB             =   0x00
+local QMC5883L_X_MSB             =   0x01
+local QMC5883L_Y_LSB             =   0x02
+local QMC5883L_Y_MSB             =   0x03
+local QMC5883L_Z_LSB             =   0x04
+local QMC5883L_Z_MSB             =   0x05
+local QMC5883L_STATUS            =   0x06
+local QMC5883L_T_LSB             =   0x07
+local QMC5883L_T_MSB             =   0x08
+local QMC5883L_CONTROL1          =   0x09
+local QMC5883L_CONTROL2          =   0x0A
+local QMC5883L_PERIOD            =   0x0B
+
+--器件ID检测
+local function chip_check()
+    i2c.send(i2cid, QMC5883L_ADDRESS_ADR_HIGH, QMC5883L_CHIP_ID_CHECK)--读器件地址
+    local revData = i2c.recv(i2cid, QMC5883L_ADDRESS_ADR_HIGH, 1)
+    if revData:byte() ~= nil then
+        QMC5883L_ADDRESS_ADR = QMC5883L_ADDRESS_ADR_HIGH
+    else
+        i2c.send(i2cid, QMC5883L_ADDRESS_ADR_LOW, QMC5883L_CHIP_ID_CHECK)--读器件地址
+        sys.wait(50)
+        local revData = i2c.recv(i2cid, QMC5883L_ADDRESS_ADR_LOW, 1)
+        if revData:byte() ~= nil then
+            QMC5883L_ADDRESS_ADR = QMC5883L_ADDRESS_ADR_LOW
+        else
+            log.info("Can't find QMC5883L device")
+            return false
+        end
+    end
+
+    i2c.send(i2cid, QMC5883L_ADDRESS_ADR, QMC5883L_CHIP_ID_CHECK)--读器件地址
+    local revData = i2c.recv(i2cid, QMC5883L_ADDRESS_ADR, 1)
+    if revData:byte() == QMC5883L_CHIP_ID then
+        log.info("Device i2c id is: QMC5883L")
+        return true
+    else
+        log.info("Can't find QMC5883L device")
+        return false
+    end
+end
+
+--[[
+qmc5883l 初始化
+@api qmc5883l.init(i2c_id)
+@number i2c_id i2c_id
+@return bool   成功返回true
+@usage
+qmc5883l.init(0)
+]]
+function qmc5883l.init(i2c_id)
+    i2cid = i2c_id
+    if chip_check() then
+        i2c.send(i2cid, QMC5883L_ADDRESS_ADR, {QMC5883L_PERIOD,0x01})
+        i2c.send(i2cid, QMC5883L_ADDRESS_ADR, {QMC5883L_CONTROL1,0x1D})
+    end
+    return true
+end
+
+--[[
+获取 qmc5883l 数据
+@api qmc5883l.get_data()
+@return table qmc5883l 数据
+@usage
+local qmc5883l_data = qmc5883l.get_data()
+log.info("qmc5883l_data", qmc5883l_data.x,qmc5883l_data.y,qmc5883l_data.z,qmc5883l_data.heading,qmc5883l_data.headingDegrees)
+]]
+function qmc5883l.get_data()
+    local qmc5883l_data = {}
+    i2c.send(i2cid, QMC5883L_ADDRESS_ADR,QMC5883L_X_LSB)
+    local data = i2c.recv(i2cid, QMC5883L_ADDRESS_ADR, 6)
+    _, qmc5883l_data.x, qmc5883l_data.y, qmc5883l_data.z = pack.unpack(data, "<h3")
+    local heading = math.atan (qmc5883l_data.y ,qmc5883l_data.x)
+    qmc5883l_data.heading = heading
+    local declinationAngle = 0.0404
+    heading = heading+declinationAngle
+    if heading < 0 then heading = heading+2*math.pi end
+    if heading > 2*math.pi then heading = heading-2*math.pi end
+    qmc5883l_data.headingDegrees = heading * 180/math.pi
+    return qmc5883l_data
+end
+
+return qmc5883l
+
+