需要材料:
小车套件(包括轮胎、电机)
L298N驱动模块 (可以把电池的高电压转换为我们需要的5V,3.3V电压)
电池
电池座
Arduino UNO 开发板
蓝牙模块(需要注意的是上传代码时因共用串口的原因会上传代码失败,解决方法:上传代码时,拔掉蓝牙模块)
需要手机安装 SPP蓝牙串口 (如果找不到的可以私信笔者)
此案例中用到串口通信
安装和连接:
+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
//定义五中运动状态
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);
}
}