☛ 功能说明

利用 Arduino 开发板控制直流马达转动方向。由 Serial Monitor 视窗传送命令控制马达转动方向,当输入 ” R ” 键时,马达右转;当输入 ” L ” 键时,马达左转;当输入 ” S ” 键时,马达停止转动。

关于直流马达的正反转功能,需要使用专用的驱动芯片配合控制,比如 L9110,L298 ,L293D 等。

下图为 L293D 全桥 ( full-H ) 驱动器,其工作电压 4.5V 至 36V,Vcc1 提供内部逻辑电源,可以连接 Arduino 开发板的 +5V 脚,Vcc2 为外接电源,提供输出端马达所需电源。

L293D 内含四组半桥 ( half-H ) 驱动器,有静电 ( electro static discharge,简记 ESD ) 保护,过热关机及输出二极管抑制线圈电压瞬间变化等功能。L293D 所有输入准位都与 TTL 相容,可以直接连接至 Arduino 开发板输出,而输出则使用达林顿三极管放大驱动电流达 600mA,可以驱动直流马达。

L293D 可以同时控制四组直流马达的转速,电路图如下所示,只要将 PWM 信号输入到致能脚 ” EN ” 即可,控制方式如下表所示。

L293D 也可以同时控制两组直流马达的转向及转速,电路如下图所示,只要将其任两组输出连接至直流马达线圈两端即可,控制方式如下表所示。

单向控制方式:

致能 ( EN ) 输入 ( 3A/4A ) 功能 ( M1/M2 )
H L / H 转动 / 转动
H H / L 快速停止
L × / × 快速停止

双向控制方式:

致能 输入 ( 1A/3A ) 输入 ( 2A/4A ) 功能
H L H 右转
H H L 左转
H L L 快速停止
H H H 快速停止
L × × 快速停止

☛ 使用材料

Arduino UNO R3  开发板 × 1、L293D 芯片 × 1、5V 直流马达 × 1。

☛ 电路图及面包板接线图

☛ 程序码

const int in1Pin=2;                            //数位接脚 2 连接至马达线圈 M+
const int in2Pin=3;                            //数位接脚 3 连接至马达线圈 M-
char  key;                                     //按键值

void setup()
{
     Serial.begin(9600);                       //初始化串列埠,鲍率为 9600bps
     Serial.println("Press 'S' : Stop");       //按 'S',马达停止转动
     Serial.println("Press 'R' : Turn Right"); //按 'R',马达右转
     Serial.println("Press 'L' : Turn Left");  //按 'L',马达左转
     pinMode(in1Pin,OUTPUT);                   //设定数位接脚 2 为输出模式
     pinMode(in2Pin,OUTPUT);                   //设定数位接脚 3 为输出模式
}

void loop()
{
     if(Serial.available())                    //按任意键
     {
        key=Serial.read();                     //读取按键值
        Serial.print("Key = ");                //显示按键值
        Serial.println(key);
     }

     if(key=='S' || key=='s')                  //按下 'S' 键或 's' 键
     {
        digitalWrite(in1Pin,LOW);              //马达停止转动
        digitalWrite(in2Pin,LOW);
     }

     if(key=='R' || key=='r')                  //按下 'R' 键或 'r' 键
     {
        digitalWrite(in1Pin,HIGH);             //马达右转
        digitalWrite(in2Pin,LOW);
     }

     if(key=='L' || key=='l')                  //按下 'L' 键或 'l' 键
     {
        digitalWrite(in1Pin,LOW);              //马达左转
        digitalWrite(in2Pin,HIGH);
     }
}

 

☛ 练习

㈠ 设计 Arduino 程式,使用 Serial Monitor 视窗控制直流马达转向。当输入 ‘ R ‘ 键时,马达右转 2 秒停止;当输入 ‘ L ‘ 键时,马达左转 2 秒停止。

const int in1Pin=2;                                   //数位接脚 2 连接至马达线圈 M+
const int in2Pin=3;                                   //数位接脚 3 连接至马达线圈 M-
char  key;                                            //按键值

