概述

在第一课中,我们介绍坦克底盘如何安装,各传感器如何与控制板连接。本课将在前一课的基础上,讲解如何驱动电机,如何实现坦克小车前进、后退、左右转、停止等基本功能。

原理

我们的坦克小车上用的是(电机型号??)直流减速电机,直流减速电机由两部分组成:直流电机和 减速器(图要重拍!!)。

直流电机有2个引脚,在这两个引脚上施加一个直流电压就能让电机转动,改变直流电压极性就可以改变电机的转向;改变电压大小可以改变电机转速。一般直流电机的转速很高,但是扭矩很小,在直流电机上增加一个减速器可以降低转速,增大扭矩。减速后的直流电机力矩增大,可控性增强。

除此之外,我们所用的电机上还有一个霍尔编码器,霍尔编码器上有6pin,其中2pin直接连接到直流电机的2个引脚上,因此,只需向霍尔编码器上这2pin上施加一个直流电压就可以控制电机了。由于制造工艺产生的误差,即使参数完全相同的两个直流减速电机给其施加完全相同的电压信号,其转速一般是不同的,所以坦克小车不能走直线属于正常现象。

霍尔编码器是通过磁电转换将输出轴上机械几何位移量转换成脉冲或数字量的传感器。霍尔编码器由霍尔码盘和霍尔元件组成,当电机转动时候编码器会输出脉冲信号,转速越快,输出脉冲数越多,反之,脉冲越少。可以通过编码器输出脉冲信号,控制左右两个电机转速,使其转速尽量一致,从而达到走直线的目的。关于编码器的使用会在后面的课程中详细讲解。(加一张电机图片,标注清楚编码器各条线含义!!)

(放一张L298N图片!!!)我们用L298N电机驱动器驱动电机,L298N电机驱动器本身可以驱动2路直流电机,经过扩展后可以驱动4路直流电机,其中K1、K2是一样的,K3、K4是一样的,左右电机如何与L298N连接前面已经介绍过了。向L298N上的ENA和ENB输入PWM信号就可以调节左右电机速度,L298N上的ENA和ENB原本是用2个跳线帽接到5V上去的,如果你不想调节电机速度,可以不用拔掉跳线帽;如果想调节电机速度需要拔掉跳线帽,将ENA、ENB接到arduino的PWM输出引脚上去。电机的正反转通过L298N上的IN1、IN2和IN3、IN4控制,其中,IN1、IN2控制左边电机;IN3、IN4控制右边电机,具体如下

左边电机 右边电机
ENA IN1 IN2 DC motor status ENB IN3 IN4 DC motor status
0 x x stop 0 x x stop
1 0 1 rotate clockwise 1 0 1 rotate clockwise
1 1 0 rotate counterclockwise 1 1 0 rotate counterclockwise
1 1 1 brake 1 1 1 brake
1 0 0 brake 1 0 0 brake

软件

下载https://osoyoo.com/driver/tank_robot_lesson2.zip并解压文件,用arduino IDE打开tank_robot_lesson2.ino文件,下面对代码做简要说明。

1.接口定义

在第一课中我们将L298N与ESP8266 UNO SHIELD按照如下方式连接

L298N ESP8266 UNO SHIELD
ENA D5
ENB D6
IN1 D8
IN2 D9
IN3 D10
IN4 D12

首先,在arduino IDE中按照上表顺序定义号各个接口

#define IN1  8    //K1、K2 motor direction
#define IN2  9    //K1、K2 motor direction
#define IN3  10    //K3、K4 motor direction
#define IN4  12   //K3、K4 motor direction
#define ENA  5    //needs to be a PWM pin to be able to control motor speed ENA
#define ENB  6   //needs to be a PWM pin to be able to control motor speed ENB

2.各功能函数

void go_ahead() //motor rotate clockwise -->robot go ahead
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4,HIGH);
}
void go_back()  //motor rotate counterclockwise -->robot go back
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4,LOW); 
}
void go_stop()   //motor brake  -->robot stop
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4,LOW); 
}
void turn_left()  //left motor rotate counterclockwise and right motor rotate clockwise -->robot turn left
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
}
void turn_right() //left motor rotate clockwise and right motor rotate counterclockwise -->robot turn right
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
}
/*set motor speed */
void set_motorspeed(int lspeed,int rspeed)  //change motor speed
{
  analogWrite(ENA,lspeed);//lspeed:0-255
  analogWrite(ENB,rspeed);//rspeed:0-255  
}

3.初始化

 void setup() {
  pinMode(IN1, OUTPUT); 
  pinMode(IN2, OUTPUT); 
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT); 
  pinMode(ENA, OUTPUT); 
  pinMode(ENB, OUTPUT);  
  set_motorspeed(255,255);//maximum speed
  go_ahead(),delay(5000),go_stop();  //robot forward 5s
  go_back(),delay(5000),go_stop();  //robot go back 5s
  turn_left(),delay(5000),go_stop();//robot turn left 5s
  turn_right(),delay(5000),go_stop();//robot turn right 5s
  go_stop();//stop
}

在setup()函数中,先将L298N各个引脚设置成正确的工作模式,然后调用上一步中编写的各个功能子函数,使坦克以最大速度前进5s->后退5s->左转5s->右转5s->停止

用usb线把坦克下车与pc连接起来,选择正确的板子型号和端口号,将程序烧录到arduino中,打开电池盒电源,正常情况坦克小车会先向前移动5s,在后退5s,接着左转5s,再右转5s,最后停止。如果不能得到这样的实验结果,请检查接线是否正确。