一板网电子技术论坛

风筝
发表于: 2022-8-26 16:07:45 | 显示全部楼层

如果您计划组装一台机器人,最终会想了解如何控制各种电机,如直流电机、步进电机和伺服电机。最简单、最便宜的方法之一是使用L293D电机驱动扩展板和Arduino开发板。它是一个功能齐全的电机扩展板 - 非常适合许多机器人和CNC项目。


它可以驱动:

●    4个双向直流电机,8位速度选择(0-255)

●    2个步进电机(单极或双极),带单线圈、双线圈、交错或微步进。

●    2个伺服电机


L293D电机驱动器和74HC595移位寄存器

L293D是一款双通道H桥电机驱动器,能够驱动一对直流电机或单个步进电机。

L293D-Motor-Driver-Shield-Chipset.jpg


由于该扩展板带有两个L293D电机驱动芯片组,这意味着它可以单独驱动多达四个直流电机,使其成为构建四轮机器人平台的理想选择。


该扩展板总共提供4个H桥,每个H桥可为电机提供高达0.6A的电流。该扩展板还带有一个74HC595移位寄存器,将Arduino的4个数字引脚扩展到两个 L293D芯片的8个方向控制引脚。


电源

L293D-Motor-Driver-Shield-Power-Supply-Terminals.jpg


通过扩展板为电机供电有三种方式:

●    Arduino和电机的单直流电源:如果您想为Arduino和电机提供单直流电源,只需将其插入Arduino上的DC插孔或扩展板上的2针EXT_PWR端子。将电源跳线放在电机扩展板上。只有在电机电源电压低于12V时才能使用此方法。

●    (推荐)Arduino通过USB供电,电机通过直流电源:如果您想让Arduino通过USB断电,电机通过直流电源断电,请插入USB线。然后将电机电源连接到扩展板上的EXT_PWR端子。不要将跳线放在扩展板上。

●    为Arduino和电机提供两个独立的直流电源:如果您想为Arduino和电机提供两个独立的直流电源。将Arduino的电源插入DC插孔,并将电机电源连接到EXT_PWR端子。确保从电机扩展板上拆下跳线。


输出端子

两个L293D芯片的输出通道都通过两个5针螺钉端子 M1、M2、M3和 M4断开。您可以将四个电压在4.5到25V之间的直流电机连接到这些端子。

L293D-Motor-Driver-Shield-Output-Terminals-Pinout.jpg


模块上的每个通道可以为直流电机提供高达600mA的电流。但是,提供给电机的电流取决于系统的电源。您还可以将两个步进电机连接到输出端子。一个步进电机连接到电机端口M1-M2,另一个连接到M3-M4。


如果您碰巧有单极步进电机,还提供GND端子。您可以将两个步进电机的中心抽头连接到此端子。


扩展板将16位 PWM输出线引出到两个3针排针,您可以将两个伺服电机连接到这些排针。


安装AFMotor库

为了与扩展板通信,我们需要安装AFMotor.h库,以便我们可以发出简单的命令来控制直流、步进和伺服电机。


要安装库,请导航到 Sketch > Include Library > Manage Libraries... 等待库管理器下载库索引并更新已安装库的列表。

Manage-Libraries.jpg

输入“motor shield”过滤您的搜索。应该有几个条目。查找Adafruit Motor Shield library(V1 Firmware) by Adafruit。单击该条目,然后选择安装。

Installing-AFMotor-Library.jpg


使用L293D扩展板驱动直流电机

现在我们了解了有关扩展板的一切,我们可以开始将它连接到Arduino开发板上!


首先将扩展板插入Arduino顶部。接下来,将电源连接到电机。虽然您可以将电压在4.5到25V之间的直流电机连接到扩展板,但在我们的实验中,使用的是额定电压为9V的直流电机。因此,我们将外部9V电源连接到EXT_PWR端子。


现在,将电机连接到M1、M2、M3 或M4电机端子。在我们的实验中,将它连接到M4。

Wiring-DC-Motor-to-L293D-Motor-Shield-Arduino.jpg


