L298N 直流电机驱动模块与 Arduino

这篇具有很好参考价值的文章主要介绍了L298N 直流电机驱动模块与 Arduino。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

L298N 直流电机驱动模块与 Arduino

原文地址

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

L298N 电机驱动器可以控制两个直流电机的速度和旋转方向。

此外,它还可以控制双极步进电机,例如NEMA 17。如果您想了解更多信息,请查看本教程。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

L298N电机驱动器和Arduino控制步进电机:Control Stepper Motor with L298N Motor Driver & Arduino (lastminuteengineers.com)

控制直流电机

只有当我们可以控制直流电机的速度和旋转方向时,我们才能完全控制它。

  • PWM – 控制速度
  • H桥 – 控制车轮方向

让我们进一步了解这些技术。

直流电机的速度可以通过改变其输入电压来控制。实现此目的的一种广泛使用的技术是脉宽调制(PWM)。

PWM是一种通过发送一系列ON-OFF脉冲来调整输入电压平均值的技术。该平均电压与脉冲的宽度成正比,称为占空比

占空比越高,施加到直流电机的平均电压就越高,从而导致电机速度增加。占空比越短,施加到直流电机的平均电压越低,导致电机速度降低。

下图显示了具有各种占空比和平均电压的PWM技术。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32脉宽调制(PWM)技术

H桥 – 控制车轮方向

直流电机的旋转方向可以通过改变其输入电压的极性来控制。实现此目的的一种广泛使用的技术是使用 H 桥。

H桥电路由四个排列成H形的开关组成,电机位于中心。

同时关闭两个特定开关可反转施加到电机的电压的极性。这会导致电机旋转方向发生变化。

以下动画显示了 H 桥电路的工作原理。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32H桥工作

L298N 电机驱动芯片

模块的中心是一个大的黑色芯片,带有一个厚实的散热器 - L298N。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

L298N芯片包含两个标准H桥,能够驱动一对直流电机,非常适合构建两轮机器人平台。

L298N 电机驱动器的电源范围为 5V 至 35V,每通道能够提供 2A 的连续电流,因此它与我们的大多数直流电机配合得很好。

技术规格

以下是规格:

电机输出电压 5V – 35V
电机输出电压(推荐) 7V – 12V
逻辑输入电压 5V – 7V
每通道连续电流 2一
最大功耗 25

有关更多详细信息,请参阅下面的数据表。

L298N 数据表

L298N 电机驱动器模块引脚排列

L298N 模块有 11 个引脚,允许它与外界通信。引脚排列如下:

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32
latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

电源引脚

L298N 电机驱动器模块从 3 针 间距3.5mm螺丝端子接收电源。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32
L298N 电机驱动器有两个输入电源引脚:VS 和 VSS。

VS引脚为 IC 的内部 H 桥供电,该桥驱动电机。该引脚接受 5V 至 12V 的输入电压。

VSS用于为 L298N IC 内的逻辑电路供电,范围为 5V 至 7V。

接地是公共接地引脚。

输出引脚

L298N电机驱动器的输出通道,输出 1 和输出 2用于电机 A 和输出 3 和输出 4对于电机 B,用两个 3.5mm 间距的螺丝端子断开到模块的边缘。您可以将两个 5-12V 直流电机连接到这些端子。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

模块上的每个通道可为直流电机提供高达 2A 的电流。然而,提供给电机的电流量取决于电机电源的容量。

方向控制引脚

方向控制引脚允许您控制电机是向前还是向后旋转。这些引脚实际上控制着L298N芯片内H桥电路的开关。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

该模块有两个方向控制引脚。这IN1 和 IN2销控制电机A的旋转方向;而IN3 和 IN4控制电机B的旋转方向。

电机的旋转方向可以通过对这些输入施加逻辑高电平(5V)或逻辑低电平(接地)来控制。下图显示了各种组合及其结果。

输入1 输入2 车轮方向
低(0) 低(0) 电机关闭
高(1) 低(0) 向前
低(0) 高(1) 向后
高(1) 高(1) 电机关闭

速度控制引脚

速度控制引脚ENA和ENB用于打开/关闭电机并控制其速度。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

将这些引脚拉高会导致电机旋转,而将它们拉低将停止它们。通过脉宽调制(PWM),可以控制电机的速度。

