作者/史舜晨,臨沂第一中學
基于ARDUINO的電器遙控系統
作者/史舜晨,臨沂第一中學
基于ARDUINO平臺,集成紅外收發模塊、數碼管顯示模塊、舵機控制模塊及相應機械結構,開發了專門的控制程序,實現了一個紅外遙控系統。該系統可以在不破壞原有電子設備開關控制結構的前提下,實現遙控開關和定時開關功能。更換觸發頭可以適應不同種類電器的多種觸發控制模式。該系統可以提高家用老舊電器的易用性和智能化程度。
Arduino;遙控;開關;定時
經濟社會的發展,人民對生活質量有了更高的追求,希望家用電器以更加舒適的方式控制家中的電子設備、希望設備提供更貼心的服務,如電器的定時控制、智能控制等。但伴隨著電器的更新換代速率不斷加快,尤其是遙控的大量廣泛應用極大便利了生活。例如人們可以不必在冬日離開溫暖的被窩去關燈,不必匆匆在客廳和餐廳間往返來使用廚房電器。但是電器的更新速率并不完全與人們更換它們的能力與意向同步,尤其是在一些比較貴重或者更換麻煩的電器上。筆者設計了一種基于ARDUINO系統的、用于提升現有手動按鍵式電器易用性的遠程遙控系統。如圖1所示,在控制器控制下,舵機帶動齒輪驅動齒條實現對機械按鍵的觸發。當舵機順時針轉動觸發一次開關,如狀態一;當舵機逆時針轉動再一次觸發開關,如狀態二。借助該系統,可以在原有手動按鍵的基礎上添加了遙控開關與定時開關功能。這種設計可以在較大程度上提高人們對家用電器的控制能力,便利生活、提高生活質量。并且可以減少家電的更換頻率,減少資源消耗;使老式電器物盡其用,符合綠色的可持續發展觀念。

圖 1 工作原理圖
本系統采用了Arduino UNO控制板,控制板采用了ATmega16U2主控芯片,同時具有14路數字輸入/輸出口(其中6路可作為PWM輸出),6路模擬輸入,一個16MHz晶體振蕩器,一個USB口,一個電源插座,一個ICSP header和一個復位按鈕。 輸入/輸出口較多,且Arduino UNO支持3種方式供電,即外部直流電源通過電源插座供電、USB接口直接供電、電池連接電源連接器的GND和VIN引腳,而且能自動選擇供電方式,配置滿足了設計的需要[1]。此外,Arduino作為一個開源設計平臺,具有類似 Java 和 C 語言開發環境,模塊化的硬件設備,良好的封裝性,適合大部分開發人群設計使用。另外重要的一點Arduino 價格比普通單片機便宜,并且體積只有巴掌大小,適合作為外附工具改進電器需要方便使用。它可方便地與傳感器、各種電子元件進行連接,實現豐富的高級應用。
本項目采用ARDUINO作為控制系統,包括了數碼管顯示模塊,紅外發射接收模塊以及舵機控制模塊。圖2為系統框架圖。紅外接收管接收來自外部紅外發射器的數據,經過控制器解碼,再相應驅動舵機控制模塊和定時設置模塊,通過舵機帶動齒輪和齒條觸發機械開關。
紅外線遙控是目前應用最廣泛、性價比最好的一種遙控技術。基于Arduino平臺實現紅外遙控功能控制簡單,實施方便。綜合以上考慮,本系統中選用了紅外遙控作為外部控制信號輸入。

圖 2 系統框架圖
紅外遙控器發出的信號是一連串二進制脈沖碼。通常都是先將其調制在特定的載波頻率上來使其在無線傳輸過程中免受其他紅外信號的干擾,然后再經紅外發射二極管發射出去。紅外接收管將接收到的光信號轉換為微弱的電信號,通過放大、自動增益控制、帶通濾波、解調變、波形整形后還原為原始控制編碼,再將此編碼傳遞給中央控制芯片做相應控制輸出。
本系統使用NEC格式的紅外遙控編碼方式。圖3為NEC協議格式典型的脈沖序列。一個信息發送由9mS的AGC自動增益控制脈沖開頭,用來設置增益。接著是4.5mS空閑,然后是地址、命令。地址和命令都傳送2次,第二次的地址和命令是反碼,可以用來校驗接收到的信息。總的傳輸時間是固定的,因為每一位都有反碼傳送。

