|
|
@@ -0,0 +1,304 @@
|
|
|
+--[[
|
|
|
+@module lis2dh12
|
|
|
+@summary lis2dh12 三轴传感器
|
|
|
+@version 1.0
|
|
|
+@date 2022.04.20
|
|
|
+@author Dozingfiretruck
|
|
|
+@usage
|
|
|
+--注意:因使用了sys.wait()所有api需要在协程中使用
|
|
|
+-- 用法实例
|
|
|
+local lis2dh12 = require "lis2dh12"
|
|
|
+i2cid = 0
|
|
|
+i2c_speed = i2c.FAST
|
|
|
+sys.taskInit(function()
|
|
|
+ i2c.setup(i2cid,i2c_speed)
|
|
|
+ lis2dh12.init(i2cid)--初始化,传入i2c_id
|
|
|
+ while 1 do
|
|
|
+ local lis2dh12_data = lis2dh12.get_data()
|
|
|
+ log.info("lis2dh12_data", "lis2dh12_data.x"..(lis2dh12_data.x),"lis2dh12_data.y"..(lis2dh12_data.y),"lis2dh12_data.z"..(lis2dh12_data.z),"lis2dh12_data.temp"..(lis2dh12_data.temp))
|
|
|
+ sys.wait(1000)
|
|
|
+ end
|
|
|
+end)
|
|
|
+]]
|
|
|
+
|
|
|
+
|
|
|
+local lis2dh12 = {}
|
|
|
+
|
|
|
+local sys = require "sys"
|
|
|
+
|
|
|
+local i2cid
|
|
|
+local LIS2DH12_ADDRESS_ADR
|
|
|
+
|
|
|
+local LIS2DH12_ADDRESS_ADR_LOW = 0x18
|
|
|
+local LIS2DH12_ADDRESS_ADR_HIGH = 0x19
|
|
|
+
|
|
|
+local LIS2DH12_CHIP_ID_CHECK = 0x0F
|
|
|
+local LIS2DH12_CHIP_ID = 0x33
|
|
|
+
|
|
|
+
|
|
|
+---器件所用地址
|
|
|
+local LIS2DH12_STATUS_REG_AUX = 0x07
|
|
|
+
|
|
|
+local LIS2DH12_OUT_TEMP_L = 0x0C
|
|
|
+local LIS2DH12_OUT_TEMP_H = 0x0D
|
|
|
+
|
|
|
+local LIS2DH12_CTRL_REG0 = 0x1E
|
|
|
+local LIS2DH12_TEMP_CFG_REG = 0x1F
|
|
|
+
|
|
|
+local LIS2DH12_CTRL_REG1 = 0x20
|
|
|
+local LIS2DH12_CTRL_REG2 = 0x21
|
|
|
+local LIS2DH12_CTRL_REG3 = 0x22
|
|
|
+local LIS2DH12_CTRL_REG4 = 0x23
|
|
|
+local LIS2DH12_CTRL_REG5 = 0x24
|
|
|
+local LIS2DH12_CTRL_REG6 = 0x25
|
|
|
+local LIS2DH12_REFERENCE = 0x26
|
|
|
+local LIS2DH12_STATUS_REG = 0x27
|
|
|
+local LIS2DH12_OUT_X_L = 0x28
|
|
|
+local LIS2DH12_OUT_X_H = 0x29
|
|
|
+local LIS2DH12_OUT_Y_L = 0x2A
|
|
|
+local LIS2DH12_OUT_Y_H = 0x2B
|
|
|
+local LIS2DH12_OUT_Z_L = 0x2C
|
|
|
+local LIS2DH12_OUT_Z_H = 0x2D
|
|
|
+local LIS2DH12_FIFO_CTRL_REG = 0x2E
|
|
|
+local LIS2DH12_FIFO_SRC_REG = 0x2F
|
|
|
+
|
|
|
+local LIS2DH12_INT1_CFG = 0x30
|
|
|
+local LIS2DH12_INT1_SRC = 0x31
|
|
|
+local LIS2DH12_INT1_THS = 0x32
|
|
|
+local LIS2DH12_INT1_DURATION = 0x33
|
|
|
+local LIS2DH12_INT2_CFG = 0x34
|
|
|
+local LIS2DH12_INT2_SRC = 0x35
|
|
|
+local LIS2DH12_INT2_THS = 0x36
|
|
|
+
|
|
|
+local LIS2DH12_INT2_DURATION = 0x37
|
|
|
+local LIS2DH12_CLICK_CFG = 0x38
|
|
|
+local LIS2DH12_CLICK_SRC = 0x39
|
|
|
+local LIS2DH12_CLICK_THS = 0x3A
|
|
|
+local LIS2DH12_TIME_LIMIT = 0x3B
|
|
|
+local LIS2DH12_TIME_LATENCY = 0x3C
|
|
|
+local LIS2DH12_TIME_WINDOW = 0x3D
|
|
|
+local LIS2DH12_ACT_THS = 0x3E
|
|
|
+local LIS2DH12_ACT_DUR = 0x3F
|
|
|
+
|
|
|
+local LIS2DH12_POWER_DOWN = 0
|
|
|
+local LIS2DH12_ODR_1Hz = 1
|
|
|
+local LIS2DH12_ODR_10Hz = 2
|
|
|
+local LIS2DH12_ODR_25Hz = 3
|
|
|
+local LIS2DH12_ODR_50Hz = 4
|
|
|
+local LIS2DH12_ODR_100Hz = 5
|
|
|
+local LIS2DH12_ODR_200Hz = 6
|
|
|
+local LIS2DH12_ODR_400Hz = 7
|
|
|
+local LIS2DH12_ODR_1kHz620_LP = 8
|
|
|
+local LIS2DH12_ODR_5kHz376_LP = 9
|
|
|
+local LIS2DH12_ODR_1kHz344_NM_HP = 9
|
|
|
+
|
|
|
+local LIS2DH12_2g = 0
|
|
|
+local LIS2DH12_4g = 1
|
|
|
+local LIS2DH12_8g = 2
|
|
|
+local LIS2DH12_16g = 3
|
|
|
+
|
|
|
+local LIS2DH12_HR_12bit = 0
|
|
|
+local LIS2DH12_NM_10bit = 1
|
|
|
+local LIS2DH12_LP_8bit = 2
|
|
|
+
|
|
|
+local PROPERTY_DISABLE = 0
|
|
|
+local PROPERTY_ENABLE = 1
|
|
|
+
|
|
|
+local LIS2DH12_TEMP_DISABLE = 0
|
|
|
+local LIS2DH12_TEMP_ENABLE = 3
|
|
|
+
|
|
|
+--器件ID检测
|
|
|
+local function chip_check()
|
|
|
+ i2c.send(i2cid, LIS2DH12_ADDRESS_ADR_LOW, LIS2DH12_CHIP_ID_CHECK)--读器件地址
|
|
|
+ local revData = i2c.recv(i2cid, LIS2DH12_ADDRESS_ADR_LOW, 1)
|
|
|
+ if revData:byte() ~= nil then
|
|
|
+ LIS2DH12_ADDRESS_ADR = LIS2DH12_ADDRESS_ADR_LOW
|
|
|
+ else
|
|
|
+ i2c.send(i2cid, LIS2DH12_ADDRESS_ADR_HIGH, LIS2DH12_CHIP_ID_CHECK)--读器件地址
|
|
|
+ sys.wait(50)
|
|
|
+ local revData = i2c.recv(i2cid, LIS2DH12_ADDRESS_ADR_HIGH, 1)
|
|
|
+ if revData:byte() ~= nil then
|
|
|
+ LIS2DH12_ADDRESS_ADR = LIS2DH12_ADDRESS_ADR_HIGH
|
|
|
+ else
|
|
|
+ log.info("i2c", "Can't find lis2dh12 device")
|
|
|
+ return false
|
|
|
+ end
|
|
|
+ end
|
|
|
+ i2c.send(i2cid, LIS2DH12_ADDRESS_ADR, LIS2DH12_CHIP_ID_CHECK)--读器件地址
|
|
|
+ sys.wait(50)
|
|
|
+ local revData = i2c.recv(i2cid, LIS2DH12_ADDRESS_ADR, 1)
|
|
|
+ if revData:byte() == LIS2DH12_CHIP_ID then
|
|
|
+ log.info("Device i2c id is: lis2dh12")
|
|
|
+ else
|
|
|
+ log.info("i2c", "Can't find lis2dh12 device")
|
|
|
+ return false
|
|
|
+ end
|
|
|
+ return true
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_read_reg(reg)
|
|
|
+ i2c.send(i2cid, LIS2DH12_ADDRESS_ADR,reg)
|
|
|
+ return i2c.recv(i2cid, LIS2DH12_ADDRESS_ADR, 1):byte(1)
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_write_reg(reg,val)
|
|
|
+ i2c.send(i2cid, LIS2DH12_ADDRESS_ADR,{reg,val})
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_block_data_update_set(val)
|
|
|
+ local rdval = lis2dh12_read_reg(LIS2DH12_CTRL_REG4)
|
|
|
+ val = (val==1) and 0x80 or 0x00
|
|
|
+ rdval = bit.band(rdval,0x7F)
|
|
|
+ rdval = bit.bor(rdval, val)
|
|
|
+ lis2dh12_write_reg(LIS2DH12_CTRL_REG4,rdval)
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_data_rate_set(val)
|
|
|
+ val = bit.lshift(bit.band(val,0x0F),4)
|
|
|
+ local rdval = lis2dh12_read_reg(LIS2DH12_CTRL_REG1)
|
|
|
+ rdval = bit.band(rdval,0x0F)
|
|
|
+ rdval = bit.bor(rdval, val)
|
|
|
+ lis2dh12_write_reg(LIS2DH12_CTRL_REG1,rdval)
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_full_scale_set(val)
|
|
|
+ val = bit.lshift(bit.band(val,0x03),4)
|
|
|
+ local rdval = lis2dh12_read_reg(LIS2DH12_CTRL_REG4)
|
|
|
+ rdval = bit.band(rdval,0xCF)
|
|
|
+ rdval = bit.bor(rdval, val)
|
|
|
+ lis2dh12_write_reg(LIS2DH12_CTRL_REG4,rdval)
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_temperature_meas_set( val)
|
|
|
+ val = bit.lshift(bit.band(val,0x03),6)
|
|
|
+ local rdval = lis2dh12_read_reg(LIS2DH12_TEMP_CFG_REG)
|
|
|
+ rdval = bit.band(rdval,0x3F)
|
|
|
+ rdval = bit.bor(rdval, val)
|
|
|
+ lis2dh12_write_reg(LIS2DH12_TEMP_CFG_REG,rdval)
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_operating_mode_set(val)
|
|
|
+ local rdval, lpen, hr
|
|
|
+ if val == LIS2DH12_HR_12bit then
|
|
|
+ lpen = 0x00
|
|
|
+ hr = 0x08
|
|
|
+ elseif val == LIS2DH12_NM_10bit then
|
|
|
+ lpen = 0x00
|
|
|
+ hr = 0x00
|
|
|
+ elseif val == LIS2DH12_LP_8bit then
|
|
|
+ lpen = 0x80
|
|
|
+ hr = 0x00
|
|
|
+ end
|
|
|
+ rdval = lis2dh12_read_reg(LIS2DH12_CTRL_REG1)
|
|
|
+ rdval = bit.band(rdval,0xF7)
|
|
|
+ rdval = bit.bor(rdval, lpen)
|
|
|
+ lis2dh12_write_reg(LIS2DH12_CTRL_REG1,rdval)
|
|
|
+
|
|
|
+ rdval = lis2dh12_read_reg(LIS2DH12_CTRL_REG4)
|
|
|
+ rdval = bit.band(rdval,0xF7)
|
|
|
+ rdval = bit.bor(rdval, hr)
|
|
|
+ lis2dh12_write_reg(LIS2DH12_CTRL_REG4,rdval)
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_status_get()
|
|
|
+ return lis2dh12_read_reg(LIS2DH12_STATUS_REG)
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_temp_data_ready_get()
|
|
|
+ local rdval = lis2dh12_read_reg(LIS2DH12_STATUS_REG_AUX)
|
|
|
+ return bit.band(rdval,0x20)
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_acceleration_raw_get()
|
|
|
+ local xl,xh,yl,yh,zl,zh,x,y,z
|
|
|
+ xl = lis2dh12_read_reg(LIS2DH12_OUT_X_L)
|
|
|
+ xh = lis2dh12_read_reg(LIS2DH12_OUT_X_H)
|
|
|
+ yl = lis2dh12_read_reg(LIS2DH12_OUT_Y_L)
|
|
|
+ yh = lis2dh12_read_reg(LIS2DH12_OUT_Y_H)
|
|
|
+ zl = lis2dh12_read_reg(LIS2DH12_OUT_Z_L)
|
|
|
+ zh = lis2dh12_read_reg(LIS2DH12_OUT_Z_H)
|
|
|
+ x = xh * 256 + xl
|
|
|
+ y = yh * 256 + yl
|
|
|
+ z = zh * 256 + zl
|
|
|
+ return x,y,z
|
|
|
+end
|
|
|
+
|
|
|
+local function lis2dh12_temperature_raw_get()
|
|
|
+ local tl,th
|
|
|
+ tl = lis2dh12_read_reg(LIS2DH12_OUT_TEMP_L)
|
|
|
+ th = lis2dh12_read_reg(LIS2DH12_OUT_TEMP_H)
|
|
|
+ return th * 256 + tl
|
|
|
+
|
|
|
+end
|
|
|
+
|
|
|
+--器件初始化
|
|
|
+function lis2dh12.init(i2c_id)
|
|
|
+ i2cid = i2c_id
|
|
|
+ sys.wait(20)
|
|
|
+ if chip_check() then
|
|
|
+ lis2dh12_block_data_update_set(PROPERTY_ENABLE)
|
|
|
+ lis2dh12_data_rate_set(LIS2DH12_ODR_10Hz)
|
|
|
+ lis2dh12_full_scale_set(LIS2DH12_2g)
|
|
|
+
|
|
|
+ lis2dh12_temperature_meas_set(LIS2DH12_TEMP_ENABLE)
|
|
|
+ lis2dh12_operating_mode_set(LIS2DH12_HR_12bit)
|
|
|
+ sys.wait(20)--跳过首次数据
|
|
|
+ log.info("lis2dh12 init_ok")
|
|
|
+ return true
|
|
|
+ end
|
|
|
+ return false
|
|
|
+end
|
|
|
+
|
|
|
+local function LIS2DH12_FROM_FS_2g_HR_TO_mg(lsb) return (bit.rshift(lsb,4)) * 1.0 end
|
|
|
+local function LIS2DH12_FROM_FS_4g_HR_TO_mg(lsb) return (bit.rshift(lsb,4)) * 2.0 end
|
|
|
+local function LIS2DH12_FROM_FS_8g_HR_TO_mg(lsb) return (bit.rshift(lsb,4)) * 4.0 end
|
|
|
+local function LIS2DH12_FROM_FS_16g_HR_TO_mg(lsb) return (bit.rshift(lsb,4)) * 12.0 end
|
|
|
+local function LIS2DH12_FROM_LSB_TO_degC_HR(lsb) return (bit.rshift(lsb,6)) / 4.0 +25.0 end
|
|
|
+
|
|
|
+--[[
|
|
|
+获取lis2dh12数据
|
|
|
+@api lis2dh12.get_data()
|
|
|
+@return table lis2dh12数据
|
|
|
+@usage
|
|
|
+local lis2dh12_data = lis2dh12.get_data()
|
|
|
+log.info("lis2dh12_data", "lis2dh12_data.x"..(lis2dh12_data.x),"lis2dh12_data.y"..(lis2dh12_data.y),"lis2dh12_data.z"..(lis2dh12_data.z),"lis2dh12_data.temp"..(lis2dh12_data.temp))
|
|
|
+]]
|
|
|
+
|
|
|
+function lis2dh12.get_data()
|
|
|
+ local lis2dh12_data={}
|
|
|
+ lis2dh12_data.raw_x,lis2dh12_data.raw_y,lis2dh12_data.raw_z = lis2dh12_acceleration_raw_get()
|
|
|
+ if lis2dh12_temp_data_ready_get() >0 then
|
|
|
+ local temp_raw = lis2dh12_temperature_raw_get()
|
|
|
+ lis2dh12_data.temp = LIS2DH12_FROM_LSB_TO_degC_HR(temp_raw)
|
|
|
+ end
|
|
|
+ -- x, y, z 轴加速度
|
|
|
+ local acc_x = math.abs(LIS2DH12_FROM_FS_2g_HR_TO_mg(lis2dh12_data.raw_x))
|
|
|
+ local acc_y = math.abs(LIS2DH12_FROM_FS_2g_HR_TO_mg(lis2dh12_data.raw_y))
|
|
|
+ local acc_z = math.abs(LIS2DH12_FROM_FS_2g_HR_TO_mg(lis2dh12_data.raw_z))
|
|
|
+
|
|
|
+ lis2dh12_data.x = acc_x
|
|
|
+ lis2dh12_data.y = acc_y
|
|
|
+ lis2dh12_data.z = acc_z
|
|
|
+
|
|
|
+ -- 重力加速度
|
|
|
+ lis2dh12_data.acc_g = math.sqrt(math.pow(acc_x, 2) + math.pow(acc_y, 2) + math.pow(acc_z, 2))
|
|
|
+
|
|
|
+ if acc_z > lis2dh12_data.acc_g then
|
|
|
+ acc_z = lis2dh12_data.acc_g
|
|
|
+ end
|
|
|
+
|
|
|
+ -- angle_z/90 = asin(acc_z/acc_g)/π/2
|
|
|
+ local angle_z = math.asin(acc_z/lis2dh12_data.acc_g) * 2 / 3.14 * 90
|
|
|
+ angle_z = 90 - angle_z
|
|
|
+ if angle_z < 0 then
|
|
|
+ angle_z = 0
|
|
|
+ end
|
|
|
+ lis2dh12_data.angle_z = angle_z
|
|
|
+
|
|
|
+ return lis2dh12_data
|
|
|
+end
|
|
|
+
|
|
|
+return lis2dh12
|
|
|
+
|
|
|
+
|
|
|
+
|