學習目標 : 認識faya紅外線發射和接收模組的功能及使用方式
學習時間 : 60min
示範模組 : (1) faya brickNano x 2
(2) faya 紅外線發射模組
(3) faya 紅外線接收模組
(4) faya 按鍵模組
工具 : (1) 樂高積木底板 (相容)
====================功能介紹====================
faya紅外線發射/接收模組透過紅外線的介面傳輸資料,本篇教學同時介紹發射和接收模組,透過一發一收的資料傳送,進行硬體的連接與程式的示範。兩個模組的使用方式很容易上手:
- 當發射模組Din埠收到下源觸發後,資料開始傳送
- 欲傳送的資料由發射模組Din輸入,接收到的資料由Dout輸出
- 若超過180ms未有資料從Din輸入,則系統重置,需重新觸發
faya紅外線發射模組利用兩顆紅外線LED當發射器,兩顆LED30度夾角排列可增加發射角度,模組上的可變電阻可用來調整載波頻率。

====================原理知識===================
以下解釋提供給有需要知道背後原理的人:
紅外線發射器的電路如下所示,左下方的區域,透過2個反向器組合成邏輯閘震盪電路,藉由10K歐姆的可變電阻,改變RC充放電的時間,進而設定輸出震盪頻率,由於我們的接收器可解調38KHz的載波,因此在使用發射模組前,需先調整可變電阻(可變電阻箭頭指向大約9點鐘方向),讓輸出產生38KHz的載波。
接下來討論兩種輸入情況:
(1) 當Din為LOW訊號時,U1D的輸出(pin11)為HIGH,此時U1C的輸出(pin8)會和U1C的輸入(pin10)會反向,pin10連接pin6為38KHz方波,因此pin8也是38KHz的方波,此方波推動Q1,使紅外線LED發射38KHz載波。
(2) 當Din為HIGH訊號時,U1D的輸出(pin11)為LOW,此時U1C的輸出(pin8)必為HIGH,Q1會持續導通,但不會受到pin10的38KHz載波影響。
如果我們把輸入Din設為常HIGH,LED持續發射無載波的HIGH訊號,當等到Din拉到LOW時,pin9為HIGH,輸出pin8由pin10的38KHz載波決定,此輸出推動Q1進而發射載波訊號,讓接收器解調,這個拉LOW後開始傳輸的動作和很多串列通訊協定一樣,UART也是其中之一,我們可以好好利用這個特性傳輸訊號。

用示波器分別記錄發射模組的Din(CH1)和R4(CH2)腳位,所得波形和電路設計結果一致:
紅外線接收模組的電路如下所示 ,透過紅外線接收器(FM6038)將38KHz的載波訊號解調,所得到的解調訊號,經過CD4528推動LED,由於CD4528的A接LOW,由真值表得知,當/B為下源觸發時,Q為HIGH,LED會閃一下,可用來偵測是否有訊號接收並解調成功。