该模块通常在这些引脚上带有跳线。当此跳线就位时,电机全速旋转。如果要以编程方式控制电机的速度,请卸下跳线并将它们连接到Arduino的PWM引脚。

板载 5V 稳压器和跳线

该模块包括一个 78M05 5V 稳压器,可通过跳线使能或禁用。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

当此跳线就位时,5V稳压器使能,逻辑电源(VSS)从电机电源(VS)派生。在这种情况下,5V输入端子充当输出引脚,提供5V 0.5A电流。您可以使用它为 Arduino 或其他需要 5V 电源的电路供电。

当跳线被移除时,5V稳压器被禁用,我们必须通过VSS引脚单独提供5V。

警告:

如果电机电源小于 12V,则可以将跳线保持在原位。如果大于12V,则必须拆下跳线,以防止损坏板载5V稳压器。

此外,当跳线就位时,请勿同时为 VSS 和 VS 引脚供电。

L298N的压降

L298N 的压降约为 2V。这是因为内部开关晶体管在正向偏置时的压降约为1V,并且由于H桥需要电流通过两个晶体管,因此总压降为2V。

因此,如果将 12V 连接到电机电源端子,电机将接收大约 10V。这意味着 12V 直流电机永远不会全速旋转。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

为了使电机以最大速度运行,电机电源的电压应略高于电机的实际电压要求(+2V)。

考虑到2V的压降,如果使用5V电机,则需要在电机电源端子提供7V。如果您有 12V 电机,那么您的电机电源电压应为 14V。

这种过大的压降会导致热量耗散。这就是为什么基于 L298N 的电机驱动器需要一个大散热器的原因。

将 L298N 电机驱动器模块连接到 Arduino

现在我们已经了解了有关该模块的所有信息,我们可以开始将其连接到我们的Arduino!

让我们从连接电机电源开始。在我们的实验中,我们使用直流变速箱电机,也称为“TT”电机,常见于两轮驱动机器人中。它们的额定电压为 3 至 12V。因此,我们将外部 12V 电源连接到 VS 端子。由于L298N的压降约为2V,因此电机将接收10V并以略低的RPM旋转。不过没关系。

接下来,我们需要为 L298N 的逻辑电路提供5V。我们将使用板载 5V 稳压器从电机电源吸收 5V,因此请将 5V-EN 跳线固定到位。

现在,将 L298N 模块的输入和使能引脚(ENA、IN1、IN2、IN3、IN4 和 ENB)连接到六个 Arduino 数字输出引脚(9、8、7、5、4 和 3)。请注意,Arduino 输出引脚 9 和 3 均支持 PWM。

最后,将一个电机连接到端子 A(OUT1 和 OUT2),另一个连接到端子 B(OUT3 和 OUT4)。您可以更换电机的连接。从技术上讲,没有正确或错误的方法。

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

Arduino示例代码

下面的代码将向您展示如何使用 L298N 电机驱动器控制直流电机的速度和旋转方向,并可作为更多实际实验和项目的基础。

代码将电机沿一个方向移动一圈,然后沿相反方向移动。还涉及一些加速和减速。

加速或减速电机时,您可能会听到它发出嗡嗡声,尤其是在较低的 PWM 值下。这是正常的;没有什么可担心的。发生这种情况是因为直流电机需要最低的电压才能运行。

// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

void setup() {
	// Set all the motor control pins to outputs
	pinMode(enA, OUTPUT);
	pinMode(enB, OUTPUT);
	pinMode(in1, OUTPUT);
	pinMode(in2, OUTPUT);
	pinMode(in3, OUTPUT);
	pinMode(in4, OUTPUT);
	
	// Turn off motors - Initial state
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}

void loop() {
	directionControl();
	delay(1000);
	speedControl();
	delay(1000);
}

