L293D电机驱动板的使用 - 花落花开一瞬间

时间:2024-02-20 13:39:00

L293D电机驱动板的使用

做小车L293D的使用是关键,自己对这板子也是一点也不了解,通过查资料和实际的摸索,算是终于完成了。把自己的经验分享一下,希望能有点帮助。
首先这块板子是和其它扩展板一样,是整个插在Arduino主板上使用的
<ignore_js_op> 


主板上的引脚被它全部占住,但并不是都被其使用,具体请看带星号的扩展部分(带星号内容非必看)
**************************************

那么在L293D上哪些引脚我们可以使用呢?
    所有的六个模拟输入引脚都是可用的。它们也可以当做数字芯片来使用。(引脚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驱动板使用到,你也是可以拿来用的但前提是你得自己焊出引脚来。
***************************************
<ignore_js_op>
一.供电

驱动板插在Arduino主板上能够得到主板的电力供应,但这点电流是根本无法带动电机什么的。所以必须外接强劲点的电源。
外接电源接在上图黄圈位置,特别注意正负极接反了要烧板子的  接外接电源时要把旁边的黄色跳帽拿掉。
电机驱动板电源输入要求为4.5V~25V。大多数1.5~3V电机不会工作。
电流要求:这个电机驱动芯片可以给每个电机最多600ma电流,1.2A的峰值电流。需要注意的是,一旦你预测你的电流达到1A的话,需要在电机驱动芯片上放一个散热块,否则可能会烧了芯片。
那种9v电池并不能带动电机。使用大的铅酸蓄电池或者镍氢电池包,18650电池。
二.硬件连接

 

如果你要连接舵机那么就接到上图画紫圈的地方,正,负,控制线对应接好。
可以看到能接两个舵机。分别用数字引脚9,10进行控制。
 
电机就接在左右两边画红圈的位置,板子上两两为一组分成了M1,M2,M3,M4,其中中间的为GND接线处一般没使用。
可以接四个直流电机或两个步进电机。
 
三.软件
安装驱动板的库文件 <ignore_js_op> AFMotor.rar (5.98 KB, 下载次数: 1075) 
在程序中就可以对M1-M4这四个直流电机进行控制了。
直流电机适应于许多机器人项目
这块电机模块可以最多驱动4个电机同时正反向运动。使用高精度的PWM输出,速度可以以每次0.5%的幅度变化。这意味着电机会运转非常柔和。
需要注意的是,这里的H桥芯片并不是用来驱动额定电流超过0.6A或峰值电流超过1.2A的电机的,只是适用于小的电机。在使用你的电机前,首先请确认电机的参数是否符合。
下面会教你如何运转起一个直流电机:
1.确认你导入#include <AFMotor.h>
2.建立AF_DCMotor(motor#,frequency)函数,其中第一参数motor#示意你的电机连到了1,2,3或者4中的哪个端口;frequency则代表了信号控制的频率。如果连接电机1和2,你可以选择MOTOR12_64KHZ,MOTOR12_8KHZ,MOTOR12_2KHZ,或者MOTOR12_1KHZ。像64KHZ这么高的频率不会发出噪声,但是低频率会有效降低电源。电机3和4只能以1KHZ运行,并且会忽略任何给定的设置。
3.你可以使用setSpeed(speed)函数来设置电机的速度,speed参数的范围从0(停止)到255(全速)。你可以在这个范围内任意设定。
4.想让电机转动,你可以调用run(direction),其中direction参数可以是FORWARD,BACKWARD,RELEASE。当然arduino并不知道哪个方向是正向,哪个是反向,所以如果运转的方向与你设定的相反,你只需要将电机接在驱动板上的两个线反向连接。
#include <AFMotor.h>
AF_DCMotor motor(2,MOTOR12_64KHZ);
Void setup(){
Serial.begin();
Serial.println(“Motor test!”);
motor.setSpeed(200);
}
Void loop(){
Serial.print(“tick”);
motor.run(FORWARD);
delay(1000);
Serial.print(“tock”);
motor.run(BACKWARD);
delay(1000);
Serial.print(“tack”);
motor.run(RELEASE);
delay(1000);
}
AF_DCMotor 类
AFMotor类配合Adafruit Motor Shied可以最多同时控制4个直流电机的速度和方向。要使用这些功能,首先要在开头添加库文件:
#include <AFMotor.h>
AF_DCMotor motorname(portnum,freq)
这是一个建立一个直流电机的函数。在程序中需要声明每个电机各一次。像下面的例子中一样,每个电机必须使用不同的名字。
参数:
port num - 选择你的电机连接到电机驱动板上的接口(1-4)
freq - 选择PWM频率。如果你没有选择这个选项,默认设置为1KHZ。
适用于通道1和2的频率:
MOTOR12_64KHZ
MOTOR12_8KHZ
MOTOR12_2KHZ
MOTOR12_1KHZ
适用于通道3和4的频率:
MOTOR34_64KHZ
MOTOR34_8KHZ
MOTOR34_1KHZ
例如:
AF_DCMotor motor4(4);//通道4,默认1KHZ频率
AF_DCMotor left_motor(1,MOTOR12_64KHZ);//通道1,64KHZ频率
注意:更高的频率会减小电机在运动过程中的噪音,但同时也会降低扭矩。
setSpeed(speed)
设置电机的速度
参数:
speed-范围为0到255,0代表停止,255代表全速。
注意:直流电机的回馈并不是典型线性的,所以真正的转速并不会与程序中设定的速度成正比。
run(cmd)
设置电机的运转模式
参数:
cmd - 选择你想要的电机运转模式
可选择的模式:
FORWARD - 正转(真正的转动方向取决于你电机的连线)
BACKWARD - 反转 (转动方向与正转相反)
RELEASE - 停止。使电机断电,与setSpeed(0)函数功能相同。调用了这个函数后,电机需要一定时间才能彻底停止。
举例:
motor.run(FORWARD);
delay(1000);
motor.run(RELEASE);
delay(1000);
motor.run(BACKWARDS);
AF_Stepper 类
AF_Stepper类配合Adafruit Motor驱动板可以同时最多控制2个步进电机。要想使用这个功能,你必须首先添加:
#include <AFMotor.h>
AF_Stepper steppername(steps,portnumber)
这个函数定义了一个步进电机。首先在程序中需要声明步进电机一次。像下面的例子中一样,每个电机必须使用不同的名字。
参数:
steps - 选择电机每转的步数
num - 选择电机的通道
num参数可以选择1(通道1和2)和2(通道3和4)
9.PNG (473.77 KB, 下载次数: 108)
下载附件
2015-5-4 14:52 上传
AF_Stepper Stepper1(48,1);
AF_Stepper Stepper2(200,2);
Step(steps,direction,style)
参数:
steps - 转动的步数
direction - 转动的方向(FORWARD 或者 BACKWARD)
style - 步进的模式
style项可以选择的模式:
SINGLE - 一次只给一相线圈供电
DOUBLE - 一次给两项项圈都供电,得到更大的扭矩
INTERLEAVE - 电机会运转得更柔滑,因为步数增加了一倍,同时速度也减小一半
MICROSTEP - 电机会运转的更柔滑,精度更高,但扭矩也会减小
举例:
Stepper.step(100,FORWARD,DOUBLE);
Stepper.step(100,BACKWARD,MICROSTEP);
setSpeed(RPMspeed)
参数:
Speed - 每分钟的转数
举例:
Stepper1.setSpeed(10);//设置电机1速度为每分钟10转
Stepper2.setSpeed(30);//设置电机2速度为每分钟30转
onestep(direction,stepstyle)
设置单步
参数:
Direction - 转动的方向(FORWARD或者BACKWARD)
Stepstyle - 步进的模式
style项可以选择的模式:
SINGLE - 一次只给一相线圈供电
DOUBLE - 一次给两项项圈都供电,得到更大的扭矩
INTERLEAVE - 电机会运转得更柔滑,因为步数增加了一倍,同时速度也减小一半
MICROSTEP - 电机会运转的更柔滑,精度更高,但扭矩也会减小
例如:
Stepper1.onestep(FORWARD,DOUBLE);
release()
释放电机的锁定扭矩,可以有效减低发热和电流损耗。
例如:
Stepper1.release();//停止转动,解除锁定的你扭矩
**************************************************************
使用步进电机

步进电机可以用来精确控制,很适合用于许多机器人或者CNC制作。这个电机驱动板做多支持2个步进电机。双极性和单极性电机都适合这个库。
对于双极性电机(42二相四线电机):其中由两相,相1的两线连接到驱动板上的M1或者M3,相2的两线连接到驱动板上对于的M2或者M4上。
运转一个步进电机比运转一个直流电机稍微复杂些,但总体还是比较简单的。
1.确认你已经代码中声明了#include <AFMotor.h>
2.使用AF_Stepper(steps,stepper#)函数来配置:steps指的是电机每圈需要的步数。一个步距角为7.5度的电机,需要360/7.5 = 48步;stepper指的是连接的端口。如果你使用了M1和M2,那端口就是1;反之,端口就是2.
3.使用setSpeed(rpm)设定电机的速度,这里的速度是指电机每分钟转动的圈数。
4.每次你想让电机转动,你都必须使用step(#steps,direction,steptype)程序。其中,#steps是指你想让电机走的步数,direction选项可以是FORWARD或者BACKWARD,然后steptype可以是SINGLE,DOUBLE,也可以是INTERLEAVE或者MICROSTEP.
“Single”指的是单相激活,“double”意味着双相瞬间激活(为了得到大的扭矩),“interleave”意味着single和double模式交替运行,带来的是双倍的精确度,但同时速度也下降了一半;“Microstepping”是一种使用PWM方式,以此得到平滑运动的模式。
你可以更加自己的想法随意切换模式。
5.预置地,每次电机运动完后都会“锁住”。如果你想释放它,你可以使用release()6.The stepping commands are “blocking” and will return once the steps have finished.You have to instruct the Stepper motors each time you want to move.(不知道怎么翻)如果你想更精细地控制步进电机,可以使用AccelStepper library,这个库带有电机加减速度功能。

例程:
#include <AFMotor.h>
void step(){
Serial.begin(9600);
Serial.println(“Stepper test!”);
motor.setSpeed(10); //10prm
motor.step(200,FORWARD,SINGLE);//步距角为1.8度,方向为顺时针,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);
}
**************************************************************
现在小车就能撒丫子跑了,接着再来说说如何用蓝牙来进行对它控制。
上图中绿圈的位置就是预留的孔位,可以焊上引脚,用来使用2号数字,A0-A5模拟和增加若干5V正电和GND引脚。
相应的引脚焊好后,把蓝牙模块的TXD引脚接在2脚上,插好正负电源线,写好就程序就OK了
<ignore_js_op> 

 

<ignore_js_op> 

kittenblock中小学创客名师推荐的图形化编程软件

 
#include <AFMotor.h>
 
#include <SoftwareSerial.h>
   
 
#define mRFSpeedXiShu 0.8125//右前轮速度调节(与其它三个轮胎保持一致)
 
#define mLFSpeedXiShu 0.9375//左前轮速度调节
 
SoftwareSerial softSerial(2,13);
   
 
AF_DCMotor motorRB(1);//右后轮
 
AF_DCMotor motorRF(2);//右前轮
 
AF_DCMotor motorLF(3);//左前轮
 
AF_DCMotor motorLB(4);//左后轮
   
 
int cheSpeed; //小车的速度
 
int RFzw=1,RBzw=1,LFzw=1,LBzw=1;//四个轮胎的速度系数
 
void setup() {
 
  
 
  softSerial.begin(9600);
 
  softSerial.listen();
 
  // turn on motor
 
  cheSpeed=80;
 
  motorRB.run(RELEASE);
 
  motorRF.run(RELEASE);
 
  motorLB.run(RELEASE);
 
  motorLF.run(RELEASE);
 
}
   
 
void loop() {
   
 
int i;
 
if(cheSpeed>255){
 
     cheSpeed=255;
 
}
 
if(cheSpeed<0){
 
     cheSpeed=0;
 
}
 
motorRF.setSpeed(cheSpeed*mRFSpeedXiShu*RFzw);
 
motorLF.setSpeed(cheSpeed*mLFSpeedXiShu*LFzw);
 
motorLB.setSpeed(cheSpeed*LBzw);
 
motorRB.setSpeed(cheSpeed*RBzw);
   
 
if(softSerial.available()>0)
 
{
 
      i=softSerial.read(); //接收蓝牙传来的数据
 
      switch(i)
 
      {
 
        case 1://前进
 
              
 
              motorRB.run(RELEASE);
 
              motorRF.run(RELEASE);
 
              motorLB.run(RELEASE);
 
              motorLF.run(RELEASE);
 
              LFzw=1;
 
              LBzw=1;
 
              RFzw=1;
 
              RBzw=1;
 
              //delay(300);
 
              motorRB.run(FORWARD);
 
              motorRF.run(FORWARD);
 
              motorLB.run(FORWARD);
 
              motorLF.run(FORWARD);
 
              break;
 
        case 2://后退
 
              
 
              motorRB.run(RELEASE);
 
              motorRF.run(RELEASE);
 
              motorLB.run(RELEASE);
 
              motorLF.run(RELEASE);
 
              LFzw=1;
 
              LBzw=1;
 
              RFzw=1;
 
              RBzw=1;
 
              motorRB.run(BACKWARD);
 
              motorRF.run(BACKWARD);
 
              motorLB.run(BACKWARD);
 
              motorLF.run(BACKWARD);
 
              break;
 
        case 3://左转弯
 
              RBzw=2;
 
              RFzw=2;
 
              LBzw=0.5;
 
              LFzw=0.5;
 
              //motorRB.run(FORWARD);
 
              //motorRF.run(FORWARD);
 
              //motorLB.run(BACKWARD);
 
              //motorLF.run(BACKWARD);
 
              break;
 
        case 4://右转弯
 
              LBzw=2;
 
              LFzw=2;
 
              RBzw=0.5;
 
              RFzw=0.5;
 
              //motorRB.run(BACKWARD);
 
              //motorRF.run(BACKWARD);
 
              //motorLB.run(FORWARD);
 
              //motorLF.run(FORWARD);
 
              break;
 
        case 5: //停止
 
              LFzw=1;
 
              LBzw=1;
 
              RFzw=1;
 
              RBzw=1;
 
              motorRB.run(RELEASE);
 
              motorRF.run(RELEASE);
 
              motorLB.run(RELEASE);
 
              motorLF.run(RELEASE);
 
              break;
 
        case 11:
 
              cheSpeed+=5;
 
              break;
 
        case 12:
 
              cheSpeed+=15;
 
              break;
 
        case 21:
 
              cheSpeed-=5;
 
              break;
 
        case 22:
 
              cheSpeed-=15;
 
              break;
 
        default:
 
              break;                                          
 
      }
 
      
 
}
 
  
 
}