接收器具Internal Pull-Up Output特性,平時輸出為HIGH,當發射器送出下源訊號觸發後,接收器拉LOW開始解調,由於接收器會把訊號反向,因此當訊號包含38KHz載波時,會解得LOW,當訊號不含載波時,會解調得HIGH訊號,如下圖所示 (參考來源)
用示波器分別記錄發射模組的R4(CH1)和接收模組的Dout(CH2)腳位,所得波形和電路設計結果一致,詳細的接收器datasheet請參考這邊。
綜合以上發射和接收模組的動作,我們得知當傳送模組Din訊號拉LOW後,訊號開始傳輸,傳輸結果於Dout輸出,用示波器分別量測發射器Din和接收器Dout,可得兩個波型一致的結果:
====================範例實作====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
本實作需要兩個Arduino模組,一邊傳送一邊接收,發射端裡用鍵模組的上/下/左/右鍵產生訊號,經過紅外線傳輸後,結果顯示在接收端的串列埠視窗
(1)當按下PB0時,透過紅外線傳輸,串列埠視窗顯示"UP"
(2)當按下PB1時,透過紅外線傳輸,串列埠視窗顯示"LEFT"
(3)當按下PB3時,透過紅外線傳輸,串列埠視窗顯示"RIGHT"
(4)當按下PB4時,透過紅外線傳輸,串列埠視窗顯示"DOWN"
接線:
(1) 電源線連接
[發射端]如下圖所示,連接的說明請看這篇文章 或簡易版
[接收端]如下圖所示,連接的說明請看這篇文章 或簡易版
(2) 訊號線連接
[發射端]
Arduino_D2 ===> 按鍵模組_PB0
Arduino_D3 ===> 按鍵模組_PB1
Arduino_D4 ===> 按鍵模組_PB3
Arduino_D5 ===> 按鍵模組_PB4
Arduino_Tx ===> 紅外線發射模組_Din
(註:我們直接利用UART協定傳輸紅外線資料,因此紅外線的發射端接到Arduino Tx)
[接收端]
Arduino_Rx ===> 紅外線發射模組_Dout
(註:我們直接利用UART協定傳輸紅外線資料,因此紅外線的接收端接到Arduino Rx)
完成接線後的發射接收端如下圖所示,發射和接收端大約距離10公分!
範例程式:
[發射端]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/7/14 | |
// Faya-Nugget 範例程式 (IRTransmitter_1.ino) | |
// 單元: 模組介紹:faya紅外線發射/接收模組 | |
// 網址: https://fayalab.blogspot.com/2017/07/fayaIrDA.html | |
// 目標: (1)當按下PB0時,透過紅外線傳輸,串列埠視窗顯示"UP" | |
// (2)當按下PB1時,透過紅外線傳輸,串列埠視窗顯示"LEFT" | |
// (3)當按下PB3時,透過紅外線傳輸,串列埠視窗顯示"RIGHT" | |
// (4)當按下PB4時,透過紅外線傳輸,串列埠視窗顯示"DOWN" | |
// 接線: Arduino ==> faya模組 | |
// D2 ==> PB0 (按鍵模組) | |
// D3 ==> PB1 (按鍵模組) | |
// D4 ==> PB3 (按鍵模組) | |
// D5 ==> PB4 (按鍵模組) | |
// Tx ==> Din (紅外線發射模組) | |
//定義Arduino與模組的連接腳位 | |
int PB_0 = 2; | |
int PB_1 = 3; | |
int PB_3 = 4; | |
int PB_4 = 5; | |
void setup() | |
{ | |
Serial.begin(2400); //2400 baud rate | |
pinMode(PB_0,INPUT); //設定上下左右四鍵為輸入 | |
pinMode(PB_1,INPUT); | |
pinMode(PB_3,INPUT); | |
pinMode(PB_4,INPUT); | |
} | |
void loop() | |
{ | |
if(digitalRead(PB_0)==HIGH) //偵測到按[上]鍵時 | |
{ | |
Serial.write("UP\n"); //串列埠送出"UP"字串 | |
} | |
if(digitalRead(PB_1)==HIGH) //偵測到按[左]鍵時 | |
{ | |
Serial.write("LEFT\n"); //串列埠送出"LEFT"字串 | |
} | |
if(digitalRead(PB_3)==HIGH) //偵測到按[右]鍵時 | |
{ | |
Serial.write("RIGHT\n"); //串列埠送出"RIGHT"字串 | |
} | |
if(digitalRead(PB_4)==HIGH) //偵測到按[下]鍵時 | |
{ | |
Serial.write("DOWN\n"); //串列埠送出"DOWN"字串 | |
} | |
delay(350); //延遲350毫秒,可除彈跳並延遲重複發送時間 | |
} |
備註:
- L25 : Serial.begin(2400); 設定串列埠傳輸速度為2400 bps,經測試,4800bps也能順利傳輸,但9600 bps則會有亂碼產生!
- L36/41/46/51 : 此指令會將字串值些送往串列埠Tx,由於我們的接線將Arduino Tx直接連到紅外線發射模組的Din,因此這些經過串列傳輸協定(UART Protocol) 的字串就跟著38KHz的調變,透過紅外線發射至空氣中了!
[接收端]
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 2017/7/14 | |
// Faya-Nugget 範例程式 (IRReceiver_1.ino) | |
// 單元: 模組介紹:faya紅外線發射/接收模組 | |
// 網址: https://fayalab.blogspot.com/2017/07/fayaIrDA.html | |
// 目標: (1)當按下PB0時,透過紅外線傳輸,串列埠視窗顯示"UP" | |
// (2)當按下PB1時,透過紅外線傳輸,串列埠視窗顯示"LEFT" | |
// (3)當按下PB3時,透過紅外線傳輸,串列埠視窗顯示"RIGHT" | |
// (4)當按下PB4時,透過紅外線傳輸,串列埠視窗顯示"DOWN" | |
// 接線: Arduino ==> faya模組 | |
// Rx ==> Dout (紅外線接收模組) | |
void setup() | |
{ | |
Serial.begin(2400); //2400 baud rate | |
} | |
char dataRead = 0; //資料暫存宣告 | |
void loop() | |
{ | |
if (Serial.available() > 0) //判斷Rx是否有資料進來 | |
{ | |
dataRead = Serial.read(); //讀取Rx資料 | |
Serial.print(dataRead); //由Serial Monitor顯示讀取到的資料 | |
} | |
} |
備註:
- L14 : Serial.begin(2400); 設定串列埠傳輸速度和發射端一致的2400 bps,記得開串列埠視窗也要選擇2400bps,才不會有亂碼產生。
- L22~L25 : 接收器解調了空中帶有38KHz載波的調變訊號,還原為帶有UART通訊協定的字串,Serial.read() 將字串讀出,並用Serial.print()指令將字串輸出到串列埠視窗。
範例結果:
將以上兩個程式各自上傳成功後,開啟接收端的串列埠視窗(記得選對COM Port),就會得到以下的結果!
討論:
(1) 在這個範例,我們透過串列埠傳輸(UART)的協定,將訊號由發射端經過紅外線模組成功的送至接收端,Arduino本身也提供紅外線協定的副程式讓大家使用,我們會在未來做示範。
(2) 本範例的傳輸距離大約10公分,大家可試試看最遠的傳輸距離,或者用板子將發射與接收器隔開,觀察會發生什麼情況。
(3) 傳輸的結果如發生亂碼(如下圖),可能的原因有二 (A) 載波偏離38KHz太遠,請調整發射器的可變電阻,沒有示波器可觀察載波頻率的人,可把可變電阻的箭頭指向9點鐘位置。(B) 串列埠視窗右下角的baud rate設定為和程式未一致,我們在程式設定2400 bps,因此視窗中也要設定此數值 (2400 baud)。
歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言