#項(xiàng)目起源#
春節(jié)是中國最傳統(tǒng),最隆重的節(jié)日,春節(jié)的習(xí)俗有貼春聯(lián)、放鞭炮、拜年等,當(dāng)然最溫馨的時(shí)刻莫過于除夕夜一家人圍在一起吃團(tuán)圓飯、看春晚了。為了慶祝即將到來的虎年春節(jié),旺仔爸爸制作了一個(gè)別樣的翻頁動(dòng)畫顯示器,我給他取名叫Page-turning display
圖 2 翻頁動(dòng)畫顯示器
既然是顯示器,那首當(dāng)其沖的肯定得有屏幕,不過這個(gè)屏幕它不是電子的,而是比較古老的翻頁式的,類似于快速翻書的效果,其實(shí)現(xiàn)在生活熒屏中播放的視頻也是一幀一幀的畫面切換出現(xiàn)的效果,只不過切換的速度很快,人眼已經(jīng)無法覺察出來,而我們這次的翻頁動(dòng)畫顯示器就是要還原這種顯示原理
下面我們先通過視頻來看一下翻頁動(dòng)畫顯示器是如何工作的
#設(shè)計(jì)制作#
我們將翻頁動(dòng)畫顯示器設(shè)計(jì)為復(fù)古的電視機(jī)造型,采用激光切割技術(shù)加工椴木板和亞克力板來制作翻頁動(dòng)畫顯示器的外觀結(jié)構(gòu),下圖3為效果圖
圖 3 翻頁動(dòng)畫顯示器效果仿真圖
#方案介紹#
初步觀察上面的仿真圖可以知道,翻頁動(dòng)畫顯示器由三部分組成,分別是:
旋轉(zhuǎn)顯示部分、外框架部分和電控部分
關(guān)于旋轉(zhuǎn)顯示部分的驅(qū)動(dòng)電機(jī)可以供我們選擇的方案有很多,比如步進(jìn)電機(jī)、直流減速電機(jī)、舵機(jī)等。由于本次旋轉(zhuǎn)部分的負(fù)載不是很大,對轉(zhuǎn)速要求不是很高,在旋轉(zhuǎn)的同時(shí)還要能夠精確控制旋轉(zhuǎn)角度,于是我們選擇性價(jià)比較高的28BYJ-48微型步進(jìn)電機(jī),在使用時(shí)搭配ULN2003驅(qū)動(dòng)即可工作,大大降低了使用難度,減小了空間體積,步進(jìn)電機(jī)如下圖4所示
圖 4 28BYJ-48微型步進(jìn)電機(jī)
關(guān)鍵的驅(qū)動(dòng)部分解決后,我們選擇Arduino Nano作為主控板,同時(shí)增加霍爾傳感器再配合磁鐵實(shí)現(xiàn)記錄旋轉(zhuǎn)圈數(shù)的功能,具體細(xì)節(jié)如下圖5
圖 5翻頁動(dòng)畫顯示器內(nèi)部圖
方案確定后,我們便可開始設(shè)計(jì)翻頁動(dòng)畫顯示器的外觀結(jié)構(gòu)
#圖紙?jiān)O(shè)計(jì)#
我們使用LaserMaker激光建模軟件設(shè)計(jì)圖紙
關(guān)于建模軟件可以登錄官方提供的網(wǎng)址下載:https://www.lasermaker.com.cn/
圖 6 LaserMaker軟件下載
下載安裝完成后打開軟件,界面如下圖7
圖 7 LaserMaker軟件運(yùn)行界面
在LaserMaker軟件中設(shè)計(jì)復(fù)古電視機(jī)的造型如圖8,作品中用來顯示畫面的翻頁部分我們采用1mm厚度的透明亞克力板,而除此之外的其他結(jié)構(gòu)部分我們選用的加工材料為3mm厚度的椴木板,為了增加作品的互動(dòng)性,我們設(shè)計(jì)一個(gè)魔法棒作為翻頁顯示器的啟停開關(guān)
圖 8 翻頁動(dòng)畫顯示器設(shè)計(jì)圖
至于翻頁顯示的動(dòng)畫貼紙需要在網(wǎng)上搜索新年動(dòng)畫素材(或者個(gè)人喜歡的動(dòng)漫素材),修改為與零件相同的尺寸,打印出來,粘貼在亞克力板上
圖 9 貼紙與亞克力板
圖 10 貼紙粘貼在亞克力板上
#加工零件#
圖紙?jiān)O(shè)計(jì)完成后我們使用激光切割機(jī)把它加工出來,切割完成后的零件如下圖11所示
圖 11 激光切割加工完成后的零件實(shí)物圖
#器材清單#
除了外觀結(jié)構(gòu)外,本次翻頁動(dòng)畫顯示器還需要使用到如下零件
Arduino Nano控制器加擴(kuò)展板*1
霍爾傳感器*2
28BYJ-48步進(jìn)電機(jī)*1
ULN2003步進(jìn)電機(jī)驅(qū)動(dòng)器*
開關(guān)*1
DC電源接口*1
3mm椴木板*1(40cm*60cm)
1mm透明亞克力板*2(40cm*60cm)
杜邦線若干
3mm轉(zhuǎn)5mm聯(lián)軸器*1
20cmD型軸*1
五金件若干
圖 12 翻頁動(dòng)畫顯示器器材清單
器材準(zhǔn)備完成,接下來我們看一下電控部分是如何連接的
#電路接線#
翻頁動(dòng)畫顯示器的電路接線如下圖13所示
步進(jìn)電機(jī)連接控制器的4-7號(hào)數(shù)字引腳,兩個(gè)霍爾傳感器分別連接2號(hào)和3號(hào)數(shù)字引腳,其中一個(gè)霍爾傳感器作為啟停開關(guān),另一個(gè)霍爾傳感器用來檢測圓盤上的磁鐵轉(zhuǎn)了多少圈
圖 13翻頁動(dòng)畫顯示器電路接線示意圖
一切準(zhǔn)備工作就緒,我們即可開始組裝作品
#組裝#
翻頁動(dòng)畫顯示器的組裝不算很復(fù)雜,但還是需要仔細(xì)按步驟安裝
第一步 安裝電子部件
首先我們安裝翻頁顯示器的開關(guān),本次作品我們選用一個(gè)有些復(fù)古味道的鈕子開關(guān),將鈕子開關(guān)安裝在正面的木板上,如下圖14和圖15
圖 14 安裝鈕子開關(guān)
圖 15 鈕子開關(guān)安裝完成
緊接著,安裝控制器、步進(jìn)電機(jī)、驅(qū)動(dòng)器以及電源接口,下圖16是所需的零件
圖 16 電子部件
主控及步進(jìn)電機(jī)等部件安裝完成如下圖17所示
圖17 主控及步進(jìn)電機(jī)安裝完成圖
接下來,安裝用來記錄圈數(shù)的霍爾傳感器,安裝完成如下圖18所示
圖 18 霍爾傳感器安裝完成
第二步 組裝框架結(jié)構(gòu)
電子部件安裝完成,下一步我們需要將框架組裝起來,框架如下,由5部分組成,只需要按照插槽拼裝即可
圖 19 框架組裝需要的零件
框架組裝完成如下圖20所示
圖 20 框架組裝完成
框架完成后,我們需要在框架中安裝翻頁顯示的旋轉(zhuǎn)骨架,所需零件如下圖21
圖 21 安裝旋轉(zhuǎn)骨架所需零件示
組裝時(shí)需要將D型軸安裝在長方形的盒子中,并在盒子的兩側(cè)安裝圓盤,安裝完成如下圖22所示
圖 22 旋轉(zhuǎn)骨架安裝完成
旋轉(zhuǎn)骨架組裝完成就需要與框架組合在一起了,如下圖23所示
圖 23 旋轉(zhuǎn)骨架與框架組合
使用一個(gè)直徑5mm轉(zhuǎn)3mm的聯(lián)軸器將步進(jìn)電機(jī)與D型軸連接在一起,而在另外一側(cè),為了保證軸旋轉(zhuǎn)時(shí)的靈活度,我們可以在孔位中安裝一個(gè)軸承,安裝完成如下圖24
圖 24 旋轉(zhuǎn)骨架與框架組合完成
下面一步,需要將正面的木板安裝在框架上
圖 25 正面木板與框架組合
圖 26 正面木板與框架組合完成
第三步 安裝顯示部分和其他
現(xiàn)在,“電視機(jī)”整體效果已經(jīng)有了,如果能夠再來一個(gè)天線將會(huì)更有“靈魂”,我們來為“電視機(jī)”安裝天線和用來啟停的魔法棒
圖 27 安裝天線和魔法棒所需零件
別忘記在魔法棒的中間裝入磁鐵,安裝完成如下圖28
圖 28天線和魔法棒安裝完成
最后,我們把最重要的顯示畫面安裝在顯示器的骨架中,翻頁動(dòng)畫顯示器的組裝就大功告成了
圖 29安裝顯示畫面
亞克力的畫面安裝時(shí)對準(zhǔn)兩側(cè)圓盤上的孔位即可,翻頁動(dòng)畫顯示器組裝完成效果如下
圖 30顯示畫面安裝完成
圖 31
作品組裝完成,接下來我們編寫程序?yàn)樽髌纷⑷腱`魂
#程序設(shè)計(jì)#
本次作品程序設(shè)計(jì)使用Arduino IDE作為編程環(huán)境,關(guān)于編程環(huán)境可以在官網(wǎng)arduino.cc下載
圖 32
當(dāng)然也可以在mixly.org網(wǎng)站下載最新的Mixly圖形化編程軟件,軟件中集成了 Arduino IDE編程環(huán)境,省去了不少配置的麻煩
#編程思路#
本次我們制作的翻頁動(dòng)畫顯示器(Page-turning display),使用步進(jìn)電機(jī)讓翻頁動(dòng)畫顯示器轉(zhuǎn)起來,使用兩個(gè)霍爾傳感器用來控制動(dòng)畫播放和記錄旋轉(zhuǎn)圈數(shù),那么關(guān)于步進(jìn)電機(jī)和霍爾傳感器的使用是本次作品程序設(shè)計(jì)的關(guān)鍵,我們根據(jù)編程思路來一步步完成
圖 33 程序設(shè)計(jì)思維導(dǎo)圖
#霍爾傳感器的使用#
背景知識(shí)
霍爾傳感器是基于霍爾效應(yīng),可以用來探測磁性材料(磁鐵)的傳感器。
什么是霍爾效應(yīng)呢?霍爾效應(yīng)在1879年被物理學(xué)家霍爾發(fā)現(xiàn),當(dāng)一個(gè)磁場靠近一個(gè)有電流通過的導(dǎo)體時(shí),導(dǎo)體中的電子會(huì)由于受到磁場的影響,偏轉(zhuǎn)到一邊,這時(shí)候?qū)w中會(huì)形成一個(gè)電勢差,這就是霍爾效應(yīng),利用這一現(xiàn)象就可以用來探測磁性材料
常見的霍爾傳感器有開關(guān)型霍爾和線性霍爾兩種,線性霍爾傳感器輸出模擬信號(hào),開關(guān)型霍爾傳感器輸出數(shù)字信號(hào)
本次作品我們只需要用霍爾傳感器控制翻頁動(dòng)畫顯示器啟停,也就是用開關(guān)型的霍爾傳感器即可
關(guān)于霍爾傳感器的編程方法很簡單,能夠檢測磁鐵有無就可以
我們在編程環(huán)境中輸入如下程序,測試一下霍爾傳感器的狀態(tài)
#define Hall_START 2 //霍爾傳感器引腳
int START;//開始狀態(tài)存儲(chǔ)變量
void setup()
{
pinMode(Hall_START, INPUT);//START
Serial.begin(9600);
}
void loop()
{
START = digitalRead(Hall_START);//存儲(chǔ)霍爾傳感器的狀態(tài)
Serial.println(START);
delay(1000);
}
程序運(yùn)行結(jié)果如下圖34
當(dāng)磁鐵考近信號(hào)為0,磁鐵遠(yuǎn)離信號(hào)為1
圖 34霍爾傳感器測試
同樣的方法可以測試第二個(gè)霍爾傳感器
我們在原有的基礎(chǔ)上繼續(xù)修改程序
#define Hall_START 2 //霍爾傳感器引腳
#define Hall_END 3 //霍爾傳感器引腳
int START;//開始狀態(tài)存儲(chǔ)變量
int END;//結(jié)束狀態(tài)存儲(chǔ)變量
void setup()
{
pinMode(Hall_START, INPUT);//START
pinMode(Hall_END, INPUT);//END
Serial.begin(9600);
}
void loop()
{
START = digitalRead(Hall_START);//存儲(chǔ)1號(hào)霍爾傳感器的狀態(tài)
END = digitalRead(Hall_END);//存儲(chǔ)2號(hào)霍爾傳感器的狀態(tài)
Serial.print(F("一號(hào)霍爾傳感器狀態(tài):"));
Serial.println(START);
delay(1000);
Serial.print(F("二號(hào)霍爾傳感器狀態(tài):"));
Serial.println(END);
delay(1000);
}
程序下載運(yùn)行后的效果如下圖35所示
圖 35 兩個(gè)霍爾傳感器同時(shí)測試
這樣,兩個(gè)霍爾傳感器都可以控制了
下面,我們豐富一下程序,設(shè)置當(dāng)磁鐵靠近霍爾傳感器超過0.5秒時(shí)開始工作,程序如下
#define Hall_START 2 //霍爾傳感器引腳
#define Hall_END 3 //霍爾傳感器引腳
#define OVER 1 //判斷是否進(jìn)入最終環(huán)節(jié)
int START;//開始狀態(tài)存儲(chǔ)變量
int END;//結(jié)束狀態(tài)存儲(chǔ)變量
bool is_working = false;//工作中
bool is_free = true;//空閑
int count=0;//計(jì)數(shù)器
int SPEED=0;//speed
char MODEL; //模式
void setup()
{
pinMode(Hall_START, INPUT);//START
pinMode(Hall_END, INPUT);//END
Serial.begin(9600);
}
void loop()
{
if(START == 1 && digitalRead(Hall_START) == 0)//兩次檢測按鍵的狀態(tài)
{
delay(500);
if ( digitalRead(Hall_START) == 0 && is_free == true) //且設(shè)備處于空閑狀態(tài)進(jìn)入工作模式
{
is_free = false;
is_working = true;
}
}
START = digitalRead(Hall_START);//存儲(chǔ)1號(hào)霍爾傳感器的狀態(tài)
END = digitalRead(Hall_END);//存儲(chǔ)2號(hào)霍爾傳感器的狀態(tài)
//開始工作
if(is_free == false && is_working == true )
{
Serial.println(F("工作中"));
//計(jì)數(shù)器計(jì)數(shù),忽略第一次檢測狀態(tài)
count++;
Serial.println(count);
if(count >500) { MODEL = OVER; }
}
//結(jié)束工作
if (MODEL == OVER && END == 0)
{
Serial.println(F("結(jié)束工作"));
count = 0;//計(jì)數(shù)器清零
is_working = false;//工作指示變量復(fù)位
is_free = true;//空閑指示變量復(fù)位
MODEL = 0;//狀態(tài)復(fù)位
}
}
程序中,我們設(shè)置了“START”和“END”兩個(gè)變量用來存放兩個(gè)霍爾傳感器的數(shù)值,用“is_free”和“is_working”兩個(gè)變量來標(biāo)記工作狀態(tài),用變量“MODEL”來存儲(chǔ)工作狀態(tài),當(dāng)檢測到磁鐵靠近1號(hào)霍爾傳感器并持續(xù)時(shí)間超過0.5秒后,即可開始進(jìn)入工作狀態(tài),同時(shí)變量“count”開始計(jì)數(shù),當(dāng)變量“count”計(jì)數(shù)值超過500后結(jié)束工作,并將所有變量的狀態(tài)復(fù)位
程序下載后的運(yùn)行結(jié)果如下圖36,當(dāng)磁鐵靠近霍爾傳感器的時(shí)間超過0.5秒后開始計(jì)數(shù),計(jì)數(shù)器數(shù)值超過500后停止工作
圖 36 霍爾傳感器啟停測試
如此,我們已經(jīng)實(shí)現(xiàn)了使用磁鐵來控制啟停的功能,接下來我們只需要在程序中加入步進(jìn)電機(jī)轉(zhuǎn)動(dòng)的程序即可實(shí)現(xiàn)真正的翻頁動(dòng)作
下面我們就來學(xué)習(xí)步進(jìn)電機(jī)的控制方法
#步進(jìn)電機(jī)知識(shí)#
背景知識(shí)
這次我們選擇的步進(jìn)電機(jī)的型號(hào)是28BYJ-48步進(jìn)電機(jī),它的全名叫永磁型單極性四相步進(jìn)電機(jī),這么復(fù)雜的名字難免讓人有些頭疼
我們先來看一下28BYJ-48步進(jìn)電機(jī)名稱的來歷
28:步進(jìn)電機(jī)的有效最大外徑是28毫米
B:表示是步進(jìn)電機(jī)
Y:表示是永磁式
J:表示是減速型(減速比1:64)
48:表示四相八拍
換句話說,28BYJ-48的含義為外徑28毫米四相八拍式永磁減速型步進(jìn)電機(jī)。是不是有點(diǎn)亂?別慌,我們一點(diǎn)點(diǎn)看
通常電機(jī)分為定子和轉(zhuǎn)子,轉(zhuǎn)子的每個(gè)齒都帶有一個(gè)永磁體,這既是永磁式的概念
定子在外圈,定子上有8個(gè)齒,每個(gè)齒都纏上了線圈,兩兩一組,同時(shí)導(dǎo)通或關(guān)斷,如此就形成了4相,這就是4相的概念,至于八拍這里就不展開詳細(xì)介紹了,你可簡單理解為4組線圈的通電順序
接下來,解釋名字中的“減速”概念,下圖37是28BYJ-48 步進(jìn)電機(jī)的拆解圖,
圖 37 28BYJ-48步進(jìn)電機(jī)內(nèi)部圖
從圖中可以看到,位于最中心的那個(gè)白色小齒輪是步進(jìn)電機(jī)的轉(zhuǎn)子軸,一個(gè)小齒輪帶動(dòng)一個(gè)大齒輪為一級減速,圖中所示的電機(jī)中共有4級減速,那么總的減速比是多少呢?即轉(zhuǎn)子要轉(zhuǎn)多少圈最終輸出軸才轉(zhuǎn)一圈呢?
回頭看一下電機(jī)參數(shù)表中的減速比參數(shù)是1:64,也就是轉(zhuǎn)子轉(zhuǎn)64圈,輸出軸轉(zhuǎn)一圈,不管是哪個(gè)廠家生產(chǎn)的電機(jī),只要型號(hào)是 28BYJ-48,其標(biāo)稱的減速比就都是1:64。
關(guān)于基本的控制原理就介紹到這里
圖 38 圖解步進(jìn)電機(jī)減速比
實(shí)際上單獨(dú)用控制器控制步進(jìn)電機(jī)還是很困難的,需要一個(gè)驅(qū)動(dòng)器來驅(qū)動(dòng)步進(jìn)電機(jī),ULN2003驅(qū)動(dòng)器與28BYJ-48步進(jìn)電機(jī)是形影不離的好朋友,基本上同時(shí)出現(xiàn)
熟悉了28BYJ-48步進(jìn)電機(jī)后,我們來編寫程序控制步進(jìn)電機(jī),我們可以選擇的步進(jìn)電機(jī)的驅(qū)動(dòng)庫有Arduino IDE內(nèi)置的【Stepper】庫和【AccelStepper】第三方庫
由于Arduino內(nèi)置的【Stepper】庫在控制步進(jìn)電機(jī)的過程中其他程序是無法進(jìn)行工作的,我們需要用簡單易用,功能強(qiáng)大的【AccelStepper】第三方庫,讓Arduino在控制步進(jìn)電機(jī)的同時(shí)完成其它工作。
安裝AccelStepper庫
在Arduino IDE編程環(huán)境中,點(diǎn)擊工具菜單欄中的【庫管理】選項(xiàng),在輸入欄輸入【AccelStepper】庫并點(diǎn)擊安裝,如下圖39
圖 39 安裝AccelStepper庫
安裝完成后,即可使用該庫控制步進(jìn)電機(jī)
我們在編程環(huán)境中輸入如下程序
#include "AccelStepper.h"
// 電機(jī)步進(jìn)方式定義
#define FULLSTEP 4 //全步進(jìn)參數(shù)
#define HALFSTEP 8 //半步進(jìn)參數(shù)
// 定義步進(jìn)電機(jī)引腳
#define motor1Pin1 4 // 28BYJ48連接的ULN2003電機(jī)驅(qū)動(dòng)板引腳 in1
#define motor1Pin2 5 // 28BYJ48連接的ULN2003電機(jī)驅(qū)動(dòng)板引腳 in2
#define motor1Pin3 6 // 28BYJ48連接的ULN2003電機(jī)驅(qū)動(dòng)板引腳 in3
#define motor1Pin4 7 // 28BYJ48連接的ULN2003電機(jī)驅(qū)動(dòng)板引腳 in4
// 定義步進(jìn)電機(jī)對象
// 定義中ULN2003驅(qū)動(dòng)板引腳順序?yàn)?in1-in3-in2-in4
// 電機(jī)設(shè)置為全步進(jìn)運(yùn)行
AccelStepper stepper(FULLSTEP, motor1Pin1, motor1Pin3, motor1Pin2, motor1Pin4);
void setup()
{
stepper.setMaxSpeed(500.0); // 電機(jī)最大速度500
stepper.setAcceleration(50.0); // 電機(jī)加速度50.0
Serial.begin(9600);
}
void loop()
{
if ( stepper.currentPosition() == 0 )
{
// 電機(jī)轉(zhuǎn)動(dòng)一周
stepper.moveTo(2048);
}
else if ( stepper.currentPosition() == 2048 )
{
// 電機(jī)轉(zhuǎn)動(dòng)一周
stepper.moveTo(0);
}
stepper.run(); // 電機(jī)運(yùn)行
}
程序中,通過【setMaxSpeed】設(shè)置步進(jìn)電機(jī)最大運(yùn)行速度,通過
【setAcceleration】設(shè)置步進(jìn)電機(jī)加速度,使用【currentPosition】獲取步進(jìn)電機(jī)運(yùn)行當(dāng)前位置,【moveTo】指令可以設(shè)置步進(jìn)電機(jī)運(yùn)動(dòng)的絕對目標(biāo)位置,即旋轉(zhuǎn)到指定角度,
這里步進(jìn)電機(jī)上電時(shí)的位置為0
程序運(yùn)行后,我們會(huì)看到步進(jìn)電機(jī)會(huì)旋轉(zhuǎn)一周后停了下來,為什么stepper.moveTo(2048)是旋轉(zhuǎn)一周呢,這里的2048指的是什么?
四相八拍的步進(jìn)電機(jī)步距角是11.25°,轉(zhuǎn)子轉(zhuǎn)一圈需要走360/11.25=32步,減速比是1:64,輸出軸轉(zhuǎn)一圈則需要32*64=2048步,
那stepper.moveTo(2048)中的2048其實(shí)就是讓輸出軸轉(zhuǎn)一圈所走的步數(shù),當(dāng)然這是在全步進(jìn)“#define FULLSTEP 4”的參數(shù)下的情況,如果是半步進(jìn)“#define HALFSTEP 8”,那么轉(zhuǎn)子每走一步的角度為5.625,轉(zhuǎn)子轉(zhuǎn)一圈需要64步,輸出軸轉(zhuǎn)一圈就需要4096步了
除此之外,【AccelStepper】庫還提供了一些其他的常用函數(shù),如下
常用函數(shù)和操作
setCurrentPosition -復(fù)位步進(jìn)電機(jī)初始位置
利用setCurrentPosition函數(shù)設(shè)置可以修改當(dāng)前位置的數(shù)值,比如,當(dāng)前步進(jìn)電機(jī)所處在0的位置,
輸入stepper.setCurrentPosition(512)指令,會(huì)將原來0的位置修改為512的位置
圖 40 圖解setCurrentPosition函數(shù)
move – 設(shè)置步進(jìn)電機(jī)運(yùn)動(dòng)的相對目標(biāo)位置
stepper.move(1024); // 利用move函數(shù)可以使步進(jìn)電機(jī)運(yùn)行相應(yīng)步數(shù)。
比如,當(dāng)前步進(jìn)電機(jī)處在0的位置,move(512)可以使步進(jìn)電機(jī)轉(zhuǎn)512步指向512的位置,再來一次move(512)指令可以使步進(jìn)電機(jī)指向1024的位置
圖 41 圖解move函數(shù)
?moveTo -設(shè)置步進(jìn)電機(jī)運(yùn)動(dòng)的絕對目標(biāo)位置
使用moveTo指令可以使步進(jìn)電機(jī)旋轉(zhuǎn)到指定角度,比如moveTo(1024)可以使步進(jìn)電機(jī)指向1024的位置,如果再輸入一次moveTo(1024)指令,步進(jìn)電機(jī)由于已經(jīng)處在1024的位置,則不再動(dòng)作
圖 42 圖解moveTo函數(shù)
?runToNewPosition – 電機(jī)運(yùn)行到用戶指定位置值,目標(biāo)位置為絕對位置。
stepper.runToNewPosition(2048); //利用runToNewPosition函數(shù)讓電機(jī)運(yùn)行到用戶指定位置值。
runToNewPosition指令與前面提到的moveTo(指令類似),只不過runToNewPosition指令在運(yùn)行的過程中在步進(jìn)電機(jī)沒有到達(dá)目標(biāo)位置前,將不會(huì)繼續(xù)執(zhí)行后續(xù)程序內(nèi)容。
圖 43 圖解runToNewPosition函數(shù)
?setSpeed -設(shè)置步進(jìn)電機(jī)運(yùn)行速度
?run -步進(jìn)電機(jī)運(yùn)行(先加速后減速模式)
?runSpeed -步進(jìn)電機(jī)運(yùn)行(勻速模式)
如果需要讓步進(jìn)電機(jī)勻速轉(zhuǎn)動(dòng),就需要使用setSpeed -設(shè)置步進(jìn)電機(jī)運(yùn)行速度
和runSpeed()函數(shù)
例如輸入如下兩條代碼,步進(jìn)電機(jī)會(huì)以300的速度勻速運(yùn)行下去
stepper.setSpeed(300); // 初始化電機(jī)速度為300
stepper.runSpeed();
以上為AccelStepper庫常用函數(shù)介紹(這里引用了太極創(chuàng)客團(tuán)隊(duì)提供的資料,感謝太極創(chuàng)客為創(chuàng)客圈做出的貢獻(xiàn))。AccelStepper庫還有很多函數(shù)沒有在這里列舉出。我們相信在掌握了以上的函數(shù)使用后,對于AccelStepper庫的其他函數(shù)也會(huì)更加容易理解和掌握。如果需要獲得更多的AccelStepper庫使用資料,請參考http://www.airspayce.com/mikem/arduino/AccelStepper/index.html
在本次翻頁動(dòng)畫顯示器中,我們只需要讓步進(jìn)電機(jī)勻速運(yùn)行,我們將前文中霍爾傳感器的程序與步進(jìn)電機(jī)程序結(jié)合即可完成翻頁動(dòng)畫顯示的程序控制
完整程序如下
#include "AccelStepper.h"
// 電機(jī)步進(jìn)方式定義
#define FULLSTEP 4 //全步進(jìn)參數(shù)
#define HALFSTEP 8 //半步進(jìn)參數(shù)
// 定義步進(jìn)電機(jī)引腳
#define motor1Pin1 4 // 28BYJ48連接的ULN2003電機(jī)驅(qū)動(dòng)板引腳 in1
#define motor1Pin2 5 // 28BYJ48連接的ULN2003電機(jī)驅(qū)動(dòng)板引腳 in2
#define motor1Pin3 6 // 28BYJ48連接的ULN2003電機(jī)驅(qū)動(dòng)板引腳 in3
#define motor1Pin4 7 // 28BYJ48連接的ULN2003電機(jī)驅(qū)動(dòng)板引腳 in4
#define Hall_START 2 //霍爾傳感器引腳
#define Hall_END 3 //霍爾傳感器引腳
#define OVER 1 //判斷是否進(jìn)入最終環(huán)節(jié)
// 定義步進(jìn)電機(jī)對象
// 定義中ULN2003驅(qū)動(dòng)板引腳順序?yàn)?in1-in3-in2-in4
// 電機(jī)設(shè)置為全步進(jìn)運(yùn)行
AccelStepper stepper(FULLSTEP, motor1Pin1, motor1Pin3, motor1Pin2, motor1Pin4);
int START;//開始狀態(tài)存儲(chǔ)變量
int END;//結(jié)束狀態(tài)存儲(chǔ)變量
bool is_working = false;//工作中
bool is_free = true;//空閑
int count=0;//計(jì)數(shù)器
int SPEED=0;//speed
char MODEL; //模式
void setup()
{
pinMode(Hall_START, INPUT);//START
pinMode(Hall_END, INPUT);//END
stepper.setMaxSpeed(500.0); // 電機(jī)最大速度500
stepper.setSpeed(0); // 初始化電機(jī)速度為0
Serial.begin(9600);
//復(fù)原到初始位置
while(digitalRead(Hall_END) == 1)
{
stepper.setSpeed(100);
stepper.runSpeed();
}
stepper.setSpeed(0);
stepper.runSpeed();
}
void loop(){
if(START == 1 && digitalRead(Hall_START) == 0)//兩次檢測按鍵的狀態(tài)
{
delay(500);
if ( digitalRead(Hall_START) == 0 && is_free == true) //且設(shè)備處于空閑狀態(tài)進(jìn)入工作模式
{
is_free = false;
is_working = true;
}
}
START = digitalRead(Hall_START);//存儲(chǔ)1號(hào)霍爾傳感器的狀態(tài)
END = digitalRead(Hall_END);//存儲(chǔ)2號(hào)霍爾傳感器的狀態(tài)
//開始工作
if(is_free == false && is_working == true )
{
SPEED = 100;
//計(jì)數(shù)器計(jì)數(shù),忽略第一次檢測狀態(tài)
if(count >500) { MODEL = OVER; }
count++;
}
//結(jié)束工作
if (MODEL == OVER && END == 0)
{
SPEED = 0;//速度清零
count = 0;//計(jì)數(shù)器清零
is_working = false;//工作指示變量復(fù)位
is_free = true;//空閑指示變量復(fù)位
MODEL = 0;//狀態(tài)復(fù)位
}
Serial.println(count);
stepper.setSpeed(SPEED);
stepper.runSpeed();
}
圖 44
至此,翻頁動(dòng)畫顯示器就全部制作完成了
#總結(jié)#
本次作品我們掌握了霍爾傳感器的工作原理,學(xué)習(xí)了28BYJ-48步進(jìn)電機(jī)的的使用方法,掌握了這些,更多有趣的動(dòng)畫內(nèi)容都可以輕松展示,比如各種動(dòng)漫主題的素材,那還等什么,趕快去試試吧
虎年春節(jié)馬上就要到了,最后祝大家在新的一年虎樂安康,萬事順?biāo)?/p>
造物讓生活更美好,我們下期再見!