基于Arduino和Blynk的远程遥控小车
小车图片😀ε=ε=ε=(~ ̄▽ ̄)~,其实很简单一起来看看叭
废话不多说。首先做这个智能小车所需要的东西有
硬件支持:
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波特率。
#include <SoftwareSerial.h>
SoftwareSerial mySerial(A1, A0); // RX, TX
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.println("Goodnight moon!");
// set the data rate for the SoftwareSerial port
mySerial.begin(115200);
mySerial.println("Hello, world?");
}
void loop() { // run over and over
if (mySerial.available()) {
Serial.write(mySerial.read());
}
if (Serial.available()) {
mySerial.write(Serial.read());
}
}
上传代码,打开串口,调波特率为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简单控制电机
先不看模式转换,上面的控件可以是电机前进,后退,左转,右转,调速
代码如下:
#define BLYNK_PRINT Serial
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "YourAuthToken";
// Your WiFi credentials.
// Set password to "" for open networks.
char ssid[] = "YourNetworkName";
char pass[] = "YourPassword";
// Hardware Serial on Mega, Leonardo, Micro...
#define EspSerial Serial1
// or Software Serial on Uno, Nano...
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(A1, A0); // RX, TX
// Your ESP8266 baud rate:
#define ESP8266_BAUD 9600
ESP8266 wifi(&EspSerial);
void setup()
{
// Debug console
Serial.begin(9600);
delay(10);
// Set ESP8266 baud rate
EspSerial.begin(ESP8266_BAUD);
delay(10);
Blynk.begin(auth, wifi, ssid, pass);
}
void loop()
{
Blynk.run();
}
YourAuthTokenW改为邮件里的Token,YourNetworkName,YourPassword改为你的8266可以连的WIFI的名字和密码
只要是可以连的WIFI就行,手机热点也行,让8266联网,然后和blynk云端服务器与Arduino通信实现联网控制功能
SG90舵机
舵机的橙、红、棕三色线分别代表PWM输入信号线,正极,负极
将超声波模块和舵机转头放在一起
超声波模块 Trig-12,Echo-~9
小车总代码:
#define BLYNK_PRINT Serial
//#include <avr/wdt.h>
//#include<VoiceRecognition.h>
#define motor_in1 11//将电机驱动IN1接到A0端口
#define motor_in2 6
#define motor_in3 5
#define motor_in4 3
#define trig 12
#define echo 9
#include <ESP8266_Lib.h>
#include <BlynkSimpleShieldEsp8266.h>
#include <Servo.h>
//VoiceRecognition Voice;
char auth[] = "o370IDZiW12AbhEiQiquapDaJynIE40_";
unsigned int right,left;
char ssid[] = "OPPO A9x";
char pass[] = "12345678";
int key=7;
int sound=8;
unsigned int cm;
Servo s;
// Hardware Serial on Mega, Leonardo, Micro...
#define EspSerial Serial1
#include <SoftwareSerial.h>
SoftwareSerial EspSerial(A1, A0); // RX, TX
// Your ESP8266 baud rate:
#define ESP8266_BAUD 9600
ESP8266 wifi(&EspSerial);
void setup()
{
// put your setup code here, to run once:
Serial.begin(9600);
delay(10);
EspSerial.begin(ESP8266_BAUD);
delay(10);
Blynk.begin(auth, wifi, ssid, pass);
pinMode(motor_in1,OUTPUT);
pinMode(motor_in2,OUTPUT);
pinMode(motor_in3,OUTPUT);
pinMode(motor_in4,OUTPUT);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
s.attach(2);
s.write(90);
tone(12,800,500);
digitalWrite(motor_in1,LOW);
digitalWrite(motor_in2,LOW);
digitalWrite(motor_in3,LOW);
digitalWrite(motor_in4,LOW);
}
void range()
{
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
int temp = float(pulseIn(echo,HIGH));
cm = (temp*17)/1000;
Serial.print("Echo =");
Serial.print(temp);//串口输出等待时间的原始数据
Serial.print(" | | Distance = ");
Serial.print(cm);//串口输出距离换算成cm的结果
Serial.println("cm");
delay(100);
if(cm<30)
{
tone(12,800,50);
delay(50);
}
}
void Leftrange()
{
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
int temp = float(pulseIn(echo,HIGH));
cm = (temp*17)/1000;
Serial.print("Echo =");
Serial.print(temp);//串口输出等待时间的原始数据
Serial.print(" | | LeftDistance = ");
Serial.print(cm);//串口输出距离换算成cm的结果
Serial.println("cm");
delay(100);
if(cm<30)
{
tone(12,800,50);
delay(50);
}
}
void Rightrange()
{
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
int temp = float(pulseIn(echo,HIGH));
cm = (temp*17)/1000;
Serial.print("Echo =");
Serial.print(temp);//串口输出等待时间的原始数据
Serial.print(" | | RightDistance = ");
Serial.print(cm);//串口输出距离换算成cm的结果
Serial.println("cm");
delay(100);
if(cm<30)
{
tone(12,800,50);
delay(50);
}
}
void turn()
{
stopit();
delay(1000);
s.write(170);
delay(500);
Leftrange();
left=cm;
s.write(90);
delay(500);
s.write(10);
delay(500);
Rightrange();
right=cm;
s.write(90);
delay(500);
if(right>=left)
{
moveRight();
delay(600);
moveForward();
}
else
{
moveLeft();
delay(600);
moveForward();
}
}
void loop() {
// put your main code here, to run repeatedly:
Blynk.run();
while(1)
{
Blynk.run();
int val=digitalRead(key);
while(val==LOW)
{
Blynk.run();
val=digitalRead(key);
}
while(1)
{
Blynk.run();
val=digitalRead(key);
if(val==LOW)
{
stopit();
break;
}
range();
while(cm>30)
{
Blynk.run();
val=digitalRead(key);
if(val==LOW)
{
stopit();
break;
}
moveForward();
range();
if(cm<10)
break;
}
Blynk.run();
val=digitalRead(key);
if(val==LOW)
{
stopit();
break;
}
turn();
}
}
}
void stopit()
{
digitalWrite(motor_in1,LOW);
digitalWrite(motor_in2,LOW);
digitalWrite(motor_in3,LOW);
digitalWrite(motor_in4,LOW);
}
void moveForward()
{
digitalWrite(motor_in1,HIGH);
digitalWrite(motor_in2,LOW);
analogWrite(motor_in1,150);
analogWrite(motor_in2,0); //调PWM波
digitalWrite(motor_in3,HIGH);
digitalWrite(motor_in4,LOW);
analogWrite(motor_in3,150);
analogWrite(motor_in4,0);
}
void moveRight()
{
digitalWrite(motor_in2,HIGH);
digitalWrite(motor_in1,LOW);
digitalWrite(motor_in4,LOW);
digitalWrite(motor_in3,LOW);
}
void moveLeft()
{
digitalWrite(motor_in1,LOW);
digitalWrite(motor_in2,LOW);
digitalWrite(motor_in3,HIGH);
digitalWrite(motor_in4,LOW);
}
void moveback()
{
digitalWrite(motor_in4,HIGH);
digitalWrite(motor_in3,LOW);
digitalWrite(motor_in2,HIGH);
digitalWrite(motor_in1,LOW);
}
避障代码是我自己写的,逻辑上有点,但是不是很严谨,有时会有一点问题,有更好代码的伙伴们欢迎指教
有问题请大家指教(●ˇ∀ˇ●)~~~~~~~~
转载:https://blog.csdn.net/weixin_44385027/article/details/101077078