文章目录[隐藏]

准备工具:

Arduino开发板

双直流电机

万向轮

H桥电机驱动板


电机驱动如下:

2路直流电机驱动板模块,双H桥步进电机驱动

H桥控制电路

在此之前你需要了解什么是H桥控制电路,电路如下:

H桥是由四个三极管实现,Q1和Q3为PNP类型三极管,Q2和Q4为NPN类型三极管,M为电机。
原理很晦涩,当Q1为低电平0时,1号三极管导通。NPN型三极管的极性与PNP型相反,所以当Q2三极管为低电平时0改三极管不导通。同样的,当Q3三极管为高电平1时,该三极管不导通,Q4为高电平1时可以导通。所以要想实现电机正转,需要如下控制电路:

(Q1、Q2低电平,Q3、Q4高电平)

反过来就是电机倒转了(Q1、Q2为高电平,Q3、Q4为低电平)

电路板分析

该模块由电源输入+I/O输入+输出组成,由于Arduino的控制电流过小不足以驱动电机,所以需要用到该驱动板,输入I/O用于连接Arduino,输出端连接两个电机。

IN1和IN2是用于控制一个电机,IN3和IN4用于控制另一个电机,不同的电平信号可控制电机的正转、反转及刹车等,对照表如下:

可以看出,当IN1为高调平1而IN2为低电平0时电机正转,反之电机反转,IN1和IN2均为高电平时为刹车。所以可以编写程序如下:

首先宏定义各接口与驱动板的连接关系,将Arduino的A0-A3接口对应地接到驱动板的IN1-IN4口,一号电机接MOTOR-A,二号电机接MOTOR-B

#define motor_in1 A0  //IO接口连接电机驱动
#define motor_in2 A1
#define motor_in3 A2
#define motor_in4 A3

然后初始化一下,均为输出端

void setup() {  //初始化输出端
pinMode(motor_in1,OUTPUT);
pinMode(motor_in2,OUTPUT);
pinMode(motor_in3,OUTPUT);
pinMode(motor_in4,OUTPUT);
}

当两个车轮均为正转时,小车往前走,根据对照表,正转为IN1和IN3为高电平,IN2和IN4为低电平,所以代码可以这样写(将不同的工作方式打包成模块,以便之后调用):

void moveForward()  //电机正转模块,前进
{
digitalWrite(motor_in1,HIGH); //左车轮
digitalWrite(motor_in2,LOW);
digitalWrite(motor_in3,HIGH); //右车轮
digitalWrite(motor_in4,LOW);
 }

倒车时只需让两个车轮反向旋转即可,即IN1和IN3为低电平,IN2和IN4为高电平。

void moveForward()  //电机到转模块,前进
{
digitalWrite(motor_in1,LOW); //左车轮
digitalWrite(motor_in2,HIGH);
digitalWrite(motor_in3,LOW); //右车轮
digitalWrite(motor_in4,HIGH);
 }

小车左转时候只需让左轮刹车右轮正转即可,即IN1和IN2高电平,IN3高电平,IN3低电平

void moveLeft()  //电机左转模块,左轮静止,右轮运动
{
digitalWrite(motor_in1,HIGH);  //左车轮,均为高电平时该轮刹车
digitalWrite(motor_in2,HIGH);
digitalWrite(motor_in3,LOW);   //右车轮
digitalWrite(motor_in4,HIGH);

右转时反过来,右轮静止左轮旋转,即IN1为高电平IN2为低电平,IN3和IN4均为高电平。

void moveRight()  //电机右转模块,右轮静止,左轮运动
{
digitalWrite(motor_in1,LOW);  //左车轮
digitalWrite(motor_in2,HIGH);
digitalWrite(motor_in3,HIGH);  //右车轮,均为高电平时该轮刹车
digitalWrite(motor_in4,HIGH);
 }

最终在循环体中调用个模块,为了更好地观察,可以将每个模块只需几秒,之后需要扩展(遥控)时再改即可。

void loop() {       //函数调用,延迟执行
moveForward();      //调用正转模块
delay(3000);        //执行3秒钟
moveBackward();      //调用倒转模块
delay(3000);        //执行3秒钟
void moveLeft();     //调用左转模块
delay(3000);        //执行3秒钟
void moveRight();    //调用右转模块
delay(3000);        //执行3秒钟
}

之后就将代码编译一下,发送到Arduino执行即可。

g

整个代码文件如下:

#define motor_in1 A0  //IO接口连接电机驱动
#define motor_in2 A1
#define motor_in3 A2
#define motor_in4 A3

void setup() {      //初始化输出端
pinMode(motor_in1,OUTPUT);
pinMode(motor_in2,OUTPUT);
pinMode(motor_in3,OUTPUT);
pinMode(motor_in4,OUTPUT);
}

void loop() {       //函数调用,延迟执行
moveForward();      //调用正转模块
delay(3000);        //执行3秒钟
moveBackward();      //调用倒转模块
delay(3000);        //执行3秒钟
void moveLeft();     //调用左转模块
delay(3000);        //执行3秒钟
void moveRight();    //调用右转模块
delay(3000);        //执行3秒钟
}

void moveForward()  //电机正转模块,前进
{
digitalWrite(motor_in1,HIGH); //左车轮
digitalWrite(motor_in2,LOW);
digitalWrite(motor_in3,HIGH); //右车轮
digitalWrite(motor_in4,LOW);
 }
void moveBackward()  //电机反转模块,倒退
{
digitalWrite(motor_in1,LOW);  //左车轮,
digitalWrite(motor_in2,HIGH);
digitalWrite(motor_in3,LOW);  //右车轮
digitalWrite(motor_in4,HIGH);
 }
void moveLeft()  //电机左转模块,左轮静止,右轮运动
{
digitalWrite(motor_in1,HIGH);  //左车轮,均为高电平时该轮刹车
digitalWrite(motor_in2,HIGH);
digitalWrite(motor_in3,LOW);   //右车轮
digitalWrite(motor_in4,HIGH);
 }
void moveRight()  //电机右转模块,右轮静止,左轮运动
{
digitalWrite(motor_in1,LOW);  //左车轮
digitalWrite(motor_in2,HIGH);
digitalWrite(motor_in3,HIGH);  //右车轮,均为高电平时该轮刹车
digitalWrite(motor_in4,HIGH);
 }

 

朱古力

By 朱古力

一条咸鱼

在 “Arduino控制小车运动” 有 1 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注