學習目標 : 認識faya RF發射接收模組的功能及使用方式
學習時間 : 45mins
示範模組 : (1) fayaduino Nano(x2)
(2) faya RF發射模組
(3) faya RF接收模組
====================功能介紹====================
faya RF發射與接收模組透過簡單的接線,從Arduino的函式下指令,就能輕鬆的傳送和讀取資料,完全不需要有藍芽或Wifi背景知識,使用起來非常方便。
faya RF發射模組外觀如下圖,它的左邊兩個埠分別是Din和NC(No Connection - 無作用),Din用來接收來自Arduino的數位訊號,內部電路將訊號調變至315MHz的頻段由天線 (ANT)發射設至空氣中。
faya RF接收模組外觀如下圖,它的右邊兩個埠分別是Dout和NC,天線接收到空氣中315MHz頻段訊號後,利用內部的電路還原回數位訊號,然後從Dout埠傳給Arduino接收處理。
注意到我們這個範例需要用到VirtualWire函式庫,函式中以預先設定好腳位,因此連接線路時必須跟著預設腳位連接
Arduino D12 --- RF發射_Din
Arduino D11 --- RF接收端Dout
====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
本電路將發射訊號
RF發射模組:本電路將發射訊號
利用315MHz晶體產生在315MHz的諧振電路,並將數位訊號以ASK(Ampliture Shift Keying)調變的方式傳送至空氣中。
電路圖如下所示:
RF接收模組:
電路主角為MICRF002BM RF接收IC,此IC接收頻段為300~440Mhz,按照Datasheet的建議,選擇周邊電阻/電容/電感零件,就能接收315MHz頻段的ASK訊號,並將此ASK訊號解調還原成基頻的數位訊號,詳細資料可以參考Datasheet - 這裡。
====================範例實作(一)====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
(1)利用Arduino產生"HELLO WORLD"字串,並透過RF發射模組發射目標:
(2)利用Serial Monitor,查看RF接收模組的資訊
接線:
(3) 訊號線連接 (RF接收模組)
D11 ==> RF接收模組_Dout
範例程式:
本模組需要使用[VirtulWire]函式庫來傳輸高頻訊號,函式庫可在此[下載],請在下載後解壓縮在Arduino的Libraries資料夾,重新開啟Arduino後即可使用。
不像藍芽或WiFi傳輸,有些通訊傳輸電路為了成本和功能考量,設計得比較不嚴謹 (也不需要那麼嚴謹),此時可以利用VirtualWire函式庫輔助訊號完成的傳輸,例如訊號的同步、 錯誤檢查等等,讓訊號能夠完整的傳送和接收。VirtualWire詳細介紹可以參考這邊,Datasheet可由此下載。
發射端:
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
// 2019/01/11 | |
// Faya-Nugget 範例程式 (RF_Transmitter_1.ino) | |
// 單元: 模組介紹-faya RF發射模組 | |
// 網址: https://fayalab.blogspot.com/2019/01/RFTransceiver.html | |
// 目標: (1)利用Arduino產生"HELLO WORLD!!!"字串,並透過RF發射模組發射 | |
// (2)利用Serial Monitor,查看RF接收模組的資訊 | |
// 接線: Arduino ==> faya模組 | |
// D12 ==> Din (RF發射模組) | |
#include <VirtualWire.h> //匯入library | |
void setup() | |
{ | |
vw_setup(2000); // 設定RF傳輸速率 (Bits per sec) | |
} | |
void loop() | |
{ | |
const char *msg = "HELLO WORLD!!!"; //輸入你想發送的訊息資訊 | |
digitalWrite(13, true); // 發送資料前先點亮內建LED燈 | |
vw_send((uint8_t *)msg, strlen(msg)); // 使用vw_send()函式傳送發送字串 | |
vw_wait_tx(); // 使用vw_wait_tx();函式,等待直到全部的字串傳輸完成 | |
digitalWrite(13, false); // 發送資料結束後關閉內建LED燈 | |
delay(2000); | |
} |
備註:
- L14 : 和UART一樣,發射和接收端的傳輸速率要一致
- L19~24 : 發送字串的指令使用方式固定,需要用到此模組時,修改要傳送的資訊(L19)即可
接收端:
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
// 2018/02/06 | |
// Faya-Nugget 範例程式 (RF_Receiver_1.ino) | |
// 單元: 模組介紹-faya RF接收模組 | |
// 網址: https://fayalab.blogspot.com/2019/01/RFTransceiver.html | |
// 目標: (1)利用Arduino產生"HELLO WORLD!!!"字串,並透過RF發射模組發射 | |
// (2)利用Serial Monitor,查看RF接收模組的資訊 | |
// 接線: Arduino ==> faya模組 | |
// D11 ==> Dout (RF接收模組) | |
#include <VirtualWire.h> //匯入library | |
void setup() | |
{ | |
Serial.begin(9600); // budrate = 9600 | |
vw_setup(2000); // 設定RF傳輸速率 (Bits per sec) | |
vw_rx_start(); // 開始接收資料 | |
} | |
void loop() | |
{ | |
uint8_t buf[VW_MAX_MESSAGE_LEN]; //設定字串緩衝區 (預設為40個字元) | |
uint8_t buflen = VW_MAX_MESSAGE_LEN; //緩衝區長度變數,用來記錄接收到多少字元,初始值為最大值 | |
if (vw_get_message(buf, &buflen)) // 使用vw_get_message()函式開始接收資料 | |
{ | |
int i; | |
digitalWrite(13, HIGH); // 開始接收資料時先點亮內建LED燈 | |
for (i = 0; i < buflen; i++) | |
{ | |
Serial.write(buf[i]); // 將接收到的字元一個一個印到超級終端機 | |
} | |
Serial.print(" Buffer Length = "); | |
Serial.println(buflen); //印出緩衝區總長度 | |
digitalWrite(13, LOW); | |
} | |
} |
備註:
- L21 : 接收資料需要設定資料緩衝區大小,此大小定義在 Libraries資料夾內的 VirtualWire_Config.h,預設值為40個字元,如果預期傳輸的資料大於此字元時,可自行更改
- L24~35: 發送字串的指令使用方式固定,需要用到此模組時,直接套用即可。
範例結果:
將發射和接收程式分別上傳到兩邊的Arduino,傳送和接受資料的期間,兩邊Arduino的內建LED都會亮起。
將發射和接收程式分別上傳到兩邊的Arduino,傳送和接受資料的期間,兩邊Arduino的內建LED都會亮起。

討論:
- 連接此RF模組時,發現當天線往Arduino主板方向時擺設的話,會有接收不良的情況發生,所以請朝外擺設可以讓收訊更良好唷。
- 在沒有阻擋的情形下,筆者能夠穩定的的收到5公尺外的發射訊號,實際上應該可以更遠,前提是用比較好的電源來源,例如筆電的電源或者高品質的USB插座電源,筆者用過低品質的行動電源,傳輸距離超過1.5公尺後,接收到的資料就斷斷續續了
- 本篇範例介紹大家如何簡單的傳輸字串,大家可以把發射端連上搖桿或按鈕,讓搖桿和按鈕的狀態對應到相對地字串指令,接收端收到指令後再進行指令解碼,這樣一個簡單的遙控器就完成囉!
====================================
fayalab 粉絲團
FB本篇留言版
沒有留言:
張貼留言