// This function lets you control spinning direction of motors
void directionControl() {
	// Set motors to maximum speed
	// For PWM maximum possible values are 0 to 255
	analogWrite(enA, 255);
	analogWrite(enB, 255);

	// Turn on motor A & B
	digitalWrite(in1, HIGH);
	digitalWrite(in2, LOW);
	digitalWrite(in3, HIGH);
	digitalWrite(in4, LOW);
	delay(2000);
	
	// Now change motor directions
	digitalWrite(in1, LOW);
	digitalWrite(in2, HIGH);
	digitalWrite(in3, LOW);
	digitalWrite(in4, HIGH);
	delay(2000);
	
	// Turn off motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}

// This function lets you control speed of the motors
void speedControl() {
	// Turn on motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, HIGH);
	digitalWrite(in3, LOW);
	digitalWrite(in4, HIGH);
	
	// Accelerate from zero to maximum speed
	for (int i = 0; i < 256; i++) {
		analogWrite(enA, i);
		analogWrite(enB, i);
		delay(20);
	}
	
	// Decelerate from maximum speed to zero
	for (int i = 255; i >= 0; --i) {
		analogWrite(enA, i);
		analogWrite(enB, i);
		delay(20);
	}
	
	// Now turn off motors
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}

代码说明:

Arduino代码相当简单。它不需要任何库即可工作。代码首先声明连接到 L298N 控制引脚的 Arduino 引脚。

// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;

在代码的设置部分,所有电机控制引脚(包括方向和速度控制引脚)都配置为数字输出。方向控制引脚被拉低以最初禁用两个电机。

void setup() {
	// Set all the motor control pins to outputs
	pinMode(enA, OUTPUT);
	pinMode(enB, OUTPUT);
	pinMode(in1, OUTPUT);
	pinMode(in2, OUTPUT);
	pinMode(in3, OUTPUT);
	pinMode(in4, OUTPUT);
	
	// Turn off motors - Initial state
	digitalWrite(in1, LOW);
	digitalWrite(in2, LOW);
	digitalWrite(in3, LOW);
	digitalWrite(in4, LOW);
}

在代码的循环部分,我们调用两个用户定义的函数,延迟一秒。

void loop() {
	directionControl();
	delay(1000);
	speedControl();
	delay(1000);
}

这些函数是:

  • directionControl()– 此功能使两个电机全速旋转两秒钟。然后,它反转电机的旋转方向并旋转两秒钟。最后,它停止电机。

    void directionControl() {
    	// Set motors to maximum speed
    	// For PWM maximum possible values are 0 to 255
    	analogWrite(enA, 255);
    	analogWrite(enB, 255);
    
    	// Turn on motor A & B
    	digitalWrite(in1, HIGH);
    	digitalWrite(in2, LOW);
    	digitalWrite(in3, HIGH);
    	digitalWrite(in4, LOW);
    	delay(2000);
    	
    	// Now change motor directions
    	digitalWrite(in1, LOW);
    	digitalWrite(in2, HIGH);
    	digitalWrite(in3, LOW);
    	digitalWrite(in4, HIGH);
    	delay(2000);
    	
    	// Turn off motors
    	digitalWrite(in1, LOW);
    	digitalWrite(in2, LOW);
    	digitalWrite(in3, LOW);
    	digitalWrite(in4, LOW);
    }
    
  • speedControl()– 此函数使用 analogWrite() 函数生成 PWM 信号,该信号将两个电机从零加速到最大速度,然后再将它们减速回零。最后,它停止电机。

    void speedControl() {
    	// Turn on motors
    	digitalWrite(in1, LOW);
    	digitalWrite(in2, HIGH);
    	digitalWrite(in3, LOW);
    	digitalWrite(in4, HIGH);
    	
    	// Accelerate from zero to maximum speed
    	for (int i = 0; i < 256; i++) {
    		analogWrite(enA, i);
    		analogWrite(enB, i);
    		delay(20);
    	}
    	
    	// Decelerate from maximum speed to zero
    	for (int i = 255; i >= 0; --i) {
    		analogWrite(enA, i);
    		analogWrite(enB, i);
    		delay(20);
    	}
    	
    	// Now turn off motors
    	digitalWrite(in1, LOW);
    	digitalWrite(in2, LOW);
    	digitalWrite(in3, LOW);
    	digitalWrite(in4, LOW);
    }
    

蓝牙控制机器人项目描述:

使用 L298N 电机驱动程序和 Android 手机应用程序制作 Arduino 蓝牙控制机器人汽车。

蓝牙 Arduino

蓝牙模块的 VCC 与 5 V连接.

地线,与Arduino的接地相连。

TX线,与Arduino的引脚2连接。

Rx 线,与 Arduino 的引脚编号 3 连接。

#include <SoftwareSerial.h>
SoftwareSerial Blue(2, 3);

int ena = 5;
int enb = 6;

int in1 = 8;
int in2 = 9;
int in3 = 10;
int in4 = 11;
long int data;
long int command1 = 92;  // forward
long int command2 = 79;  // left
long int command3 = 71;  //  right
long int command4 = 91;  //  Reverse
long int command5 = 10;  // stop

char state = 0;

void setup() {
  Serial.begin(9600);
  Blue.begin(9600);

  pinMode(ena, OUTPUT);
  pinMode(enb, OUTPUT);

  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  analogWrite(ena, 255);
  analogWrite(enb, 255);
  delay(1000);
}

void loop() {

  while (Blue.available() == 0)
    ;
  if (Blue.available() > 0) {
    data = Blue.parseInt();
  }
  delay(100);
  //Serial.print(data);

  if (data == command1)  // Forward
  {

    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    //delay(100);
  }

  if (data == command2)  // left
  {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    delay(100);
  }

  if (data == command3)  // Right
  {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(100);
  }

  if (data == command4)  // Reverse
  {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
    delay(100);
  }


  if (data == command5)  // Stop
  {
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    // delay(100);
  }
}

使用L298N电机驱动器的Arduino避障机器人

作者:Paul Vertor in CircuitsArduino

原文

简介:

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

在我们开始之前,您是否想过是为您的项目选择 Arduino 电机扩展板还是 L298N 电机驱动器?我个人更喜欢 L298N 电机驱动器,因为可以使用更多 Arduino 的引脚为我们的机器人添加更多功能!

1. 何时使用 Arduino 电机扩展板 L293D?

优势

首先,我们可以在机器人底盘上节省一些空间,而且与 L298N 电机驱动器相比,使用电机扩展板时用于接线的跳线要少得多。

其次,我们还可以使用 Adafruit 电机扩展板库通过软件设置电机速度并定义最大速度。

最后,Arduino和电机可以使用单个直流电源,之后扩展板将处理其余部分,以确保您的伺服和电机正常运行。

弊端

将引脚接头焊接到扩展板层上需要一些焊接技巧。此外,该扩展板使用 Arduino 计时器进行伺服操作,这可能会导致“AFMotor.h”(即 Adafruit Motor Shield)库和其他库之间的计时器冲突。最后但并非最不重要的一点是,一旦电流超过 1A,你可能希望在电机驱动器上安装一个散热器,否则会出现热故障,可能会烧坏芯片。

规格

您可以在此处查看有关扩展板规格的更多信息。

2. 何时使用L298N电机驱动器?

优势

它只需要一些接线 - 无需焊接。虽然这个模块没有预先构建的库,但可以使用Arduino的PWM(脉宽调制)引脚和一些简单的代码行来设置电机的速度。

这里对烧坏芯片的担忧要少得多,因为模块上的每个通道都可以向直流电机提供高达 2A 的电流,再加上一个大块的散热器可以保护模块免受可能的热故障的影响(顺便说一下,散热器使驱动器看起来更酷)。

由于我们可以使用所有Arduino的引脚(在电机扩展板上,可以使用的引脚数量减少了一半以上),因此有更多的引脚可用于更多功能!

Arduino和电机驱动器分开放置将在机器人底盘上占用更多空间。电源和接地连接也可能需要额外的面包板。此外,在大多数情况下,Arduino和电机需要两个独立的直流电源。

如果电池电源无法提供恒定功率,您还可能会遇到一些奇怪的伺服操作,从而导致 Arduino 重置问题并导致伺服抖动或不工作。但不要担心 - 稍后我将介绍一种解决此问题的简单方法!

规格

以下是 lastminuteengineers.com 的规范:

“L298N 电机驱动器 IC 实际上有两个输入电源引脚:”Vss“和”Vs”。
从Vs引脚,H桥获得驱动电机的电源,可以是5至35V。Vss用于驱动5至7V的逻辑电路。他们共用一个’GND’。

在此处查看有关如何使用电机驱动器的更多信息。

第 1 步:

步骤 2:准备组件和工具

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

对于此项目,您将需要:

  1. HC-SR04超声波传感器
  2. 超声波传感器支架
  3. 伺服电机(我使用了SG90伺服)
  4. 三轮机器人底盘
  5. 小型面包板
  6. A 7805 稳压器
  7. 9伏电池(Arduino的电源)
  8. 一个 9 V 电池直流插孔
  9. 两节 3.7 V 18650 锂离子电池(电机电源)
  10. 带开关的双插槽 18650 电池座
  11. 一个 Arduino Uno R3
  12. A / B 型USB电缆(用于将代码上传到Arduino)
  13. L298N 电机驱动器
  14. 两个橡胶轮
  15. 旋转脚轮/滚珠脚轮
  16. 两个 3-6 V DC 塑料电机(又名“TT”电机)
  17. 一些公-公和公-母跳线连接组件

将组件安装在机器人底盘上有许多选择,包括使用热胶、双面胶带或螺钉。

以下是您可能需要的一些额外工具:

  • 热胶枪
  • 剪刀
  • 一把螺丝刀
  • 万用表(如果您想精确测量电池的电压 - 我稍后会谈到这一点)
  • 焊料、烙铁和传统海绵
  • 18650 3.7 V 锂离子电池充电器(长期使用需要)

上面提到的焊接工具只是焊接的最低要求。可以在此处查看焊接的基本工具和材料以及如何焊接。

第 3 步:将跳线焊接到每个电机的端子 A&B

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WxcPt8RT-1678264694735)(null)]

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

