Arduino 智能小车 - 超声波测距(20180512实训课--华清远见)

1. 超声波测距

 

超声波测距的主要原理为发射装置发出超声波,根据接收器接到超声波时的时间差,与雷 达测距原理相似.

超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时.

根据超声波在空气中的传递速度为 340m/s,在转换成距离

 

 

2. 超声波模块

 

Arduino 智能小车中,我们使用的超声波模块为 HC-SR04,具体如下图


 

 

在上述模块中共有4个引脚,具体解释如下:

VCC : 接 +5v 电 源

GND : 接 GND

Trig : 发出超声波引脚

Echo : 接收超声波引脚

 

 

3. Arduino 超声波编程

3.1 定义 Trig  Echo 引脚与初始化

 

Trig 与 Echo 引脚与 Arduino 引脚进行连接, 其中将 Echo 对应的 Arduino 引脚设置为 input,Trig 则设置为 output,具体编程如下:


 

3.2 超声波测距

 

在使用超声波模块时,具体的编程步骤如下: 设置 TRIG 引脚为低电平

 

设置 TRIG 引脚为高电平,维持10us

 

digitalWrite(PIN_TRIG,HIGH);//设置 TRIG 引脚为高电平
delayMicroseconds(10);//延时10us

 

设置 TRIG 引脚为低电平,准备下一次测距

digitalWrite(PIN_TRIG,LOW);//设置 TRIG 引脚为低电平

调用 pulseIn() 函数来计算从发出到接收的时间,在转换成距离

duration = float(pulseIn(PIN_ECHO,HIGH));
distance = (duration * 17)/1000;

在换算具体的过程如下:

340m/1s 换算成 34000cm / 1000000 us 经过约分之后,则表示成

34cm / 1000 us,表示 1us 对应的传输的距离(cm) 由于考虑传输包含发送的距离,故要除以2


3.3 超声波测距完整代码

 

以下代码可以进行超声波测距,并在串口终端显示距离,单位为 cm

 

void setup() { Serial.begin(115200); pinMode(PIN_TRIG,OUTPUT); pinMode(PIN_ECHO,INPUT);
}

void loop() {

float distance = ultrasonic_distance(); Serial.print(distance); Serial.println(" cm");
}

float ultrasonic_distance(void)
{
float distance; float duration;

digitalWrite(PIN_TRIG,LOW); delayMicroseconds(2); digitalWrite(PIN_TRIG,HIGH); delayMicroseconds(10); digitalWrite(PIN_TRIG,LOW);

//340m/1s ----> 34000cm / 1000000 us ----> 34 / 1000
// 1us = 34cm ,计算距离时需要除以2
duration = float(pulseIn(PIN_ECHO,HIGH)); distance = (duration * 17)/1000;

return distance;
}

 

 

4. 超声波避障

 

利用超声波模块可以进行避障与跟随,当遇到障碍物时可以选择停车或者改变小车运动方向.


  • 18
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Arduino超声波避障小车代码,使用HC-SR04超声波测距模块: ``` // 定义超声波模块的引脚 #define trigPin 13 #define echoPin 12 // 定义电机驱动模块的引脚 #define motorPin1 9 #define motorPin2 8 #define motorPin3 7 #define motorPin4 6 // 定义小车的运动控制函数 void moveForward() { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); } void moveBackward() { digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); } void turnLeft() { digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, HIGH); digitalWrite(motorPin3, HIGH); digitalWrite(motorPin4, LOW); } void turnRight() { digitalWrite(motorPin1, HIGH); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, HIGH); } void stopMoving() { digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); } // 定义超声波测距函数 float getDistance() { // 发送超声波信号 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 接收超声波回波 float duration = pulseIn(echoPin, HIGH); // 计算距离(单位:厘米) float distance = duration * 0.034 / 2; return distance; } void setup() { // 初始化引脚 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); } void loop() { // 获取距离 float distance = getDistance(); // 判断距离并控制小车运动 if (distance < 10) { stopMoving(); delay(1000); turnLeft(); delay(1000); } else { moveForward(); } } ``` 在这个示例代码中,我们使用了HC-SR04超声波测距模块来测量小车前方的距离,并根据距离控制小车的运动。如果距离小于10厘米,则停止运动并向左转;否则向前行驶。你可以根据需要修改距离和运动控制的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值