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 源码及固件
- Air8000 模组使用固件:https://gitee.com/openLuat/LuatOS-Air8000/tree/master/core,本 demo 使用的固件版本是:LuatOS-SoC_V2005_Air8000.soc
- 脚本资源文件:https://gitee.com/openLuat/LuatOS-Air8000/tree/master/Core_board_demo
- 将固件和脚本烧录到模块中:Luatools 下载和使用教程 - 合宙模组资料中心
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 传感器,读取传感器数据状态。