0

0
0

文字

分享

0
0
0

使用 Arduino 遙控家電

馥林文化_96
・2012/12/18 ・2094字 ・閱讀時間約 4 分鐘 ・SR值 438 ・四年級

文/馬萬圳

前言

躺在床上看書看累了,你想倒頭就睡,卻懶得下床關燈嗎?或是窩在舒服的沙發上看電視,你想開個電風扇涼快一下,卻連抬個腿都覺得麻煩嗎?如果這時候可以拿起遙控器遙控電器的關開,按一下就可以把電燈關掉,按另一下就可以把電風扇打開,該是多麼美好的一件事!

這聽起來很困難嗎?不!一點都不!本專題要告訴您如何使用紅外線遙控插座控制電器的開關,並且以 Arduino 自製一個簡單的紅外線遙控器,利用 Arduino 來遙控紅外線插座。

STEP 1:

把紅外線插座插到110V插座 (圖1),先按一下黑色按鈕讓燈亮,再按住按鈕約3秒鐘,等燈亮後手放開,此時燈會閃爍 (圖2),代表紅外線插座已進入紅外線學習模式:

 圖1:將紅外線插座插入110V插座

 圖2:按住按鍵3秒鐘後放開,此時燈會閃爍,表示已進入紅外線學習模式

拿起家裏任何一個遙控器,對著紅外線插座按任一鍵 (圖3),這個紅外線插座很聰明,當你聽到繼電器發出嗒的一聲時,表示它已經把紅外線學起來了。

 圖3:用遙控器對著紅外線插座按任一鍵

完成設定後,馬上來做個簡單的測試,將電器 (例如電風扇、立燈) 插到紅外線插座上,然後按

一下遙控器同一顆按鍵,此時電器電源會打開 (圖4),再按一下,便會關閉電源 (圖5)。

 圖4:按一下打開電器,此時燈會亮

 圖5:再按一下關閉電器,此時燈會熄滅

STEP 2:

下一步是使用 Arduino 讀取遙控器的紅外線訊號。

首先是連接電路,將 38kHz 紅外線接收器接到 Arduino 上。紅外線接收器的接法如圖6所示,接收器的Vout腳接到pin 2腳位,Vcc接到5V輸出腳位,GND接到 Arduino的GND腳位。

 圖6:紅外線接收器線路接法

接著是安裝 IRRemote Library。請將IRRemote Library下載後(註1),解壓縮放到libraries資料夾底下即可

,例如 “C:\arduino-1.0.1\libraries”

將底下的程式輸入Arduino IDE 並上傳至 Arduino 板子上:

// 示紅外線協定與訊號
#include // 引用 IRRemote 函式庫
const int irReceiverPin = 2; // 紅外線接收器 OUTPUT 訊號接在 pin 2
IRrecv irrecv(irReceiverPin); // 定義 IRrecv 物件來接收紅外線訊號
decode_results results; // 解碼結果將放在 decode_results 結構的 result 變數裏
void setup()
{
Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps
irrecv.enableIRIn(); // 啟動紅外線解碼
}
// 顯示紅外線協定種類
void showIRProtocol(decode_results *results)
{

Serial.print(“Protocol: “);

// 判斷紅外線協定種類

switch(results->decode_type) {

case NEC:

Serial.print(“NEC”);

break;

case SONY:

Serial.print(“SONY”);

break;

case RC5:

Serial.print(“RC5″);

break;

case RC6:

Serial.print(“RC6″);

break;

default:

Serial.print(“Unknown encoding”);

}

// 把紅外線編碼印到 Serial port

Serial.print(“, irCode: “);

Serial.print(results->value, HEX); // 紅外線編碼

Serial.print(“, bits: “);

Serial.println(results->bits); // 紅外線編碼位元數

}

void loop()

{

if (irrecv.decode(&results)) { // 解碼成功,收到一組紅外線訊號

showIRProtocol(&results); // 顯示紅外線協定種類

irrecv.resume(); // 繼續收下一組紅外線訊號

}

}

