Arduino_蓝牙遥控_智能小车_案例

需要材料:

  1.     小车套件(包括轮胎、电机)

  2.     L298N驱动模块 (可以把电池的高电压转换为我们需要的5V,3.3V电压) 

  3.     电池

  4.     电池座

  5.     Arduino UNO 开发板

  6. 蓝牙模块(通用模块,注意!上传代码时因共用串口的原因会上传代码失败,解决方法:上传代码时候,拔掉蓝牙模块

  7. 需要手机安装 SPP蓝牙串口 (如果找不到的,或者下载的不好用,可以私信我,给你网盘链接)

此案例中用到串口通信

 

安装和连接:

 

Arduino_蓝牙遥控_智能小车_案例

+12V:该引脚接的电压是驱动模块所能输出给电机的最大电压,一般 直接接电池。12V是由L298N芯片所能接受最大电压而定,一般介入5~12V电压。在此我们接入的电压为两节18650串联的电压,即3.7+3.7=7.4V;

GND: 在该项目中GND即为电源的负极,同时要保证Arduino开发板,驱动模块等所有模块的GND连在一起才可以正常工作。在某些复杂的项目中还需要区分数字地和模拟地,在此不做详细介绍。

+5V: L298N模块(注意不是L298N芯片)内含稳压电路(将高电压转换为低电压的电路),在模块内部将”+12V”引脚输入的电压转化为可供开发板使用的+5V电压,一般将次输出接入到开发板为开发板供电。

L298N有两路输出,所以可以控制小车前进、后退、转弯,其中:

ENA: 代表第一路输出的电压大小。驱动模块输出电压越高,电机转速越快。

1.当其输入为0V的时候,驱动模块输出对第一路电机输出电压为0V;

2.当其输入为3.3V的时候,驱动模块对第一路电机输出电压为”+12V”引脚的输入电压。

3.由于ENA输入电压的高低控制驱动对电机的输出电压,因此当我们需要对小车运动速度进行控制的时候,一般通过PWM对”ENA”引脚进行控制。

 

IN1/IN2:这两个引脚控制电机正反转方向。例:假如IN1输入高电平3.3V,IN2输入低电平0V,ENA为3.3V,电机正转,此时将IN1输入改为0V,IN2输入改为3.3V,其他条件不变,则电机将会反转。

OUT1/OUT2:这两个引脚分别接电机的两极。

ENB,IN3/IN4,OUT3/OUT4引脚控制第二路输出,与上述ENB,IN3/IN4,OUT3/OUT4功能相似。

 

L298N驱动的IN1/IN2/IN3/IN3引脚与Arduino板的4/5/6/7号引脚对应相连

 

蓝牙模块连接:

TX:接Arduino UNO开发板”RX”引脚 

RX:接Arduino UNO开发板”TX”引脚 

GND:接Arduino UNO开发板”GND”引脚 

VCC:接Arduino UNO开发板”5V”或”3.3V”引脚        

 

我这里由于硬件准备不足,所以只有两个*可供驱动,其中一个使用万向轮,对,你没理解错,我做的是,三轮车!!!

代码如下:

#include <Servo.h>

//定义五中运动状态

char FORWARD = '1'; //前进

char BACKWARD = '2'; //后退

char TURNLEFT = '3'; //左转弯

char TURNRIGHT = '4'; //右转弯

char STOP = '0'; //停止

//定义需要用到的引脚

int leftMotor1 = 4;

int leftMotor2 = 5;

int rightMotor1 = 6;

int rightMotor2 = 7;

//接收到的字符

char cmd;

 

void setup() {

  Serial.begin(9600);   

  //设置控制电机的引脚为输出状态

  pinMode(leftMotor1, OUTPUT);

  pinMode(leftMotor2, OUTPUT);

  pinMode(rightMotor1, OUTPUT);

  pinMode(rightMotor2, OUTPUT);

}

 

void loop() {

  //读取蓝牙模块发送到串口的数据

if(Serial.available())

{

    cmd = Serial.read();

    delay(5);

 

    Serial.println(cmd);

}

 

  //控制电机转动

if(cmd == FORWARD )

  {

    digitalWrite(leftMotor1, LOW);//正转

      digitalWrite(leftMotor2, HIGH);

      digitalWrite(rightMotor1, LOW);

      digitalWrite(rightMotor2, HIGH);

    }

   if(cmd == BACKWARD )

  {

    digitalWrite(leftMotor1, HIGH);//反转

      digitalWrite(leftMotor2, LOW);

      digitalWrite(rightMotor1, HIGH);

      digitalWrite(rightMotor2, LOW);

    }

    if(cmd == TURNLEFT )

   {

    digitalWrite(leftMotor1, LOW);//左转

      digitalWrite(leftMotor2,LOW);

      digitalWrite(rightMotor1, LOW);

      digitalWrite(rightMotor2, HIGH);

    }

    if(cmd == TURNRIGHT )

   {

    digitalWrite(leftMotor1, LOW);//右转

      digitalWrite(leftMotor2, HIGH);

      digitalWrite(rightMotor1, LOW);

      digitalWrite(rightMotor2, LOW);

    }

     if(cmd == STOP )

    {

    digitalWrite(leftMotor1, LOW);//停止

      digitalWrite(leftMotor2, LOW);

      digitalWrite(rightMotor1, LOW);

      digitalWrite(rightMotor2, LOW);

    }

}