下面的草图将让您全面了解如何使用L293D电机驱动器扩展板来控制直流电机的速度和旋转方向,并可以作为更多实际实验和项目的基础。


  1. AF_DCMotor motor(4);

  2. void setup()
  3. {
  4.         //Set initial speed of the motor & stop
  5.         motor.setSpeed(200);
  6.         motor.run(RELEASE);
  7. }

  8. void loop()
  9. {
  10.         uint8_t i;

  11.         // Turn on motor
  12.         motor.run(FORWARD);
  13.         
  14.         // Accelerate from zero to maximum speed
  15.         for (i=0; i<255; i++)
  16.         {
  17.                 motor.setSpeed(i);  
  18.                 delay(10);
  19.         }
  20.         
  21.         // Decelerate from maximum speed to zero
  22.         for (i=255; i!=0; i--)
  23.         {
  24.                 motor.setSpeed(i);  
  25.                 delay(10);
  26.         }

  27.         // Now change motor direction
  28.         motor.run(BACKWARD);
  29.         
  30.         // Accelerate from zero to maximum speed
  31.         for (i=0; i<255; i++)
  32.         {
  33.                 motor.setSpeed(i);  
  34.                 delay(10);
  35.         }

  36.         // Decelerate from maximum speed to zero
  37.         for (i=255; i!=0; i--)
  38.         {
  39.                 motor.setSpeed(i);  
  40.                 delay(10);
  41.         }

  42.         // Now turn off motor
  43.         motor.run(RELEASE);
  44.         delay(1000);
  45. }
复制代码

代码说明

草图首先包含AFMotor.h库。


接下来创建库对象。这里需要声明电机连接的电机端口号。对于端口M1写入1,对于M2写入2,依此类推。如果要将多个电机连接到扩展板,请为每个电机创建单独的对象。例如,以下代码片段创建了两个AFmotor对象。

  1. AF_DCMotor motor1(1);
  2. AF_DCMotor motor2(2);
复制代码

在代码的setup()和loop()函数部分,我们只需调用以下两个函数来控制电机的速度和旋转方向。

●    setSpeed(speed) 函数设置电机的速度。速度范围从0到255,0表示关闭,255表示全速。您可以在程序中随时设置速度。

●    run(cmd) 函数设置电机的运行模式。 cmd 的有效值为:

     ●    FORWARD – 向前运行(实际旋转方向取决于电机接线)

     ●    BACKWARD - 向后运行(旋转将与 FORWARD 方向相反)

     ●    RELEASE – 停止电机。这会切断电机的电源,相当于 setSpeed(0)。电机扩展板不实现动态制动,因此电机可能需要一些时间才能减速。

跳转到指定楼层
风筝
发表于: 2022-8-26 16:20:24 | 显示全部楼层

使用L293D扩展板驱动步进电机

让我们将步进电机连接到L293D扩展板。首先将扩展板插入Arduino顶部。


对于28BYJ-48单极步进电机

如果您使用的是28BYJ-48单极步进电机,这些电机的额定电压为5V,每转可提供48 步。因此,将外部5V电源连接到EXT_PWR端子。记得移除PWR跳线。


