概述

这个三轮小车的第一课,再这一课中,我们将介绍如何安装底盘、直流电机、arduino uno控制器、电机控制器、电源等部件,安装完必要部件后,会介绍如何驱动直流电机,让小车能前进、后退、左右转。

硬件部分

1 电机

所需配件:

M3*30十字螺丝  x 4颗

M3螺帽  x 4颗

用M3*30螺丝加螺帽按照图示把两个驱动轮安装到底盘上,将左右两个车轮装在直流电机轴上。(记得加图片!)

2 万向轮

所需配件:

M3*12双通铜柱  x 4根

M3*5十字螺丝  x 8颗

用M3*5十字螺把铜柱一端固定在亚克力底盘上,用M3*5螺丝将万向轮固定在铜柱另一端。(记得加图片!)

3 电池盒

所需配件:

M3*10十字螺丝  x 4颗

M3*10螺帽  x 4颗

将电池盒用4和M3*10十字螺丝固定在亚克力底盘表面,并用M3螺帽拧紧(记得加图片!)

4 arduino uno

所需配件:

M3*10十字螺丝  x 4颗

M3*10螺帽  x 4颗

用四颗M3*10螺丝和螺帽把arduino uno固定在亚克力底盘表面上(记得加图片!)

5 L298N电机驱动板

所需配件:

M3*10十字螺丝  x 4颗

M3*10螺帽  x 4颗

用四颗M3*10螺丝和螺帽把L298N电机驱动板固定在亚克力底盘表面上(记得加图片!)

6 接线

整个小车的电源由安装在电池盒中18650电池供电。电池盒上有红黑两条线,将红黑两条线分别接到DC头上标记有“+”和“-”的接线端子上,DC头插到Arduino UNO,这样Arduino UNO就能工作了。再从DC头上接出一条红黑线给L298N电机驱动板供电。如图所示

要驱动直流电机需要借助L298N电机驱动器,不能直接用arduino uno GPIO口驱动,因为单片机GPIO带负载能力是比较弱的。L298N上分别有ENA、IN1-IN4、ENB。其中ENA和ENB分别用于控制两路输出的速度;IN1、IN2用于控制第一路输出方向;IN3、IN4用于控制第二路输出的方向。

关于L298N的详解介绍请移步到这里

L298NPro motor driver module

用公对母杜邦线按照下表将L298N与arduino uno对应连接起来

Arduino UNO L298N
D5 ENA
D7 IN1
D8 IN2
D9 IN3
D10 IN4
D6 ENB

(补张图!!)

右边电机插到K1或K2口上;左边电机插到K3或K4口上(做张图!)

至此硬件部分算是告一段落了,接下来是软件部分。

软件

下载示例代码并解压,用arduino IDE打开lesson-1.ino,下面对部分代码作简单说明。

#define IN1  7   //K1、K2 motor direction
#define IN2  8     //K1、K2 motor direction
#define IN3  9    //K3、K4 motor direction
#define IN4  10   //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 ENA

上面是L298N与arduino之间的接口定义,需要注意的是,ENA和ENB需要接到PWM口上去,对于arduino uno而言D3、D5、D6、D9、D10、D11带PWM输出功能。IN1-IN4可以随便接。

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_right(int t)  //left motor rotate clockwise and right motor rotate counterclockwise -->robot turn right
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delay(t);
}
void turn_left(int t) //left motor rotate counterclockwise and right motor rotate clockwise -->robot turn left
{
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delay(t);
}

这几个函数分别用于控制小车前进、后退、停止、右转和左转。

void set_motorspeed(int lspeed,int rspeed) //change motor speed
{
  analogWrite(ENA,lspeed);//lspeed:0-255
  analogWrite(ENB,rspeed);//rspeed:0-255   
}

这个函数用于改变电机转速,lspeed是左边电机转速,rspeed是右边电机转速。给的值越大电机转的越快。这个函数参数合法的范围是:0-255

测试

用USB线将arduino 和PC连接起来,选择正确的板卡型号和端口将其烧录到arduino uno中。小车会按照下面的顺序运动:

  1. 向前运动2s
  2. 后退2s
  3. 左转2s
  4. 右转2s
  5. 停止