3-6 V DC TT 电机上有两个端子。从现在开始,让我们称它们为终端 A 和 B。棘手的是,每个端子可以是A或B,具体取决于您将电机放置在机器人底盘上的方式。但规则很简单:将电机连接到机箱后,无论顶部的哪个端子是A,下面的另一个端子都是B.识别电机侧是A还是B是一个重要的过程,它将确保将电机的电线正确连接到L298N电机驱动器, 确保它将机器人的轮子沿所需方向旋转(向前方向或向后方向)。

现在,您只需要记住项目中两个电机的每个电机的端子 A 在哪里以及端子 B 的位置。

第 4 步:组装机器人的零件

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32
latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

在连接所有组件之前,我们将固定底盘上的每个组件以形成机器人的形状。

由于我在顶面使用了空间有限的单层底盘,因此已经放入了两个带轮子的电机,脚轮,电池座和伺服器固定在底面上。超声波传感器连接到传感器支架上,然后拧到伺服电机上。此外,Arduino Uno 板和电机驱动器模块放置在机器人的尾部,而面包板和 9 V 电池放置在机器人的中间。在这些组件中,电池座最后安装,以避免重叠在用于将组件连接到顶部的螺钉上。此外,请注意,在这个阶段,我们还没有对18650个细胞做任何事情。我建议我们把这些留在那里,直到你对如何照顾好它们有一些想法。

