小小云提示:教程作者caterpillar是來自臺灣的programmer(kinda),所以在一些專有名詞的使用上會和我們這邊使用的不太一樣啦,不過作者也有標(biāo)注出英文名稱,大家自行轉(zhuǎn)換喲(?????????)
步進(jìn)電機(jī)這東西的學(xué)問真不少,就結(jié)論而言,控制步進(jìn)電機(jī)最好的方式,就是找到與手邊步進(jìn)電機(jī)可以配合的程式庫來使用。Arduino IDE 不是有 Stepper 程式庫可以使用嗎?嗯!它是可以用一些步進(jìn)電機(jī)上,不過,不見得能完全發(fā)揮步進(jìn)電機(jī)應(yīng)有的控制能力,控制某些電機(jī)則會有些問題,正巧,我手上這顆 28BYJ-48 5V DC 就是!… XD
認(rèn)識步進(jìn)電機(jī)
在 Arduino 官方網(wǎng)站的Arduino – Stepper文件中,談到了步進(jìn)電機(jī)的兩個(gè)基本分類:單極步進(jìn)電機(jī)(Unipolar Stepper)與雙極步進(jìn)電機(jī)(Bipolar Stepper)。那么就從這兩個(gè)分類開始認(rèn)識!
單極步進(jìn)電機(jī)是提供單一方向的電流來驅(qū)動(dòng)電機(jī),例如:

在上圖中,可以看到線圈各有一個(gè)共同接點(diǎn),通常接電源,只要改變其他接點(diǎn)的電壓訊號,就可以產(chǎn)生電流,而電流都是固定的方向,而由于有四個(gè)線圈,這樣的電機(jī)被稱為四相(Phase)電機(jī)。
雙極步進(jìn)電機(jī)的電流則是雙向的,例如:

這類電機(jī)在驅(qū)動(dòng)時(shí),需要改變電流的方向來達(dá)到不同激磁的效果,而由于有兩個(gè)線圈,這樣的電機(jī)被稱為二相電機(jī)。
電機(jī)的相數(shù)除了二向、四相之外,還有單相、三相、五相等,這是為了達(dá)到不同程度的控制,電機(jī)的控制是運(yùn)用電流通過線圈會產(chǎn)生磁場,并與另一永久磁鐵產(chǎn)生作用,來達(dá)到轉(zhuǎn)動(dòng)的效果,以四相步進(jìn)電機(jī)為例:

如果做為定子的線圈激磁后,面對轉(zhuǎn)子一面是 S 極,就會吸引轉(zhuǎn)子的 N 極,只要依順序?qū)Ω飨嗑€圈激磁,就會產(chǎn)生轉(zhuǎn)動(dòng)效果,像上面這種一次激磁一個(gè)線圈的方式,稱為一相激磁,因?yàn)槊看沃患ご乓粋€(gè)線圈,電力消耗小,不過缺點(diǎn)是振動(dòng)大、轉(zhuǎn)距小。
常見的激磁方式是二相激磁,顧名思義,一次激磁兩相,由于有兩相用以吸引住轉(zhuǎn)子,因此振動(dòng)小、轉(zhuǎn)距大:

也有一相、二相輪流激磁,稱為一/二相激磁,順序其實(shí)就是上面兩張圖的結(jié)合:

可以看出這種激磁方式,每次轉(zhuǎn)動(dòng)的角度為一相或二相激磁的一半,可以得到更精確的控制。
步進(jìn)電機(jī)控制電路
步進(jìn)電機(jī)需要比較高的電壓或電流驅(qū)動(dòng),在 Arduino 官方網(wǎng)站的Arduino – Stepper文件中,有Unipolar Steppers及Bipolar Steppers兩個(gè)頁面,介紹了如何連接出能驅(qū)動(dòng)步進(jìn)電機(jī)的電路,分別有可以接成兩個(gè)控制腳位與四個(gè)控制腳位的方式。
其中會用到的 IC 是達(dá)靈頓陣列(Darlington Array),如先前〈mBlock & Arduino(15)認(rèn)識晶體管與繼電器〉談到的,若想運(yùn)用晶體管提供更大的電流來驅(qū)動(dòng)電機(jī),可以使用兩個(gè)或多個(gè)晶體管的組合,達(dá)靈頓陣列中有多組達(dá)靈頓電路,以ULN2003APG來說,里頭有七組達(dá)靈頓電路。
如果不想那么麻煩地自己接電路,那么可以依使用的步進(jìn)電機(jī)來搭配現(xiàn)成的步進(jìn)電機(jī)驅(qū)動(dòng)模組:

這個(gè)步進(jìn)電機(jī)驅(qū)動(dòng)模組,左上四個(gè)腳位可以接到 Arduino 的數(shù)位輸出腳位,下方有 +、- 兩個(gè)腳位,分別接 Vcc 與 GND,右上白色插槽用來連接我手邊這顆五線四相的 28BYJ-48 5V DC,上圖步進(jìn)電機(jī)驅(qū)動(dòng)模組中的 ULN2003APG,可搭配 28BYJ-48 5V DC 這個(gè)步進(jìn)電機(jī):

