马达是我们经常使用到的电动装置,它可以将电能转化成动能,驱动其他东西的运动。听起来很抽象,举几个例子吧。
我们小时候玩的四驱车,带动轮子转动的那个小装置就是马达;夏天让风扇旋转带给我们凉意,也是马达的功劳。

根据使用电源的不同,可以将马达分成直流马达和交流马达。因为我们的小硬件使用的通常都是直流电,所以采用的也基本都是直流马达,通过马达来驱动外接设备运动。
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设置为LOWdigitalWrite(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设置为LOWdigitalWrite(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连接引脚7int IN1=4;int IN2=5;int IN3=6;int IN4=7;// INA连接引脚11// INB连接引脚9int 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个马达开始转动,并且速度会逐渐增大,换向一次周而复始。说明我们使用调速大马达的方法也成功了。