第 5 步:将所有内容连接起来

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

现在我们已经迈出了重要的一步。这些连接允许您的Arduino与机器人中的其他组件进行通信。照片说明中写的注释可能会对您有所帮助。

电机与电机驱动器的导线

如果看一下L298N电机驱动器原理图,可以看出有四个输出端子,包括OUT1、OUT2、OUT3和OUT4,分别以逆时针方向安装在模块上,用于为电机提供电流。

还记得本开头提到的电机端子 A 和 B 吗?现在是时候将电机 1(左电机)的 A 线连接到 OUT3,将 B 线连接到 OUT4,将电机 2 的 A 线(右电机)连接到 OUT1,最后将 B 线连接到 OUT2。

就我而言,紫色是左侧电机的 A 线的颜色,而蓝色是同一电机的 B 线的颜色,反之亦然(蓝色表示 A,紫色表示 B)。

将 Arduino 5 V 和 GND 引脚连接到试验板

这些引脚用于在面包板上创建两条5V和GND的公共共享线路,为机器人内的不同组件供电。

为您的电机驱动器供电

再次查看 L298N 电机驱动器原理图。您可以看到有三个端子用于为电机驱动器供电,包括 VCC、GND 和 5V。电池座的正极和负极线分别连接到VCC和GND为两个电机供电,而5V端子则连接到试验板上的公共5V线路,为模块的逻辑电路供电。

将电机驱动器连接到 Arduino 板

同样从上面的L298N原理图中,我们可以看到有六个输入引脚,从左到右分别是ENA,IN1,IN2,IN3,IN4和ENB。由于很可能有跳线代替ENA和ENB,我们只需要将IN1-IN4相应地连接到数字引脚4-7(又名引脚D4-D7)。这些销用于控制电机向前或向后旋转的方向。具体来说,IN4 向前驱动左侧电机,IN3 反转该电机,IN2 设置右侧电机的前进方向,IN1 反转。

