如果您打算组装新的机器人,那么您最终将希望了解如何控制各种电机,例如DC电机,步进电机和伺服器。最简单,最便宜的方法之一是将L293D电动机驱动器与Arduino接起来。它是功能齐全的电动机驱动,非常适合许多机器人和CNC项目。
它可以驱动:
- 具有8位速度选择的4个双向直流电动机(0-255)
- 2个步进电机(单极或双极),具有单线圈,双线圈,交错或微步进。
- 2台伺服电机
L293D电机驱动器和74HC595移位寄存器
- L293D是一款双通道H桥电机驱动器,能够驱动一对DC电机或单个步进电机。
- 由于板子有两个L293D电动机驱动器芯片组,这意味着它可以单独驱动多达四个直流电动机,因此非常适合构建四轮机器人平台。
- 屏蔽层总共提供4个H桥,每个H桥可以为电机提供高达0.6A的电流。
- 屏蔽层还带有一台74HC595移位寄存器,该寄存器将Arduino的4个数字引脚扩展到两个L293D芯片的8个方向控制引脚。
L293D电机驱动器和74HC595移位寄存器
通过屏蔽为电动机供电时,存在三种情况。
- 适用于Arduino和电机的单个直流电源:如果您想同时使用Arduino和电机的单个直流电源,只需将其插入Arduino的DC插孔或屏蔽板上的2针EXT_PWR块即可。将电源跳线放在电动机屏蔽罩上。仅当电动机电源电压小于12V时,才可以使用此方法。
- (推荐)Arduino通过USB、USB电机通过直流电源供电:如果您想让Arduino由USB供电,而电机由DC电源供电,则插入USB电缆。然后将电动机电源链接到屏蔽板上的EXT_PWR模块。请勿将跳线放在板子上。
- 用于Arduino和电机的两个独立的直流电源:如果您想要为Arduino和电机的两个独立的直流电源。将Arduino的电源插入DC插孔,然后将电机电源链接到EXT_PWR模块。确保将跳线从电动机护罩上卸下。
警告:
跳线就位时,请勿为EXT_PWR输入供电。否则可能会损坏电机护罩以及Arduino!
作为奖励,板子提供以下功能:
- 板子带有一台下拉电阻阵列,可在加电期间保持电动机关闭。
- 板载LED指示电动机电源正常。如果不亮,则电动机将无法运行。
- RESET就是Arduino的reset按钮。为了省事起见,它仅显示在顶部。
输出端子
- 两个L293D芯片的输出通道都通过两个5针螺钉端子输出M1,M2,M3和M4。您可以将四个电压在4.5至25V之间的直流电动机链接到这些端子。
- 模块上的每个通道均可向直流电动机提供高达600mA的电流。但是,提供给电动机的电流量取决于系统的电源。
- 您也可以将两个步进电机链接到输出端子。一台步进电机链接到电机端口M1-M2,另一台链接到M3-M4。
- 如果碰巧有单极步进电机,还可以提供GND端子。您可以将两个步进电机的中心抽头链接到此端子。
- 屏蔽层将16位PWM输出线引出到两个3针接头链接器上,您可以在其中链接两个伺服电机。
L293D屏蔽上未使用的引脚 屏蔽层未使用数字引脚#2,#13和模拟引脚A0-A5。
模拟引脚在右下角断开,其中引脚2的分支较小。如果要使用这些引脚,可以将一些接头链接到它。
安装AFMotor库
为了与屏蔽层通信,我们需要安装AFMotor.h库,以便我们可以发出简单的命令来控制DC,步进和伺服电机。
要安装库,请导航至“sketch”>“include library”>“manage libraries...”,等待库管理器下载库索引并更新已安装库的列表。
输入“ motor shield ”来过滤搜索。应该有几个条目。查找Adafruit提供的Adafruit Motor Shield库(V1固件)。单击该条目,然后选择“安装”。
L293D的直流电动机的驱动
既然我们了解了所有关于屏蔽的知识,我们就可以将其链接到Arduino了!
首先将板子插入Arduino的顶部。
接下来,将电源链接到电动机。尽管您可以将电压在4.5到25V之间的直流电动机链接到板子,但是在我们的实验中,我们使用的是额定9V的直流电动机。因此,我们将外部9V电源链接到EXT_PWR端子。
目前,将电动机链接到M1,M2,M3或M4电动机端子。在我们的实验中,我们将其链接到M4。
下图将使您全面了解如何使用L293D电动机驱动器护罩控制直流电动机的速度和旋转方向,并可以作为更实际的实验和项目的基础。
#include <AFMotor.h>
AF_DCMotor motor(4);
void setup()
{
//Set initial speed of the motor & stop
motor.setSpeed(200);
motor.run(RELEASE);
}
void loop()
{
uint8_t i;
// Turn on motor
motor.run(FORWARD);
// Accelerate from zero to maximum speed
for (i=0; i<255; i++)
{
motor.setSpeed(i);
delay(10);
}
// Decelerate from maximum speed to zero
for (i=255; i!=0; i--)
{
motor.setSpeed(i);
delay(10);
}
// Now change motor direction
motor.run(BACKWARD);
// Accelerate from zero to maximum speed
for (i=0; i<255; i++)
{
motor.setSpeed(i);
delay(10);
}
// Decelerate from maximum speed to zero
for (i=255; i!=0; i--)
{
motor.setSpeed(i);
delay(10);
}
// Now turn off motor
motor.run(RELEASE);
delay(1000);
}
代码解释
草图首先包括AFMotor.h库。
第二行AF_DCMotor motor(motorPort#);创建一台库对象。在这里,您需要声明电动机链接的电动机端口号。对于端口M1,写1,对于M2,写2,依此类推。
如果要将多个电动机链接到驱动器,请为每个电动机创建单独的对象。例如,以下代码片段创建了两个AFmotor对象。
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
- setSpeed(speed)功能设置电动机的速度。在speed从0到255的范围与0被关闭和255作为全油门。您可以随时在程序中设置速度。
- run(cmd)功能设置电动机的运行模式。有效值为cmd:
- FORWARD -正向运行(旋转实际方向将取决于电机的接线)
- BACKWARD-向后运行(旋转方向与FORWARD相反)
- RELEASE–停止电动机。这会断开电动机的电源,等效于setSpeed(0)。电动机的防护罩没有实现动态破坏,因此电动机可能需要一些时间才能旋转下来。
L293D步进电机驱动
让我们将步进电机链接到L293D。首先将板子插入Arduino的顶部。
对于28BYJ-48单极步进器
如果使用的是28BYJ-48单极步进电机,则这些电机的额定电压为5V,每转可提供48步。因此,将外部5V电源链接到EXT_PWR端子。
切记卸下PWR跳线。
目前,将电动机链接到M1-M2(端口#1)或M3-M4(端口#2)步进电动机端子。在我们的实验中,我们将其链接到M3-M4。
对于NEMA 17双极步进器
如果使用NEMA 17双极步进电机,则这些电机的额定电压为12V,每转可提供200步。因此,将外部12V电源链接到EXT_PWR端子。
切记卸下PWR跳线。
目前,将电动机链接到M1-M2(端口#1)或M3-M4(端口#2)步进电动机端子。在我们的实验中,我们将其链接到M3-M4。
Arduino 代码
下图将使您完全了解如何使用L293D控制单极或双极步进电机,除了stepsPerRevolution参数外,这两种电机都相同。
在尝试绘制草图之前,请根据电动机的规格更改此参数。例如,对于NEMA 17,将其设置为200,对于28BYJ-48,将其设置为48。
#include <AFMotor.h>
// Number of steps per output rotation
// Change this as per your motor&#39;s specification
const int stepsPerRevolution = 48;
// connect motor to port #2 (M3 and M4)
AF_Stepper motor(stepsPerRevolution, 2);
void setup() {
Serial.begin(9600);
Serial.println(&#34;Stepper test!&#34;);
motor.setSpeed(10); // 10 rpm
}
void loop() {
Serial.println(&#34;Single coil steps&#34;);
motor.step(100, FORWARD, SINGLE);
motor.step(100, BACKWARD, SINGLE);
Serial.println(&#34;Double coil steps&#34;);
motor.step(100, FORWARD, DOUBLE);
motor.step(100, BACKWARD, DOUBLE);
Serial.println(&#34;Interleave coil steps&#34;);
motor.step(100, FORWARD, INTERLEAVE);
motor.step(100, BACKWARD, INTERLEAVE);
Serial.println(&#34;Micrsostep steps&#34;);
motor.step(100, FORWARD, MICROSTEP);
motor.step(100, BACKWARD, MICROSTEP);
}
代码说明:
草图首先包括AFMotor.h库。
第二行AF_Stepper motor(48, 2);创建一台库对象。在这里,您需要传递电动机的每转步数和电动机所链接的端口号,作为参数。
在代码的设置和循环部分,我们简单地调用以下两个函数来控制电动机的速度和旋转方向。
- setSpeed(rpm)功能设置电动机的速度,rpm您希望步进器每分钟转多少转。
- step(#steps, direction, steptype)每次要移动电动机时,都会调用该函数。#steps是您要采取的步骤。direction是FORWARD或BACKWARD,有效值为stepstyle:
- 单–一次给一台线圈通电。
- 双–一次为两个线圈通电,以提供更大的扭矩。
- 交错-在单张和双张之间交替进行,以在两者之间建立半步。这样可以使操作更顺畅,但是由于额外的半步,速度也降低了一半。
- MICROSTEP –相邻线圈上下倾斜,以在每个完整步骤之间创建多个“微步骤”。这将导致更精细的分辨率和更平滑的旋转,但会损失扭矩。
L293D驱动伺服电机
使用L293D驱动伺服器非常容易。
电机接线实际上通过两个3引脚接头将Arduino的16位PWM输出引脚#9和#10断开到的边缘。
Servos的电源来自Arduino的板载5V稳压器,因此您无需将任何东西链接到EXT_PWR端子。
当我们使用板载PWM引脚时,草图使用IDE的内置Servo库。
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int pos = 0; // variable to store the servo position
void setup()
{
// attaches the servo on pin 10 to the servo object
myservo.attach(10);
}
void loop()
{
// sweeps from 0 degrees to 180 degrees
for(pos = 0; pos <= 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
// sweeps from 180 degrees to 0 degrees
for(pos = 180; pos>=0; pos-=1)
{
myservo.write(pos);
delay(15);
}
} |