跳转至

Air8000-软件指南-如何使用 GSENSOR 功能

一、GSENSOR 概述

gsensor 即 G-sensor,重力传感器,又名加速度传感器。Air8000 使用的 G-sensor 传感器型号是 da221。

da221 传感器是一种低功耗、高性能的电容式三轴线性加速度计,采用微机械技术开发。该器件采用 2x2x1.1 mm 的 LGA 封装,保证在 -40°C 至 +85°C 的宽温度范围内工作。传感器元件采用单晶硅通过 DRIE 工艺制造,并通过密封的硅帽保护免受环境影响。该器件具有用户可选的 ±2g/±4g/±8g 满量程测量范围,数据输出速率从 1Hz 到 1 kHz,并集成了信号调节和主动检测功能。da221 具有断电模式,非常适合手机电源管理。一个独立且灵活的中断大大简化了各种运动状态检测的算法。

二、演示功能概述

本示例将演示如何读取 da221 传感器的三轴数据和中断输出。

三、准备硬件环境

3.1 Air8000 模组

使用 Air8000 开发套件,如下图所示:

淘宝购买链接:Air8000 开发套件淘宝购买链接

此开发套件的详细使用说明参考:Air8000 产品手册

3.2 PC 电脑

WIN10以及以上版本的Windows系统;

3.3 da221 传感器

da221 传感器是 Air8000 模块自带的,不用另外买。

3.4 数据通信线

USB 数据线(其一端为 Type-C 接口,用于连接 Air8000)。

四、准备软件环境

4.1 下载调试工具

使用说明参考:Luatools 下载和详细使用

五、软硬件资料

5.1 源码及固件

5.2 demo 使用 api 介绍

本教程使用 api 接口为:

https://docs.openluat.com/air8000/luatos/api/core/i2c/

六、代码示例介绍

6.1 Air8000 中断设置

6.1.1 硬件连接

在Air8000模块内部 da221 传感器的 INT 引脚已经连接到处理器的 GPIO 39 引脚。

6.1.2 中断触发方式

当传感器检测到运动(根据 INT_MAP1 等寄存器配置)时,会改变 INT 引脚电平 默认情况下,当引脚电平变化(上升沿或下降沿)时会触发中断。

6.1.3 回调机制

每次中断触发时,系统会自动调用 ind() 函数 在 ind() 中您可以处理传感器数据(如加速度数据)

6.2 初始化 I2C

6.2.1 复用 I2C 引脚

--[[io外设功能复用选择        @param1 将I2C功能        @param2 复用到总线序号为i2cId        @param3 pad号为13        @param4 复用功能序号为2        @param5 不是输入功能    ]]
mcu.altfun(mcu.I2C, i2cId, 13, 2, 0)
mcu.altfun(mcu.I2C, i2cId, 14, 2, 0)

6.2.2 配置 i2C

重新打开 i2c,i2c 速度设置为低速模式。

--关闭i2c,防止其他使用过
i2c.close(i2cId)
--重新打开i2c,i2c速度设置为低速
i2c.setup(i2cId, i2c.SLOW)

6.3 初始化 gsensor

6.3.1 配置 da221 的精度,测量范围等。

设置激活时间,设置模式,采样率等。

ACTIVE_DUR (27H) 寄存器用于配置 "活动状态"(active)和 "非活动状态"(inactive)的判定持续时间,结合自动睡眠/唤醒功能(如 MODE_BW 寄存器中的 autosleep_en)可实现智能功耗管理。

ACTIVE_THS (28H) 寄存器用于配置 "活动中断"(active interrupt)的加速度阈值,当传感器检测到的加速度超过此阈值时,会触发中断(需配合 INT_SET1 等寄存器使能)。

MODE_BW 的寄存器(地址为 11H),用于控制设备的电源模式、带宽和自动睡眠功能。

ODR_AXIS 的寄存器(地址为 10H),用于控制设备的数据输出速率(ODR - Output Data Rate)

具体代码如下

-- 设置寄存器
    i2c.send(i2cId, da221Addr, active_dur_addr, 1)-- 设置激活时间,默认0x00
    sys.wait(5)
    i2c.send(i2cId, da221Addr, active_ths_addr, 1)-- 设置激活阈值
    sys.wait(5)
    i2c.send(i2cId, da221Addr, mode_addr, 1)-- 设置模式
    sys.wait(5)
    i2c.send(i2cId, da221Addr, odr_addr, 1)-- 设置采样率
    sys.wait(5)

6.3.2 配置中断

INT_SET1 (16H) 寄存器用于配置 传感器的中断触发方式 和 各轴(X/Y/Z)的中断使能,适用于运动检测、姿态识别等场景。

INT_LATCH (21H) 寄存器用于配置 中断信号的锁存(保持)时间,决定中断触发后信号保持的时间长度,适用于防抖、多事件捕获等场景。

具体代码如下

