/------转载请附上本文链接 https://www.cnblogs.com/blogs-192-168-9-222/p/11506638.html -------啦啦啦我是快乐的分割线- ------------/
小车图片😀ε=ε=ε=(~ ̄▽ ̄)~,其实很简单一起来看看叭
废话不多说。首先做这个智能小车所需要的东西有
硬件支持:
1.Arduino Uno 开发板
2.L298N电机驱动模块
3.ESP8266芯片一块
4.SG90舵机一个
5.HC-SR04超声波模块一个
6.一些杜邦线
7.7.4V(5600mA)锂电池充
8.四个直流电机和一个四轮车底盘(某宝上十几块钱的就都有,只是要自己拼装)
软件支持:
1.Arduino IDE
2.Blynk App(手机安卓客户端)
东西都备齐了就可以动手开始做啦。做这个东西从学习arduino到制作完成一共用了大约10天,中间还有七七八八的事情,总算制作完成了
L298N Arduino Uno ESP8266
HC-SR04超声波模块 SG90 舵机
------------------------------------------制作过程------------------------------------------------
一、对软件Arduino IDE要下载一些外加库和一些处理
1.文件-首选项-附加开发板管理器网址: http://arduino.esp8266.com/stable/package_esp8266com_index.json
2.下载Blynk库,发现网上的文章都要到处找库,其实你在下面的库管理器里面可以下载最新的
然后在第三方库示例里面可以看见Blynk库
3.还有一些库统一下载放在arduino里自带的libraries文件夹里面
链接:https://pan.baidu.com/s/1mQo-x83PEcdNnmfdB6LGIA
提取码:y1d0
二、然后硬件和编程方面
esp8266
esp8266和单片机连线
VCC-3.3V GND-GND TX和RX反接arduino的RX和TX,我接的是RX-A0 ,TX-A1
RST和IO可以置空
ESP8266默认波特率为115200,可以通过arduino软件调试串口波特率为可以和arduino通信的9600波特率。
1 #include <SoftwareSerial.h>
2
3 SoftwareSerial mySerial(A1, A0); // RX, TX
4
5
6 void setup() {
7
8 // Open serial communications and wait for port to open:
9
10 Serial.begin(115200);
11
12 while (!Serial) {
13
14 ; // wait for serial port to connect. Needed for native USB port only
15
16 }
17
18
19 Serial.println("Goodnight moon!");
20
21
22 // set the data rate for the SoftwareSerial port
23
24 mySerial.begin(115200);
25
26 mySerial.println("Hello, world?");
27
28 }
29
30
31
32 void loop() { // run over and over
33
34 if (mySerial.available()) {
35
36 Serial.write(mySerial.read());
37
38 }
39
40 if (Serial.available()) {
41
42 mySerial.write(Serial.read());
43
44 }
45
46 }
上传代码,打开串口,调波特率为115200波特率,和换行格式 NL和CR
串口输出
表明进入AT模式
再发送 AT+UART=9600,8,1,0,0 串口输出OK ,就成功修改了esp8266的波特率为9600,可以让esp8266和arduino uno通信啦。
调试好esp还有blynk呢
Blynk,先在华为商场或者别的,只要是安卓手机都行,下载Blynk APP
Blynk里面的物件需要能量,限2000,拖出来不用了的可以循环托回去,长按拖入那个三角循环浮标的,
不要Delete啊,我就Delete只有1400了,心疼(~﹃~)~zZ。
每建立一个工程blynk会发送邮箱给你,里面的token很重要,所以邮箱不要乱写哟
然后是L298N
先看一下基础教程:https://www.bilibili.com/video/av59280674?from=search&seid=424387283798668433
里面的使能是调速是通过自控使能引脚控制频率调速
我们可以不拔掉跳帽,是使能引脚保持高电平,处于使能状态,然后通过内置函数调PWM波
IN1,IN2,IN3,IN4分别接线 ~11,~6,~5,~3
7.4V(5600mA)锂电池在+12V和GND处对驱动供电,在无电脑供电情况下,可以通过5V对Arduino供电
注意L298N的GND要和Arduino接地,不然没在一个电路,电机动不了
接好线,可以先试一下通过blynk简单控制电机
先不看模式转换,上面的控件可以是电机前进,后退,左转,右转,调速
代码如下:
1 #define BLYNK_PRINT Serial
2
3
4 #include <ESP8266_Lib.h>
5 #include <BlynkSimpleShieldEsp8266.h>
6
7 // You should get Auth Token in the Blynk App.
8 // Go to the Project Settings (nut icon).
9 char auth[] = "YourAuthToken";
10
11 // Your WiFi credentials.
12 // Set password to "" for open networks.
13 char ssid[] = "YourNetworkName";
14 char pass[] = "YourPassword";
15
16 // Hardware Serial on Mega, Leonardo, Micro...
17 #define EspSerial Serial1
18
19 // or Software Serial on Uno, Nano...
20 #include <SoftwareSerial.h>
21 SoftwareSerial EspSerial(A1, A0); // RX, TX
22
23 // Your ESP8266 baud rate:
24 #define ESP8266_BAUD 9600
25 ESP8266 wifi(&EspSerial);
26
27 void setup()
28 {
29 // Debug console
30 Serial.begin(9600);
31
32 delay(10);
33
34 // Set ESP8266 baud rate
35 EspSerial.begin(ESP8266_BAUD);
36 delay(10);
37
38 Blynk.begin(auth, wifi, ssid, pass);
39 }
40
41 void loop()
42 {
43 Blynk.run();
44 }
YourAuthTokenW改为邮件里的Token,YourNetworkName,YourPassword改为你的8266可以连的WIFI的名字和密码
只要是可以连的WIFI就行,手机热点也行,让8266联网,然后和blynk云端服务器与Arduino通信实现联网控制功能
SG90舵机
舵机的橙、红、棕三色线分别代表PWM输入信号线,正极,负极
将超声波模块和舵机转头放在一起
超声波模块 Trig-12,Echo-~9
小车总代码:
1 #define BLYNK_PRINT Serial
2 //#include <avr/wdt.h>
3 //#include<VoiceRecognition.h>
4
5 #define motor_in1 11//将电机驱动IN1接到A0端口
6 #define motor_in2 6
7 #define motor_in3 5
8 #define motor_in4 3
9 #define trig 12
10 #define echo 9
11
12 #include <ESP8266_Lib.h>
13 #include <BlynkSimpleShieldEsp8266.h>
14 #include <Servo.h>
15 //VoiceRecognition Voice;
16 char auth[] = "o370IDZiW12AbhEiQiquapDaJynIE40_";
17 unsigned int right,left;
18 char ssid[] = "OPPO A9x";
19 char pass[] = "12345678";
20 int key=7;
21 int sound=8;
22 unsigned int cm;
23 Servo s;
24 // Hardware Serial on Mega, Leonardo, Micro...
25
26 #define EspSerial Serial1
27 #include <SoftwareSerial.h>
28
29 SoftwareSerial EspSerial(A1, A0); // RX, TX
30
31 // Your ESP8266 baud rate:
32 #define ESP8266_BAUD 9600
33
34 ESP8266 wifi(&EspSerial);
35
36 void setup()
37 {
38 // put your setup code here, to run once:
39 Serial.begin(9600);
40 delay(10);
41
42 EspSerial.begin(ESP8266_BAUD);
43
44 delay(10);
45
46 Blynk.begin(auth, wifi, ssid, pass);
47 pinMode(motor_in1,OUTPUT);
48 pinMode(motor_in2,OUTPUT);
49 pinMode(motor_in3,OUTPUT);
50 pinMode(motor_in4,OUTPUT);
51 pinMode(trig,OUTPUT);
52 pinMode(echo,INPUT);
53 s.attach(2);
54 s.write(90);
55 tone(12,800,500);
56 digitalWrite(motor_in1,LOW);
57 digitalWrite(motor_in2,LOW);
58 digitalWrite(motor_in3,LOW);
59 digitalWrite(motor_in4,LOW);
60 }
61 void range()
62 {
63 digitalWrite(trig,LOW);
64 delayMicroseconds(2);
65 digitalWrite(trig,HIGH);
66 delayMicroseconds(10);
67 digitalWrite(trig,LOW);
68 int temp = float(pulseIn(echo,HIGH));
69 cm = (temp*17)/1000;
70
71 Serial.print("Echo =");
72 Serial.print(temp);//串口输出等待时间的原始数据
73 Serial.print(" | | Distance = ");
74 Serial.print(cm);//串口输出距离换算成cm的结果
75 Serial.println("cm");
76 delay(100);
77
78 if(cm<30)
79 {
80 tone(12,800,50);
81 delay(50);
82 }
83 }
84 void Leftrange()
85 {
86 digitalWrite(trig,LOW);
87 delayMicroseconds(2);
88 digitalWrite(trig,HIGH);
89 delayMicroseconds(10);
90 digitalWrite(trig,LOW);
91 int temp = float(pulseIn(echo,HIGH));
92 cm = (temp*17)/1000;
93
94 Serial.print("Echo =");
95 Serial.print(temp);//串口输出等待时间的原始数据
96 Serial.print(" | | LeftDistance = ");
97 Serial.print(cm);//串口输出距离换算成cm的结果
98 Serial.println("cm");
99 delay(100);
100
101 if(cm<30)
102 {
103 tone(12,800,50);
104 delay(50);
105 }
106 }
107 void Rightrange()
108 {
109 digitalWrite(trig,LOW);
110 delayMicroseconds(2);
111 digitalWrite(trig,HIGH);
112 delayMicroseconds(10);
113 digitalWrite(trig,LOW);
114 int temp = float(pulseIn(echo,HIGH));
115 cm = (temp*17)/1000;
116
117 Serial.print("Echo =");
118 Serial.print(temp);//串口输出等待时间的原始数据
119 Serial.print(" | | RightDistance = ");
120 Serial.print(cm);//串口输出距离换算成cm的结果
121 Serial.println("cm");
122 delay(100);
123 if(cm<30)
124 {
125 tone(12,800,50);
126 delay(50);
127 }
128 }
129 void turn()
130 {
131 stopit();
132 delay(1000);
133 s.write(170);
134 delay(500);
135 Leftrange();
136 left=cm;
137 s.write(90);
138 delay(500);
139 s.write(10);
140 delay(500);
141 Rightrange();
142 right=cm;
143 s.write(90);
144 delay(500);
145 if(right>=left)
146 {
147 moveRight();
148 delay(600);
149 moveForward();
150
151 }
152 else
153 {
154 moveLeft();
155 delay(600);
156 moveForward();
157
158 }
159 }
160
161 void loop() {
162 // put your main code here, to run repeatedly:
163 Blynk.run();
164 while(1)
165 {
166 Blynk.run();
167 int val=digitalRead(key);
168 while(val==LOW)
169 {
170 Blynk.run();
171 val=digitalRead(key);
172 }
173 while(1)
174 {
175 Blynk.run();
176 val=digitalRead(key);
177 if(val==LOW)
178 {
179 stopit();
180 break;
181 }
182 range();
183 while(cm>30)
184 {
185 Blynk.run();
186 val=digitalRead(key);
187 if(val==LOW)
188 {
189 stopit();
190 break;
191 }
192 moveForward();
193 range();
194 if(cm<10)
195 break;
196 }
197 Blynk.run();
198 val=digitalRead(key);
199 if(val==LOW)
200 {
201 stopit();
202 break;
203 }
204 turn();
205 }
206 }
207 }
208
209 void stopit()
210 {
211 digitalWrite(motor_in1,LOW);
212 digitalWrite(motor_in2,LOW);
213 digitalWrite(motor_in3,LOW);
214 digitalWrite(motor_in4,LOW);
215 }
216 void moveForward()
217 {
218 digitalWrite(motor_in1,HIGH);
219 digitalWrite(motor_in2,LOW);
220 analogWrite(motor_in1,150);
221 analogWrite(motor_in2,0); //调PWM波
222 digitalWrite(motor_in3,HIGH);
223 digitalWrite(motor_in4,LOW);
224 analogWrite(motor_in3,150);
225 analogWrite(motor_in4,0);
226 }
227 void moveRight()
228 {
229 digitalWrite(motor_in2,HIGH);
230 digitalWrite(motor_in1,LOW);
231 digitalWrite(motor_in4,LOW);
232 digitalWrite(motor_in3,LOW);
233 }
234 void moveLeft()
235 {
236 digitalWrite(motor_in1,LOW);
237 digitalWrite(motor_in2,LOW);
238 digitalWrite(motor_in3,HIGH);
239 digitalWrite(motor_in4,LOW);
240 }
241
242 void moveback()
243 {
244 digitalWrite(motor_in4,HIGH);
245 digitalWrite(motor_in3,LOW);
246 digitalWrite(motor_in2,HIGH);
247 digitalWrite(motor_in1,LOW);
248
249 }
避障代码是我自己写的,逻辑上有点,但是不是很严谨,有时会有一点问题,有更好代码的伙伴们欢迎指教
有问题请大家指教(●ˇ∀ˇ●)~~~~~~~~
原文出处:https://www.cnblogs.com/blogs-192-168-9-222/p/11506638.html
来源:oschina
链接:https://my.oschina.net/u/4391811/blog/3252652