程式上傳完畢後,打開 Serial Monitor,接著拿起遙控器,對著紅外線接收器按下按鍵(要用跟紅外線插座一樣的同一個按鍵),這時候Serial Monitor會顯示紅外線訊號的編碼,如圖7所示:

 圖7:遙控器紅外線訊號

將解到的Protocol種類與編碼記錄下來(本例為 NEC協定,編碼為4CB3817E),待會我們會用到。

STEP 3:

下一步我們將使用 Arduino 來發射紅外線,以遙控紅外線插座。

首先一樣是先連接電路,我們要把紅外線發射器和一顆按鈕接到Arduino。紅外線發射器的接法如圖8所示,發射器的長腳要接到 pin 3 腳位,並且串接一顆 100 ohm 電阻,短腳要接到 GND腳位。至於按鈕則是一支腳接到 5V輸出腳位,另一支腳接到 pin 4 腳位,同時接一個 10K 電阻連接到 GND腳位。

將底下的程式輸入Arduino IDE 並上傳至 Arduino 板子上:

/*

* 發射紅外線訊號

* 注意! 紅外線發射器(IR LED)必須接到 pin 3, 不能接其它腳位

*/

#include// 引用 IRRemote 函式庫

const int buttonPin = 4; // 按鍵(pushbutton)接在 pin 4

int buttonState = 0; // 按鍵狀態

IRsend irsend; // 定義 IRsend 物件來發射紅外線訊號

void setup()

{

pinMode(buttonPin, INPUT); // 把 buttonPin 設置成 INPUT

}

void loop()

{

// 讀取按鍵狀態

buttonState = digitalRead(buttonPin);

// 檢查按鍵是否被按下(pressed)

// 有的話 buttonState 會是 HIGH

if (buttonState == HIGH) {

// 發射紅外線訊號

irsend.sendNEC(0x4CB3817E, 32); // 記得換成你遙控器的紅外線編碼

}

}

本例所用的是講NEC協定的遙控器,所以程式呼叫sendNEC() 發射紅外線訊號,如果你在 STEP2解到是其它紅外線協定,必須改呼叫其它函式,例如sendSony(), sendRC5(), sendRC6(), sendSharp()等。另外,記得將程式裏的紅外線編碼換成你遙控器的編碼。

大功告成了,此時按下按鈕後,Arduino就會遙控紅外線遙控插座,你便可以打開或關閉電器的電源囉。

假如你有Ethernet Shield、Wi-Fi Shield 或者是藍芽擴充模組,你只要利用 Arduino 和紅外線遙控插座,然後再寫個手機App,便可以利用手機來遙控家電的開關了。這部份我想就留給你當作功課了!

*註1: IRRemote Library 可由此連結下載。

材料表:

1) 一張 Arduino 板子,一條 USB 傳輸線,以及 Arduino IDE 軟體開發環境:

 

2) 一顆 38 kHz 的紅外線接收器 (Infrared Receiver),如 TSOP2438TSOP4438,  PNA4602,  FM-8038TM2-5DN

▲ 紅外線接收器(Infrared Receiver)

 

3) 一顆發射波長為 940nm (nanometer, 奈米) 的紅外線發射器

 

4) 一個紅外線遙控插座 (可在露天或淘寶買到)

 

*馬萬圳先生(Cooper Maa),國內資深Arduino玩家。(部落格)

文章原文刊載於《MAKE》國際中文版


數感宇宙探索課程,現正募資中!

相關標籤:
文章難易度
馥林文化_96
54 篇文章 ・ 6 位粉絲
馥林文化是由泰電電業股份有限公司於2002年成立的出版部門,有鑒於21世紀將是數位、科技、人文融合互動的世代,馥林亦出版科技機械類雜誌及相關書籍。馥林文化出版書籍http://www.fullon.com.tw/


0

0
0

文字

分享

0
0
0

