极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 23076|回复: 4

Arduino电机驱动板L293d详解

[复制链接]
发表于 2015-10-21 10:41:17 | 显示全部楼层 |阅读模式
首先关于驱动下载,一定要到github下载
https://github.com/farukcankaya/AFMotor
亲测可用
  1. your-path-to-afmotor\AFMotor-master\AFMotor\examples
复制代码

注意把AFMotor-master后面的内容拷贝到Arduino库文件就可以了,之前从论坛下载的不可用不知道是否是文件夹是AF_Motor的原因,百度云盘的驱动不好用,我没有具体比较过两个文件,感兴趣的可以比较一下。

其中l293d马达驱动资料是淘宝买驱动板给提供的下载链接,后面AFMotor_master是从github下载的感兴趣的可以比较一下。

如果是直流电机只震动不转,我一开始遇到了用的是motorparty的例子,后来用MotorTest的例子搞定了驱动小电机。

详细介绍请自己百度。

放一个马达的官网介绍,比较有料的,来自于https://learn.adafruit.com/adafruit-motor-shield adafruit网站,这是大神级别的。

下面的要熟记



  1. 可以把L293D电机驱动板的针脚取下来,重新焊接到正面,然后将电机驱动板L293D和Arduino板的相关接口通过杜邦线连接起来。

  2. L293D电机驱动板和Arduino板的针脚连接如下:
  3. 数字端口11:直流电机#1/步进#1(PWM)
  4. 数字端口 3:直流电机#2/步进#1(PWM)
  5. 数字端口 5:直流电机#3/步进#2(PWM)
  6. 数字端口 6:直流电机#4/步进#2(PWM)
  7. 以及端口4,7,8和12。

  8. 数字端口 9:舵机控制#2
  9. 数字端口 10:舵机控制#1
复制代码


如果你仔细观察两边的5根接线柱,其实很明显的分为两组:一组3,一组2.我们用两组的直接驱动直流电机就好了。
一般我用M1或者M4,当然M2和M3也可以,不过具体接线待定。
附上连线图:

本来是小电机来着,可惜线断了,手头没有电烙铁,只好用马达代替了。
注意看连接。

  1. 为了有效的使用电机驱动板,电机驱动程序你必须搞懂啊
复制代码


可用的示例代码:
[pre lang="arduino" line="1" file="MotorTest.pde"]// Adafruit Motor shield library
// copyright Adafruit Industries LLC, 2009
// this code is public domain, enjoy!

#include <AFMotor.h>

AF_DCMotor motor(4); //指定使用哪个电机接口,附带的例子是2,我改成4了。

void setup() {
  Serial.begin(9600);           // set up Serial library at 9600 bps
  Serial.println("Motor test!");

  // turn on motor
  motor.setSpeed(200);

  motor.run(RELEASE);
}

void loop() {
  uint8_t i;
  
  Serial.print("tick");
  
  motor.run(FORWARD); //控制电机正转反转的代码
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
}

  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
}
  
  Serial.print("tock");

  motor.run(BACKWARD);
  for (i=0; i<255; i++) {
    motor.setSpeed(i);  
    delay(10);
}

  for (i=255; i!=0; i--) {
    motor.setSpeed(i);  
    delay(10);
}
  

  Serial.print("tech");
  motor.run(RELEASE);
  delay(1000);
}
[/code]


  1. #if (ARDUINO >= 100) //看驱动文件,根据不同的情况,推测ARDUINO大于一百指的是版本号大于1.0,来判断加载哪个文件
  2.   #include "Arduino.h" //百度云盘里的没有进行这个判断所以导致程序报错,换句话说,百度云盘下载的l293d资料版本老
  3. #else
  4.   #if defined(__AVR__)
  5.     #include <avr/io.h>
  6.   #endif
  7.   #include "WProgram.h"
  8. #endif

  9. #include "AFMotor.h"
复制代码




  1. //直流电机的速度设置方法

  2. void AF_DCMotor::setSpeed(uint8_t speed) {
  3.   switch (motornum) {
  4.   case 1:
  5.     setPWM1(speed); break;
  6.   case 2:
  7.     setPWM2(speed); break;
  8.   case 3:
  9.     setPWM3(speed); break;
  10.   case 4:
  11.     setPWM4(speed); break;
  12.   }
  13. }

  14. //扩展板用的都是pwm接口,所以,实际上起作用都是setpwm相应的电机

  15. [b][color=Red]inline [/color][/b]void setPWM4(uint8_t s) { //有大神解释下inline的含义吗?
  16. #if defined(__AVR_ATmega8__) || \
  17.     defined(__AVR_ATmega48__) || \
  18.     defined(__AVR_ATmega88__) || \
  19.     defined(__AVR_ATmega168__) || \
  20.     defined(__AVR_ATmega328P__)
  21.     // use PWM from timer0A on PB3 (Arduino pin #6)
  22.     OCR0B = s;
  23. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  24.     // on arduino mega, pin 6 is now PH3 (OC4A)
  25.     OCR3A = s;
  26. #elif defined(__PIC32MX__)
  27.     // Set the OC2 (pin 5) PMW duty cycle from 0 to 255 这个是取值范围
  28.     OC2RS = s;
  29. #else
  30.    #error "This chip is not supported!"
  31. #endif
  32. }

  33. =============run函数
  34. void AF_DCMotor::run(uint8_t cmd) {
  35.   uint8_t a, b;
  36.   switch (motornum) {
  37.   case 1:
  38.     a = MOTOR1_A; b = MOTOR1_B; break;
  39.   case 2:
  40.     a = MOTOR2_A; b = MOTOR2_B; break;
  41.   case 3:
  42.     a = MOTOR3_A; b = MOTOR3_B; break;
  43.   case 4:
  44.     a = MOTOR4_A; b = MOTOR4_B; break;
  45.   default:
  46.     return;
  47.   }
  48.   
  49.   switch (cmd) { //状态机,根据不同的命令来切换状态
  50.   case FORWARD:
  51.     latch_state |= _BV(a);
  52.     latch_state &= ~_BV(b);
  53.     MC.latch_tx();
  54.     break;
  55.   case BACKWARD:
  56.     latch_state &= ~_BV(a);
  57.     latch_state |= _BV(b);
  58.     MC.latch_tx();
  59.     break;
  60.   case RELEASE:
  61.     latch_state &= ~_BV(a);     // A and B both low
  62.     latch_state &= ~_BV(b);
  63.     MC.latch_tx();
  64.     break;
  65.   }
  66. }

复制代码



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2015-10-23 09:59:02 | 显示全部楼层
感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我再发一个支持leonardo的库出来,当时也找了好久,我的板子就是leonardo,希望对其它人有用.你可以看下里面的.cpp,增加了对ATmega32u4 的支持

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 1 反对 0

使用道具 举报

发表于 2015-11-7 16:09:57 | 显示全部楼层
太棒了,非常实用
回复 支持 反对

使用道具 举报

发表于 2016-4-2 11:17:05 | 显示全部楼层
zmalibaba 发表于 2015-10-23 09:59
感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我 ...

高人啊 辛亏你提供了这个板也是32U4 不然只能丢了!!
回复 支持 反对

使用道具 举报

发表于 2017-1-24 12:20:28 | 显示全部楼层
zmalibaba 发表于 2015-10-23 09:59
感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我 ...

非常感谢,我的板子适合你的。
回复 支持 反对

使用道具 举报

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

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 02:47 , Processed in 0.051388 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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