☛ 功能说明
利用 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'; }