马达是我们经常使用到的电动装置,它可以将电能转化成动能,驱动其他东西的运动。听起来很抽象,举几个例子吧。
我们小时候玩的四驱车,带动轮子转动的那个小装置就是马达;夏天让风扇旋转带给我们凉意,也是马达的功劳。
根据使用电源的不同,可以将马达分成直流马达和交流马达。我们做智能硬件使用的基本都是直流马达,通过马达来驱动外接设备运动。
将电能转化成动能的物理原理,我们在中学已经学过,这里利用了两个原理:电磁感应和磁铁的同性相斥异性相吸。
一个马达的外形大致如此,
马达加上一些结构,与轮胎结合起来就成了轮子
它有两个接线的地方,一处接正极,另一处就接负极,
马达的正负极不能直接连接到Arduino开发板的引脚上,必须使用一个转换电路。否则马达在转动的过程中可能会产生强大的电流,击穿开发板上的元器件。
为此,可以使用专门的马达扩展板,来连接使用马达,
也可以使用集成了转换电路的马达模块,例如风扇马达模块,
在此我们选用集成了转换电路的风扇马达模块来讲解。
该模块有4个引脚,
模块引脚 | 功能说明 |
---|---|
INA | 控制接口A |
INB | 控制接口B |
VCC | 直流电 |
GND | 接地 |
因为要调整直流马达的转动速度,INA
与INB
最好接到具有PWM
功能的接口上,通过设置该引脚的级数数,来调节马达的转速。这里,我们将INA
连接到D9
,INB
连接到D8
,
模块引脚 | 连接 | Arduino扩展板 |
---|---|---|
INA | <–> | D9组S引脚 |
INB | <–> | D8组S引脚 |
VCC | <–> | D8组V引脚 |
GND | <–> | D8组G引脚 |
首先要初始化INA
与INB
连接的接口,让Arduino
开发板拥有向它们输出的能力,
//INA使用具有PWM功能的D9引脚
int INA = 9;
//INB使用具有PWM功能的D8引脚
int INB = 8;
void setup() {
//设置引脚为输出
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
}
将INA
引脚设置成低电平LOW,改变INB
引脚的值,来达到控制马达转速的效果,
void setup() {
//设置引脚为输出
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
digitalWrite(INA, LOW);
}
void loop() {
//从0级到100级
for(int level = 0 ; level < 100+1; level++)
{
//调整INB上的电压级数,达到改变风扇转速的效果
analogWrite(INB, level);
delay(100);
}
}
这里将调整的级数,调整在了0~100
。理论上可以调整的级数应该是0~255
级。但是由于马达电流负载的原因,设置到高级数时,例如245级
,会让开发板过载。因此可以把最大级数设置的稍微小一点,例如230级
,
int INA = 9;
int INB = 8;
int START_LEVEL = 0;
int END_LEVEL = 230;
void setup() {
pinMode(INA, OUTPUT);
pinMode(INB, OUTPUT);
digitalWrite(INA, LOW);
}
void loop() {
//从9级慢慢加速到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);
}
}
马达开始缓慢的旋转,越转越快;达到最快转速时,又开始减速,直到停止;整个过程周而复始。
如果想修改马达旋转的方向,可以将INB
设置为低电平LOW,改变INA
引脚的值,
int INA = 9;
int INB = 8;
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);
}
}
/*******************************************************************/
本系列课程使用到的Arduino开发板、扩展板以及其他相关的传感器,各位可以根据我们文章中介绍的硬件在淘宝网选购。
您也可以在我们的网店跟我学Arduino编程中购买,这些相关硬件都由我们为您把关购买,为大家节省选择的精力与时间。同时也感谢大家对我们这些码农的支持。
最后再次感谢各位读者对安豆
的支持,谢谢:)
/*******************************************************************/