作者/史舜晨,臨沂第一中學(xué)
基于ARDUINO的電器遙控系統(tǒng)
作者/史舜晨,臨沂第一中學(xué)
基于ARDUINO平臺(tái),集成紅外收發(fā)模塊、數(shù)碼管顯示模塊、舵機(jī)控制模塊及相應(yīng)機(jī)械結(jié)構(gòu),開(kāi)發(fā)了專門(mén)的控制程序,實(shí)現(xiàn)了一個(gè)紅外遙控系統(tǒng)。該系統(tǒng)可以在不破壞原有電子設(shè)備開(kāi)關(guān)控制結(jié)構(gòu)的前提下,實(shí)現(xiàn)遙控開(kāi)關(guān)和定時(shí)開(kāi)關(guān)功能。更換觸發(fā)頭可以適應(yīng)不同種類電器的多種觸發(fā)控制模式。該系統(tǒng)可以提高家用老舊電器的易用性和智能化程度。
Arduino;遙控;開(kāi)關(guān);定時(shí)
經(jīng)濟(jì)社會(huì)的發(fā)展,人民對(duì)生活質(zhì)量有了更高的追求,希望家用電器以更加舒適的方式控制家中的電子設(shè)備、希望設(shè)備提供更貼心的服務(wù),如電器的定時(shí)控制、智能控制等。但伴隨著電器的更新?lián)Q代速率不斷加快,尤其是遙控的大量廣泛應(yīng)用極大便利了生活。例如人們可以不必在冬日離開(kāi)溫暖的被窩去關(guān)燈,不必匆匆在客廳和餐廳間往返來(lái)使用廚房電器。但是電器的更新速率并不完全與人們更換它們的能力與意向同步,尤其是在一些比較貴重或者更換麻煩的電器上。筆者設(shè)計(jì)了一種基于ARDUINO系統(tǒng)的、用于提升現(xiàn)有手動(dòng)按鍵式電器易用性的遠(yuǎn)程遙控系統(tǒng)。如圖1所示,在控制器控制下,舵機(jī)帶動(dòng)齒輪驅(qū)動(dòng)齒條實(shí)現(xiàn)對(duì)機(jī)械按鍵的觸發(fā)。當(dāng)舵機(jī)順時(shí)針轉(zhuǎn)動(dòng)觸發(fā)一次開(kāi)關(guān),如狀態(tài)一;當(dāng)舵機(jī)逆時(shí)針轉(zhuǎn)動(dòng)再一次觸發(fā)開(kāi)關(guān),如狀態(tài)二。借助該系統(tǒng),可以在原有手動(dòng)按鍵的基礎(chǔ)上添加了遙控開(kāi)關(guān)與定時(shí)開(kāi)關(guān)功能。這種設(shè)計(jì)可以在較大程度上提高人們對(duì)家用電器的控制能力,便利生活、提高生活質(zhì)量。并且可以減少家電的更換頻率,減少資源消耗;使老式電器物盡其用,符合綠色的可持續(xù)發(fā)展觀念。
圖 1 工作原理圖
本系統(tǒng)采用了Arduino UNO控制板,控制板采用了ATmega16U2主控芯片,同時(shí)具有14路數(shù)字輸入/輸出口(其中6路可作為PWM輸出),6路模擬輸入,一個(gè)16MHz晶體振蕩器,一個(gè)USB口,一個(gè)電源插座,一個(gè)ICSP header和一個(gè)復(fù)位按鈕。 輸入/輸出口較多,且Arduino UNO支持3種方式供電,即外部直流電源通過(guò)電源插座供電、USB接口直接供電、電池連接電源連接器的GND和VIN引腳,而且能自動(dòng)選擇供電方式,配置滿足了設(shè)計(jì)的需要[1]。此外,Arduino作為一個(gè)開(kāi)源設(shè)計(jì)平臺(tái),具有類似 Java 和 C 語(yǔ)言開(kāi)發(fā)環(huán)境,模塊化的硬件設(shè)備,良好的封裝性,適合大部分開(kāi)發(fā)人群設(shè)計(jì)使用。另外重要的一點(diǎn)Arduino 價(jià)格比普通單片機(jī)便宜,并且體積只有巴掌大小,適合作為外附工具改進(jìn)電器需要方便使用。它可方便地與傳感器、各種電子元件進(jìn)行連接,實(shí)現(xiàn)豐富的高級(jí)應(yīng)用。
本項(xiàng)目采用ARDUINO作為控制系統(tǒng),包括了數(shù)碼管顯示模塊,紅外發(fā)射接收模塊以及舵機(jī)控制模塊。圖2為系統(tǒng)框架圖。紅外接收管接收來(lái)自外部紅外發(fā)射器的數(shù)據(jù),經(jīng)過(guò)控制器解碼,再相應(yīng)驅(qū)動(dòng)舵機(jī)控制模塊和定時(shí)設(shè)置模塊,通過(guò)舵機(jī)帶動(dòng)齒輪和齒條觸發(fā)機(jī)械開(kāi)關(guān)。
紅外線遙控是目前應(yīng)用最廣泛、性價(jià)比最好的一種遙控技術(shù)?;贏rduino平臺(tái)實(shí)現(xiàn)紅外遙控功能控制簡(jiǎn)單,實(shí)施方便。綜合以上考慮,本系統(tǒng)中選用了紅外遙控作為外部控制信號(hào)輸入。
圖 2 系統(tǒng)框架圖
紅外遙控器發(fā)出的信號(hào)是一連串二進(jìn)制脈沖碼。通常都是先將其調(diào)制在特定的載波頻率上來(lái)使其在無(wú)線傳輸過(guò)程中免受其他紅外信號(hào)的干擾,然后再經(jīng)紅外發(fā)射二極管發(fā)射出去。紅外接收管將接收到的光信號(hào)轉(zhuǎn)換為微弱的電信號(hào),通過(guò)放大、自動(dòng)增益控制、帶通濾波、解調(diào)變、波形整形后還原為原始控制編碼,再將此編碼傳遞給中央控制芯片做相應(yīng)控制輸出。
本系統(tǒng)使用NEC格式的紅外遙控編碼方式。圖3為NEC協(xié)議格式典型的脈沖序列。一個(gè)信息發(fā)送由9mS的AGC自動(dòng)增益控制脈沖開(kāi)頭,用來(lái)設(shè)置增益。接著是4.5mS空閑,然后是地址、命令。地址和命令都傳送2次,第二次的地址和命令是反碼,可以用來(lái)校驗(yàn)接收到的信息??偟膫鬏敃r(shí)間是固定的,因?yàn)槊恳晃欢加蟹创a傳送。
圖3 NEC協(xié)議典型脈沖序列
本項(xiàng)目中所有的指令都是通過(guò)紅外遙控器發(fā)出,包括時(shí)間設(shè)置指令、直接觸發(fā)開(kāi)關(guān)指令、倒計(jì)時(shí)開(kāi)始指令等。項(xiàng)目設(shè)計(jì)中使用的碼值如下:
long on0= 0x00FF6897; long on1 = 0x00あ30CF;
long on2 = 0x00FF18E7; long on3 = 0x00FF7A85;
long on4 = 0x00FF10EF; long on5 = 0x00FF38C7;
long on6 = 0x00FF5AA5; long on7 = 0x00FF42BD;
long on8 = 0x00FF4AB5; long on9 = 0x00FF52AD;
long add = 0x00FF02FD; long subtract = 0xFF9867;
long play = 0xFFA857;
on0–on9用來(lái)設(shè)置定時(shí)時(shí)間并顯示,add按鍵用來(lái)控制舵機(jī)正轉(zhuǎn),subtract用來(lái)控制反轉(zhuǎn),play用來(lái)控制計(jì)時(shí)開(kāi)始和計(jì)時(shí)結(jié)束后的開(kāi)關(guān)觸發(fā)。紅外接收管的信號(hào)引腳連接到Arduino的數(shù)字3。
舵機(jī)是一種位置伺服的驅(qū)動(dòng)器,主要是由外殼、電路板、無(wú)核心馬達(dá)、齒輪與位置檢測(cè)器所構(gòu)成,適用于角度不斷變化并且可以保持的控制系統(tǒng),目前舵機(jī)廣泛應(yīng)用在機(jī)器人關(guān)節(jié)的控制,機(jī)器車方向的扭動(dòng)等在智能控制應(yīng)用中。
Arduino控制器可以通過(guò)輸出不同占空比的PWM信號(hào)控制舵機(jī)的轉(zhuǎn)動(dòng)[3]。本項(xiàng)目中選擇的舵機(jī)是TOWERPRO的9G舵機(jī),該舵機(jī)具有尺寸小,質(zhì)量輕,扭力大,相應(yīng)脈沖相對(duì)較短的優(yōu)點(diǎn),能夠滿足項(xiàng)目中驅(qū)動(dòng)齒條觸發(fā)開(kāi)關(guān)的需求,其工作電壓在3.5–6v,扭矩為1.6kg·cm(4.8V),在無(wú)負(fù)載的時(shí)候的速度為0.12秒/60度(4.8V)或者0.10秒/60度(6.0V) 。該舵機(jī)有三個(gè)引腳分別是電源VCC、地線GND及信號(hào)線PWM。本項(xiàng)目中信號(hào)線接到Arduino的數(shù)值引腳10上。當(dāng)控制器發(fā)送觸發(fā)信號(hào)時(shí),舵機(jī)通過(guò)正轉(zhuǎn)或者反轉(zhuǎn)驅(qū)動(dòng)齒輪轉(zhuǎn)動(dòng),然后帶動(dòng)齒條移動(dòng),實(shí)現(xiàn)如圖1所示狀態(tài)變化,控制開(kāi)關(guān)閉合和斷開(kāi)。
設(shè)計(jì)不同的觸發(fā)頭可以實(shí)現(xiàn)對(duì)不同電器的控制。如圖4所示的旋鈕式開(kāi)關(guān)頭可以應(yīng)用到旋鈕式開(kāi)關(guān)上,如燃?xì)庠?、微波爐等。
圖4 旋鈕式觸發(fā)頭
控制軟件是實(shí)現(xiàn)本項(xiàng)目的關(guān)鍵,直接影響系統(tǒng)的功能性、流暢性和執(zhí)行效率??刂栖浖饕t外接收模塊、舵機(jī)控制模塊、數(shù)碼管顯示模塊。紅外遙控模塊實(shí)現(xiàn)紅外輸入控制指令的解碼,舵機(jī)控制模塊根據(jù)相應(yīng)的指令實(shí)現(xiàn)舵機(jī)的正轉(zhuǎn)或者反轉(zhuǎn),數(shù)碼管顯示模塊實(shí)現(xiàn)倒計(jì)時(shí)進(jìn)度的顯示和信息的提示。
圖5 程序流程圖
程序工作的流程圖如圖5所示,首先判斷是否有按鍵按下,如果有,就對(duì)紅外進(jìn)行解碼,判斷相應(yīng)的操作指令,如果沒(méi)有識(shí)別出按鍵則在數(shù)碼管上顯示“E”,表示按鍵錯(cuò)誤。如為時(shí)間設(shè)置指令,則在數(shù)碼管上顯示倒計(jì)時(shí)的時(shí)間,并且向倒計(jì)時(shí)模塊傳遞倒計(jì)時(shí)的時(shí)間;如果為直接觸發(fā)開(kāi)關(guān)指令,則判斷是正傳還是反轉(zhuǎn),如果是正傳則向舵機(jī)控制模塊傳遞chePos=1,舵機(jī)接到指令后調(diào)用函數(shù)clockwisefan()實(shí)現(xiàn)正傳;反轉(zhuǎn)則向舵機(jī)控制模塊傳遞chePos=0;舵機(jī)控制模塊則調(diào)用函數(shù)Anticlockwisefan()實(shí)現(xiàn)反轉(zhuǎn)。正反轉(zhuǎn)函數(shù)代碼如下,本項(xiàng)目中轉(zhuǎn)動(dòng)的角度為180度,轉(zhuǎn)動(dòng)度數(shù)可以根據(jù)項(xiàng)目需要進(jìn)行改動(dòng)。
void Clockwise(void) //正轉(zhuǎn)程序
{ for(pos=0; pos <180; pos++) // 從0度到180度運(yùn)動(dòng)// 每次步進(jìn)一度
{ myservo.write(pos); // 指定舵機(jī)轉(zhuǎn)向的角度
delay(10); } } // 等待10ms讓舵機(jī)到達(dá)指定位置
void Anti_clockwisefan(void) //反轉(zhuǎn)程序
{ for(pos=180 ; pos >0; pos––)
// 從180度到0度運(yùn)動(dòng),每次步進(jìn)一度
{ myservo.write(pos); // 指定舵機(jī)轉(zhuǎn)向的角度
delay(10); } } // 等待10ms讓舵機(jī)到達(dá)指定位置
如果為倒計(jì)時(shí)開(kāi)始指令,則調(diào)用led_diplay()函數(shù),開(kāi)始倒計(jì)時(shí),同步驅(qū)動(dòng)數(shù)碼管的顯示。倒計(jì)時(shí)函數(shù)delay_time_start()的代碼如下:其中delay_time表示延時(shí)的分鐘數(shù),delay(x)函數(shù),表示延時(shí)x毫秒。為了表示延時(shí)一分鐘,本項(xiàng)目中使用了循環(huán)語(yǔ)句60次。
void delay_time_start(int delay_time)
{ for(int k=delay_time;k>0;k––)
{ led_display(k);
for(int m=60;m>0;m––)
{ delay(1000); //延時(shí)1秒
if(k==1 && m<11)//最后十秒顯示
{ led_display((m)); } } }
chePos=!chePos;
led_display(0);
action_start(); }
其中action_start()函數(shù)實(shí)現(xiàn)舵機(jī)反轉(zhuǎn),代碼如下:
void action_start(void)
{ if (chePos==1) //如果chePos為1,運(yùn)行正轉(zhuǎn)程序
{ Clockwise(); } //運(yùn)行正轉(zhuǎn)程序
else
{ Anti_clockwisefan(); } } //運(yùn)行反轉(zhuǎn)程序
圖6為各模塊與ArduinoUNO的連接原理圖,圖7為實(shí)物連接圖。
在demo驗(yàn)證過(guò)程中,紅外遙控輸入信號(hào)識(shí)別正確,舵機(jī)及齒輪和齒條控制輸出平穩(wěn)有效,成功實(shí)現(xiàn)了對(duì)按鍵的觸發(fā)。倒計(jì)時(shí)模塊工作正常,在倒計(jì)時(shí)結(jié)束后也有效的調(diào)用了舵機(jī)控制模塊,實(shí)現(xiàn)了開(kāi)關(guān)的觸發(fā)。
圖6 各模塊連接圖
圖7 各構(gòu)件實(shí)際連接圖
技術(shù)調(diào)研后,本文設(shè)計(jì)的電器遠(yuǎn)程遙控系統(tǒng)成功實(shí)現(xiàn)了預(yù)期功能,可以加裝在家中的手動(dòng)按鍵式電器上,為生活帶來(lái)一定程度的便利,具有一定的實(shí)用價(jià)值。
該系統(tǒng)采用模塊化的設(shè)計(jì)思想,充分利用了Arduino平臺(tái)的接口豐富、開(kāi)發(fā)簡(jiǎn)單、功能實(shí)用等特性,以Arduino控制板為核心,通過(guò)自主編寫(xiě)的控制程序,成功實(shí)現(xiàn)了對(duì)舵機(jī)模塊、紅外接收發(fā)射模塊和數(shù)碼管顯示模塊的集成和控制,技術(shù)路線得到驗(yàn)證,筆者也從中得到鍛煉,學(xué)習(xí)能力、創(chuàng)新能力、自信心得到極大提升。
在實(shí)驗(yàn)過(guò)程中也發(fā)現(xiàn)系統(tǒng)所存在的不足,今后還可以在以下方面對(duì)系統(tǒng)進(jìn)行改進(jìn)或做深入研究:
(1)使用精確度更高的舵機(jī),避免由于誤差不能夠正常觸發(fā);(2)完善機(jī)械和外觀設(shè)計(jì),實(shí)現(xiàn)對(duì)不同機(jī)械按鍵的觸發(fā);(3)集成無(wú)線通信或wif i技術(shù),實(shí)現(xiàn)手機(jī)遠(yuǎn)程遙控。
* [1]劉楚紅,董鎮(zhèn),錢宇捷,陶立,柳盛東.基于Arduino 的倒車?yán)走_(dá)系統(tǒng)設(shè)計(jì)[J],現(xiàn)代電子技術(shù),2014年第37卷第17期
* [2]李雪瑩.基于單片機(jī)的空調(diào)紅外線編解碼系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)[D],電子科技大學(xué)碩士論文
* [3]蔡睿妍.基于Arduino的舵機(jī)控制系統(tǒng)設(shè)計(jì)[J],電腦知識(shí)與技術(shù):1009-3044(2012)15-3719-03