小言_互联网的博客

基于Arduino和Blynk的远程遥控小车

293人阅读  评论(0)

基于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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场