大家好,今天在这个项目中,我们将RF接收器和发送器模块与PIC微控制器接口,并在两个不同的pic微控制器之间进行无线通信。
在这个项目中,我们将做以下事情:
- 我们将在发送器中使用PIC16F877A,在接收器部分中使用PIC18F4520。
- 我们将把键盘和LCD与PIC微控制器连接。
- 在发送器端,我们将使用PIC接口键盘并发送数据。在接收器端,我们将无线接收数据并在LCD上显示按下了哪个键。
- 我们将使用编码器和解码器IC来传输4位数据。
- 使用市场上便宜的RF TX-RX模块,接收频率将为433Mhz。
在讨论原理图和代码之前,让我们了解带有编码器-解码器IC的RF模块的工作原理。另请阅读以下两篇文章,以了解如何将LCD和键盘与PIC微控制器连接:
- 使用MPLABX和XC8与PIC单片机进行LCD接口
- 与PIC微控制器接口的4x4矩阵键盘
433MHz射频发送器和接收器模块:
这些是我们在项目中使用的发送器和接收器模块。它是可用于433 MHz的最便宜的模块。这些模块在一个通道中接受串行数据。
如果我们看到模块的规格,则发射器的额定输入电压为3.5-12V ,发射距离为20-200米。它确实以433 MHz频率以AM(音频调制)协议进行传输。我们可以在10mW功率下以4KB / S的速度传输数据。
在上图中,我们可以看到发送器模块的引脚排列。引脚从左到右分别是VCC,DATA和GND。我们还可以添加天线并将其焊接在上图所示的点上。
对于接收器规格,接收器具有5V dc额定值和4MA静态电流作为输入。接收频率为433.92 MHz,灵敏度为-105DB。
在上图中,我们可以看到接收器模块的引脚排列。四个引脚从左到右分别是VCC,DATA,DATA和GND。中间的两个引脚内部连接。我们可以使用任何一个或两个。但最好同时使用这两种方法来降低噪声耦合。
另外,数据表中未提及一件事,模块中间的可变电感器或POT用于频率校准。如果我们无法接收到发送的数据,则发送和接收频率可能不匹配。这是一个射频电路,我们需要在理想的发射频率点上调节发射器。同样,与发射器一样,该模块还具有一个天线端口。我们可以焊接成线圈形式的导线,以延长接收时间。
传输范围取决于提供给发射机的电压和两侧天线的长度。对于此特定项目,我们没有使用外部天线,而是在发射器端使用了5V。我们检查了5米的距离,它运行良好。
射频模块对于远程无线通信非常有用。此处显示了基本的RF发射器和接收器电路。我们使用RF模块进行了许多项目:
- 射频控制家用电器
- 使用Arduino的蓝牙控制玩具车
- 使用Raspberry Pi的RF远程控制LED
需要编码器和解码器:
该射频传感器具有以下缺点:-
- 单向沟通。
- 只有一个频道
- 噪声干扰很大。
由于这个缺点,我们使用了编码器和解码器IC HT12D和HT12E。D代表将在接收方使用的解码器,E代表将在发送方使用的编码器。该IC提供4个通道。同样由于编码和解码,噪声水平非常低。
在上图中,左一个是HT12D解码器,右一个是HT12E编码器。两种IC均相同。A0至A7用于特殊编码。我们可以使用微控制器引脚来控制这些引脚并设置配置。另一侧需要匹配相同的配置。如果两种配置均正确且匹配,则我们可以接收数据。这8个引脚可以连接到Gnd或VCC或保持开路。无论我们在编码器中进行什么配置,我们都需要匹配解码器上的连接。在这个项目中,我们将打开编码器和解码器的那8个引脚。 9和18引脚分别为VSS和VDD。我们可以在其中使用VT引脚HT12D作为通知目的。对于这个项目,我们没有使用它。的TE引脚用于传输启用或禁用引脚。
重要的部分是我们需要连接电阻的OSC引脚,以便为编码器和解码器提供振荡。解码器需要比解码器更高的振荡。通常,编码器电阻值为1Meg,解码器值为33k。我们将在项目中使用这些电阻。
DOUT引脚是HT12E上的RF发送器数据引脚,而HT12D中的DIN引脚用于连接RF模块数据引脚。
在HT12E中, AD8至AD11是四通道输入,它通过RF模块进行转换和串行传输,而确切的反向情况发生在HT12D中,即接收和解码了串行数据,并且在4个引脚D8至D11上获得了4位并行输出。
所需组件:
- 2-面包板
- 1-液晶屏16x2
- 1 –键盘
- HT12D和HT12E对
- RX-TX射频模块
- 1- 10K预设
- 2 – 4.7k电阻
- 1- 1M电阻
- 1- 33k电阻
- 2- 33pF陶瓷电容器
- 1 – 20Mhz晶体
- Bergsticks
- 单绞线很少。
- PIC16F877A单片机
- PIC18F4520单片机
- 用于控制频率罐的螺丝起子需要与人体绝缘。
电路原理图:
发射器侧(PIC16F877A)的电路图:
我们已将PIC16F877A用于发送目的。的六角键穿过连接PORTB和4个信道跨越的最后4位连接PORTD。在此处了解有关连接4x4矩阵键盘的更多信息。
针脚如下:
1. AD11 = RD7
2. AD10 = RD6
3. AD9 = RD5
4. AD8 = RD4
接收器侧(PIC18F4520)的电路图:
在上图中,显示了接收器电路。该LCD跨连接PORTB。在该项目中,我们使用了PIC18F4520的内部振荡器。的4个信道,因为我们在发射机电路做之前所连接的相同的方式。在此处了解有关将16x2 LCD与PIC微控制器连接的更多信息。
这是发射机端-
和接收器端在单独的面包板上-
代码说明:
该代码分为两部分,一部分用于发送器,另一部分用于接收器。您可以从此处下载完整的代码。
PIC16F877A射频发射器代码:
和往常一样,我们需要在pic微控制器中设置配置位,定义一些宏,包括库和晶体频率。编码器ic的AD8-AD11端口在PORTD处定义为RF_TX。您可以在末尾给出的完整代码中检查所有代码。
我们使用了两个函数, void system_init(void) 和 void encode_rf_sender(字符数据)。
该 system_init 用于销初始化和键盘初始化。从键盘库调用键盘初始化。
键盘端口也定义在keyboard.h中。我们使用TRISD = 0x00将PORTD设置为输出,并将RF_TX端口设置为0x00作为默认状态。
void system_init(void){ TRISD = 0x00; RF_TX = 0x00; keyboard_initialization(); }
在 encode_rf_sender中, 我们根据所按下的按钮更改了4引脚状态。我们已经创建了 16种不同的 十六进制值或 PORTD状态,具体取决于( 4x4)按下了16种不同的按钮。void encode_rf_sender(char data){ if(data =='1') RF_TX = 0x10; if(data =='2') RF_TX = 0x20; if(data =='3') …………。.. …。…。
在 main 函数中,我们首先使用 switch_press_scan() 函数接收键盘按下的数据,并将数据存储在key变量中。之后,我们使用 encode_rf_sender() 函数并更改了PORTD状态对数据进行了编码。
PIC18F4520 射频接收器的代码:
与往常一样,我们首先将PIC18f4520中的配置位置1。它与PIC16F877A稍有不同,您可以检查随附的zip文件中的代码。
我们包含了LCD头文件。使用#define RF_RX PORTD线在PORTD上定义了解码器IC的D8-D11端口连接,该连接与“编码器”部分中使用的连接相同。LCD端口声明也在lcd.c文件中完成。
#包括
由于我们使用内部振荡器为如前所述18F4520,我们已经使用 系统 _初始化 函数,其中我们配置OSCON的18F4520的寄存器来设置内部振荡器为8兆赫。我们还将LCD引脚和解码器引脚的TRIS位置1。由于HT - 12D在D8-D11端口提供输出,因此我们需要将PORTD配置为输入以接收输出。
void system_init(void){ OSCCON = 0b01111110; // 8Mhz,,intosc // OSCTUNE = 0b01001111; // PLL使能,最大预分频器8x4 = 32Mhz TRISB = 0x00; TRISD = 0xFF; //最后4位作为输入位。 }
我们将OSCON寄存器配置为8 MHz,同时将端口B作为输出,将端口D作为输入。
下面的功能是使用前面的发送器部分中使用的确切反向逻辑实现的。在这里,我们从端口D获得相同的十六进制值,并通过该十六进制值来确定在发送器部分中按下了哪个开关。我们可以识别每个按键,并将相应的字符提交到LCD。
void rf_analysis(unsigned char recived_byte){ if(recived_byte == 0x10) lcd_data('1'); if(recived_byte == 0x20) lcd_data('2'); if(recived_byte == 0x30) ……。….. ………………..
该lcd_data从所谓lcd.c文件。
在 主要 功能中,我们首先初始化系统和LCD。我们获取了一个可变字节,并存储了从端口D接收到的十六进制值。然后,通过功能 rf_analysis, 我们可以在LCD上打印字符。
void main(void){ unsigned char byte = 0; system_init(); lcd_init(); while(1){ lcd_com(0x80); lcd_puts(“ CircuitDigest”); lcd_com(0xC0); 字节= RF_RX; rf_analysis(byte); lcd_com(0xC0); } return; }
在运行之前,我们已经对电路进行了调谐。首先,我们按下了键盘上的“ D ”按钮。因此,RF发射器正在连续发射0xF0。然后,我们调整接收器电路,直到LCD显示字符“ D ”为止。有时会从制造商那里正确调整模块,有时会没有。如果一切均已正确连接,并且在LCD中未获得按下按钮的值,则可能是RF接收器未调谐。我们使用绝缘螺丝起子来减少由于人体感应引起的错误调整。
这样,您可以将RF模块连接到PIC单片机,并使用RF Sensor在两个PIC单片机之间进行无线通信。
您可以从此处下载发送器和接收器的完整代码,也可以查看下面的演示视频。