使我們的項目無線化總是讓它看起來很酷,并擴展了可以控制的范圍。從使用普通紅外 LED 進行短距離無線控制到 ESP8266 進行全球 HTTP 控制,有很多方法可以無線控制某些東西。在本項目中,我們將學習如何使用 433 MHz RF 模塊和 AVR 微控制器構建無線項目。
在這個項目中,我們做以下事情:-
我們將 Atmega8 用于射頻發射器,將Atmega8用于射頻接收器部分。
我們將 LED 和按鈕與 Atmega8 微控制器連接。
在發射器方面,我們將按鈕與Atmega連接并傳輸數據。在接收器側,我們將無線接收數據并在LED上顯示輸出。
接收頻率為433Mhz,使用市場上廉價的RF TX-RX模塊。
所需組件
Atmega8 AVR 微控制器 (2)
10 針 FRC 電纜
面包板 (2)
發光二極管 (2)
按鈕 (1)
HT12D 和 HT12E 對
射頻模塊
電阻器 (10k,47k,1M)
跳線
5V電源
使用的軟件
我們使用CodeVisionAVR軟件編寫代碼,使用SinaProg軟件使用USBASP程序員將代碼上傳到Atmega8。
在介紹原理圖和代碼之前,讓我們先了解RF模塊與編碼器-解碼器IC的工作原理。
433MHz 射頻發射器和接收器模塊
這些是我們在項目中使用的發射器和接收器模塊。它是433 MHz最便宜的模塊,這些模塊在一個通道中接受串行數據。
如果我們看到模塊的規格,變送器的額定工作電壓為3.5-12V,發射距離為20-200米。它確實以433 MHz 頻率的 AM(音頻調制)協議傳輸。我們可以以 4KB/S 的速度以 10mW 的功率傳輸數據。
在上圖中,我們可以看到發射器模塊的引腳。從左到右,引腳是VCC,DATA和GND。我們還可以添加天線并將其焊接在上圖中表示的點上。
對于接收器規格,接收器的額定電壓為5V 直流,靜態電流為 4MA作為輸入。接收頻率為433.92 MHz,靈敏度為-105DB。
在上圖中,我們可以看到接收器模塊的引腳。四個引腳從左到右依次為VCC、數據、數據和GND。中間的兩個引腳在內部連接。我們可以使用任何一個或兩個。但是,最好同時使用兩者來降低噪聲耦合。
此外,數據表中沒有提到一件事,模塊中間的可變電感或POT用于頻率校準。如果我們無法接收傳輸的數據,則發射和接收頻率可能不匹配。這是一個射頻電路,我們需要將發射器調諧到完美的發射頻率點。此外,與發射器相同,該模塊也有一個天線端口;我們可以以線圈形式焊接焊絲,以獲得更長的接收時間。
傳輸范圍取決于提供給發射器的電壓和兩側天線的長度。對于這個特定的項目,我們沒有使用外部天線,而是在發射器側使用了5V。我們檢查了5米的距離,效果很好。
電路圖
射頻發射器側電路圖
引腳 D7 的 atmega8 -> 引腳 13 HT12E
引腳 D6 的 atmega8 -> 引腳 12 HT12E
atmega8 的引腳 D5 -> 引腳 11 HT12E
引腳 D4 的 atmega8 -> 引腳 10 HT12E
按鈕固定 Atmega 的 B0。
HT12E 引腳 15 和 16 之間的 1M 歐姆電阻。
HT12E 的引腳 17 連接到射頻發射器模塊的數據引腳。
HT12E 至 5V 的引腳 18。
HT12E 的 GND 引腳 1-9 和引腳 14 以及 Atmega 的引腳 8。
射頻接收器側電路圖
atmega8 的引腳 D7 -> 引腳 13 HT12D
引腳 D6 的 atmega8 -> 引腳 12 HT12D
引腳 D5 的 atmega8 -> 引腳 11 HT12D
引腳 D4 的 atmega8 -> 引腳 10 HT12d
LED 連接到 Atmega 的引腳 B0。
HT12D的引腳14到射頻接收器模塊的數據引腳。
HT12D 引腳 15 和 16 之間的 47Kohm 電阻。
HT12D 的 GND 引腳 1-9 和 Atmega 的引腳 8。
LED 連接到 HT12D 的引腳 17。
5V 至 Atmega 的引腳 7 和 HT12D 的引腳 18。
使用 CodeVision 為 Atmega 8 創建項目
安裝這些軟件后,請按照以下步驟創建項目并編寫代碼:
第 1 步。打開 CodeVision 單擊“文件 -> 新建”-> 項目。將出現確認對話框。點擊是
第 2 步。代碼向導將打開。單擊第一個選項,即 AT90,然后單擊確定。
第 3 步。選擇您的微控制器芯片,在這里我們將采用如圖所示的Atmega8。
第 4 步:-單擊端口。在變送器部分,按鈕是我們的輸入,輸出4條數據線。因此,我們必須初始化 Atmega 的 4 個引腳作為輸出。單擊端口 D.通過單擊使位 7、6、5 和 4 輸出。
第 5 步:-單擊程序 - >生成,保存并退出。現在,我們一半以上的工作已經完成
第 6 步:-在桌面上創建一個新文件夾,以便我們的文件保留在文件夾中,否則它將分散在整個桌面窗口中。根據需要命名您的文件夾,我建議使用相同的名稱來保存程序文件。
我們將有一個接一個的三個對話框來保存文件。對保存第一個對話框后將出現的其他兩個對話框執行相同的操作。
現在,您的工作區如下所示。
我們的大部分工作都是在向導的幫助下完成的。現在,我們只需要為發射器和接收器部分編寫幾行代碼,就是這樣......
按照相同的步驟為接收器部分創建文件。在接收器部分,只有 Led 是我們的輸出,因此使端口 B0 位輸出。
代碼和解釋
我們將編寫使用 RF 無線切換 LED的代碼。本文末尾給出了發射器和接收器側的 Atmega 的完整代碼。
射頻發射器的 Atmega8 代碼:
首先包含delay.h頭文件以在我們的代碼中使用 delay。
#include
#include
void main(void)
{
現在,來到代碼的最后一行,您將在其中找到一個 while循環。我們的主代碼將在此循環中。
在 While 循環中,我們將在按下按鈕時將0x10字節發送到 PORTD,并在未按下按鈕時發送0x20。您可以使用任何值進行發送。
while (1)
{
if(PINB.0 == 1) {
PORTD = 0x10;
}
if(PINB.0 == 0) {
PORTD = 0x20;
}
}
}
射頻接收器的Atmega代碼
首先在 void main 函數上方聲明變量,用于存儲來自 RF 模塊的傳入字符。
#include
#include
#include
unsigned char byte = 0;
void main(void) {
現在來到while循環。在此循環中,將傳入字節存儲到 char 變量字節,并檢查傳入字節是否與我們在發射器部分中寫入的字節相同。如果字節相同,請將端口 B.0設置為高電平,而不是使用 PORTB.0 來切換 LED。
while (1)
{
byte = PIND;
if(PIND.7==0 && PIND.6==0 && PIND.5==0 && PIND.4==1)
{
PORTB.0 = ~PORTB.0;
delay_ms(1000);
} } }
構建項目
我們的代碼完成了。現在,我們必須構建我們的項目。單擊“構建項目”圖標,如下所示。
構建項目后,將在調試> Exe文件夾中生成一個十六進制文件,該文件可以在您之前為保存項目而創建的文件夾中找到。我們將使用此十六進制文件通過Sinaprog軟件上傳到Atmega8中。
將代碼上傳到 Atmega8
根據給定的圖表連接電路以編程Atmega8。將FRC電纜的一端連接到USBASP編程器,另一端將連接到微控制器的SPI引腳,如下所述:
FRC 母連接器引腳 1 -> 引腳 17,Atmega8 的 MOSI
引腳 2 連接到 atmega8 的 Vcc,即引腳 7
引腳 5 連接到 atmega8 的復位,即引腳 1
引腳 7 連接到 atmega8 的 SCK,即引腳 19
引腳 9 連接到 atmega8 的 MISO,即引腳 18
引腳 8 連接到 atmega8 的 GND,即引腳 8
按照電路圖連接試驗板上的其余組件,然后打開Sinaprog。
我們將使用Sinaprog上傳上面生成的十六進制文件,因此打開它并從設備下拉菜單中選擇 Atmega8。從調試> Exe 文件夾中選擇十六進制文件,如下所示。
現在,單擊程序。
您已完成,您的微控制器已編程。使用相同的步驟在接收器側對另一個Atmega進行編程。
Code for Transmitter Part:
#include
#include
void main(void)
{
DDRB=(0<
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTB=(0<
// Port C initialization
// Function: Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(1<
// State: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(1<
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<
while (1)
{
if(PINB.0 == 1) {
PORTD = 0x10;
}
if(PINB.0 == 0) {
PORTD = 0x20;
}
}
}
Code for Receiver Part:
#include
#include
// Declare your global variables here
unsigned char byte = 0;
unsigned char lightON = 0;//light status
int LED_status = 0;
void main(void)
{
// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(0<
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=0 Bit0=0
PORTB=(0<
// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<
while (1)
{
byte = PIND;
if(PIND.7==0 && PIND.6==0 && PIND.5==0 && PIND.4==1 && LED_status==0)
{
PORTB.0 = ~PORTB.0;
delay_ms(1000);
}
}
}
-
微控制器
+關注
關注
48文章
7564瀏覽量
151509 -
HTTP
+關注
關注
0文章
510瀏覽量
31293 -
ESP8266
+關注
關注
50文章
962瀏覽量
45087
發布評論請先 登錄
相關推薦
評論