风筝
发表于: 2019-1-23 22:00:03 | 显示全部楼层

在本篇文章中,您将学习到如何通过使用Arduino开发板和L293D驱动器控制直流电机、步进电机和伺服电机。在本文结束时,您可以实现控制旋转方向、加速度、速度、功率和轴位置。

poster-1.jpg


为什么用L293D驱动电机?

驱动电动机需要大电流。另外,旋转方向和速度是两个需要控制的重要参数。这些要求可以通过使用微控制器(或像Arduino这样的开发板)来处理。但有个问题;微控制器无法提供足够的电流来运行电机,如果直接将电机连接到微控制器,可能会损坏微控制器。例如,Arduino UNO引脚限制为40mA电流,远小于控制小型电机所需的100-200mA电流。要解决这个问题,我们应该使用电机驱动器。电机驱动器可以连接到微控制器以接收命令并以高电流运行电机。


L293D是最受欢迎的电机驱动器之一,可驱动直流电机,电流负载高达1A.L293D有4个输出,适用于4线步进电机。 L293D也可用于驱动伺服电机。在本项目中,您将学习如何使用L293和Arduino UNO作为控制器来驱动电机。


所需的组件

●    Arduino UNO R3开发板

●    公USB A对公USB B线

●    L293D驱动器

●    迷你面包板

●    面包板跳线

●    30V 3A可调电源

●    直流减速电机

●    BYGH403 1.65A步进电机

●    TowerPro MG995 55G金属齿轮伺服电机

component.jpg


控制直流电动机

20-1.jpg

有几种类型的直流电机,但在这里我们将使用简单的有刷直流电机。它有小塑料齿轮,很容易驾驶。该电机适用于小型机器人和玩具。

11.jpg


电路

circuit-arduino.jpg

在此电路中,可调电源可以用9V电池或电源适配器替换。确保所有电线和电缆连接正确,然后上传代码。

22.jpg

21.jpg


代码

这是一个非常简单的代码。 您可以添加更多代码行以提高电机性能。

  1. // Basic sketch for trying out the L293D by www.Electropeak.com
  2. // Running single DC motor by L293D
  3. // 20/08/2018


  4. #define MOTOR_EN_1_2  10
  5. #define MOTOR_IN1     9
  6. #define MOTOR_IN2     8

  7. #define slow 64
  8. #define normal 128
  9. #define fast 255

  10. int Speed;

  11. void Forward_Rev(void){
  12.   analogWrite(MOTOR_EN_1_2, Speed);
  13.   digitalWrite(MOTOR_IN1, HIGH);
  14.   digitalWrite(MOTOR_IN2, LOW);
  15. }

  16. void Backward_Rev(void){
  17.   analogWrite(MOTOR_EN_1_2, Speed);
  18.   digitalWrite(MOTOR_IN1, LOW);
  19.   digitalWrite(MOTOR_IN2, HIGH);
  20. }

  21. void Forward_ramp_up(void){
  22.   digitalWrite(MOTOR_IN1, HIGH);
  23.   digitalWrite(MOTOR_IN2, LOW);
  24.   for (int i=0; i<255; i++) { analogWrite(MOTOR_EN_1_2, i); delay(10); } } void Forward_ramp_down(void){ digitalWrite(MOTOR_IN1, HIGH); digitalWrite(MOTOR_IN2, LOW); for (int i=255; i>=0; i--) {
  25.     analogWrite(MOTOR_EN_1_2, i);
  26.     delay(10);
  27.   }
  28. }

  29. void Backward_ramp_up(void){
  30.   digitalWrite(MOTOR_IN1, LOW);
  31.   digitalWrite(MOTOR_IN2, HIGH);
  32.   for (int i=0; i<255; i++) { analogWrite(MOTOR_EN_1_2, i); delay(10); } } void Backward_ramp_down(void){ digitalWrite(MOTOR_IN1, LOW); digitalWrite(MOTOR_IN2, HIGH); for (int i=255; i>=0; i--) {
  33.     analogWrite(MOTOR_EN_1_2, i);
  34.     delay(10);
  35.   }
  36. }

  37. void Brake(void){
  38.   digitalWrite(MOTOR_IN1, HIGH);
  39.   digitalWrite(MOTOR_IN2, HIGH);
  40. }

  41. void setup() {
  42.   
  43.   Serial.begin(9600);
  44.   Serial.println("L293D DC motor test");

  45.   pinMode(MOTOR_EN_1_2, OUTPUT);
  46.   pinMode(MOTOR_IN1, OUTPUT);
  47.   pinMode(MOTOR_IN2, OUTPUT);
  48. }

  49. void loop() {

  50.   Speed=normal; // Normal Speed

  51.   Forward_Rev();
  52.   delay(1000);
  53.   Brake();
  54.   delay(500);
  55.   Backward_Rev();
  56.   delay(1000);
  57.   Brake();
  58.   delay(500);
  59.   Forward_ramp_up();
  60.   Forward_ramp_down();
  61.   Backward_ramp_up();
  62.   Backward_ramp_down();
  63.   
  64. }
复制代码

ezgif.com-video-to-gif-12.gif


控制步进电机

在这个项目中,我们使用四线步进电机。 您可以在三种模式下控制步进电机。 单步、半步和功率步。 您应该知道步进电机的接线连接。 如果不这样做,请使用欧姆表来查找。


电路

有时,步进电机会在电路中产生一些噪音。 你可以并联一些电容来移除它们。

circuit-arduino-stepper.jpg


代码

此代码仅适用于首次运行。 要提高电机的性能,可以使用Arduino库的示例代码

ezgif.com-video-to-gif-14.gif


控制伺服电机

微型伺服电机(也称为9g伺服电机)在机器人手臂等小机器人项目中非常有用。 您应该生成PWM信号来控制伺服电机。 伺服电机根据其类型和尺寸可以非常快速和强大。

27.jpg

电路

circuit-arduino-servo.jpg

代码

以下是Arduino库的代码

  1. #include

  2. Servo myservo;  // create servo object to control a servo
  3. // twelve servo objects can be created on most boards

  4. int pos = 0;    // variable to store the servo position

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

  10. void loop() {
  11.   for (pos = 0; pos <= 180; pos += 3) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(5); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 3) { // goes from 180 degrees to 0 degrees
  12.     myservo.write(pos);              // tell servo to go to position in variable 'pos'
  13.     delay(5);                       // waits 15ms for the servo to reach the position
  14.   }
  15. }
复制代码

ezgif.com-video-to-gif-15.gif

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-26 02:08 , Processed in 0.047488 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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