遲來報到的質數——《數學,這樣看才精采》

天下文化_96
・2022/05/20 ・2868字 ・閱讀時間約 5 分鐘

2013 年國際數學界最轟動的新聞,應屬中國留美學者張益唐在孿生質數問題上所作出的突破。他個人的經歷更增加了整件事的傳奇性。

數學家張益唐。圖/VOA, 公有領域

張益唐雖然是北大數學系的高材生,但是 37 歲從美國普渡大學拿到博士學位之後,因與指導教授意趣不合,一時在學界無法發展,多年靠打工餬口。1999 年才好不容易至新罕布夏大學數學系任講師。在張益唐長期不得意的歲月裡,他雖然沒有發表什麼數學論文,但是也不曾喪失志氣,還是堅持研究自己喜歡的數學問題。

張益唐在 58 歲暴得大名,各種獎項與頭銜接踵而來,在最是少年逞英豪的數學世界裡,真成為一個異數。英國數學家哈代在他著名的小冊子《一個數學家的辯白》裡曾說:「我不知道有任何一項數學的主要進展,是由超過五十歲的人所啟動。」張益唐正好給哈代的偏見一個反例。

張益唐研究的是關於質數的性質。

一個自然數 p 是質數(也稱為素數)的條件有二:其一,p 大於 1;其二,除了 1 與 p 自己之外,沒有別的自然數能整除 p。全體質數可以從小到大排成一個數列 2, 3, 5, 7, 11, 13, …,通常把排在第 n 個位置的質數記作 pn。如果 pn 與 pn+1 相差為2,則稱質數對 (pn, pn+1) 為一對孿生質數,例如 3 與 5,5 與 7,11 與 13。

圖/envato elements

「孿生質數猜想」就說這樣的質數對有無窮多組。因為古希臘的歐幾里得在他的巨著《原本》裡,曾經證明質數有無窮多個,所以有人以為也是歐幾里得最先提出孿生質數猜想。其實不然,目前從文獻中所見, 1879 年英國數學家格萊舍(James Whitbread Lee Glaisher)在《數學信使》(Messenger of Mathematics)雜誌上的一篇文章,才是第一次將孿生質數猜想見諸文字。

張益唐的大突破是證明有無窮多組質數對 (pn, pn+1) 使得 pn 與 pn+1 相距不超過 7 千萬。

為什麼這是一個大突破呢?因為在張益唐之前,不管給出什麼固定數 m,完全不知道相差在 m 之內的質數對,到底是有限多個還是無窮多個。自從 2013 年 5 月他的成就在國際媒體上廣為流傳之後,世界上很多數學家努力要把 7千萬的差距往下壓縮,目前已經改善到 246 之內。但是距離孿生質數猜想所需的 2,還有巨大而艱困的鴻溝。

一般人從媒體得知張益唐對數學做出了重大貢獻,可能會好奇問他的結果有什麼用?這裡「用」當然是指實際的應用。其實,他的成果目前還只有純學術價值,與國計民生毫不相干。自從古希臘人辨識出質數,在兩千多年的時間裡,除了數學家關心質數外,質數一直缺乏任何應用價值。二十世紀電腦發達之後,才利用因數分解成質數的超級困難特性,產生了某些幾乎無法有效破解的密碼系統,廣泛的應用到金融、通信、資料保密上。

圖/envato elements

在中國古算裡缺席?

一個基本的數學概念,經歷了兩千多年的滄桑,才顯現出它的實用價值,這不是一件平凡的成就。因此,我們不得不佩服希臘人研究質數的真知灼見,並且感嘆十八世紀前的中國傳統數學裡卻不見質數的蹤跡。質數為什麼會在中國遲來報到?實在是一個令人費解的現象。

