一、实验目的
(1)熟悉Linux或Windows上LiteOS-M嵌入式开发环境的配置;
(2)熟悉LiteOS-M内核的目录结构和模块;
(3)熟悉LiteOS-M内核的编译、下载和测试流程。
(4)熟悉LiteOS-M硬件驱动原理和驱动开发流程,熟悉访问设备的应用程序开发。
(5)熟悉智能小车硬件结构,掌握超声波模块的硬件连接,工作原理,驱动开发和应用。
二、实验内容
研究华为鸿蒙智能小车(Hi3861主控板)硬件结构,重点研究其中的超声波模块的作用,硬件结构,工作原理,并编写该模块的驱动程序和应用程序。应用程序的功能是:开始探测障碍物;实时输出前方障碍物的距离;停止探测障碍物。
三、实验环境
宿主机操作系统:Ubuntu 20.04版本(内核版本:Linux 5.10)
编译工具:gcc/g++
编辑工具:vi/vim/vscode
依赖环境:
HarmonyOS开发环境
可参考gitee上OpenHarmony/docs/zh-cn /device-dev /quick-start快速环境搭建文档
- 实验设计思路
4.1 鸿蒙智能小车结构和功能
完整小车图:
小车主要硬件组成:
- 主板
- 通用底板
- 扩展版
- 舵机加超声波模块
舵机和超声波模块的组合提供了一种高度灵活和精确的方法来探测和响应环境。超声波模块负责发射和接收超声波,通过计算超声波来回的时间,可以精确地测量出物体与传感器之间的距离,实现物体的检测和距离测量。舵机则负责调整超声波模块的方向,使其能够在不同的方向上进行探测,实现全方位的环境感知。
4.2 超声波模块结构和功能
超声波模块:
(1)采用IO口TRIG触发测距,给至少10us的高电平信号;
(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;
(3)有信号返回,输出一个高电平,高电平持续的时间就是超声波从发射到返回的时间。测试距离=(高电平时间*声速(340M/S))/2;
超声波模块实物图如下:
需要注意的是:超声波模块的GND线要与机器人板上的GND接口对应,在这里为绿线
4.3 程序结构
4.3.1 程序的基本结构
(1)首先配置GPIO引脚的功能和方向,然后发送超声波信号。
(2)发送信号的方式是将引脚的电平设置为高,延时20微秒,然后将电平设置为低这个过程会触发超声波模块发送超声波。
(3)接着程序进入一个循环,等待接收到反射回来的超声波。当记录时间的引脚电平从低变为高时,记录当前的时间;当电平从高变为低时,再次记录当前的时间。两次记录的时间的差就是超声波从发送到接收的总时间。
(4)根据超声波的速度(在空气中约为340m/s,或者0.034cm/us)和总时间,计算出距离。因为超声波是往返行程,所以距离需要除以2。
4.3.2 关键函数或参数或某种机制
(1)hi_io_set_func()
参数:
int pin:这是GPIO引脚的编号,用于指定要设置的GPIO引脚。
int func:这是要设置的功能编号。不同的功能编号对应不同的功能。
该函数用于设置特定GPIO引脚的功能。
- IoTGpioSetOutputVal()
参数:
int pin:这是GPIO引脚的编号,用于指定要设置的GPIO引脚。
IotGpioValue value:这是要设置的值,通常是IOT_GPIO_VALUE0或IOT_GPIO_VALUE1,分别对应低电平和高电平。
在本示例中,函数被用来生成超声波信号,以控制超声波测距模块。通过改变GPIO引脚的输出值,可以控制超声波模块发送超声波和停止发送超声波。
五、关键代码分析
5.1 程序关键片段一:发送超声波
hi_io_set_func(GPIO_8, GPIO_FUNC);
IoTGpioSetDir(GPIO_8, IOT_GPIO_DIR_IN); //设置引脚方向
IoTGpioSetDir(GPIO_7, IOT_GPIO_DIR_OUT);
IoTGpioSetOutputVal(GPIO_7, IOT_GPIO_VALUE1);
hi_udelay(20);
IoTGpioSetOutputVal(GPIO_7, IOT_GPIO_VALUE0); //20us的延时触发发送超声波
5.2 程序关键片段二:获取时差并计算距离
while (1) {
IoTGpioGetInputVal(GPIO_8, &value); 读取GPIO_8引脚的输入值
//超声波信号发送,记录第一次时间
if ( value == IOT_GPIO_VALUE1 && flag == 0) {
start_time = hi_get_us();
flag = 1;
}
//超声波信号结束返回,计算时间差
if (value == IOT_GPIO_VALUE0 && flag == 1) {
time = hi_get_us() - start_time;
start_time = 0;
break;
}
}
// 根据超声波信号的总时间计算距离
// 超声波的速度在空气中约为0.034cm/us,因为超声波是往返行程,所以需要除以2
distance = time * 0.034 / 2;
printf("distance is %f\r\n",distance);
- 程序运行结果和分析
注意距离的单位为cm