摘要:本文为你带来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 HIGHdelay(2);  // wait for 2 usHAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);  // pull the TRIG pin HIGHdelay(10);  // wait for 10 usHAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // pull the TRIG pin low// read the time for which the pin is highwhile (!(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)));  // wait for the ECHO pin to go highwhile (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4))    // while the pin is high{local_time++;   // measure time for which the pin is highdelay (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的超声波模组移植相关推荐

  1. Gut:粪便病毒组移植减轻2型糖尿病和肥胖症模型小鼠的相关症状

    本文转自无菌动物,原文 链接 https://mp.weixin.qq.com/s/1hfXTQg9U3HmXAvcXyUgyA 粪便病毒组移植减轻2型糖尿病和肥胖症模型小鼠的相关症状 供稿人:张行 ...

  2. LiteOS学习笔记-5通信模组之LiteOS的SAL及socket编程

    LiteOS学习笔记-5通信模组之LiteOS的SAL及socket编程 一.SAL套接字抽象层 二.Socket套接字简介 Socket概述 Socket结构体 字节序转换函数 ip地址的转换 字节 ...

  3. LiteOS学习笔记-4通信模组之AT框架

    LiteOS学习笔记-4通信模组之AT框架 一.AT客户端简介 什么是AT客户端 AT客户端框架作用 二.串口驱动框架实现 2.1串口初始化 2.2读写缓冲区ring_buffer 2.3读写实现与注 ...

  4. 基于嵌入式多芯片模组的微机保护平台

    为适应微机继电保护向高度数字化.网络化.综合化和智能化方向迅速发展的趋势,在采用工业数控开放式系统体系结构的基础上,提出并成功地开发了基于嵌入式多芯片模组的高性能通用微机保护平台.该平台以具有自主知识 ...

  5. linux 挂iscisc存储,基于arm的嵌入式linux操作系统的移植研究-通信与信息系统专业论文.docx...

    基于arm的嵌入式linux操作系统的移植研究-通信与信息系统专业论文 Classified Index: TP316.8 U.D.C: 621.38 Dissertation for the Mas ...

  6. 基于粒子群算法的组卷系统的研究与实现

    摘 要 组卷系统的主要任务是根据用户的需要用当前数据库中的试题组成一套符合用户需求的试卷.随着数据库与题量增大,传统采用随机选取和回朔试探法的组卷抽提算法因其抽题时间长,占用的空间复杂度太大,容易陷入 ...

  7. 模型计算算力_8核人工智能开源主板_基于 BITMAIN AI 计算模组_3.5寸

    模型计算算力_8核人工智能开源主板_基于 BITMAIN AI 计算模组_3.5寸 产品概述 产品特点 1. 超高性能,超低功耗 2.体积小,接口丰富,灵活扩展 3.开发环境友好,工具链完备 应用场景 ...

  8. 基于Comsol的超声探测锂电池SOC状态仿真分析

    对于锂离子电池管理系统BMS非常重要的一个功能就是对电池的SoC状态进行预测. SoC既电池的荷电状态,state ofcharge的缩写,电池的SoC对于电池的管理十分重要,可以指导电池的充放电,防 ...

  9. 基于ACCESS在线考试自动组卷系统设计

    基于ACCESS在线考试自动组卷系统设计-VB(论文+系统+开题报告+答辩PPT) [摘要]随着当今计算机技术的飞速发展,利用计算机进行试题库的管理和考试分析已成为学校推动教学改革.提高教学质量的重要 ...

最新文章

  1. English in 999
  2. SharePoint REST API - 同步SharePoint列表项
  3. 【学习笔记】树形结构基础
  4. 部署 SAP UI5 应用到 SAP BTP 时遇到的 error retrieving MTA 错误消息
  5. 为什么SAP UI5框架在应用整个生命周期只调用onBeforeRendering一次
  6. Apache+php+mysql安装与配置详解
  7. 注解驱动的 Spring cache 缓存介绍
  8. 发光的二次元克拉克拉 满足年轻用户个性化、碎片化的文娱需求
  9. Android EditText的常用技巧
  10. vue 百度地图纠偏 经纬度偏差、根据经纬度返回地址等信息
  11. brew安装软件时报错
  12. opencv实现银行卡卡号识别
  13. pyecharts可视化画3D动态地球仪,世界地图,中国地图。
  14. GRE红宝书使用方法介绍
  15. Mat 与 IplImage之间的转换
  16. python爬取百度图片的思路与代码(最后附上了代码)
  17. 早餐为啥不能吃大米粥?医生:不仅是米粥,这3物也最好少吃
  18. 中介者(Mediator)模式实例
  19. python的循环控制语句while和for的使用详解
  20. html设计带图形的边框,css怎么设置图片的边框?

热门文章

  1. Bootstrap 模态框插件Modal 的事件
  2. es6 async函数实例:按顺序完成异步操作
  3. String.fromCodePoint()方法
  4. vue 内的 对象 获取 键值对_vue.js - vue 登录存localStorage的方法
  5. android 内存检测框架,Android项目内存泄漏检测
  6. mongodb @aggregation 返回字段映射不上_Spring Boot 操作 MongoDB
  7. windowbuilder怎么加图片_一键制作音乐图片,这效果太惊艳了!微信这个功能简直是“宝藏”...
  8. sql 超时时间已到.在操作完成之前超时时间已过或服务器未响应.,sqlserver Timeout 时间已到。在操作完成之前超时时间已过或服务器未响应...
  9. postgresql explain的初步分析
  10. 一、JSP的基本原理