前言
最近参加立创训练营,用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 0

float 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);//拉高Trig
    IoTUdelay(20);//20us
    IoTGpioSetOutputVal(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电阻到了在做介绍。