第6節 直流馬達
馬達是我們經常使用到的電動裝置,它可以將電能轉化成動能,驅動其他東西的運動。聽起來很抽象,舉幾個例子吧。
我們小時候玩的四驅車,帶動輪子轉動的那個小裝置就是馬達;夏天讓風扇旋轉帶給我們涼意,也是馬達的功勞。
根據使用電源的不同,可以將馬達分成直流馬達和交流馬達。我們做智能硬件使用的基本都是直流馬達,通過馬達來驅動外接設備運動。
6.1 工作原理
將電能轉化成動能的物理原理,我們在中學已經學過,這裏利用了兩個原理:電磁感應和磁鐵的同性相斥異性相吸。
- 將一根磁棒放在金屬罩中間,兩端懸上一個金屬柱子,金屬柱子上面有線圈;
- 當線圈通過電流的時候,就能產生磁場,磁棒根據極性改變位置;
- 改變電流方向,線圈磁場方向發生調換,磁棒再次根據極性改變位置;
- 如此往復,磁棒就旋轉了起來。
一個馬達的外形大致如此,
馬達加上一些結構,與輪胎結合起來就成了輪子
它有兩個接線的地方,一處接正極,另一處就接負極,
- 在不超過極限電壓的情況下,對馬達施加的電壓越大,馬達就轉動的越快;
- 調轉正負極的連接順序,馬達的旋轉方向也發生調轉;
6.2 連接方式
馬達的正負極不能直接連接到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引腳 |
6.3 代碼設計
首先要初始化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);
}
}
6.4 結果觀察
馬達開始緩慢的旋轉,越轉越快;達到最快轉速時,又開始減速,直到停止;整個過程周而復始。
6.5 馬達的反轉
如果想修改馬達旋轉的方向,可以將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編程中購買,這些相關硬件都由我們爲您把關購買,爲大家節省選擇的精力與時間。同時也感謝大家對我們這些碼農的支持。
最後再次感謝各位讀者對安豆
的支持,謝謝:)
/*******************************************************************/