马达是我们经常使用到的电动装置,它可以将电能转化成动能,驱动其他东西的运动。听起来很抽象,举几个例子吧。
我们小时候玩的四驱车,带动轮子转动的那个小装置就是马达;夏天让风扇旋转带给我们凉意,也是马达的功劳。
根据使用电源的不同,可以将马达分成直流马达和交流马达。因为我们的小硬件使用的通常都是直流电,所以采用的也基本都是直流马达,通过马达来驱动外接设备运动。
6.1 工作原理
将电能转化成动能的物理原理,我们在中学已经学过,它利用了两个原理:电磁感应和磁铁的同性相斥异性相吸。
- 将一根磁棒放在金属罩中间,两端悬上一个金属柱子,金属柱子上面有线圈;
- 当线圈通过电流的时候,就能产生磁场,磁棒根据极性改变位置;
- 改变电流方向,线圈磁场方向发生调换,磁棒再次根据极性改变位置;
- 如此往复,磁棒就旋转了起来。
一个马达的外形大致如此,
马达的转速是比较高的,如果要将旋转的能力转化为车轮转动的能力,就要为马达添加一些齿轮一样的附属机械结构,将马达的转速和车轮的转速匹配起来。下图中马达被黄色的结构包裹,这里面就实现了这样的一个转化。
马达有两个接线的地方,一处接正极,另一处就接负极。
具体哪个接正极哪个接负极没有规定,都可以,它们的接法只是确定了马达旋转的方向:
- 在不超过极限电压的情况下,对马达施加的电压越大,马达就转动的越快;
- 调转正负极的连接顺序,马达的旋转方向也发生调转;
6.2 马达驱动板
马达的正负极不能直接连接到Arduino开发板的引脚上,必须使用一个转换电路。否则马达在转动的过程中可能会产生强大的电流,击穿开发板上的元器件。
为此,可以使用专门的马达驱动板,来连接使用马达。下面两种驱动板可以用来驱动能力较强的大马达。
也可以使用集成了转换电路的马达模块,例如下图这个集成了风扇的小马达模块。
6.3 使用小马达
在此我们选用集成了转换电路的风扇马达模块来讲解,开发板使用Arduino UNO。
小马达对电压的要求不高,可以直接使用开发板提供的5v电压驱动,不必单独外接一个电源。
该模块有4个引脚,
模块引脚 | 功能说明 |
---|---|
INA | 控制接口A |
INB | 控制接口B |
VCC | 直流电 |
GND | 接地 |
因为要调整直流马达的转动速度,INA
与INB
最好接到具有PWM
功能的接口上,通过设置该引脚的级数数,来调节马达的转速。这里,我们将INA
连接到D9
,INB
连接到D10
,
模块引脚 | 连接 | Arduino扩展板 |
---|---|---|
INA | <—> | D9组S引脚 |
INB | <—> | D10组S引脚 |
VCC | <—> | D9组V引脚 |
GND | <—> | D9组G引脚 |
6.3.1 代码设计
首先要初始化INA
与INB
连接的接口,让Arduino
开发板拥有向它们输出的能力,将INA
引脚设置成低电平LOW,改变INB
引脚的值,来达到控制马达转速的效果,
//INA使用具有PWM功能的D9引脚
int INA = 9;
//INB使用具有PWM功能的D8引脚
int INB = 10;
void setup() {
//设置引脚为输出
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
digitalWrite(INA, LOW);
}
这里将调整的级数,调整在了0~100
。理论上可以调整的级数应该是0~255
级。
void loop() {
//从0级到100级
for(int level = 0 ; level < 100+1; level++)
{
//调整INB上的电压级数,达到改变风扇转速的效果
analogWrite(INB, level);
delay(100);
}
}
但是由于马达电流负载的原因,设置到高级数时,例如245级
,可能会让开发板过载。因此可以把最大级数设置的稍微小一点,例如230级
。下面我们还将转速做动态的变化,从慢到快,再从快到慢,
int INA = 9;
int INB = 10;
int START_LEVEL = 0;
int END_LEVEL = 230;
void setup() {
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
digitalWrite(INA, LOW);
}
void loop() {
//从0级慢慢加速到230级
for(int level = START_LEVEL ; level < END_LEVEL+1; level++)
{
analogWrite(INB, level);
delay(100);
}
//从230级慢慢减速到0级
for(int level = END_LEVEL; level > START_LEVEL ; level--)
{
analogWrite(INB, level);
delay(100);
}
}
6.3.2 结果观察
马达开始缓慢的旋转,越转越快;达到最快转速时,又开始减速,直到停止;整个过程周而复始。
6.3.3 马达的反转
目前,我们的INA
始终保持的低电平,而INB
始终保持的高电平(虽然它的值在不停的变化)。因此电机始终朝着一个方向发生变化。
如果想修改马达旋转的方向,可以将INB
设置为低电平LOW,改变INA
引脚为高电平,
int INA = 9;
int INB = 10;
int START_LEVEL = 0;
int END_LEVEL = 230;
void setup() {
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
}
void loop() {
//朝着一个方向旋转,先加速,再减速
//INA设置为LOW
digitalWrite(INA, LOW);
for(int level = START_LEVEL ; level < END_LEVEL+1; level++)
{
//改写INB的级数
analogWrite(INB, level);
delay(100);
}
for(int level = END_LEVEL; level > START_LEVEL ; level--)
{
//改写INB的级数
analogWrite(INB, level);
delay(100);
}
//朝着另一个方向旋转,先加速,再减速
//INB设置为LOW
digitalWrite(INB, LOW);
for(int level = START_LEVEL ; level < END_LEVEL+1; level++)
{
//改写INA的级数
analogWrite(INA, level);
delay(100);
}
for(int level = END_LEVEL; level > START_LEVEL ; level--)
{
//改写INA的级数
analogWrite(INA, level);
delay(100);
}
}
6.4 使用大马达(利用L298N电机驱动板)
要使用大马达,一定需要为马达提供较大的电压,Arduino开发板的电压只有5v,达不到驱动马达转动的要求的。因此,为这种马达提供服务的转接板需要额外接入电源。
下图是L298N电机驱动板
的使用说明,
外接电源不要超过24v,这是常用马达所能承受的最大电压;ENA
IN1
和IN2
控制1号马达的转动;ENB
IN3
和IN4
控制2号马达的转动;
特别需要注意的是,这个驱动板有2种用法:一种是马达的转动速度固定,保持最大速度;另一种就是可以通过PWM进行转速的调节。
6.4.1 定速转动
定速转动只负责马达转动,不管马达转动的快慢(不需要PWM调节转动速度)。这时就需要使用图中红色的短接线,将ENA
ENB
连接起来(或者让这2个端口保持高电平)。不然向马达输出电压的对应模块不会有电压,也就不能带动马达转动;
在这种情况下,输入端口有如下规则,
电机模块序号 | 转动方式 | IN1引脚电平 | IN2引脚电平 | ENA调速 |
---|---|---|---|---|
1号马达 | 正转 | HIGH | LOW | 短接 |
1号马达 | 反转 | LOW | HIGH | 短接 |
1号马达 | 不转 | LOW | LOW | 短接 |
电机模块序号 | 转动方式 | IN3引脚电平 | IN4引脚电平 | ENB调速 |
---|---|---|---|---|
2号马达 | 正转 | HIGH | LOW | 短接 |
2号马达 | 反转 | LOW | HIGH | 短接 |
2号马达 | 不转 | LOW | LOW | 短接 |
6.4.1.1 硬件连接
我们这里只来验证马达1和马达2全力开动的情况,也就是说不考虑调速,让ENA
和ENB
保持短接。
连接2个马达到电机驱动板的马达接口,
马达 | 马达驱动板接口 |
---|---|
马达1正极 | OUT1 |
马达1负极 | OUT2 |
马达2正极 | OUT3 |
马达2负极 | OUT4 |
马达上的电极正负极没有关系,都可以(正负只影响转动的方向,如果不满意转动方向,以后可以进行调换)。
连接电机驱动板的控制信号到Arduino开发板上,连线如下:
马达驱动板引脚 | Arduino开发板引脚 |
---|---|
IN1 | 4 |
IN2 | 5 |
IN3 | 6 |
IN4 | 7 |
连接电机驱动板的外接电源,连线如下:
马达驱动板引脚 | 外接引脚 |
---|---|
VCC | 电源正极 |
GND | 电源负极和Arduino GND引脚 |
5V | Arduino Vin引脚 |
特别注意的是,驱动板的5V输出要连接到Arduino开发板上。
以下是连接后的整体效果:
上图,我们连接了两个驱动轮胎的马达,可以制作小车了;如果只用一端连接普通马达,那么就可以制作风扇。
只要能驱动马达转动,马达再去带动其他机械结构运动就行了,所以马达的可玩性很高。
6.4.1.2 代码设计
如下代码,可以实现2个马达的运动:
int IN1=4;
int IN2=5;
int IN3=6;
int IN4=7;
void setup() {
//初始化电机不动
pinMode(IN1, OUTPUT);
digitalWrite(IN1, HIGH);
pinMode(IN2, OUTPUT);
digitalWrite(IN2, HIGH);
pinMode(IN3, OUTPUT);
digitalWrite(IN3, HIGH);
pinMode(IN4, OUTPUT);
digitalWrite(IN4, HIGH);
}
void loop() {
// 正向旋转2秒
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
delay(2000);
// 反向旋转2秒
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
delay(2000);
}
6.4.1.3 结果观察
部署代码到设备上以后,一定要打开外接电源上的开关,才能为马达提供动力。
可以看到2个马达开始转动,并且每隔2秒,换向一次周而复始。说明我们使用大马达的方法也成功了。
6.4.2 变速转动
要控制马达的转速。这时就需要使用图中红色的短接线移除。哪个电压输出模块要实现转速调节,就移除它对应的那根短接线;
输入端口做如下设置,
电机模块序号 | 转动方式 | IN1引脚电平 | IN2引脚电平 | ENA调速 |
---|---|---|---|---|
1 | 正转 | HIGH | LOW | 0-255级数字 |
1 | 反转 | LOW | HIGH | 0-255级数字 |
1 | 不转 | LOW | LOW | 0-255级数字 |
电机模块序号 | 转动方式 | IN3引脚电平 | IN4引脚电平 | ENB调速 |
---|---|---|---|---|
2 | 正转 | HIGH | LOW | 0-255级数字 |
2 | 反转 | LOW | HIGH | 0-255级数字 |
2 | 不转 | LOW | LOW | 0-255级数字 |
6.4.2.1 硬件连接
硬件连接的方法大部分和前面定速转动
中的连接方式一模一样,只是在一个地方有区别:因为要做PWM调速,所以要把短接的ENA
和ENB
取开,让Arduino主板分别控制它们的值。
连接电机驱动板的控制信号到Arduino开发板上,连线如下:
马达驱动板引脚 | Arduino开发板引脚 |
---|---|
IN1 | 4 |
IN2 | 5 |
IN3 | 6 |
IN4 | 7 |
INA | 11 |
INB | 9 |
以下是连接后的整体效果:
6.4.2.2 代码设计
如下代码,可以实现2个马达的运动:
//使用L298N驱动板
// IN1连接引脚4
// IN2连接引脚5
// IN3连接引脚6
// IN4连接引脚7
int IN1=4;
int IN2=5;
int IN3=6;
int IN4=7;
// INA连接引脚11
// INB连接引脚9
int INA = 11;
int INB = 9;
void setup() {
//设置引脚为输出
pinMode(IN1,OUTPUT);
pinMode(IN2,OUTPUT);
pinMode(IN3,OUTPUT);
pinMode(IN4,OUTPUT);
pinMode(INA,OUTPUT);
pinMode(INB,OUTPUT);
}
void loop() {
int i;
//让电机的转速从0到255正向加速转动
for(i=0;i<=255;i++)
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(INA,i);
analogWrite(INB,i);
delay(50);
}
//让电机的转速从255到0正向减速转动
for(i=255;i>0;i--)
{
digitalWrite(IN1,LOW);
digitalWrite(IN2,HIGH);
digitalWrite(IN3,LOW);
digitalWrite(IN4,HIGH);
analogWrite(INA,i);
analogWrite(INB,i);
delay(50);
}
//让电机的转速从0到255反向加速转动
for(i=0;i<255;i++)
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(INA,i);
analogWrite(INB,i);
delay(50);
}
//让电机的转速从255到0反向减速转动
for(i=255;i>0;i--)
{
digitalWrite(IN1,HIGH);
digitalWrite(IN2,LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4,LOW);
analogWrite(INA,i);
analogWrite(INB,i);
delay(50);
}
}
6.4.2.3 结果观察
部署代码到设备上以后,一定要打开外接电源上的开关,才能为马达提供动力。
可以看到2个马达开始转动,并且速度会逐渐增大,换向一次周而复始。说明我们使用调速大马达的方法也成功了。