首先关于驱动下载,一定要到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也可以,不过具体接线待定。
附上连线图:
本来是小电机来着,可惜线断了,手头没有电烙铁,只好用马达代替了。
注意看连接。
- 为了有效的使用电机驱动板,电机驱动程序你必须搞懂啊
复制代码
可用的示例代码:
[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]
- #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相应的电机
- [b][color=Red]inline [/color][/b]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;
- }
- }
复制代码
|