LiteOS基于Sensorhub的超声波模组移植
摘要:本文为你带来LiteOS基于Sensorhub的超声波模组移植的应用。
1、Sensor Hub
LiteOS传感框架即Sensor Hub,是一个基于Huawei LiteOS物联网操作系统的传感器管理框架。
随着物联网的发展,物联网终端越来越智能化,例如在个人穿戴、智能家居、家用医疗等终端上将配置越来越多的传感器,来获取更多传感数据,使终端更加智能,使得开发和维护变得复杂和困难。LiteOS传感框架将物联网终端设备上例如加速计(Accelerometer)、陀螺仪(Gyroscope)、气压仪(Barometer)、温湿度计(Humidometer)等不同类型的传感器统一管理,通过抽象不同类型传感器接口,屏蔽其硬件细节,做到“硬件”无关性,非常方便于物联网设备的开发、维护和功能扩展。
LiteOS传感框架主要包括了Sensor Manager、BSP manager,Converged Algorithms。
- Sensor Manager:统一的传感器交互管理,如Sensor的配置、采样、上报和管理。
- BSP Manager:统一的驱动接口,负责Sensor驱动管理、电源管理、Sensor交互管理,如Sensor的打开、关闭、读写、数据更新等。
- Converged Algorithms:融合算法库(算法基于具体的业务模型),根据具体业务模型,在端侧MCU进行算法融合,例如环境监测算法、计步算法等,从传统、简单采集算法升级到智能算法,应用直接调用,提升传感数据的业务精准度,降低数据采集时延。
2、SR04超声波模组
HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超声波发射器、接收器与控制电路。基本工作原理:(1)采用IO口TRIG触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO口ECHO输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;2、实物图:如右图接线,VCC供5V电源,GND为地线,TRIG触发控制信号输入,ECHO回响信号输出等四支线。图一实物图3、电气参数:电气参数HC-SR04超声波模块工作电压DC 5 V工作电流15mA工作频率40Hz最远射程4m最近射程2cm测量角度15度输入触发信号10uS的TTL脉冲输出回响信号输出TTL电平信号,与射程成比例规格尺寸45*20*15mm。


