Arduino超声波智能避障小车

本文最后更新于:2022年5月29日 上午

实物图

V1jg7n.md.jpg

接线

实际情况看程序定义的脚位

这里是我按照程序说明接线

1,L298N驱动板对应接Arduino板的接线

IN1->14; IN2->15;

IN3->16; IN4->17;

5V -> 5V; GND -> GND;

12V -> 电池正极; 电池负极也接去GND;

ENA -> 6

ENB-> 2

ENA和ENB的接口注意:

L298N模块的ENA,ENB接口要接上arduino板块的2,6和4,8中的任意两个,想小车怎样后退或者转弯就怎么接,接好要在程序里编程好。

2,超声波对应接Arduino板的接线:

VCC -> 5v; GND -> GND;

Echo(发射脚位) -> 8;

Trig(接收脚位) -> 9;

 

3,电机对应L298N驱动板的接线:

分开左右两边的电机线,分别接在L298N驱动板的OUT1、OUT2和OUT3、OUT4的接口上。(同一边的同一个电机线不能接在一起,要分开接)

程序

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#include <Servo.h> 
int IN1=14; // 定義6腳位 左後
int IN2=15; // 定義9腳位 左前
int IN3=16; // 定義10腳位 右前
int IN4=17; // 定義11腳位 右後
int ENA=6;
int ENB=2;
int inputPin = 9; // 定義超音波信號接收腳位
int outputPin =8; // 定義超音波信號發射腳位
int Fspeedd = 0; // 前速
int Rspeedd = 0; // 右速
int Lspeedd = 0; // 左速
int directionn = 0; // 前=8 後=2 左=4 右=6
Servo myservo; // 設 myservo
int delay_time = 250; // 伺服馬達轉向後的穩定時間
int Fgo = 8; // 前進
int Rgo = 6; // 右轉
int Lgo = 4; // 左轉
int Bgo = 2; // 倒車
void setup()
{
Serial.begin(9600); // 定義馬達輸出腳位
pinMode(IN1,OUTPUT); // 腳位 6 (PWM)
pinMode(IN2,OUTPUT); // 腳位 9 (PWM)
pinMode(IN3,OUTPUT); // 腳位 10 (PWM)
pinMode(IN4,OUTPUT); // 腳位 11 (PWM)
pinMode(inputPin, INPUT); // 定義超音波輸入腳位
pinMode(outputPin, OUTPUT); // 定義超音波輸出腳位
myservo.attach(10); // 定義伺服馬達輸出第5腳位(PWM)
}
void advance(int a) // 前進
{
digitalWrite(IN1,HIGH); // 使馬達(前进)動作
digitalWrite(IN2,LOW);
//analogWrite(pinRF,100);
//analogWrite(pinRB, 0);
digitalWrite(IN3,HIGH); // 使馬達(前进)動作
digitalWrite(IN4,LOW);
//analogWrite(pinLF,100);
//analogWrite(pinLB,0);
delay(a * 100);
}
void right(int b) //右轉(單輪)
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
//analogWrite(pinRF,0);
// analogWrite(pinRB, 0);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
//analogWrite(pinLF,100);
// analogWrite(pinLB,0);
delay(b * 100);
}
void left(int c) //左轉(單輪)
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
//analogWrite(pinRF,100);
//analogWrite(pinRB, 0);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
//analogWrite(pinLF,0);
//analogWrite(pinLB,0);
delay(c * 100);
}
void turnR(int d) //右轉(雙輪)
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(IN3,0);
analogWrite(IN4, 100);
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(IN3,100);
analogWrite(IN4,0);
delay(d * 100);
}
void turnL(int e) //左轉(雙輪)
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
analogWrite(IN3,100);
analogWrite(IN4, 0);
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
analogWrite(IN3,0);
analogWrite(IN4,100);
delay(e * 100);
}
void stopp(int f) //停止
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,LOW);
digitalWrite(IN3,LOW);
digitalWrite(IN4,LOW);
delay(f * 100);
}
void back(int g) //後退 后退
{
digitalWrite(IN1,LOW); // 使馬達(后退)動作
digitalWrite(IN2,HIGH);
//analogWrite(pinRF,0);
//analogWrite(pinRB, 150);
digitalWrite(IN3,LOW); // 使馬達(后退)動作
digitalWrite(IN4,HIGH);
//analogWrite(pinLF,0);
//analogWrite(pinLB,150);
delay(g * 100);
}
void detection() //測量3個角度(0.90.179)
{
int delay_time = 250; // 伺服馬達轉向後的穩定時間
ask_pin_F(); // 讀取前方距離
if(Fspeedd < 10) // 假如前方距離小於10公分
{
stopp(1); // 清除輸出資料
back(2); // 後退 0.2秒
}
if(Fspeedd < 25) // 假如前方距離小於25公分
{
stopp(1); // 清除輸出資料
ask_pin_L(); // 讀取左方距離
delay(delay_time); // 等待伺服馬達穩定
ask_pin_R(); // 讀取右方距離
delay(delay_time); // 等待伺服馬達穩定
if(Lspeedd > Rspeedd) //假如 左邊距離大於右邊距離
{
directionn = Rgo; //向右走
}
if(Lspeedd <= Rspeedd) //假如 左邊距離小於或等於右邊距離
{
directionn = Lgo; //向左走
}
if (Lspeedd < 10 && Rspeedd < 10) //假如 左邊距離和右邊距離皆小於10公分
{
directionn = Bgo; //向後走
}
}
else //加如前方不小於(大於)25公分
{
directionn = Fgo; //向前走
}
}
void ask_pin_F() // 量出前方距離
{
myservo.write(90);
digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // 讓超聲波發射高電壓10μs,這裡至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓
float Fdistance = pulseIn(inputPin, HIGH); // 讀差相差時間
Fdistance= Fdistance/5.8/10; // 將時間轉為距離距离(單位:公分)
Serial.print("F distance:"); //輸出距離(單位:公分)
Serial.println(Fdistance); //顯示距離
Fspeedd = Fdistance; // 將距離 讀入Fspeedd(前速)
}
void ask_pin_L() // 量出左邊距離
{
myservo.write(5);
delay(delay_time);
digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // 讓超聲波發射高電壓10μs,這裡至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓
float Ldistance = pulseIn(inputPin, HIGH); // 讀差相差時間
Ldistance= Ldistance/5.8/10; // 將時間轉為距離距离(單位:公分)
Serial.print("L distance:"); //輸出距離(單位:公分)
Serial.println(Ldistance); //顯示距離
Lspeedd = Ldistance; // 將距離 讀入Lspeedd(左速)
}
void ask_pin_R() // 量出右邊距離
{
myservo.write(177);
delay(delay_time);
digitalWrite(outputPin, LOW); // 讓超聲波發射低電壓2μs
delayMicroseconds(2);
digitalWrite(outputPin, HIGH); // 讓超聲波發射高電壓10μs,這裡至少是10μs
delayMicroseconds(10);
digitalWrite(outputPin, LOW); // 維持超聲波發射低電壓
float Rdistance = pulseIn(inputPin, HIGH); // 讀差相差時間
Rdistance= Rdistance/5.8/10; // 將時間轉為距離距离(單位:公分)
Serial.print("R distance:"); //輸出距離(單位:公分)
Serial.println(Rdistance); //顯示距離
Rspeedd = Rdistance; // 將距離 讀入Rspeedd(右速)
}
void loop()
{
myservo.write(90); //讓伺服馬達回歸 預備位置 準備下一次的測量
detection(); //測量角度 並且判斷要往哪一方向移動
if(directionn == 2) //假如directionn(方向) = 2(倒車)
{
back(8); // 倒退(車)
turnL(2); //些微向左方移動(防止卡在死巷裡)
Serial.print(" Reverse "); //顯示方向(倒退)
}
if(directionn == 6) //假如directionn(方向) = 6(右轉)
{
back(1);
turnR(6); // 右轉
Serial.print(" Right "); //顯示方向(左轉)
}
if(directionn == 4) //假如directionn(方向) = 4(左轉)
{
back(1);
turnL(6); // 左轉
Serial.print(" Left "); //顯示方向(右轉)
}
if(directionn == 8) //假如directionn(方向) = 8(前進)
{
advance(1); // 正常前進
Serial.print(" Advance "); //顯示方向(前進)
Serial.print(" ");
}
}

Arduino超声波智能避障小车
https://kevinloongc.github.io/posts/dfc9b5c6.html
作者
Kevin Loongc
发布于
2019年4月20日
许可协议