ENA和ENB上预装的跳线基本上会将电机设置为最大速度。如果您想使用“analogWrite()”功能控制电机的速度,只需移除预安装的跳线,然后将 ENA 和 ENB 连接到 Arduino 上可用的 PWM 引脚,并将任何值写入这些引脚的范围从 0 到 255。

使用稳压器为伺服提供恒定功率

稳压器有三个引脚,包括输入、接地和输出。在这种情况下,它将从Arduino的Vin引脚获取9 V输入电压,并向伺服输出5 V的恒定功率。稳压器和伺服器都将沉入面包板上的公共接地线。

舵机还有三个引脚,分别是VCC,GND和信号引脚。如您所知,VCC 将连接到稳压器的“输出”引脚,而信号引脚连接到 Arduino 板上的引脚 D9。请注意,如果向 7805 输入 5 V,则伺服器将不起作用!因此,如果您使用 USB 电缆为 Arduino 供电,请将伺服器的 VCC 引脚连接到常见的 5 V 线路。

将超声波传感器连接到 Arduino Uno

超声波传感器有四个引脚,分别是VCC,触发,回声和GND。通常的做法是为每个引脚选择不同的电线颜色。我为VCC选择了橙色,为触发器选择了紫色,为回声选择了灰色,为GND选择了蓝色。该模块由公共 5 V 线路供电,并与其他组件吸收到同一接地线路。触发引脚连接到Arduino的引脚A0,而Echo引脚连接到引脚A1。

使用 DC 插孔使用 9 V 电池为 Arduino 供电

只需将插孔插入 Arduino 的外部直流端口,然后将 18650 电池放入电池座中,同时打开开关即可为系统供电。但是坚持住!你的机器人的大脑目前是空的,你需要在其中输入一些代码。

第 6 步:将代码上传到机器人的大脑

  1. 下载 Arduino IDE 软件
  2. 下载下面提供的代码
  3. 下载“新平”库
  • 在 Arduino IDE 软件的“菜单”选项卡上,单击“工具”/“管理库…”

  • 在搜索栏中输入“NewPing”,然后选择“安装”

  • 将代码上传到您的 Arduino 板

  • 通过 USB 电缆将 Arduino 板连接到您的 PC

  • 在“菜单”选项卡上,单击“工具”,然后为“板”选项选择“Arduino Uno”

  • 单击“验证”符号(看起来像“勾号”)以编译代码

  • 单击“√”符号旁边的“上传”符号,将一些逻辑上传到机器人的大脑

附件

Arduino_FlinchingBot.ino

下载

#include <NewPing.h>
#include <Servo.h>

#define TRIG_PIN A0
#define ECHO_PIN A1
#define MAX_DISTANCE 400

NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);

Servo myservo;

int distance = 100;
int pos = 0;

void setup() {
  //set up motors
  pinMode(7, OUTPUT);  //left motors forward
  pinMode(6, OUTPUT);  //left motors reverse
  pinMode(5, OUTPUT);  //right motors forward
  pinMode(4, OUTPUT);  //right motors reverse

  // set up servo
  myservo.attach(9);
  myservo.write(90);
  delay(2000);

  distance = readPing();
  delay(60);
}

void loop() {
  int distanceR = 0;
  int distanceL = 0;

  if (distance <= 50) {
    moveStop();
    delay(100);
    moveBackward();
    delay(300);
    moveStop();
    delay(100);
    distanceR = lookRight();
    delay(50);
    distanceL = lookLeft();
    delay(50);

    if (distanceR >= distanceL) {
      if (distanceR <= 30 && distanceL <= 30) {  // if both sides are too narrow
        for (int i = 0; i < 2; i++) {            // turn around
          turnRight();
          moveStop();
          delay(100);
        }
      } else {
        turnRight();
        moveStop();
        delay(100);
      }
    } else if (distanceR < distanceL) {
      if (distanceR < 30 && distanceL <= 30) {  // if both sides are too narrow
        for (int i = 0; i < 2; i++) {           // turn around
          turnLeft();
          moveStop();
          delay(100);
        }
      } else {
        turnLeft();
        moveStop();
        delay(100);
      }
    }
  } else moveForward();

  distance = readPing();
  delay(60);
}

