本文主要是介绍OpenHarmony南向学习笔记——Hi3861+HC-SR04超声波检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Hi3861+HC-SR04超声波检测
- 前言
- 模块介绍
- 1. GPIO模式
- 时序图
- 通信流程
- 代码
前言
最近参加立创训练营,用Hi3861做机器狗,接着上一段时间的学习继续OpenHarmony的设备开发学习,之前的笔记中一直没有使用到超声波模块,在这次的训练营中,笔者打算尝试在Hi3861试试。
模块介绍
产商的手册如下所示,笔者购买的是2022款,链接如下:「超声波测距模块 HC-SR04 超声波传感器 支持兼容UNO R3/51/STM32」。
该模块支持四种模式来获取距离,可以通过背面的电阻设置进行选择。
1. GPIO模式
时序图
此模式需要使用Hi3861的两个IO口来与超声波模块的TRIG和ECHO两个脚进行通信。
通信流程
根据厂商资料可以知道,该模块的通信流程如下:
1.主控芯片与TRIG连接的IO配置为输出模式,与ECHO连接的IO配置为输入模式;
2.MCU给TRIG引脚输出一个大于10us的高电平脉冲;
3.模块通过ECHO脚返回一个高电平脉冲信号;
4.主控记录ECHO脚高电平脉冲时间T并代入公式计算。
代码
此代码参考了润和的智能循迹避障小车样例代码。笔者此处使用的是传智教育的元气派,有部分接口定义不太一样。
// An highlighted block#define Echo 8 //Echo //GPIO8
#define Trig 7 //Trig //GPIO7
#define GPIO_FUNC 0float GetDistance (void) {static unsigned long start_time = 0, time = 0;float distance = 0.0;IotGpioValue value = IOT_GPIO_VALUE0;unsigned int flag = 0;/*
=============== GPIO通信模式流程 1初始化GPIO========================================*/IoTIoSetFunc(Echo, GPIO_FUNC);//设置Echo连接IO为普通GPIO模式,无复用IoTGpioSetDir(Echo, IOT_GPIO_DIR_IN);//设置Echo连接IO为输入模式IoTGpioSetDir(Trig, IOT_GPIO_DIR_OUT);//设置Trig连接IO为输出模式/*
=============== GPIO通信模式流程 2输出起始信号========================================*/IoTGpioSetOutputVal(Trig, IOT_GPIO_VALUE1);//拉高TrigIoTUdelay(20);//20usIoTGpioSetOutputVal(Trig, IOT_GPIO_VALUE0);//拉低Trig/*
=============== GPIO通信模式流程 3检测Echo脚输出的高电平时间========================================*/while (1) {IoTGpioGetInputVal(Echo, &value);//读取Echo脚的电平状态if ( value == IOT_GPIO_VALUE1 && flag == 0) {//如果为高start_time = IoTGetUs();//获取此时时间flag = 1;}if (value == IOT_GPIO_VALUE0 && flag == 1) {//高电平结束变成低电平time = IoTGetUs() - start_time;//计算高电平维持时间start_time = 0;break;}}/*
=============== GPIO通信模式流程 4代入公式计算========================================*/distance = time * 0.034 / 2;// printf("distance is %f\r\n",distance);return distance;
}
打印结果
有关其他三种模式的通信,等笔者的10K欧0603电阻到了在做介绍。
这篇关于OpenHarmony南向学习笔记——Hi3861+HC-SR04超声波检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!