28BYJ-48 5V DC 這個(gè)步進(jìn)電機(jī),其中紅線是接 5V 電源,各線的連接是:

如果搭配 ULN2003,要對 28BYJ-48 5V DC 步進(jìn)電機(jī)做激磁,那么 ULN2003 的輸入腳位 4、3、2、1,提供電位以進(jìn)行激磁的順序?yàn)椤 ?/p>
一相激磁:1000-0100-0010-0001
二相激磁:1100-0110-0011-1001
一/二相激磁:1000-1100-0100-0110-0010-0011-0001-1001
以 mBlock 控制步進(jìn)電機(jī)
如果想要體驗(yàn)一下步進(jìn)電機(jī)轉(zhuǎn)動(dòng),那么可以簡單地如下實(shí)作,腳位 D8 到 D11 分別對應(yīng)至澄、黃、粉、藍(lán),例如一相激磁:

執(zhí)行程式之后,你可以見到步進(jìn)電機(jī)緩慢的轉(zhuǎn)動(dòng),將順序改為 S4 到 S1,就會看到電機(jī)緩慢的逆轉(zhuǎn),這邊沒有設(shè)任何的工作時(shí)間延遲,這是因?yàn)?mBlock 執(zhí)行速度的關(guān)系,直接使用 Arduino 積木方塊,只能是這個(gè)速度了。
類似地,以下是二相激磁:

以下是一/二相激磁:

關(guān)于 Stepper 程式庫
如果想更進(jìn)一步試試步進(jìn)電機(jī)控制,可以使用 Arduino IDE 中的 Stepper 范例,它們使用到 Arduino 的 Stepper 程式庫,不過,如果你手邊是 28BYJ-48 5V DC 步進(jìn)電機(jī),就要注意一下了,以 stepper_oneRevolution 范例為例:

直接執(zhí)行的話,你的電機(jī)只會有一個(gè)方向的轉(zhuǎn)動(dòng),無法逆轉(zhuǎn),這是因?yàn)?28BYJ-48 5V DC 的接線順序,與 Stepper 程式庫預(yù)期的不同,如果你的 28BYJ-48 5V DC 的接線順序由澄、黃、粉、藍(lán)分別是接至 D8 到 D11,那么有兩個(gè)方式可以解決,一個(gè)方式是在 Arduino 上將 D9 與 D10 接線對調(diào),另一個(gè)方式是在建立Stepper時(shí),9與10對調(diào):

再來是stepsPerRevolution必須設(shè)定為你的電機(jī)實(shí)際上一圈會有多少步,如果是 28BYJ-48 5V DC 的話,查詢到的規(guī)格上寫著,步進(jìn)角為5.625 / 64,因此這電機(jī)轉(zhuǎn)一圈需要的步數(shù)是360 / (5.625 / 64),也就是4096步,不過,這是一/二相激磁才會有的步數(shù),如果你查看 Stepper 程式庫原始碼,會發(fā)現(xiàn),它是采二相激磁的實(shí)作方式,因此,使用這個(gè) Stepper 程式庫,你實(shí)際上要設(shè)的stepsPerRevolution必須是2048步。
不過,如果你改了腳位也將stepsPerRevolution設(shè)為2048,步進(jìn)電機(jī)還是不會動(dòng),這是因?yàn)?Stepper 程式庫中setSpeed函式的關(guān)系:

這是以毫秒為單位來設(shè)置step_delay,如果你設(shè)為2048步,那number_of_steps就是2048,那么step_delay就會是29.296875 / whatSpeed,如果whatSpeed設(shè)為60,那結(jié)果就會是0.48828125,然而step_delay是unsigned long,也就是實(shí)際上結(jié)果只會儲存0,那么step函式中millis() - this->last_step_time >= this->step_delay該行,就會一直是成立的,也就是完全沒給工作時(shí)間,這么一來電機(jī)就不會動(dòng)了。
因此,如果你直接使用 Stepper 程式庫,設(shè)為 2048 步之后,那么速度就不能設(shè)太高,例如以下就可以正常正反轉(zhuǎn)了:

如果你會使用 Arduino 官方語言的話,改寫 Stepper 應(yīng)該不是難事,可以試著實(shí)作一/二相激磁,并令其能支援 28BYJ-48 5V DC 的4096步與高轉(zhuǎn)速,懶的話,網(wǎng)路上是也有人已經(jīng)實(shí)作或改寫好的版本,不過,想要精確控制的話,重點(diǎn)還是在于,認(rèn)識你的步進(jìn)電機(jī)與程式庫!
感謝CodeData用戶:caterpillar的貢獻(xiàn) 著作權(quán)歸作者所有
整理:寧波家電物聯(lián)網(wǎng)云平臺,中科極動(dòng)云