从时序图表明你只需要提供一个10uS以上脉冲触发信号,该模块内部将发出8个40kHz周期电平并检测回波。一旦检测到有回波信号则输出回响信号。回响信号的脉冲宽度与所测的距离成正比。由此通过发射信号到收到的回响信号时间间隔可以计算得到距离。公式:uS/58=厘米或者uS/148=英寸;或是:距离=高电平时间*声速(340M/S)/2;建议测量周期为60ms以上,以防止发射信号对回响信号的影响。
3、sensorhub的HC-SR04驱动
通过时序图可以完成一个简单的读取传感器的接收程序:(这里用GPIOA1和GPIOA4举例)
uint32_t hcsr04_read (void)
{
local_time=0;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // pull the TRIG pin HIGH
delay(2); // wait for 2 us HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // pull the TRIG pin HIGH
delay(10); // wait for 10 us
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // pull the TRIG pin low // read the time for which the pin is high while (!(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4))); // wait for the ECHO pin to go high
while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)) // while the pin is high
{
local_time++; // measure time for which the pin is high
delay (1);
}
return local_time * .034/2;
}
4、将驱动注册到SensorHub上
先写iO操作,初始化、打开、关闭和读取数据的操作
STATIC INT32 SR04Init(SensorType *sensor)
{
(VOID)(sensor); GPIO_InitTypeDef GPIO_InitStruct; /* GPIO Ports Clock Enable */
__HAL_RCC_GPIOA_CLK_ENABLE(); /*Configure GPIO pin : PD11 */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /*Configure GPIO pins : PD12 PD13 PD14 PD15 */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); return LOS_OK;
}
STATIC INT32 SR04ReadData(SensorType *sensor)
{
PRINTK("read data\n");
INT32 *data = (INT32 *)sensor->sensorData;
data[0] = hcsr04_read();
return LOS_OK;
}
STATIC INT32 SR04Open(SensorType *sensor, OpenParam *para)
{
UINT32 ret;
(VOID)(para); SR04 *SR04 = (SR04 *)sensor->priv; if ((sensor->sensorStat == SENSOR_STAT_OPEN) && (sensor->interval == SR04Period)) {
return LOS_OK;
} if (SR04->gyroTimerId != INVALID_TIMER_ID) {
ret = LOS_SwtmrDelete(SR04->gyroTimerId);
SR04->gyroTimerId = INVALID_TIMER_ID;
if (ret != LOS_OK) {
PRINT_ERR("delete a timer failed!\n");
return LOS_NOK;
}
} // creat a timer, first parameter is ticks.
ret = LOS_SwtmrCreate(sensor->interval, LOS_SWTMR_MODE_PERIOD, (SWTMR_PROC_FUNC)GypoTimerFunc, &SR04->gyroTimerId, (UINT32)sensor);
if (ret != LOS_OK) {
PRINT_ERR("creat a timer failed!\n");
return LOS_NOK;
} ret = LOS_SwtmrStart(SR04->gyroTimerId);
if (ret != LOS_OK) {
PRINT_ERR("start timer err\n");
} SR04Period = sensor->interval; PRINTK("SR04 on.\n");
return LOS_OK;
} STATIC INT32 SR04Close(SensorType *sensor)
{
UINT32 ret; if (sensor->sensorStat == SENSOR_STAT_CLOSE) {
PRINT_DEBUG("sr04 has been closed\n");
return LOS_OK;
} __HAL_RCC_GPIOA_CLK_DISABLE(); PRINTK("SR04 off.\n");
return LOS_OK;
}
然后将设计的驱动注册到框架上
STATIC struct SensorOperation Sr04Ops = {
.Init = SR04Init,
.Open = SR04Open,
.Close = SR04Close,
.ReadData = SR04ReadData,
};
STATIC SensorType g_sensorSR04 = {
.sensorOp = &Sr04Ops,
.sensorData = &g_SR04Data,
.sensorDataLen = sizeof(g_SR04Data),
.priv = &g_SR04Priv,
.tag = TAG_BEGIN,
.cmd = CMD_CMN_INTERVAL_REQ,
.interval = DEFAULT_INTERVAL,
};
VOID SR04Register(VOID)
{
SensorRegister(&g_sensorSR04);
}
将驱动注册到通用sensor驱动模块上。今天的代码移植基本完成,后续有传感器和板子进行验证
总结
这个驱动是有问题,就是这个是读取时阻塞的程序,后面试过,需要设计时采用定时器和外部中断完成,可以将这个阻塞的程序改成非阻塞的,效率大大提升,后续讲解如何用定时器和外部触发中断完成这个驱动设计。
LiteOS基于Sensorhub的超声波模组移植的更多相关文章
- 基于s5pv210嵌入式系统busybox文件系统移植
基于s5pv210嵌入式系统busybox文件系统移植 1.下载源码 busybox.net/downloads下载最新版的busybox源码,最新源码为1.21.1 2.解压源码文件 tar xvf ...
- 基于ILI9341的TFT液晶显示模组LCM240320详解(1)
Hello,大家好,今天我们来讨论当下非常流行的TFT液晶显示模组,它最大的特点是可以显示出效果非常好的彩色信息,绝大多数手机.液晶显示器,液晶电视.MID.MP4等产品都在使用它,你想抗拒它的魅力还 ...
- 【转】基于linux下的dm9000网卡移植全分析
转自:http://blog.sina.com.cn/s/blog_6abf2c04010189ui.html DM9000可以直接与ISA总线相连,也可以与大多数CPU直接相连.Mini2440采用 ...
- 基于IAR和STM32的uCOS-II移植
网上基于MDK的移植数不胜数,但是基于IAR的移植几乎没有,因为官方的例程就是基于IAR的,所以移植起来很简单,没人介绍,但还是得小心谨慎,一不小心就出错,对于新手来说,查找错误可不是那么容易的.IA ...
- MCP|ZWT|Precision de novo peptide sequencing using mirror proteases of Ac-LysargiNase and trypsin for large-scale proteomics(基于Ac-LysargiNase和胰蛋白酶的蛋白组镜像de novo测序)
一.概述 由于难以获得100%的蛋白氨基酸序列覆盖率,蛋白组de novo测序成为了蛋白测序的难点,由Ac-LysargiNase(N端蛋白酶)和胰蛋白酶构成的镜像酶组合可以解决这个问题并具有稳定性, ...
- 1、Attention_based Group recommendation——基于注意力机制的群组推荐
1.摘要: 本文将Attention-based模型和BPR模型结合对给定的群组进行推荐项目列表. 2.算法思想: 如图: attention-based model:[以下仅计算一个群组的偏好,多个 ...
- 基于keil平台下STM32L系列移植FreeRTOS操作系统
1,下载FreeRTOS https://www.freertos.org/a00104.html 点击下载后,会进入如下界面 之后会弹出下载界面,格式为.EXE,不用怀疑.不是木马. 等待下载完成, ...
- 在基于or1200处理器的SoC上移植linux
经历了前端的艰苦奋斗.SoC前端设计已经调试完毕,如今直接进入uboot移植 首先cd入u-boot-master 找到子文件夹include下得de2_115.h文件进行改动: (下一步计划:加 ...
- 基于S3C2440的linux-3.6.6移植——LED驱动【转】
本文转载自:http://www.voidcn.com/blog/lqxandroid2012/article/p-625005.html 目前的linux版本的许多驱动都是基于设备模型,LED也不例 ...
- 基于STM32的无损压缩算法miniLZO移植,压缩率很高,20KB随机数压缩到638字节,耗时275us
说明: 1.miniLZO是采用C编写的无损压缩库. 2.提供了快速压缩和超快速解压缩能力. 3.比较耗内存,需要64KB内存用于压缩,对于H7这种大内存的,非常合适.或者有外置SRAM/SDRAM的 ...
随机推荐
- Mac OS安装Python的pip
最近牛牛的同学在学习python,但当他使用numpy时出现了报错(。•́︿•̀。) 原因为他的python没有numpy这个库(这个故事很典).然鹅雪上加霜的是,他的电脑是Mac,没有Windows ...
- 【前端开发】基于vue+elemnt-ui流程图设计器解决方案
前言 越来越多的企业都在研发低代码平台,其中流程引擎是核心之一,拥有一个可以拖拽设计审批流程的设计器是相当重要的. 介绍 审批流程设计器是一种工具,用于创建和设计审批流程.它通常是一个可视化的设计器界 ...
- [Python]常用知识
Python 常用知识 编译型语言 和 解释性语言 解释性语言 编译型语言 概念 计算机不能直接的理解高级语言,只能直接理解机器语言,所以必须要把高级语言翻译成机器语言,计算机才能执行高级语言的编写的 ...
- vivo 网络端口安全建设技术实践
作者:vivo 互联网安全团队 - Peng Qiankun 随着互联网业务的快速发展,网络攻击的频率和威胁性也在不断增加,端口是应用通信中的门户,它是数据进出应用的必经之路,因此端口安全也逐渐成为了 ...
- 2023-11-08:用go语言,字符串哈希原理和实现 比如p = 233, 也就是课上说的选择的质数进制 “ 3 1 2 5 6 ...“ 0 1 2 3 4 hash[0] = 3 * p的0
2023-11-08:用go语言,字符串哈希原理和实现 比如p = 233, 也就是课上说的选择的质数进制 " 3 1 2 5 6 ..." 0 1 2 3 4 hash[0] = ...
- 浅谈斜率优化DP
前言 考试 T2 出题人放了个树上斜率优化 DP,直接被同校 OIER 吊起来锤. 离 NOIP 还有不到一周,赶紧学一点. 引入 斜率 斜率,数学.几何学名词,是表示一条直线(或曲线的切线)关于(横 ...
- (Good topic)压缩字符串 (3.16 leetcode每日打卡)
字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后的字符串没有变短,则返回原先的字符 ...
- BIRCH算法全解析:从原理到实战
本文全面解析了BIRCH(平衡迭代削减聚类层次)算法,一种用于大规模数据聚类的高效工具.文章从基础概念到技术细节,再到实战应用与最佳实践,提供了一系列具体的指导和例子.无论你是数据科学新手,还是有经验 ...
- cyclone3内部资源
CycloneIII内部资源概述 目录 CycloneIII内部资源概述 Logic Elements and Logic Array Blocks(逻辑元件和逻辑阵列块) LE LAB LAB In ...
- CentOS(7.6)环境下迁移Mysql(5.7)的data目录到指定位置
第一步:关闭Mysql #关闭Mysql服务systemctl stop mysqld#查看Mysql服务状态 ps -ef|grep mysql 第二步:创建新目录,并拷贝数据文件 #创建data文 ...