i2c.send(i2cId, da221Addr, int_set1_reg, 1)--设置x,y,z发生变化时,产生中断
sys.wait(5)
i2c.send(i2cId, da221Addr, int_latch_addr, 1)-- 设置中断锁存 中断一旦触发将保持,直到手动清除
sys.wait(5)

6.3.3 将中断映射到 INT 引脚

当 XYZ 轴合成的加速度超过阈值时,gsensor 传感器就可以产生中断,当中断产生时,这个状态可以映射到 INT 引脚,然后模块与 INT 引脚相连的引脚检测到中断信息后,就可以进行自己的业务处理。

i2c.send(i2cId, da221Addr, int_map1_reg, 1)--运动的时候,产生中断
sys.wait(5)

6.3.4 配置 gsensor 模式,使能 XYZ 轴

-- 配置gsensor为正常模式,使能XYZ轴,禁用自测。
i2c.send(i2cId, da267Addr, {0x11, 0x30}, 1)

6.4 中断处理代码

local function ind()
    logF("int", gpio.get(intPin))
    --gsensor()  -- 调用gsensor函数,计算设备是否处于运动状态
    if gpio.get(intPin) == 1 then
        -- interruptCount = interruptCount + 1  -- 增加计数器
        -- if interruptCount >= 2 then  -- 判断是否达到2次
        --     gsensor()  -- 调用gsensor函数
        --     interruptCount = 0  -- 重置计数器
        -- end
        -- manage.setLastCrashLevel()
        --读取x,y,z轴的数据
        i2c.send(i2cId, da221Addr, 0x02, 1)
        local data = i2c.recv(i2cId, da221Addr, 6)
        if data and #data == 6 then
            logF("XYZ ORIGIN DATA", data:toHex())
            local xl, xm, yl, ym, zl, zm = string.byte(data, 1, 1), string.byte(data, 2, 2), string.byte(data, 3, 3), string.byte(data, 4, 4), string.byte(data, 5, 5), string.byte(data, 6, 6)
            local x, y, z = (xm << 8 | xl) >> 4, (ym << 8 | yl) >> 4, (zm << 8 | zl) >> 4
            logF("x:", x, "y:", y, "z:", z)
        else
            sys.publish("RESTORE_GSENSOR")
            return
        end

    end
end

6.4 传感器数据读取

- 读取三轴速度
            i2c.send(i2cId, da221Addr, x_lsb_reg, 1)
            local recv_data_xyz = i2c.recv(i2cId, da221Addr, 6)
            local hex_data_xyz = stringToBytes(recv_data_xyz:toHex())
            log.info("recv_data_xyz", recv_data_xyz:toHex())
            if recv_data_xyz and #recv_data_xyz == 6 then
                -- local data_xyz = {}
                -- for i = 1, #recv_data_xyz do
                --     -- 将提取的子字符串添加到结果表中
                --     table.insert(data_xyz, recv_data_xyz:sub(i, i):toHex())
                -- end
                -- data_xyz = data_xyz:byte()
                log.info(string.format("Byte: %02X %02X %02X %02X %02X %02X", hex_data_xyz[1], hex_data_xyz[2], hex_data_xyz[3], hex_data_xyz[4], hex_data_xyz[5], hex_data_xyz[6]))
                -- 提取X轴数据
                local acc_x = ((hex_data_xyz[2] << 8)|hex_data_xyz[1])>>4;
                -- 提取Y轴数据
                local acc_y = ((hex_data_xyz[4] << 8)|hex_data_xyz[3])>>4;
                -- 提取Z轴数据
                local acc_z = ((hex_data_xyz[6] << 8)|hex_data_xyz[5])>>4;
                log.info(string.format("acc_x %.1f", acc_x))
                log.info(string.format("acc_y %.1f", acc_y))
                log.info(string.format("acc_z %.1f", acc_z))
                -- sys.publish("gsensor", {x = acc_x, y = acc_y, z = acc_z})

6.5 异常处理

当读取 XYZ 轴和计步数据时,如果读取的数据不正确,则会发布一个消息 RESTORE_GSENSOR,可以通过监听到这个消息来判断传感器工作是否正常,以及做一些特殊处理。

if data and #data == 6 then
            logF("XYZ ORIGIN DATA", data:toHex())
            local xl, xm, yl, ym, zl, zm = string.byte(data, 1, 1), string.byte(data, 2, 2), string.byte(data, 3, 3), string.byte(data, 4, 4), string.byte(data, 5, 5), string.byte(data, 6, 6)
            local x, y, z = (xm << 8 | xl) >> 4, (ym << 8 | yl) >> 4, (zm << 8 | zl) >> 4
            logF("x:", x, "y:", y, "z:", z)
        else
            sys.publish("RESTORE_GSENSOR")
            return
        end

七、结果验证

7.1 传感器初始打印相关信息。

7.2 读取三轴数据,解析显示出来。

7.3 每 4 秒钟读取一次传感器数据。

7.4 中断输出日志数据。

八、总结

本示例介绍了如何使用 da221 传感器,读取传感器数据状态。