LiteOS基于Sensorhub的超声波模组移植

Stella981
• 阅读 708

摘要:本文为你带来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。

LiteOS基于Sensorhub的超声波模组移植

LiteOS基于Sensorhub的超声波模组移植

从时序图表明你只需要提供一个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驱动模块上。今天的代码移植基本完成,后续有传感器和板子进行验证

总结

这个驱动是有问题,就是这个是读取时阻塞的程序,后面试过,需要设计时采用定时器和外部中断完成,可以将这个阻塞的程序改成非阻塞的,效率大大提升,后续讲解如何用定时器和外部触发中断完成这个驱动设计。

点击关注,第一时间了解华为云新鲜技术~

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这