Arduino教程-09.L298N控制直流电机(避障小车)
目录
- 3.1 电机
- 3.2
- 控制直流电机
- PWM – 控制速度
- H桥 – 控制转动方向
- L298N 电机驱动芯片
- 技术规格
- L298N 电机驱动器模块引脚排列
- 电源引脚
- 输出引脚
- 方向控制引脚
- 速度控制引脚
- 板载 5V 稳压器和跳线
- L298N的压降
- 将 L298N 电机驱动器模块连接到 Arduino
- Arduino示例代码
- 代码说明:
- 使用L298N电机驱动器的Arduino避障机器人
- 简介:使用L298N电机驱动器的Arduino避障机器人
- 第 1 步:观看短视频
- 步骤 2:准备组件和工具
- 第 3 步:将跳线焊接到每个电机的端子 A&B
- 第 4 步:组装机器人的零件
- 第 5 步:将所有内容连接起来
- 第 6 步:将代码上传到机器人的大脑
- 附件
- 第 7 步:照顾好 18650 电池
- 第 8 步:根据需要修改代码!
- 第 9 步:完成!
- 完整代码
参考:
- 深入探讨: Arduino 连接 L298N 直流电机驱动器模块 (lastminuteengineers.com)
- L298N电机驱动模块详解
- 关于Arduino连接L298N供电问题
3.1 电机
直流电机内部有磁铁、转子和碳刷等组件组成,将电机的+、-极和电池相连,即可正转或逆转。
电机在运转时,碳刷和整流子之间会产生火花,进而引发干扰,影响到微处理器或无线遥控器的运行。为了消除噪声,通常在碳刷电机的+、-极之间焊接一个0.01~0.1uF的电容。
步进电机 是一种易于控制旋转角度和转动圈数的电机,常见于需要精确定位的自动控制系统,比如:打印机、光驱等,仅仅接上电源,步进电机是不会转动的,步进电机有四条控制线和两条电源线,微处理器从控制线输入脉冲(即:高、低电位变化),步进电机的转子就会配合脉冲数转动到对应的角度。
脉冲产生器发出的信号,轮流驱使电机转动一个角度,转动一圈所需要的次数以及每次转动的角度,分别称为“步数”和“步进角”。
缺点: 体积、重量以及消耗电力都比较大,因此许多需要控制旋转角度的装置,都改用 舵机直流电机 又称为“碳刷电机”,因为它通过碳刷将电力传输给转子。碳刷需要清理也会损耗,因此许多电器逐步改用无刷电机,无刷电机的结构以及驱动方式,都和一般碳刷电机不同
直流电机的技术文件
从电机的技术文件所列举的转速和扭力参数,可得知该电机是否符合转速和负重的需求;工作电压和消耗电流参数,则关系到电源和控制器的配置。
表:RF-300电机
最大效率 | 堵转(STALL) | |||||||
---|---|---|---|---|---|---|---|---|
工作电压 | 转速 | 电流 | 扭力 | 输出 | 扭力 | 电流 | ||
1.6~6.5V | 1710转/分钟 | 0.0525A | 0.27mN·m | 2.8g·cm | 0.049W | 1.22mN·m | 12g·cm | 0.18A |
表:**FA-130**电机
最大效率 | 堵转(STALL) | |||||||
---|---|---|---|---|---|---|---|---|
工作电压 | 转速 | 电流 | 扭力 | 输出 | 扭力 | 电流 | ||
1.5~3V | 6990转/分钟 | 0.66A | 0.59mN·m | 6.0g·cm | 0.43W | 2.55mN·m | 26g·cm | 2.20A |
设计电机的晶体管控制电路时,最重要的两个参数是**工作电压和堵转电流**。堵转代表电机轴心受到外力卡住而停止,此时电机线圈形同短路状态,电机的负荷越重,电流越大,发热量也就增加。
3.2
深入探讨: Arduino 连接 L298N 直流电机驱动器模块 (lastminuteengineers.com)
虽然您最终需要学习控制直流电机才能构建自己的机器人,但您可能需要一些更容易上手的东西——这就是 L298N 电机驱动器的用武之地。它可以控制两个直流电机的速度和旋转方向。
此外,它还可以控制双极步进电机,例如NEMA 17。如果您想了解更多信息,请查看本教程。
使用 L298N 和 Arduino 控制 NEMA 17 步进电机的教程
控制直流电机
只有当我们可以控制直流电机的速度和旋转方向时,我们才能完全控制它。通过结合这两种技术,这是可能的。
- PWM – 控制速度
- H桥 – 控制转动方向
PWM – 控制速度
直流电机的速度可以通过改变其输入电压来控制。实现此目的的一种广泛使用的技术是脉宽调制(PWM)。
PWM是一种通过发送一系列ON-OFF脉冲来调整输入电压平均值的技术。该平均电压与脉冲的宽度成正比,称为占空比。
占空比越高,施加到直流电机的平均电压就越高,从而导致电机速度增加。占空比越短,施加到直流电机的平均电压越低,导致电机速度降低。
下图显示了具有各种占空比和平均电压的PWM技术。
脉宽调制(PWM)技术
H桥 – 控制转动方向
直流电机的旋转方向可以通过改变其输入电压的极性来控制。实现此目的的一种广泛使用的技术是使用 H 桥。
H桥电路由四个排列成H形的开关组成,电机位于中心。
同时关闭两个特定开关可反转施加到电机的电压的极性。这会导致电机旋转方向发生变化。
以下动画显示了 H 桥电路的工作原理。
H桥工作
L298N 电机驱动芯片
模块的中心是一个大的黑色芯片,带有一个厚实的散热器 - L298N。
L298N芯片包含两个标准H桥,能够驱动一对直流电机,非常适合构建两轮机器人平台。
L298N 电机驱动器的电源范围为 5V 至 35V,每通道能够提供 2A 的连续电流,因此它与我们的大多数直流电机配合得很好。
技术规格
以下是规格:
电机输出电压 | 5V – 35V |
---|---|
电机输出电压(推荐) | 7V – 12V |
逻辑输入电压 | 5V – 7V |
每通道连续电流 | 2A |
最大功耗 | 25W |
有关更多详细信息,请参阅下面的数据表。
L298N 数据表
L298N 电机驱动器模块引脚排列
L298N 模块有 11 个引脚,允许它与外界通信。引脚排列如下:
让我们一一熟悉每个引脚。
电源引脚
L298N 电机驱动器模块有 3 针、3.5mm 间距螺丝端子连接电源。
L298N 电机驱动器有两个输入电源引脚:VS 和 VSS。
VS引脚为 IC 的内部 H 桥供电,该桥驱动电机。该引脚接受 5V 至 12V 的输入电压。
VSS用于为 L298N IC 内的逻辑电路供电,范围为 5V 至 7V。
接地是公共接地引脚。
输出引脚
L298N电机驱动器的输出通道,OUT1 和OUT2用于电机 A 和OUT3 和OUT4用于电机 B,用两个 3.5mm 间距的螺丝端子连接。您可以将两个 5-12V 直流电机连接到这些端子。
模块上的每个通道可为直流电机提供高达 2A 的电流。然而,提供给电机的电流量取决于电机电源的容量。
方向控制引脚
方向控制引脚允许您控制电机是向前还是向后旋转。这些引脚实际上控制着L298N芯片内H桥电路的开关。
该模块有两个方向控制引脚。这IN1 和 IN2销控制电机A的旋转方向;而IN3 和 IN4控制电机B的旋转方向。
电机的旋转方向可以通过对这些输入施加逻辑高电平(5V)或逻辑低电平(接地)来控制。下图显示了各种组合及其结果。
IN1 | IN2 | 转动方向 |
---|---|---|
低(0) | 低(0) | 电机关闭 |
高(1) | 低(0) | 向前 |
低(0) | 高(1) | 向后 |
高(1) | 高(1) | 电机关闭 |
速度控制引脚
速度控制引脚ENA和ENB用于打开/关闭电机并控制其速度。
将这些引脚拉高会导致电机旋转,而将它们拉低将停止它们。但是,通过脉宽调制(PWM),可以控制电机的速度。
该模块通常在这些引脚上带有跳线。当此跳线连接时,电机全速旋转。如果要以编程方式控制电机的速度,请卸下跳线并将它们连接到Arduino的PWM引脚。
板载 5V 稳压器和跳线
该模块包括一个 78M05 5V 稳压器,可通过跳线使能或禁用。
当此跳线就位时,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 直流电机永远不会全速旋转。
为了使电机以最大速度运行,电机电源的电压应略高于电机的实际电压要求(+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)。您可以更换电机的连接。从技术上讲,没有正确或错误的接法。
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 outputspinMode(enA, OUTPUT);pinMode(enB, OUTPUT);pinMode(in1, OUTPUT);pinMode(in2, OUTPUT);pinMode(in3, OUTPUT);pinMode(in4, OUTPUT);// Turn off motors - Initial statedigitalWrite(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 255analogWrite(enA, 255);analogWrite(enB, 255);// Turn on motor A & BdigitalWrite(in1, HIGH);digitalWrite(in2, LOW);digitalWrite(in3, HIGH);digitalWrite(in4, LOW);delay(2000);// Now change motor directionsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);delay(2000);// Turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW);
}// This function lets you control speed of the motors
void speedControl() {// Turn on motorsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);// Accelerate from zero to maximum speedfor (int i = 0; i < 256; i++) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Decelerate from maximum speed to zerofor (int i = 255; i >= 0; --i) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Now turn off motorsdigitalWrite(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 outputspinMode(enA, OUTPUT);pinMode(enB, OUTPUT);pinMode(in1, OUTPUT);pinMode(in2, OUTPUT);pinMode(in3, OUTPUT);pinMode(in4, OUTPUT);// Turn off motors - Initial statedigitalWrite(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 255analogWrite(enA, 255);analogWrite(enB, 255);// Turn on motor A & BdigitalWrite(in1, HIGH);digitalWrite(in2, LOW);digitalWrite(in3, HIGH);digitalWrite(in4, LOW);delay(2000);// Now change motor directionsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);delay(2000);// Turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW); }
speedControl()
– 此函数使用 analogWrite() 函数生成 PWM 信号,该信号将两个电机从零加速到最大速度,然后再将它们减速回零。最后,它停止电机。void speedControl() {// Turn on motorsdigitalWrite(in1, LOW);digitalWrite(in2, HIGH);digitalWrite(in3, LOW);digitalWrite(in4, HIGH);// Accelerate from zero to maximum speedfor (int i = 0; i < 256; i++) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Decelerate from maximum speed to zerofor (int i = 255; i >= 0; --i) {analogWrite(enA, i);analogWrite(enB, i);delay(20);}// Now turn off motorsdigitalWrite(in1, LOW);digitalWrite(in2, LOW);digitalWrite(in3, LOW);digitalWrite(in4, LOW); }
每次在切换电机状态之前先暂停0.5秒,可以避免电机频繁地正、反转而导致寿命降低。
使用L298N电机驱动器的Arduino避障机器人
查看原文
简介:使用L298N电机驱动器的Arduino避障机器人
在这个项目中,我将引导您逐步了解如何为那些喜欢L298N H桥电机驱动器而不是电机驱动板的人制作一个简单的Arduino退缩机器人。
在我们开始之前,您是否想过是为您的项目选择 Arduino 电机扩展板还是 L298N 电机驱动器?我个人更喜欢 L298N 电机驱动器,因为我们可以使用更多 Arduino 的引脚为我们的机器人添加更多功能!
话虽如此,让我们快速浏览一下下面的比较以选择最合适的。
1. 何时使用 Arduino 电机驱动板 L293D?
优势
首先,我们可以在机器人底盘上节省一些空间,而且与 L298N 电机驱动器相比,使用电机驱动板时用于接线的跳线要少得多。
其次,我们还可以使用 Adafruit 电机驱动板库通过软件设置电机速度并定义最大速度。
最后,Arduino和电机可以使用单个直流电源,之后扩展板将处理其余部分,以确保您的伺服和电机正常运行。
弊
将引脚接头焊接到驱动板层上需要一些焊接技巧。此外,该扩展板使用 Arduino 计时器进行伺服操作,这可能会导致“AFMotor.h”(即 Adafruit Motor Shield)库和其他库之间的计时器冲突。最后但并非最不重要的一点是,一旦电流达到 1A,你可能需要在电机驱动器上安装一个散热器,否则你会得到热故障,可能会烧坏芯片。
规格
您可以在此处查看有关驱动板规格的更多信息。
2. 何时使用L298N电机驱动器?
优势
它只需要一些接线 - 无需焊接。虽然这个模块没有预先构建的库,但我们可以使用Arduino的PWM(脉宽调制)引脚和一些简单的代码行来设置电机的速度。
这里对烧坏芯片的担忧要少得多,因为模块上的每个通道都可以向直流电机提供高达 2A 的电流,再加上一个大块的散热器可以保护模块免受可能的热故障的影响。
由于我们可以使用所有Arduino的引脚(在L293D电机驱动板上,可以使用的引脚数量减少了一半以上),因此有更多的引脚可用于更多功能!
弊
Arduino和电机驱动器分开放置将在机器人底盘上占用更多空间。电源和接地连接也可能需要额外的面包板。此外,在大多数情况下,Arduino和电机需要两个独立的直流电源。
如果电池电源无法提供恒定功率,您还可能会遇到一些奇怪的伺服操作,从而导致 Arduino 重置问题并导致伺服抖动或不工作。但不要担心 - 稍后我将介绍一种解决此问题的简单方法!
规格
以下是 lastminuteengineers.com 的规范:
“L298N 电机驱动器 IC 实际上有两个输入电源引脚:”Vss“和”Vs”。
从Vs引脚,H桥获得驱动电机的电源,可以是5至35V。Vss用于驱动5至7V的逻辑电路。他们都共用一个GND
。
在此处或此处查看有关如何使用电机驱动器的更多信息。
我还将向您展示该项目所需的该模块的主要功能以及指南。
第 1 步:观看短视频
步骤 2:准备组件和工具
对于此项目,您将需要:
- HC-SR04超声波传感器
- 超声波传感器支架
- 伺服电机(我使用了SG90)
- 三轮机器人底盘
- 小型面包板
- 7805 稳压器
- 9伏电池(Arduino的电源)
- 一个 9 V 电池直流插孔
- 两节 3.7 V 18650 锂离子电池(电机电源)
- 带开关的双插槽 18650 电池座
- 一个 Arduino Uno R3
- A / B 型USB电缆(用于将代码上传到Arduino)
- L298N 电机驱动器
- 两个橡胶轮
- 旋转脚轮/滚珠脚轮
- 两个 3-6 V DC 塑料变速电机(又名“TT”电机)
将组件安装在机器人底盘上有许多选择,包括使用热胶、双面胶带或螺钉。就我而言,我使用双面胶带和螺钉来组装组件或将它们连接到机器人底盘上。
以下是您可能需要的一些额外工具:
- 热胶枪
- 剪刀
- 一把螺丝刀
- 万用表
- 焊料、烙铁和传统海绵
- 18650 3.7 V 锂离子电池充电器(长期使用需要)
请注意,如果您希望在跳线和 3-6V DC TT 电机之间建立牢固可靠的连接,提供稳定且令人满意的机器人操作,则仍然需要快速简便的焊接。
顺便说一下,我上面提到的焊接工具只是焊接的最低要求.您可以在此处查看焊接的基本工具和材料以及如何焊接。
第 3 步:将跳线焊接到每个电机的端子 A&B
请像本指南中所示的电线焊接一样进行一些快速简便的焊接(即请参阅该指南中的“如何焊接电线”部分)。这里唯一的区别是,您无需将两根电线焊接在一起,而是将电线焊接到电机上。请注意,单个电机的每个端子的电线颜色应可区分,并且两个电机的电线颜色应一致(如上图所示)。
以下是焊接步骤的摘要:
- 用湿海绵擦拭烙铁头,清洁烙铁头
- 用焊料在烙铁尖端镀锡
- 用焊料在电线尖端镀锡
- 带焊料的电机引线之一镀锡
- 将镀锡线固定在电机引线的顶部
- 将烙铁接触它们两个以均匀熔化焊料
- 冷却后,硬化焊料将在电机引线和电线之间建立牢固的连接
- 对两个电机的其余端子重复相同的过程
3-6 V DC TT 电机上有两个端子。您只需要记住项目中两个电机的每个电机的端子 A 在哪里以及端子 B 的位置。
第 4 步:组装机器人的零件
在连接所有组件之前,我们将固定底盘上的每个组件以形成机器人的形状。使用任何对您有利的方法(例如热胶、双面胶带、螺钉)将组件连接到机器人的身体上。如果您想遵循我的组装,请参阅上面带有注释的照片说明。
由于我使用了单层底盘,因此已经放入了两个带轮子的电机,脚轮,电池座和伺服器固定在底面上。超声波传感器连接到传感器支架上,然后拧到伺服电机上。此外,Arduino Uno 板和电机驱动器模块放置在机器人的尾部,而面包板和 9 V 电池放置在机器人的中间。在这些组件中,电池座最后安装,以避免重叠在用于将组件连接到顶部的螺钉上。此外,请注意,在这个阶段,我们还没有对18650做任何事情。我建议我们把这些留在那里,直到你对如何安排好它们有一些想法。
第 5 步:将所有内容连接起来
现在我们已经迈出了重要的一步。这些连接允许您的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 步:将代码上传到机器人的大脑
下载 Arduino IDE 软件
下载下面提供的代码
下载“新平”库
- 在 Arduino IDE 软件的“菜单”选项卡上,单击“工具”/“管理库…”
- 在搜索栏中输入 “NewPing.h”,然后选择“安装”
- 将代码上传到您的 Arduino 板
- 通过 USB 电缆将 Arduino 板连接到您的 PC
- 在“菜单”选项卡上,单击“工具”,然后为“板”选项选择“Arduino Uno”
- 单击“验证”符号(看起来像“勾号”)以编译代码
- 单击“勾号”符号旁边的“上传”符号,将一些逻辑上传到机器人的大脑
附件
Arduino_FlinchingBot.ino
下载
第 7 步:照顾好 18650 电池
在将 18650 电池放入电池座为电机供电之前,请务必事先检查其剩余电压,以免意外缩短电池寿命。
那我的意思是什么?如果您想要长期使用的“健康”电池,请尽量不要过度使用或过度充电。例如,始终保持3.2 V至3.9 V的电压值(尽管大多数电池可以充电至最大值4.2 V)。为此,您必须经常检查用于为机器人供电的电池的剩余电压,并在电压降至 3.2 V 以下后对其进行充电。对于我正在使用的电池,通常需要大约两个小时才能将电池部分充电至大约 3.9 V。部分充电时间可能会因不同类型的 18650 电池而异,因此请注意时间!
如图所示,我的一个 18650 电池的剩余电压测量为 3.75 V,所以很好!现在我可以安全地使用它为我的机器人供电。
您可以在此处阅读有关如何延长电池寿命的更多信息。
第 8 步:根据需要修改代码!
我们快到了!现在我只想提供更多信息,以便您可以自由地个性化机器人的逻辑。
那么机器人是怎么想的呢?如果你看上面的流程图,可以看出机器人会不断检查50厘米的距离内是否有物体在它面前。如果什么都没有,它将继续前进。否则,它将后退以避免与前面的物体发生碰撞,然后它会转头看右侧和左侧,以决定它应该转向哪个方向(左或右)。例如,如果当时右侧有东西挡住,它会向左转,反之亦然。但是,如果两侧都太窄(即两侧的距离都短于30厘米),它只会简单地掉头。转向任何方向后,它将继续直行,关闭动作循环。
你拿到了吗?现在享受修改!
第 9 步:完成!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tkbdaga8-1671091692289)(null)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WYfwv0BM-1671091692413)(null)]
恭喜你来到这里!让我们将 18650 电池放入电池座中,打开开关,然后将 9 V 电池直流插孔插入 Arduino 的外部直流端口,然后看着您的机器人开始滚动车轮!
完整代码
#include <NewPing.h>
#include <Servo.h>#define TRIG_PIN A0
#define ECHO_PIN A1
#define MAX_DISTANCE 400NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);Servo myservo;int distance = 100;
int pos = 0;void setup() {//set up motorspinMode(7, OUTPUT); //left motors forwardpinMode(6, OUTPUT); //left motors reversepinMode(5, OUTPUT); //right motors forwardpinMode(4, OUTPUT); //right motors reverse// set up servomyservo.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 narrowfor (int i = 0; i < 2; i++) { // turn aroundturnRight();moveStop();delay(100);}} else {turnRight();moveStop();delay(100);}} else if (distanceR < distanceL) {if (distanceR < 30 && distanceL <= 30) { // if both sides are too narrowfor (int i = 0; i < 2; i++) { // turn aroundturnLeft();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 degreemyservo.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 degreemyservo.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 degreemyservo.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 degreemyservo.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 itcm = 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);
}
Arduino教程-09.L298N控制直流电机(避障小车)相关推荐
- 将循迹小车改为蓝牙控制自动避障小车#arduino
演示视频:https://www.bilibili.com/video/BV1CM41187oh/?share_source=copy_web&vd_source=d43eaf7cae2ed3 ...
- 超声波+红外线避障小车(Arduino + L298P电机驱动扩展板)
我是一名小学6年级的学生,就叫我小花生吧.我就读于北京市朝阳区垂杨柳中心小学金都分校.我学习Python编程已经两年多了,曾获得蓝桥杯全国选拔赛二等奖(Python中级青少年组)和北京复赛二等奖.打算 ...
- 基于STC12C5616AD芯片智能循迹避障小车完整制作过程(详细教程)
前言:本篇文章适合小白阅读,其中有很基础的Keil 5的使用教程等.大多网友知道如何使用,因此大家可以看目录,对于自己而言比较基础的可以不用阅读,重点关注一些迷茫的部分. 智能循迹避障小车教程目录 智 ...
- Arduino驱动L298N控制直流电机的正反转和调速
Arduino驱动L298N控制直流电机的正反转和调速 一.前言 二.产品参数 三.驱动直流电机 三.接线图 四.程序 五.实验结果 总结 一.前言 本模块使用ST公司的L298N作为主驱动芯片,具有 ...
- arduino超声波自动避障小车制作过程
超声波自动避障小车 #include <Servo.h> #define Trig 2 //引脚控制超声波发出声波 #define Echo 3 //引脚反应接收到返回声波 #define ...
- STM32F103RCT6 实验代码之舵机+超声波避障小车(一)杂谈+电机+L298N
STM32 舵机+超声波避障 一.直流电机 二.L298N模块 寒假由于时间较长,自己就想做一个智能车玩玩,第一个做的是蓝牙小车,不过比较简单,我就不打算具体另开一个部分,到时候挑一些与避障小车不一样 ...
- 基于arduino单片机智能避障小车
基于arduino单片机智能避障小车 思路简介 本文简要介绍了基于arduino单片机智能小车可以通过手机端蓝牙助手对其进行遥控操作'可以切换手动操作和自动避障两个模式,避障基于蝙蝠超声波测距的原理, ...
- 【arduino】KitteBlock自动避障小车
原文链接:http://www.arduino.cn/thread-45399-1-1.html [KitteBlock]自动避障小车 (超级简单, 推荐新手) avirufus 注册会员 201 ...
- Arudino+L298N控制直流电机正反转
Arudino+L298N控制直流电机正反转 所需元器件 电路连接图 Arduino程序 所需元器件 Arduino uno, L298N, 直流电机马达两个,两节18650电池,一个电池盒,杜邦线若 ...
最新文章
- Visual Studio 2010在简洁中强调团队合作
- 网站被黑搜索快照被劫持怎么办
- Jenkins 关闭和重启实现方式.
- 安装MySql卡在Start Service的问题
- android 全局对话框6,[Android][Framework]从全局AlertDialog聊聊WindowManager
- JsonPath 解析Josn字符串
- 路由器和三层交换机区别
- Nginx 转发配置
- 纬度渐长率算法C语言,关于纬度渐长率.pdf
- 在SAP系统中,更改一个公司代码(Company Code)的会计科目表(Chart of Accounts)
- 如何绘制用户体验地图
- 通过iscsi协议使用ceph rbd
- TL431NSG-A 友顺UTC
- java实现生产者消费者模式
- python小课网站_攻陷朋友圈的8.9元Python小课,有哪些新套路?
- 修改elementui的表格合并行和表格表头边框
- 天天动听 悬浮歌词(迷你歌词)效果解读 .
- 树莓派 4B 下 Linux 系统高级命令行
- TMP451温度传感器
- 创意平面设计源于哪些思维
热门文章
- 视频教程-赵强老师:大数据从入门到精通(12)集群HA-Hadoop
- 学校校车运营各项安全管理制度_学校校车安全管理制度介绍
- 快来认识一下,我国公布南海25个岛礁、55个海底地理实体
- 特斯拉机器人学会工厂打螺丝,未来可组装和复制自己
- 千古绝唱风月事,河山绘尽一人心
- 关于ucos的邮箱、信号量使用步骤
- begining...
- 一起Talk编程语言吧
- oracle+srvctl+crsctl,【Oracle Database】Oracle RAC(七):crsctl srvctl
- 移动端mobiscroll时间控件的使用