#打卡不停更#【FFH】OpenHarmony设备开发(五)-超声波传感器 原创 精华
Table of Contents
前言
在之前学习了很多新的有趣知识,本次学习了超声波模组,利用已学的知识给遥控小车加上一个简单的自动避障功能.
有了超声波模组,以后可以开发更有意思的小实验,例如简单的无人操控小车、简单的量尺…
准备
创建文件夹和相关的代码文件
其中WIFI_car保存网络连接遥控小车的代码,WIFI_hcsr04保存超声波模组相关的代码
编辑BUILD.gn,加入相关头文件的引用路径(小tips:不知道路径的头文件可以用Ctrl+P搜索)
编辑app路径下的BUILD.gn,使我们的遥控小车能被系统编译加载
格式是:"文件夹名:静态库名"
超声波模组
本次样例学习的是HC-SR04超声波模组
超声波模组一共有4个引脚,分别为Vcc、 Trig(控制端)、 Echo(接收端)、 GND;其中VCC、GND接上5V电源.
HC-SR04超声波距离传感器的核心是两个超声波传感器。一个Trig(控制端)控制发出的超声波信号,将电信号转换为40 KHz超声波脉冲。Echo(接收端)监听发射的脉冲.
初始化
通过查询原理图,可以得知小车连接超声波的GPIO口为7和8
其中GPIO7是Trig(输入口),GPIO8是Echo(输出口)
首先我们要对这两个GPIO口进行初始化
GPIO口初始化老三套:IO口初始化、IO口复用、IO口输入输出方向
编写检测距离函数
我们要检测距离,首先要懂得超声波传感器的原理
超声波传感器通过Trig高电平发送声波,Echo接收超声波,通过计算发送和接收到的时间差,辅以声波的速度,得以计算出小车和障碍之间的距离.
程序设计流程:
- 发送trig高电平
- 等待20us,trig设置为低电平
- Echo接收到了高电平,计时高电平时间,高电平持续时间就是超声波从发射到返回的总时间
其中为了减少干扰,可以先发送trig高电平50us,再将trig置为低电平,Echo接收到的数据从高电平降为低电平,便可开始
为了准确性,还可以检测数次距离,再对其数据做平均值以及除错(当声波没有被反射回来,则回波信号将在38毫秒后超时并返回低电平。因此38 ms的脉冲表示在传感器范围内没有阻塞。)
本次样例只简单编写了一个检测函数:
避障线程
简单的避障功能需要以下几点需求:
- 避障线程的优先级需要高于遥控的优先级,这样当快要撞上障碍时能保证自动避障能正常运行
- 需要设计一个信号量,信号量的作用是保证两个或多个关键代码不被并发调用,在这里是为了避免避障线程和遥控线程并发调用。本次样例使用一个sem_d变量代替了信号量,sem_d为1时使遥控功能睡眠
- 不断判断距离是否小于特定值,当小于特定值做出相对应的避障
网络连接遥控小车
源代码文件
连接wifi,开启TCP,遥控小车的步骤可以参考本篇文章【FFH】OpenHarmony设备开发(二)-基于TCP遥控小车
为了加入超声波传感器线程,我们可以在小车IO口之后启动超声波线程(也可直接用SYS_RUN()启动线程,此处因为遥控之前用不到避障,因而延迟启动线程):
信号量的使用:
首先创建全局变量,记得要在头文件中extern该变量,WIFI_hcsr04.c才能使用到该变量
当sem_d为1时,休眠遥控代码,直至sem_d为0
头代码文件
此处代码为了WIFI_hcsr04.c能调用到一些需要用到的函数和变量.
其它
效果
问题
测试了几轮下来,发现了有以下问题
- 在测试中偶尔会遇到栈溢出的情况,原因尚未找到
- 超声波传感器的精确度不高,容易会误判障碍物(虚无的障碍emm)
当前解决方案:
-
加大线程的栈大小(无法从根本解决)
-
找到栈溢出原因,设计超时机制,避免内存不断堆积
-
设计检测距离的算法,对获取的数据进行取平均值以及除去最大最小.
现在智能驾驶使用超声波少会不会也是因为传感器原因?
超声波传感器对距离测量的精度不高,并且返回的信息较为单薄.
面对智能驾驶来说,传感器返回的数据远远不够用,策略就只能十分保守,做不了更复杂的智能驾驶系统
懂了,还是因为超声波传感器自己的局限性
超声波实际应用还是少见
跟着楼主把各个组件熟悉下
不错不错,很好了
超声波传感器还是不适合太快的场合