现在,将电机连接到M1-M2(端口#1)或M3-M4(端口#2)步进电机端子。在我们的实验中,连接到M3-M4。

Wiring-Unipolar-Stepper-Motor-to-L293D-Motor-Shield-Arduino.jpg


对于NEMA 17双极步进电机

如果您使用的是NEMA17 双极步进电机,这些电机的额定电压为12V,每转可提供200步。因此,将外部12V电源连接到EXT_PWR端子。记得移除PWR跳线。


现在,将电机连接到M1-M2(端口#1)或M3-M4(端口#2)步进电机端子。在我们的实验中,连接到M3-M4。

Wiring-Bipolar-Stepper-Motor-to-L293D-Motor-Shield-Arduino.jpg


Arduino代码

以下草图将让您全面了解如何使用L293D扩展板控制单极或双极步进电机,除了stepsPerRevolution参数外,这两种电机的代码都是相同的。


在尝试草图之前,根据您的电机规格更改此参数。例如,对于NEMA 17,将其设置为200,对于28BYJ-48,将其设置为48。

  1. #include <AFMotor.h>

  2. // Number of steps per output rotation
  3. // Change this as per your motor's specification
  4. const int stepsPerRevolution = 48;

  5. // connect motor to port #2 (M3 and M4)
  6. AF_Stepper motor(stepsPerRevolution, 2);

  7. void setup() {
  8.   Serial.begin(9600);
  9.   Serial.println("Stepper test!");

  10.   motor.setSpeed(10);  // 10 rpm   
  11. }

  12. void loop() {
  13.   Serial.println("Single coil steps");
  14.   motor.step(100, FORWARD, SINGLE);
  15.   motor.step(100, BACKWARD, SINGLE);

  16.   Serial.println("Double coil steps");
  17.   motor.step(100, FORWARD, DOUBLE);
  18.   motor.step(100, BACKWARD, DOUBLE);

  19.   Serial.println("Interleave coil steps");
  20.   motor.step(100, FORWARD, INTERLEAVE);
  21.   motor.step(100, BACKWARD, INTERLEAVE);

  22.   Serial.println("Micrsostep steps");
  23.   motor.step(100, FORWARD, MICROSTEP);
  24.   motor.step(100, BACKWARD, MICROSTEP);
  25. }
复制代码

代码说明

草图首先包含AFMotor.h库。


接下来创建库对象。在这里,您需要将电机的每转步数和电机连接的端口号作为参数传递。


在代码的setup()和loop()函数部分,我们只需调用以下两个函数来控制电机的速度和旋转方向。

●    setSpeed(rpm) 函数设置电机的速度,其中rpm是您希望步进电机每分钟转动多少转。

●    step(#steps, direction, steptype) 函数:每次移动电机时都会调用该函数。 #steps 是您希望它采取的步数。方向是 FORWARD 或 BACKWARD,stepstyle 的有效值为:

    ●    SINGLE - 一次通电一个线圈。

    ●    DOUBLE - 两个线圈一次通电以获得更大的扭矩。

    ●    INTERLEAVE - 在单步和双步之间交替以在其间创建半步。这可以使操作更顺畅,但由于额外的半步,速度也降低了一半。

    ●    MICROSTEP - 相邻的线圈上下倾斜,以在每个完整步骤之间创建许多“微步进”。这会导致更精细的分辨率和更平滑的旋转,但会损失扭矩。


使用L293D扩展板驱动伺服电机

使用L293D扩展板驱动伺服电机非常简单。


电机扩展板实际上将Arduino的16位PWM输出引脚#9和#10用两个3针接头连接到扩展板的边缘。


伺服系统的电源来自Arduino的板载5V稳压器,因此您无需将任何东西连接到EXT_PWR端子。

Wiring-Servo-Motor-to-L293D-Motor-Shield-Arduino.jpg


当我们使用板载PWM引脚时,草图使用IDE的内置伺服电机库。

  1. #include <Servo.h>

  2. Servo myservo;        // create servo object to control a servo
  3. int pos = 0;        // variable to store the servo position

  4. void setup()
  5. {
  6.         // attaches the servo on pin 10 to the servo object
  7.         myservo.attach(10);   
  8. }

  9. void loop()
  10. {
  11.         // sweeps from 0 degrees to 180 degrees
  12.         for(pos = 0; pos <= 180; pos += 1)
  13.         {
  14.                 myservo.write(pos);
  15.                 delay(15);
  16.         }
  17.         // sweeps from 180 degrees to 0 degrees
  18.         for(pos = 180; pos>=0; pos-=1)
  19.         {
  20.                 myservo.write(pos);
  21.                 delay(15);
  22.         }
  23. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 675 | 回复: 1398



手机版|

GMT+8, 2022-10-7 06:59 , Processed in 0.020613 second(s), 4 queries , Gzip On, MemCache On. Powered by Discuz! X3.4

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表