void setup()
{
     Serial.begin(9600);                              //初始化串列埠,鲍率为 9600bps
     Serial.println("Press 'R' : Turn Right, 2Sec."); //按 'R',马达右转 2 秒
     Serial.println("Press 'L' : Turn Left, 2Sec.");  //按 'L',马达左转 2 秒
     pinMode(in1Pin,OUTPUT);                          //设定数位接脚 2 为输出模式
     pinMode(in2Pin,OUTPUT);                          //设定数位接脚 3 为输出模式
}

void loop()
{
     if(Serial.available())                           //按任意键
     {
        key=Serial.read();                            //读取按键值
        Serial.print("Key = ");                       //显示按键值
        Serial.println(key);
     }

     if(key=='S' || key=='s')                         //按下 'S' 键或 's' 键
     {
        digitalWrite(in1Pin,LOW);                     //马达停止转动
        digitalWrite(in2Pin,LOW);
     }

     if(key=='R' || key=='r')                         //按下 'R' 键或 'r' 键
     {
        digitalWrite(in1Pin,HIGH);                    //马达右转
        digitalWrite(in2Pin,LOW);
        delay(2000);                                  //延迟 2 秒
        key='S';
     }

     if(key=='L' || key=='l')                         //按下 'L' 键或 'l' 键
     {
        digitalWrite(in1Pin,LOW);                     //马达左转
        digitalWrite(in2Pin,HIGH);
        delay(2000);                                  //延迟 2 秒
        key='S';        
     }
}

 

㈡ 设计 Arduino 程式,使用 Serial Monitor 视窗控制直流马达转向及转动时间。当输入  ‘ 2R ‘ 代表右转 2 秒停止;当输入 ‘ 5L ‘ 代表左转 5 秒停止。当输入 ‘ 0L ‘ 代表持续左转不停止。( 输入值为 0R ~ 9R 或 0L ~ 9L )

const int in1Pin=2;                                   //数位接脚 2 连接至马达线圈 M+
const int in2Pin=3;                                   //数位接脚 3 连接至马达线圈 M-
char  key[2];                                         //按键值
int delaySecond;                                      //延迟秒数
int i=0;                                              //字元阵列索引
int msgFlag=0;                                        //讯息列印旗标

void setup()
{
     Serial.begin(9600);                              //初始化串列埠,鲍率为 9600bps
     Serial.println("Press '2R': Turn Right, 2Sec."); //按 '2R',马达右转 2 秒
     Serial.println("Press '7L': Turn Left, 7Sec.");  //按 '7L',马达左转 7 秒
     pinMode(in1Pin,OUTPUT);                          //设定数位接脚 2 为输出模式
     pinMode(in2Pin,OUTPUT);                          //设定数位接脚 3 为输出模式
}

void loop()
{
     if(Serial.available())                           //按任意键
     {
        key[i]=Serial.read();                         //读取按键值
        i++;
        if(i==2)
           i=0;
        msgFlag=1;
     }

     if(msgFlag==1)                                   //列印马达转动方向及时间
     {
        if(key[1]=='R' || key[1]=='r')
        {
           Serial.print("Motor turn right, ");
           Serial.print(key[0]-'0');
           Serial.println(" Sec.");
        }
        
        if(key[1]=='L' || key[1]=='l')
        {
           Serial.print("Motor turn left, ");
           Serial.print(key[0]-'0');
           Serial.println(" Sec.");
        }
        msgFlag=0;
     }
     
     switch(key[1])                                   //判断直流马达的转向
     {
        case 'r':
        case 'R':
                 motorTurnRight();                    //马达向右转
                 break;
        case 'l':
        case 'L':
                 motorTurnLeft();                     //马达向左转
                 break;
        case 's':
        case 'S':
                 motorStop();                         //马达停止转动
                 break;
     }

     if((key[0]-'0')>0)                               //判断马达转动几秒后停止转动
     {
        delaySecond=(key[0]-'0')*1000;                //延迟秒数
        delay(delaySecond);
        motorStop();                                  //马达停止转动
     }
}

void motorTurnRight()                                 //马达右转函式
{
     digitalWrite(in1Pin,HIGH);
     digitalWrite(in2Pin,LOW);
}

void motorTurnLeft()                                  //马达左转函式
{
     digitalWrite(in1Pin,LOW);
     digitalWrite(in2Pin,HIGH);
}

void motorStop()                                      //马达停止函式
{
     digitalWrite(in1Pin,LOW);
     digitalWrite(in2Pin,LOW);
     key[1]='S';
}