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;
}
}
感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我再发一个支持leonardo的库出来,当时也找了好久,我的板子就是leonardo,希望对其它人有用.你可以看下里面的.cpp,增加了对ATmega32u4 的支持 太棒了,非常实用 zmalibaba 发表于 2015-10-23 09:59 static/image/common/back.gif
感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我 ...
高人啊 辛亏你提供了这个板也是32U4 不然只能丢了!! zmalibaba 发表于 2015-10-23 09:59
感谢楼主提供的AF_motor库,但是你提供的这个库不支持ATmega32u4 的Arduino 板子 例如Arduino Leonardo,我 ...
非常感谢,我的板子适合你的。
页:
[1]