加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長期合作伙伴
立即加入

logo

logo

有事離開?不用擔(dān)心

掃一掃繼續(xù)用手機(jī)看

微信掃碼
不再提醒
  • 點(diǎn)贊
  • 評論
  • 分享
相關(guān)視訊
  • 視訊介紹
    • #項(xiàng)目起源#
    • #設(shè)計(jì)制作#
    • #組裝#
    • #程序設(shè)計(jì)#
    • #總結(jié)#
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請入駐 產(chǎn)業(yè)圖譜

開源 | 自制春節(jié)主題翻頁動(dòng)畫顯示器

2022/01/26
1003
閱讀需 34 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

#項(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;//speedchar 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ī)速度為300stepper.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;//speedchar 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>

造物讓生活更美好,我們下期再見!

相關(guān)推薦

電子產(chǎn)業(yè)圖譜