2014年6月18日 星期三

[ Wireless-RF ] RF433 MHZ 搭配微控制器的使用方法

網頁中所使用的零件可至露天賣場訂購:

無線發射接收模組與微控制器的連接線路

賣場的無線發射接收模組可直接使用微控制器 ( 例如,單晶片 8051、AVR 和 PIC ... 等 ) 晶片來做為編碼與解碼,連接線路非常簡單!兩端的訊號同步使用 UART ( Universal Asynchronous Receiver/Transmitter, 通用非同步收發傳輸器 ) 接腳 TxDRxD,再分別與無線發射、接收模組的 DATA 接腳連接用以傳送與接收編碼訊號,詳細接線圖如上圖所示。

圖片上所列的 AT89S51 與 AVR ATtiny2313 線路,發射與接收的程式類似,因此下面使用 AT89S51 ( Keil C ) 發射與 AVR ATtiny2313 ( AVR Studio 4 ) 接收中的原始碼做說明,完整的程式碼可在下面所提供的連結下載。

注意到電源的部分,除了 AT89S51 需要使用 +5V 的電源供應之外,根據 AVR ATtiny2313 資料手冊的第一頁關於速度與電壓的要求,可以使用的電壓範圍在 2.7 - 5.5V @ 8MHz,所以可以使用兩顆乾電池來做為 ATtiny2313 的電源,不管是做為發射端或是接收端都是可以正常工作的
  • ATtiny2313V:0 - 4 MHz @ 1.8 - 5.5V, 0 - 10 MHz @ 2.7 - 5.5V

  • ATtiny2313 :0 - 10 MHz @ 2.7 - 5.5V, 0 - 20 MHz @ 4.5 - 5.5V

無線發射模組程式碼 ( AT89S51 ):

為了確保編碼傳送可正確傳送到接收端,因此我們自行定義編碼原則。傳送的編碼分為四個位元組,每個位元組所代表的意思如下:
  • byte 1:SYNC
  • 同步訊號 ( 0xAA )

  • byte 2:RADDR
  • 定義傳送到哪一個接收端;設定是 ( 0x44 )

  • byte 3:CMD
  • 在接收端執行預先定義的動作編碼。設定是執行 LED 亮 ( 0x11 ) 和滅 ( 0x22 ) 兩個命令

  • byte 4:checksum
  • 最後一個為元式傳送檢驗和,等於 byte 2 + byte 3

AT89S51 的 baud rate 設定是 Timer1, mode 2 atuo reload, 1200 bps

主程式一開始先做暫存器初始化,然後進入無窮迴圈,每隔 100 ms 傳送 LED 亮滅的命令到位址 0x44 的接收端

UART 傳送的程式如下

tByte 是另外定義的資料型態 ( 無符號位元組,可表示 0x00 - 0xFF )

延遲副程式,延遲時間設定為 100 ms

這部分可依實際情形再做調整,怎麼計算延遲時間請找一下 8051 的書,裡面都會講到。

上面的程式也有組合語言的版本,裡面的程式結構差異不大,可互相做為參考。


無線接收模組程式碼 ( AVR ATtiny2313 ):

接收的部分我們使用 AVR ATtiny2313 做解碼與接收的晶片。程式一開始進行 IO 與 UART 初始化 ( ioinit() ),然後程式進入無窮迴圈



當一直等待 UART 接收的訊號時,其實 ATtiny2313 就會耗電,最好的方法就是讓它進入到睡眠狀態,需要的時候再叫醒它就好。因此如果想要微控制器進 IDLE MODE,就新增一個副程式,並將副程式加入到無窮迴圈裡就可以了。


進入到省電模式之後的 ATtiny2313 ,只有在中斷發生時才會被喚醒進入到中斷副程式 ( ISR(USART_RX_vect) )處理接收到的資料

不難發現到,接收解碼的部分並沒有加入同步位元的檢查程式 ( SYNC,稱為 dummy byte ),原因是即使在發射端未發出編碼訊號,接收端也會收到來自電源或其他來源的雜訊訊號。因為 RF 接收模組會依據輸入的電訊號準位 ( signal level ) 調整輸入增益,而第一個 byte ( SYNC ) 位元組可以讓緊接下來的 "raddress"、"data" 和 "chk" 的讀取更可靠;若使用其它的 RF 發送模組或許就不需要這個位元組了。


程式碼下載與測試:

  • AT89S51

  • ATtiny2313 

  • 下面檔案使用 AVR Studio 4 編譯;不同版本時請新建一個專案檔,再加入下面其中一個原始檔,設定好晶片以及環境後就可以進行編譯;或是使用連結中已編譯好的燒錄檔 (.hex)


下面是使用相同的程式碼,但使用 RF 315 MHz 無線發射接收模組所做的測試。可以知道,控制的方式大同小異。

右邊是 AT89S51 (+5V),負責發射;左邊是 ATtiny2313 (+3V),負責接收。每隔一秒鐘傳送一次命令使 LED 亮滅。注意到,只要在兩這之間有東西阻隔或是接近 (如影片中切換電源開關時),傳輸就會有遺漏,做測試時可以自己試試!
相同程式碼但使用不同的無線發射接收模組 ( RF 315 MHz ) 的測試


上面就是使用微控制器 UART 硬體功能來實現無線傳送接收的方法。其他關於無線模組應用的文章,請看下面的賣場部落格文章連結。


<<相關資料與使用說明連結>>

3 則留言:

  1. 你好~感謝作者的付出及分享,可以請問模組的 433MHz 可以用 Tektronix(太克)示波器 TDS 1012 來觀看傳輸訊號的波形嗎? Thanks~

    回覆刪除
    回覆
    1. 當然可以!看這一篇裡的說明,示波器更好
      http://ruten-proteus.blogspot.tw/2013/03/Wireless-RF-RPi-sim-HT12E.html

      刪除