Arduino开发实例-DIY超声波传感器避障机器人

超声波传感器避障机器人

1、应用介绍

在本应用中,我们将使用一个超声波传感器与两个直流电机和一个伺服电机相结合,Arduino作为主控板创建一个简单的避障机器人。 超声波传感器发送和接收信号以确定物体的距离。 如果距离小于 15 厘米有物体,机器人将停止。 然后它环顾四周,转向一个它什么都感觉不到的方向,然后朝那个方向移动。 超声波传感器安装在伺服电机上,以便机器人可以移动并寻找畅通的路径。

关于超声波传感的驱动,在前面的文章中做了详细的介绍,请参考:

关于直流电机驱动,在前面的文章中做了详细的介绍,请参考:

关于伺服电机驱动,在前面的文章中做了详细的介绍,请参考:

在这里插入图片描述

2、硬件接线

本次应用使用到的硬件配件如下:

序号 配件名称 数量
1 Arduino UNO 1
2 Arudino L293D 电机驱动扩展板 1
3 直流电机和轮子 2
4 HC-SR04超声波传感器 1
5 Tower Pro SG90 9g 舵机 1
6 杜邦线 20
7 三轮小车底盘组件 1
8 9V AA 电池 1

硬件接线如下:

在这里插入图片描述

接线说明如下:

超声波传感器 电机驱动扩展板
VCC +5V
Trig Pin A4
Echo Pin A5
GND GND
左轮电机 电机驱动扩展板 ARDUINO
红线 M1 +5V
黑线 M1 GND
左轮电机 电机驱动扩展板 ARDUINO
Red wire M3 +5V
Black wire M3 GND
舵机 电机驱动扩展板 ARDUINO
棕色线 Servo_2 – GND
红色线 Servo_2+ +5V
黄色线 Servo_2 s Signal

3、驱动实现

本次使用到如下开源库:

演示代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <AFMotor.h>
#include <NewPing.h>
#include <Servo.h>
#define TRIG\_PIN A4
#define ECHO\_PIN A5
#define MAX\_DISTANCE 200
#define MAX\_SPEED 190 // Sets speed of DC motors
#define MAX\_SPEED\_OFFSET 20
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
AF_DCMotor motor1(1, MOTOR12_1KHZ); // First motor to connection 1
AF_DCMotor motor2(3, MOTOR12_1KHZ); // Second motor to connection 3
Servo myservo; // Give the servo a name
boolean goesForward = false;
int distance = 100; // Define an int for distance and speed
int speedSet = 0;

void setup() {
myservo.attach(9); // Servo attached to pin 9
myservo.write(115); // Set servo at 115 degrees
delay(2000);
distance = readPing(); // Read the distance from the sensor
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
distance = readPing();
delay(100);
}
void loop() {
int distanceR = 0;
int distanceL = 0;
delay(40);
// If distance is less than 15 cm, carry out this function
if (distance <= 15) {
moveStop();
delay(100);
moveBackward();
delay(300);
moveStop();
delay(200);
distanceR = lookRight();
delay(200);
distanceL = lookLeft();
delay(200);
if (distanceR >= distanceL) {
turnRight();
moveStop();
} else { // Or else carry on
turnLeft();
moveStop();
}
} else {
moveForward();
}
distance = readPing();
}
int lookRight() { // The servo looks to the right
myservo.write(50);
delay(500);
int distance = readPing();
delay(100);
myservo.write(115);
return distance;
}
int lookLeft() { // The servo looks to the left
myservo.write(170);
delay(500);
int distance = readPing();
delay(100);
myservo.write(115);
return distance;
delay(100);
}
int readPing() {
delay(70);
int cm = sonar.ping\_cm();
if (cm == 0) {
cm = 250;
}
return cm;
}
void moveStop() {
motor1.run(RELEASE);
motor2.run(RELEASE);
}
void moveForward() {
if (!goesForward) { // If area is clear, motors move forward
goesForward = true;
motor1.run(FORWARD);
motor2.run(FORWARD);
// Slowly bring up speed to avoid loading down
// batteries too quickly
for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) {
motor1.setSpeed(speedSet);
motor2.setSpeed(speedSet + MAX_SPEED_OFFSET);
delay(5);
}
}
}
void moveBackward() {
goesForward = false;
motor1.run(BACKWARD);
motor2.run(BACKWARD);
// Slowly bring up speed to avoid loading down
// batteries too quickly
for (speedSet = 0; speedSet < MAX_SPEED; speedSet += 2) {
motor1.setSpeed(speedSet);
motor2.setSpeed(speedSet + MAX_SPEED_OFFSET);
delay(5);
}
}
void turnRight() { // Movement for turning right
motor1.run(FORWARD);
motor2.run(BACKWARD);
delay(300);
motor1.run(FORWARD);
motor2.run(FORWARD);
}
void turnLeft() { // Movement for turning left
motor1.run(BACKWARD);
motor2.run(FORWARD);
delay(300);
motor1.run(FORWARD);
motor2.run(FORWARD);
}

文章来源: https://iotsmart.blog.csdn.net/article/details/128217097