iam郎 发表于 2015-10-21 10:41:17

Arduino电机驱动板L293d详解

首先关于驱动下载,一定要到github下载
https://github.com/farukcankaya/AFMotor
亲测可用
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网站,这是大神级别的。

下面的要熟记



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

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

数字端口 9:舵机控制#2
数字端口 10:舵机控制#1

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

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

为了有效的使用电机驱动板,电机驱动程序你必须搞懂啊

可用的示例代码:
// 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);
}



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

#include "AFMotor.h"




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

void AF_DCMotor::setSpeed(uint8_t speed) {
switch (motornum) {
case 1:
    setPWM1(speed); break;
case 2:
    setPWM2(speed); break;
case 3:
    setPWM3(speed); break;
case 4:
    setPWM4(speed); break;
}
}

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

inline void setPWM4(uint8_t s) { //有大神解释下inline的含义吗?
#if defined(__AVR_ATmega8__) || \
    defined(__AVR_ATmega48__) || \
    defined(__AVR_ATmega88__) || \
    defined(__AVR_ATmega168__) || \
    defined(__AVR_ATmega328P__)
    // use PWM from timer0A on PB3 (Arduino pin #6)
    OCR0B = s;
#elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    // on arduino mega, pin 6 is now PH3 (OC4A)
    OCR3A = s;
#elif defined(__PIC32MX__)
    // Set the OC2 (pin 5) PMW duty cycle from 0 to 255 这个是取值范围
    OC2RS = s;
#else
   #error "This chip is not supported!"
#endif
}

=============run函数
void AF_DCMotor::run(uint8_t cmd) {
uint8_t a, b;
switch (motornum) {
case 1:
    a = MOTOR1_A; b = MOTOR1_B; break;
case 2:
    a = MOTOR2_A; b = MOTOR2_B; break;
case 3:
    a = MOTOR3_A; b = MOTOR3_B; break;
case 4:
    a = MOTOR4_A; b = MOTOR4_B; break;
default:
    return;
}

switch (cmd) { //状态机,根据不同的命令来切换状态
case FORWARD:
    latch_state |= _BV(a);
    latch_state &= ~_BV(b);
    MC.latch_tx();
    break;
case BACKWARD:
    latch_state &= ~_BV(a);
    latch_state |= _BV(b);
    MC.latch_tx();
    break;
case RELEASE:
    latch_state &= ~_BV(a);   // A and B both low
    latch_state &= ~_BV(b);
    MC.latch_tx();
    break;
}
}




zmalibaba 发表于 2015-10-23 09:59:02

感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我再发一个支持leonardo的库出来,当时也找了好久,我的板子就是leonardo,希望对其它人有用.你可以看下里面的.cpp,增加了对ATmega32u4 的支持

Hackerpro 发表于 2015-11-7 16:09:57

太棒了,非常实用

raybin 发表于 2016-4-2 11:17:05

zmalibaba 发表于 2015-10-23 09:59 static/image/common/back.gif
感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我 ...

高人啊 辛亏你提供了这个板也是32U4 不然只能丢了!!

qianqifeng 发表于 2017-1-24 12:20:28

zmalibaba 发表于 2015-10-23 09:59
感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我 ...

非常感谢,我的板子适合你的。
页: [1]
查看完整版本: Arduino电机驱动板L293d详解