嵌入式入门学习笔记——L298n驱动模块、麦克纳姆轮小车

举报
yd_266832696 发表于 2025/05/31 21:39:09 2025/05/31
【摘要】 L298N是一款高性能电机驱动模块,可同时控制两个直流电机(6V-46V,2A),支持正反转、PWM调速及过热保护。通过Arduino的I/O引脚控制ENA/ENB使能端和IN1-IN4方向引脚,实现电机驱动。典型应用包括基础电机控制和麦克纳姆轮全向移动,后者需对各轮速度进行正交分解组合,通过8个独立函数控制各轮方向及速度,实现前进、后退、平移、旋转等复杂运动。代码示例展示了电机加速/减速控

一、L298n驱动模块

1.好处

L298N,是一款接受高电压的电机驱动器,直流电机和步进电机都可以驱动。一片驱动芯片可同时控制两个直流减速电机做不同动作,在6V到46V的电压范围内,提供2安培的电流,并且具有过热自断和反馈检测功能。

L298N可对电机进行直接控制,通过主控芯片的I/O输入对其控制电平进行设定,就可为电机进行正转反转驱动,操作简单、稳定性好,可以满足直流电机的大电流驱动条件。

2.各引脚意思,接法

MOTORA: 电机A

MOTORB: 电机B

VMS: 可接46V电源

GND :负极

5V:5v输出电压(可为arduino供电)

ENA:使能端A,可控制电机A的转速

ENB:使能端B,可控制电机B的转速

IN1、IN2:控制电机A(MOTORA)正转反转

IN3、IN4:控制电机B(MOTORB)正转反转

举个例子

二、思路

        电源给驱动板供电

        驱动板给arduino板供电(5V)

        arduino通过ENA、ENB、IN引脚发送信息给驱动板

        驱动板执行

 三、接线

 四、代码

int enA = 9;//驱动模块的ENA接Arduino的9号引脚
int in1 = 8;
int in2 = 7;

int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
  
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
  //先给低电平,让轮子不动
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

void loop() {
  //火力全开前进模式
  analogWrite(enA, 255);//给电机A的电压达到最大,0电压最小,255电压最大
  analogWrite(enB, 255);

  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  delay(2000);
  //后退模式
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  delay(2000);
  //制动刹车
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  delay(2000);
  //匀加速前进,先让电机准备动起来
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  //i逐渐加大,驱动板给的电压加大,速度逐渐加大
  for (int i = 0; i < 256; i++) {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  }
  //同理,让电机匀减速
  for (int i = 255; i >= 0; --i) {
    analogWrite(enA, i);
    analogWrite(enB, i);
    delay(20);
  }
  //停下
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  
}

analogwrite()函数产生PWM信号将两个电动机从零加速到最大速度,然后将其减速回零。最后,它关闭了电动机 

五、麦克纳姆轮

因为麦克纳姆轮子是斜的,所以受到地面的摩擦力也是斜的45°

正确装法

前进:

受力分析,将速度正交分解,左右相抵消

后退

同理

原地旋转:

左前轮   前进
左后轮 前进
右前轮 后退
右后轮 后退

 上下的速度相互抵消,前面的轮速度向右,后面的轮速度向左。

平移:


左前轮   后退
左后轮 前进
右前轮 前进
右后轮 后退


上下的速度相互抵消,前面的轮速度向左,后面的轮速度向左。

 斜向上:


错误装法 

 部分代码展示:

先写各个轮子运动的情况函数,共八种

void L1_forward(int v)//左前轮前进,输入要求的速度v(0~255)
{
  digitalWrite(L1_IN1,LOW);
  digitalWrite(L1_IN2,HIGH);
  analogWrite(L1_ENA,v);
}
void R1_forward(int v)//右前轮前进
{
  digitalWrite(R1_IN1,HIGH);
  digitalWrite(R1_IN2,LOW);
  analogWrite(R1_ENA,v);
}
void L2_forward(int v)//左后轮前进
{
  digitalWrite(L2_IN1,HIGH);
  digitalWrite(L2_IN2,LOW);
  analogWrite(L2_ENA,v);
}
void R2_forward(int v)//右后轮前进
{
  digitalWrite(R2_IN1,HIGH);
  digitalWrite(R2_IN2,LOW);
  analogWrite(R2_ENA,v);
}
void allstop()
{
  digitalWrite(L1_IN1,LOW);
  digitalWrite(L1_IN2,LOW);  
  digitalWrite(R1_IN1,LOW);
  digitalWrite(R1_IN2,LOW);
  digitalWrite(L2_IN1,LOW);
  digitalWrite(L2_IN2,LOW);
  digitalWrite(R2_IN1,LOW);
  digitalWrite(R2_IN2,LOW);
}
void L1_backward(int v)//左前轮后退
{
  digitalWrite(L1_IN1,HIGH);
  digitalWrite(L1_IN2,LOW);
  analogWrite(L1_ENA,v);
}
void R1_backward(int v)//右前轮后退
{
  digitalWrite(R1_IN1,LOW);
  digitalWrite(R1_IN2,HIGH);
  analogWrite(R1_ENA,v);
}
void L2_backward(int v)//左后轮后退
{
  digitalWrite(L2_IN1,LOW);
  digitalWrite(L2_IN2,HIGH);
  analogWrite(L2_ENA,v);
}
void R2_backward(int v)//右后轮后退
{
  digitalWrite(R2_IN1,LOW);
  digitalWrite(R2_IN2,HIGH);
  analogWrite(R2_ENA,v);
}

 整体小车的运动情况代码

/*前进*/
  L1_forward(100);
  R1_forward(100);
  L2_forward(100);
  R2_forward(100);
  delay(1500);
  allstop();
  delay(1500);

  /*后退*/
  L1_backward(100);
  R1_backward(100);
  L2_backward(100);
  R2_backward(100);
  delay(1500);
  allstop();
  delay(1500);
  
  /*顺时针原地旋转*/
  L1_forward(200);
  R1_backward(200);
  L2_forward(200);
  R2_backward(200);
  delay(1500);
  allstop();
  delay(1500);

  /*逆时针原地旋转*/
  L1_backward(200);
  R1_forward(200);
  L2_backward(200);
  R2_forward(200);
  delay(1500);
  allstop();
  delay(1500);

  /*左边平移*/
  L1_backward(150);
  R1_forward(150);
  L2_forward(150);
  R2_backward(150);
  delay(1500);
  allstop();
  delay(1500);

  /*右边平移*/
  L1_forward(150);
  R1_backward(150);
  L2_backward(150);
  R2_forward(150);
  delay(1500);
  allstop();
  delay(1500);
  
  /*斜向左上方*/
  R1_forward(150);
  L2_forward(150);
  delay(1500);
  allstop();
  delay(1500);
  
  /*斜向右上方*/
  L1_forward(150);
  R2_forward(150);
  delay(1500);
  allstop();
  delay(1500);
  
  /*斜向左下方*/
  L1_backward(150);
  R2_backward(150);
  delay(1500);
  allstop();
  delay(1500);
  
  /*斜向右下方*/
  R1_backward(150);
  L2_backward(150);
  delay(1500);
  allstop();
  delay(1500);


五、成果

不能上传视频,不便展示



【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。