int lookLeft() {
  for (pos = 90; pos <= 180; pos += 1) {  // goes from 90 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);  // tell servo to go to position in variable 'pos'
    delay(5);
  }
  int distance = readPing();
  delay(60);

  for (pos = 180; pos >= 90; pos -= 1) {  // goes from 180 degrees to 90 degrees
    // in steps of 1 degree
    myservo.write(pos);  // tell servo to go to position in variable 'pos'
    delay(5);
  }
  return distance;  // return distance on the left side
}

int lookRight() {
  for (pos = 90; pos >= 0; pos -= 1) {  // goes from 90 degrees to 0 degree
    // in steps of 1 degree
    myservo.write(pos);  // tell servo to go to position in variable 'pos'
    delay(5);
  }
  int distance = readPing();
  delay(60);

  for (pos = 0; pos <= 90; pos += 1) {  // goes from 0 degree to 90 degrees
    // in steps of 1 degree
    myservo.write(pos);  // tell servo to go to position in variable 'pos'
    delay(5);
  }
  return distance;  // return distance on the right side
}

int readPing() {
  int cm = sonar.ping_cm();
  if (cm == 0)          // if the measured distance exceeds the measuring limit of the ultrasonic sensor, by default the sonar.ping_cm() function will return a value of 0
  {                     // Due to the distance of 0 the robot will keep avoiding even when there is nothing in front of it
    cm = MAX_DISTANCE;  // To fix this, we set the distance to the pre-defined MAX_DISTANCE of 400 cm
  }
  return cm;
}

void moveStop() {
  digitalWrite(7, LOW);
  digitalWrite(6, LOW);
  digitalWrite(5, LOW);
  digitalWrite(4, LOW);
}

void moveForward() {
  digitalWrite(7, HIGH);
  digitalWrite(5, HIGH);
}

void moveBackward() {
  digitalWrite(6, HIGH);
  digitalWrite(4, HIGH);
}

void turnRight() {
  digitalWrite(7, HIGH);
  digitalWrite(4, HIGH);
  delay(250);
  digitalWrite(7, HIGH);
  digitalWrite(5, HIGH);
}

void turnLeft() {
  digitalWrite(5, HIGH);
  digitalWrite(6, HIGH);
  delay(250);
  digitalWrite(7, HIGH);
  digitalWrite(5, HIGH);
}

第 7 步:照顾好 18650 电池

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

在将 18650 电池放入电池座为电机供电之前,请务必事先检查其剩余电压,以免意外缩短电池寿命。

那我的意思是什么?如果您想要长期使用的“健康”电池,请尽量不要过度使用或过度充电。例如,始终保持3.2 V至3.9 V的电压值(尽管大多数电池可以充电至最大值4.2 V)。为此,您必须经常检查用于为机器人供电的电池的剩余电压,并在电压降至 3.2 V 以下后对其进行充电。对于我正在使用的电池,通常需要大约两个小时才能将电池部分充电至大约 3.9 V。部分充电时间可能会因不同类型的 18650 电池而异,因此请注意时间!

如图所示,我的一个 18650 电池的剩余电压测量为 3.75 V,所以很好!现在我可以安全地使用它为我的机器人供电。

您可以在此处阅读有关如何延长电池寿命的更多信息。

第 8 步:根据需要修改代码!

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

我们快到了!现在我只想提供更多信息,以便您可以自由地个性化机器人的逻辑。

那么机器人是怎么想的呢?如果你看上面的流程图,可以看出机器人会不断检查50厘米的距离内是否有物体在它面前。如果什么都没有,它将继续前进。否则,它将后退以避免与前面的物体发生碰撞,然后它会转头看右侧和左侧,以决定它应该转向哪个方向(左或右)。例如,如果当时右侧有东西挡住,它会向左转,反之亦然。但是,如果两侧都太窄(即两侧的距离都短于30厘米),它只会简单地掉头。转向任何方向后,它将继续直行,关闭动作循环。

第 9 步:完成!

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