歐幾里得的《原本》約在西元前 300 年左右成書,是古希臘數學集大成之作。第七卷討論數的性質,是使用幾何的觀點來理解數。也就是從「單位」的概念出發,以度量直線段的方式引入「數」。第七卷定義 2 說「一個數是由許多單位合成的。」因此,1 代表單位而不算作「數」。定義 11 說「質數是只能為一個單位所量盡者。」定義 16 說「兩數相乘得出的數稱為面,其兩邊就是相乘的數。」所以質數只能是線,而不能稱為面。

歐幾里德畫像。圖/wiki, 公有領域

從這些定義可看出來,古希臘人所謂的「數」是依附在幾何的體系裡而得以操作。中國古代缺乏像《原本》這種按照邏輯次序鋪陳結果的數學書,通常是以解決實際問題的風貌來書寫,因此不太可能探討與闡述「數」的純粹性質。

例如,以《九章算術》為代表的中國古算裡,數字是與矩形、直角三角形的面積緊密相連結,但卻沒有像希臘人那樣分辨,有些數是可以表現為面,而有些數卻不可以。

也許古代中國缺乏一項歐幾里得所擁有的知識背景,因而造成了雙方關注問題的差異。古希臘有一位重要的哲人德謨克利特(Democritus),他主張萬物皆由不可分割的「原子」所構成。在「原子論」的知識背景下,數目 1 就不會與其他數目等量齊觀了,1 是「單位」,是數的「原子」。

圖/envato elements

中國古代沒有明確的「原子論」,《墨子.經說下》所說:「非半,進前取也。前,則中無為半,猶端也。」其中切得不能再切的「端」在《墨子.經說上》解釋為「端,體之無序而最前者也。」也只是類似「原子」的概念,並未發展到德謨克利特的思想程度。「原子論」思想的欠缺,或許是質數在中國古算裡缺席的因素之一。

難以望其項背

康熙敕編的《御製數理精蘊》(簡稱《數理精蘊》)是融合中西數學的百科全書,其中將質數譯為「數根」,並且在附表〈對數闡微〉中列有質數表。雖然質數已經在中國現身,但是數學家並沒有感到相見恨晚而深入探討。

晚清數學名家李善蘭在翻譯歐幾里得《原本》後九卷時,第一卷第一界說為:「數根者唯一能度而他數不能度」,也把質數翻譯成「數根」。

數學家李善蘭。圖/傅任敢 《中華教育界》 1936 -1937年, 公有領域

李善蘭很可能受《數理精蘊》的影響,而去研究判別給定數是否為質數的方法。英國傳教師偉烈亞力(Alexander Wylie)將其中一法,以給編輯的信公布在香港一家英文雜誌上,其敘述為「以 2 的對數乘給定的數,求出其真數,以 2 減同數,以給定數除餘數,若能除盡,則給定數為質數;若不能除盡,則不是質數。」

此命題常被稱為「中國定理」,其實是歐洲早已知道的「費馬小定理」的逆命題,該定理斷言若 p 為質數,則 2p − 2 ≣ 0 (mod p)。

其實李善蘭的方法並不永遠正確,例如:2341 − 2 是 341 的整倍數,但是 341 = 11 × 31 並不是一個質數。1872 年李善蘭在《中西聞見錄》報刊發表了〈考數根法〉一文,成為清末關於質數研究的重要成果,但是他並沒有收錄「中國定理」,應該是他已經知道命題並不為真。

要知道李善蘭與高斯的生命是有重疊的時期,因此當西方以質數為基礎所建立的數論,已經繁複深刻美不勝收之時,也許連李善蘭都不曾完全清楚中國落後的程度是多麼巨大!


數感宇宙探索課程,現正募資中!

天下文化_96
9 篇文章 ・ 7 位粉絲
天下文化成立於1982年。一直堅持「傳播進步觀念,豐富閱讀世界」,已出版超過2,500種書籍,涵括財經企管、心理勵志、社會人文、科學文化、文學人生、健康生活、親子教養等領域。每一本書都帶給讀者知識、啟發、創意、以及實用的多重收穫,也持續引領台灣社會與國際重要管理潮流同步接軌。