Arduino Tank Car Kit Lesson 3: Control the motor

Byamber

Arduino Tank Car Kit Lesson 3: Control the motor

{:en}


Authorized Amazon Seller:

Robot Tank Car Chassis

Buy from US Buy from CA Buy from UK Buy from DE Buy from IT Buy from FR Buy from ES

Robot Tank Car Electronic Parts Kit

Buy from US Buy from CA Buy from UK Buy from DE Buy from IT Buy from FR Buy from ES

I. Objective:

In this tutorial, we will use KOOKYE Smart DIY kit to make a simple program controlled smart car. Once the car installation is completed, we will use a UNO R3 board to control the car movements including go forward, go back, left turn and right turn.

II. How It Work:

Three Parts of Car Motor: DC motor,gear reducer and encoder.
There are 6 pin wires from encoder motor,two of them (red and black wires) come from the DC motor.
The pinout K1 or K2 and K3 or K4 on L298N board can be used for driving the left motor and right motor respectively.
The pinout ENA and ENB can be used to adjust the motor speed via input PWM signal.
The pinout N1,N2,N3 and N4 can be used to control the forward and backward direction of motor.

Motor(Left) Motor (Right)
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

III. Software Installation:

Step 1: Install latest Arduino IDE (If you have Arduino IDE version after 1.1.16, please skip this step)
Download Arduino IDE from https://www.arduino.cc/en/Main/Software?setlang=en , then install the software.

Step 2:Download Lesson Two sample code from http://www.kookye.com/download/Arduino_Tank_Car_Kit/tank_robot_lesson3.zip
, unzip the download zip file tank_robot_lesson2.zip, you will see a folder called tank_robot_lesson3.

Step 3: Connect UNO R3 board to PC with USB cable, Open Arduino IDE -> click file -> click Open -> choose code “smartcar-lesson2.ino” in tank_robot_lesson3 folder, load the code into arduino.

open

Step 4: Choose corresponding board and port for your project,upload the sketch to the board.

port

IV. Understanding the Code:

Part 1: Define the pinout as the table

#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

Part 2: Understand the structure,value and function.

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  
}

Part 3: Data initialization. We need to set the correct work mode to each pinouts(ENA,ENB,N1,N2,N3,N4) on driver board and call the above function in part 2.

 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
}

V. Hardware Installation:

Step 1: Install ESP8266 Expansion Board on UNO R3 board.
lesson2-HW-1
Step 2: Move the wire connected to digit ports(D5,D6,D8,D9,D10,D12) in UNO R3 board to its counterpart digit pin in ESP8266 wifi Board. Connected the port(GND,VCC,VT) in voltage meter and the port (GND,12V,VO) in L298N Board.

L298N-esp8266 wifi

L298N-voltage meter
Step 3: Turn the switch of esp8266 to “1” and “2” position, as the following photo shows.

lesson2-HW-2
(If you have finished the above steps on lesson one, please skip these step)

Step 4: Testing. the tank car will go forward for 5s,go back for 5s ,turn left for 5s and turn right for 5s in sequence.You also can change the example code to make the car movements as your need.

{:}{:zh}概述

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

原理

我们的坦克小车上用的是GM25直流减速电机,额定电压是9V,详细参数请看看下面链接。

http://kookye.com/2017/08/31/gm25-motor/

直流减速电机主要由两部分组成:直流电机和 减速器(图要重拍!!)。

直流电机有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

软件

下载http://www.kookye.com/download/car/tank_robot_lesson2.zip 并解压文件,用arduino IDE打开tank_robot_lesson2.ino文件,下面对代码做简要说明。

1.接口定义

在第一课中我们将L298N与esp8266 uart wifi shield按照如下方式连接

L298N esp8266 uart wifi 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,最后停止。如果不能得到这样的实验结果,请检查接线是否正确。{:}

About the Author

amber administrator

You must be logged in to post a comment