latch_state &= ~_bv(motor1_a) & ~_bv(motor1_b) & ~_bv(motor2_a) & ~_bv(motor,# Arduino 项目,单片机,驱动开发,stm32

恭喜你来到这里!让我们将 18650 电池放入电池座中,打开开关,然后将 9 V 电池直流插孔插入 Arduino 的外部直流端口,然后看着您的机器人开始滚动车轮!文章来源地址https://www.toymoban.com/news/detail-784278.html

到了这里,关于L298N 直流电机驱动模块与 Arduino的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【STM32】cubeMX配置HAL库驱动L298N控制直流有刷电机

    目录 1.电机为什么需要驱动板呢?为什么不能用控制器直接控制电机呢? 2.H桥电路介绍 3.L298N原理介绍 4.实物接线图 5.CUBEMX配置 6.代码 7. 演示视频 L298N是常用来驱动小型直流有刷电机(两个)和步进电机(一个)的电机驱动板,其电路原理就是两个H桥电路,控制原理是使用

    2024年02月16日
    浏览(49)
  • 一文搞懂如何使用STM32驱动直流电机(普通PWM输出和L298N、高级定时器输出带死区双通道互补PWM和IR2110S及自举电路、H桥电路和电机正反转)

    笔者从开始接触嵌入式单片机开始,就和驱动电机相伴而走。从最开始的直接买L298N驱动模块直接驱动直流电机,到现在自己设计PCB电路板驱动直流电机,可以说是和电机驱动共同成长了。现在笔者将这一过程的收获记录下来,希望对大家有所帮助。 不用详细了解L298N芯片和

    2024年02月02日
    浏览(45)
  • L298N双路电机驱动模块使用指南

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

    2024年02月07日
    浏览(39)
  • 最全H桥电机驱动模块L298N原理及应用

    通常,H 桥是一个相当简单的电路,包含四个开关元件,负载位于中心,采用类似 H 的配置。 开关元件 (Q1…Q4) 通常是双极或 FET 晶体管,在某些高压应用中为 IGBT。也存在集成解决方案,但开关元件是否与其控制电路集成与本讨论的大部分内容无关。二极管 (D1…D4) 称为钳位

    2024年02月08日
    浏览(32)
  • 《树莓派项目实战》第十五节 使用L298N驱动板模块驱动双极42步进电机

    目录 15.1 双极步进电机引脚介绍 15.2 连接到树莓派 15.3 编写代码驱动步进电机  在本节,我们将学习如何使用L298N驱动板驱动一个

    2024年02月13日
    浏览(41)
  • L298N驱动电机+pwm

    目录 一、L298N驱动电机 二、pwm波输出——电机转动 pwm参数 pwm参数计算 输出比较 pwm基本结构:运行控制 → 时基单元 →捕获/输出比较通道 时基单元 捕获/输出通道的输出 STM32F103c8t6定时器:TIM1、TIM2、TIM3、TIM4 基本定时器 通用定时器 PWM输出  L298N驱动 :输入:12V 12V供电 :

    2023年04月19日
    浏览(34)
  • L298n电机驱动+stm32+pwm

    7V~12VVCC:接入7V—12V的电源。 GND:接地。 注:当单片机与驱动不是同一电源时要供地。 5V输出:可以输出5V的电源。 电机A/B:接入电机。 IN1~IN4:控制电机正反转,转速信号接口。 电机A/B使能:通过跳帽控制是否使能电机。 通过引脚的高低搭配,控制电机的正反转和停止,

    2024年02月16日
    浏览(38)
  • L298N电机驱动板的使用说明

    目录 一、为什么要用L298N驱动板来驱动电机 二、L298N引脚功能图 三、供电方式 1、接入5V电源 2、接入7~12V电源 3、接入大于12V电源 四、L298N的驱动方式 你可能有这个疑惑,电机是4-6V供电的,单片机的输出也是5V输出,为什么不直接用单片机来供电驱动电机呢?这是因为单片机

    2024年02月02日
    浏览(30)
  • L298N驱动俩路电机按键控制正反转

    一个L298N是带有俩路驱动电路的,就是可以驱动俩个电机同时去转动,在硬件部分因为以前弄小车的时候已经组装好了,一路驱动去控制俩个电机,俩路驱动就是控制四个电机,做的是四轮四驱的小车,嫌麻烦就没有去拆改装了。 博主主页里面有介绍过L298N的使用了,为了避

    2024年02月03日
    浏览(31)
  • STM32之L298N控制130电机+PWM调速

    左右两边的OUT0~OUT4接130电机两端; 中间蓝色端口接电源, 注意:两个电源口和一个接地口都要接上!!!!!!!! 偏左一些的排针用杜邦线接上io口,如果需要PWM控速的话,ENA和ENB的跳线帽需要拔掉, 然后用两根杜邦线分别连到一个io口,给高电平使能,如果是低电平则

    2024年02月04日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包