/------转载请附上本文链接 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 }
避障代码是我自己写的,逻辑上有点,但是不是很严谨,有时会有一点问题,有更好代码的伙伴们欢迎指教
有问题请大家指教(●ˇ∀ˇ●)~~~~~~~~