圖3 NEC協議典型脈沖序列
本項目中所有的指令都是通過紅外遙控器發出,包括時間設置指令、直接觸發開關指令、倒計時開始指令等。項目設計中使用的碼值如下:
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用來設置定時時間并顯示,add按鍵用來控制舵機正轉,subtract用來控制反轉,play用來控制計時開始和計時結束后的開關觸發。紅外接收管的信號引腳連接到Arduino的數字3。
舵機是一種位置伺服的驅動器,主要是由外殼、電路板、無核心馬達、齒輪與位置檢測器所構成,適用于角度不斷變化并且可以保持的控制系統,目前舵機廣泛應用在機器人關節的控制,機器車方向的扭動等在智能控制應用中。
Arduino控制器可以通過輸出不同占空比的PWM信號控制舵機的轉動[3]。本項目中選擇的舵機是TOWERPRO的9G舵機,該舵機具有尺寸小,質量輕,扭力大,相應脈沖相對較短的優點,能夠滿足項目中驅動齒條觸發開關的需求,其工作電壓在3.5–6v,扭矩為1.6kg·cm(4.8V),在無負載的時候的速度為0.12秒/60度(4.8V)或者0.10秒/60度(6.0V) 。該舵機有三個引腳分別是電源VCC、地線GND及信號線PWM。本項目中信號線接到Arduino的數值引腳10上。當控制器發送觸發信號時,舵機通過正轉或者反轉驅動齒輪轉動,然后帶動齒條移動,實現如圖1所示狀態變化,控制開關閉合和斷開。
設計不同的觸發頭可以實現對不同電器的控制。如圖4所示的旋鈕式開關頭可以應用到旋鈕式開關上,如燃氣灶、微波爐等。

圖4 旋鈕式觸發頭
控制軟件是實現本項目的關鍵,直接影響系統的功能性、流暢性和執行效率。控制軟件主要包括紅外接收模塊、舵機控制模塊、數碼管顯示模塊。紅外遙控模塊實現紅外輸入控制指令的解碼,舵機控制模塊根據相應的指令實現舵機的正轉或者反轉,數碼管顯示模塊實現倒計時進度的顯示和信息的提示。

圖5 程序流程圖
程序工作的流程圖如圖5所示,首先判斷是否有按鍵按下,如果有,就對紅外進行解碼,判斷相應的操作指令,如果沒有識別出按鍵則在數碼管上顯示“E”,表示按鍵錯誤。如為時間設置指令,則在數碼管上顯示倒計時的時間,并且向倒計時模塊傳遞倒計時的時間;如果為直接觸發開關指令,則判斷是正傳還是反轉,如果是正傳則向舵機控制模塊傳遞chePos=1,舵機接到指令后調用函數clockwisefan()實現正傳;反轉則向舵機控制模塊傳遞chePos=0;舵機控制模塊則調用函數Anticlockwisefan()實現反轉。正反轉函數代碼如下,本項目中轉動的角度為180度,轉動度數可以根據項目需要進行改動。
void Clockwise(void) //正轉程序
{ for(pos=0; pos <180; pos++) // 從0度到180度運動// 每次步進一度
{ myservo.write(pos); // 指定舵機轉向的角度
delay(10); } } // 等待10ms讓舵機到達指定位置
void Anti_clockwisefan(void) //反轉程序
{ for(pos=180 ; pos >0; pos––)
// 從180度到0度運動,每次步進一度
{ myservo.write(pos); // 指定舵機轉向的角度
delay(10); } } // 等待10ms讓舵機到達指定位置
如果為倒計時開始指令,則調用led_diplay()函數,開始倒計時,同步驅動數碼管的顯示。倒計時函數delay_time_start()的代碼如下:其中delay_time表示延時的分鐘數,delay(x)函數,表示延時x毫秒。為了表示延時一分鐘,本項目中使用了循環語句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); //延時1秒
if(k==1 && m<11)//最后十秒顯示
{ led_display((m)); } } }
chePos=!chePos;
led_display(0);
action_start(); }
其中action_start()函數實現舵機反轉,代碼如下:
void action_start(void)
{ if (chePos==1) //如果chePos為1,運行正轉程序
{ Clockwise(); } //運行正轉程序
else
{ Anti_clockwisefan(); } } //運行反轉程序
圖6為各模塊與ArduinoUNO的連接原理圖,圖7為實物連接圖。
在demo驗證過程中,紅外遙控輸入信號識別正確,舵機及齒輪和齒條控制輸出平穩有效,成功實現了對按鍵的觸發。倒計時模塊工作正常,在倒計時結束后也有效的調用了舵機控制模塊,實現了開關的觸發。

圖6 各模塊連接圖

圖7 各構件實際連接圖
技術調研后,本文設計的電器遠程遙控系統成功實現了預期功能,可以加裝在家中的手動按鍵式電器上,為生活帶來一定程度的便利,具有一定的實用價值。
該系統采用模塊化的設計思想,充分利用了Arduino平臺的接口豐富、開發簡單、功能實用等特性,以Arduino控制板為核心,通過自主編寫的控制程序,成功實現了對舵機模塊、紅外接收發射模塊和數碼管顯示模塊的集成和控制,技術路線得到驗證,筆者也從中得到鍛煉,學習能力、創新能力、自信心得到極大提升。
在實驗過程中也發現系統所存在的不足,今后還可以在以下方面對系統進行改進或做深入研究:
(1)使用精確度更高的舵機,避免由于誤差不能夠正常觸發;(2)完善機械和外觀設計,實現對不同機械按鍵的觸發;(3)集成無線通信或wif i技術,實現手機遠程遙控。
* [1]劉楚紅,董鎮,錢宇捷,陶立,柳盛東.基于Arduino 的倒車雷達系統設計[J],現代電子技術,2014年第37卷第17期
* [2]李雪瑩.基于單片機的空調紅外線編解碼系統的設計和實現[D],電子科技大學碩士論文
* [3]蔡睿妍.基于Arduino的舵機控制系統設計[J],電腦知識與技術:1009-3044(2012)15-3719-03