跳转至

exvib - exvib 三轴加速度传感器扩展库

作者:李源龙

一、概述

  1. exvib.lua可适用于合宙内部集成了G-Sensor加速度传感器DA221的模组型号, 目前仅有Air8000系列模组内置了DA221,Air7000推出时也会内置该型号G-Sensor;

  2. DA221在Air8000内部通过I2C1与之通信,并通过WAKEUP2接收运动监测中断, 如您使用合宙其它型号模组外接DA221时,比如Air780EGH,建议与Air8000保持一致也选用I2C1和WAKEUP2 (该管脚即为Air780EGH的PIN79:USIM_DET),这样便可以无缝使用本扩展库,DA221的供应商为苏州明皜 如需采购DA221或者其他更高端的加速度传感器可以联系他们;

  3. DA221作为加速度传感器,LuatOS仅支持运动检测这一功能,主要用于震动检测,运动检测,跌倒检测, 搭配GNSS实现震动然后定位的功能,其余功能请自行研究,合宙提供了三种应用场景,如果需要适配自己的场景需求, 请参考手册参数自行修改代码,调试适合自己场景的传感器值,合宙不提供DA221任何其它功能的任何形式的技术支持;

关于exvib库的三种模式主要用于以下场景: 1,微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面;加速度量程2g; 2,运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程4g; 3,跌倒检测,用于人或物体瞬间跌倒时的检测;加速度量程8g;

二、核心示例

-- 用法实例

exvib=require("exvib")

local intPin=gpio.WAKEUP2   --中断检测脚,内部固定wakeup2
local tid   --获取定时打开的定时器id
local num=0 --计数器 
local ticktable={0,0,0,0,0} --存放5次中断的tick值,用于做有效震动对比
local eff=false --有效震动标志位,用于判断是否触发定位

gpio.setup(164, 1, gpio.PULLUP) -- air8000整机板需要大概该电源控制i2c上电 和音频解码芯片共用,自己设计可以忽略掉
gpio.setup(147, 1, gpio.PULLUP) -- air8000整机板需要大概该电源控制i2c上电 camera的供电使能脚,自己设计可以忽略掉
--有效震动模式
--tick计数器,每秒+1用于存放5次中断的tick值,用于做有效震动对比
local function tick()
    num=num+1
end
--每秒运行一次计时
sys.timerLoopStart(tick,1000)

--有效震动判断
local function ind()
    log.info("int", gpio.get(intPin))
    if gpio.get(intPin) == 1 then
        --接收数据如果大于5就删掉第一个
        if #ticktable>=5 then
            log.info("table.remove",table.remove(ticktable,1))
        end
        --存入新的tick值
        table.insert(ticktable,num)
        log.info("tick",num,(ticktable[5]-ticktable[1]<10),ticktable[5]>0)
        log.info("tick2",ticktable[1],ticktable[2],ticktable[3],ticktable[4],ticktable[5])
        --表长度为5且,第5次中断时间间隔减去第一次间隔小于10s,且第5次值为有效值
        if #ticktable>=5 and (ticktable[5]-ticktable[1]<10 and ticktable[1]>0) then
            log.info("vib", "xxx")
            --是否要去触发有效震动逻辑
            if eff==false then
                sys.publish("EFFECTIVE_VIBRATION")
            end
        end
    end
end

--设置30s分钟之后再判断是否有效震动函数
local function num_cb()
    eff=false
end

local function eff_vib()
    log.info("触发有效震动")
    --触发之后eff设置为true,30分钟之后再触发有效震动
    eff=true
    --30分钟之后再触发有效震动
    sys.timerStart(num_cb,180000)
end

sys.subscribe("EFFECTIVE_VIBRATION",eff_vib)



--持续震动模式
--持续震动模式中断函数
-- local function ind()
--     log.info("int", gpio.get(intPin))
--     --上升沿为触发震动中断
--     if gpio.get(intPin) == 1 then
--         local x,y,z =  exvib.read_xyz()      --读取x,y,z轴的数据
--         log.info("x", x..'g', "y", y..'g', "z", z..'g')
--     end
-- end


local function vib_fnc()
    -- 1,微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面;加速度量程2g;
    -- 2,运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程4g;
    -- 3,跌倒检测,用于人或物体瞬间跌倒时的检测;加速度量程8g;
    --打开震动检测功能
    exvib.open(1)
    --设置gpio防抖100ms
    gpio.debounce(intPin, 100)
    --设置gpio中断触发方式wakeup2唤醒脚默认为双边沿触发
    gpio.setup(intPin, ind)

end

sys.taskInit(vib_fnc)

三、常量详解

exvib扩展库没有常量。

四、函数详解

exvib.read_xyz()

功能

获取da221的xyz轴数据

注意事项

读取x,y,z轴的数据,需要注意的是,x,y,z轴数据在静止状态下,因为数据有噪声,所以x,y,z轴数据不会为固定值,数据会有微小的变化,所有传感器都有噪声,这个是无法避免的。

参数

返回值

local x,y,z = exvib.read_xyz()

x

-- 参数含义:x轴数据;
-- 数据类型:number;
-- 取值范围:无特别限制;
-- 注意事项:无;

y

-- 参数含义:y轴数据;
-- 数据类型:number;
-- 取值范围:无特别限制;
-- 注意事项:无;

z

-- 参数含义:z轴数据;
-- 数据类型:number;
-- 取值范围:无特别限制;
-- 注意事项:无;

示例

local x,y,z =  exvib.read_xyz()      --读取x,y,z轴的数据,需要注意的是,x,y,z轴数据在静止状态下,因为数据有噪声,所以x,y,z轴数据不会为固定值,数据会有微小的变化,所有传感器都有噪声,这个是无法避免的。
log.info("x", x..'g', "y", y..'g', "z", z..'g')

exvib.open(mode)

功能

打开da221三轴加速度传感器

注意事项

提供了三种应用模式,可以根据自己的应用场景进行选择,也可以自己对扩展库的值进行修改。

参数

mode

参数含义:加速度传感器的应用模式;
数据类型:number
取值范围:1 - 微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面,加速度量程2g
        2 - 运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测,加速度量程4g
        3 - 跌倒检测,用于人或物体瞬间跌倒时的检测,加速度量程8g
是否必选:是;
注意事项:作为必需参数,若不提供会导致错误;
示例代码:exvib.open(1)

返回值

示例

    local intPin=gpio.WAKEUP2   --中断检测脚,内部固定wakeup2

--持续震动模式
--持续震动模式中断函数
local function ind()
    log.info("int", gpio.get(intPin))
    --上升沿为触发震动中断
    if gpio.get(intPin) == 1 then
        local x,y,z =  exvib.read_xyz()      --读取x,y,z轴的数据
        log.info("x", x..'g', "y", y..'g', "z", z..'g')
    end
end

-- 1,微小震动检测,用于检测轻微震动的场景,例如用手敲击桌面;加速度量程2g;
-- 2,运动检测,用于电动车或汽车行驶时的检测和人行走和跑步时的检测;加速度量程4g;
-- 3,跌倒检测,用于人或物体瞬间跌倒时的检测;加速度量程8g;
--打开震动检测功能
exvib.open(1)
--设置gpio防抖100ms
gpio.debounce(intPin, 100)
--设置gpio中断触发方式wakeup2唤醒脚默认为双边沿触发
gpio.setup(intPin, ind)

exvib.close()

功能

关闭da221三轴加速度传感器

注意事项

暂无

参数

返回值

示例

exvib.close()

五、产品支持说明

Air8000,Air8000A,Air8000G,Air8000D支持exvib扩展库