学习记录L298n驱动模块、麦克纳姆轮小车

一、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);

五、成果

不能上传视频,不便展示

 

版权声明:本文为CSDN博主「Z·y001」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_63503875/article/details/122513441

生成海报
点赞 0

Z·y001

我还没有学会写个人说明!

暂无评论

相关推荐

基于51单片机的智能台灯设计

一.硬件方案 本文介绍了一种基于PWM调光的智能台灯设计。把单片机技术和PWM调光技术结合起来实现台灯光强的调节。即在不改变PWM方波周期的前提下,利用单片机控制PWM的占空比,从而来改变电压的大小实现灯光亮度的调

Arduino智能小车 ———电机驱动

L298N电机驱动代码,完成功能:前进、后退,控制时间相同。 问题:给进相同PWM数值,两边转速并不一致,无法回到原点。 int IN12;//电机1两个控

STM32蓝牙后驱小车详细制作教程

前言 忙里偷闲,出于兴趣做了一个STM32蓝牙小车,看了很多教程,要么讲的不清不楚,要么付费下载源码,实属烦人,遂写下本教程,完全开源免费&#x