L293D电机驱动版在Arduino上使用笔记
硬件连接
电源
驱动板是可以接受Arduino板的电力的,但是,arduino也就那么点电压,带一两个小直流电机还好说,东西搞多了,也是供不应求的.不过幸好L293D支持外部供电,通过上图中的外接电源接口,就可以进行外部供电.
进行外部供电的时候,需要将外接电源接口旁边的黄色跳线帽拔掉.
可以给每个电机最多600ma电流,1.2A的峰值电流。
电流超过1A的话,需要放散热块.
建议使用18650电池.
引脚使用
所有的六个模拟输入引脚都是可用的。它们也可以当做数字芯片来使用。(引脚14到19)
数字引脚2和13可用。 下面的引脚只有在下面提到的直流或者步进电机工作时才会被用到 数字引脚11: 1号直流电机或者1号步进电机 数字引脚3: 2号直流电机或者1号步进电机 数字引脚5: 3号直流电机或者2号步进电机 数字引脚6:4号直流电机或者2号步进电机 下面的引脚只有在下面的直流或者步进电机工作时才会被用到 数字信号4,7,8,和12通过74hc595(serial-to-parallel)来驱动直流或者步进电机 下面的引脚只有在舵机工作时才会被用到 数字信号9:1号舵机 数字信号10: 2号舵机
所以只要相应的引脚没被L293D驱动板使用到,就可以可以拿来用的但前提是得自己焊出引脚来。焊引脚的地方就是上图中的预留孔位.
电机连接
L293D可以驱动4个直流电机(M1~M4),两个中间白色圈中的接口一般不用.
L293D还可以接两个舵机,分别用数字引脚9和10控制.
软件
使用L293D需要安装AFMotor库文件.
与直流电机有关的函数
确保导入AFMotor库文件并#include < AFMotor.h>后,有这么几个函数需要用到
AF_DCMotor motorname(motornum,frequency);
motorname
给电机起个名字,然后这个名字就是此电机在程序中的代号了
motornum
用来选择你要给哪个电机取名字,参数范围为1~4
frequency
用来设定此电机信号控制的频率.
M1和M2可以使用MOTOR12_64KHZ,MOTOR12_8KHZ,MOTOR12_2KHZ,或者MOTOR12_1KHZ等常量
M3和M4使用MOTOR34_64KHZ,MOTOR34_8KHZ,MOTOR34_1KHZ。
setSpeed(speed)
- setSpeed用来设置电机的速度
- 参数speed的取值范围从0(停止)到255(全速)
- motorname.setSpeed(speed)
run(direction)
开跑
direction可以使用FORWARD,BACKWARD,RELEASE三个常量
示范:
#include <AFMotor.h>
AF_DCMotor motor(2,MOTOR12_64KHZ);
void setup(){
motor.setSpeed(200);
}
void loop(){
motor.run(FORWARD);
delay(1000);
motor.run(BACKWARD);
delay(1000);
motor.run(RELEASE);
delay(1000);
}
与步进电机有关的函数
确保导入AFMotor库文件并#include < AFMotor.h>后,有这么几个函数需要用到
AF_Stepper steppername(steps,portnumber)
steppername
给电机起个名字,然后这个名字就是此电机在程序中的代号了
steps
设置电机每转的步数,比如设置36,则每步走1/36转
portnumber
选择电机的通道,范围为1(通道1,2)和2(通道3和4)
Step(steps,direction,style)
step
转动的步数
direction
转动的方向FORWARD 或者 BACKWARD
style
步进的模式,可以选择的参数:
- SINGLE - 一次只给一相线圈供电
- DOUBLE - 一次给两项项圈都供电,得到更大的扭矩
- INTERLEAVE - 电机会运转得更柔滑,因为步数增加了一倍,同时速度也减小一半
- MICROSTEP - 电机会运转的更柔滑,精度更高,但扭矩也会减小
如果想更精细地控制步进电机,可以使用AccelStepper library,这个库带有电机加减速度功能。
示范:
#include <AFMotor.h>
AF_Stepper motor(200,2);
void step(){
motor.step(200,FORWARD,SINGLE);
motor.release();
delay(1000);
}
Void loop(){
motor.step(100,FORWARD,SINGLE);
motor.step(100,BACKWARD,SINGLE);
motor.step(100,FORWARD,DOUBLE);
motor.step(100,BACKWARD,DOUBLE);
motor.step(100,FORWARD,INTERLEAVE);
motor.step(100,BACKWARD,INTERLEAVE);
motor.step(100,FORWARD,MICROSTEP);
motor.step(100,BACKWARD,MICROSTEP);
}