自制无线遥控器与RF模块通信

在本文中,将探讨如何利用Silabs C8051F321微控制器和常见的RF模块TX433与RX433来制作一个具有超过8个按钮的无线遥控器。这种遥控器在电子商店中随处可见,且价格相对便宜。目标是实现一种能够控制垃圾车移动垃圾箱的遥控器,这需要自己编写接收和发送代码来扩展按钮数量。

在电子商店中,经常可以看到TX433和RX433这样的RF模块,它们价格亲民且易于获取。然而,市面上的遥控器通常只有8个按钮,这限制了其应用范围。为了突破这一限制,决定自己编程制作一个具有更多按钮的遥控器。

UART通信协议的挑战

在实现无线遥控器的过程中,面临的第一个挑战是如何在C语言中读写UART,以实现无线通信。不同于Keil和Silabs等微控制器的常规方法,需要找到一种不会产生回声的方法来读取UART信号。这需要使用低级函数_getkey()和中断来控制IO。

在尝试过程中,最初从hyperterminal接收到的都是无用信号。更换了USB到串口线后,问题得到了解决。这是因为新的线缆具有反向极性,UART信号与RS232信号相反。解决这个问题的一种方法是使用MAX232或晶体管来反转极性,选择了后者。

硬件设计

在硬件设计方面,使用了Silabs的C8051F321微控制器。通过适当的修改,这种控制器也可以用于许多其他Silabs芯片。目标是实现一个传输-接收距离可达50米左右的遥控器,这需要使用15厘米的天线。在实验中,使用了2400波特率的UART,这是推荐的连接速度,以获得更好的噪声/距离比。

遥控器的工作原理

遥控器的工作原理基于发送和接收信号。发送端首先发送同步信号,然后是地址和控制字节。接收端在等待同步字符后,读取地址位和控制字节,如果它们匹配,就会触发相应的端口。如果没有按钮被按下,所有继电器都会关闭。

软件实现

遥控器的软件是在Silabs IDE 3.61.00中编写的,并使用Keil编译器ver. 8.17进行编译。当按下按钮时,c8051F321的UART会写入类似'SW01b\r'的信号,TX433模块会发送代码到接收器RX433。接收器解码后,会点亮相应通道的LED(或者如果是连接到微控制器的匹配端口输出,则脉冲继电器)。

代码示例

以下是发送端主模块的代码示例:

void main(void) { PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer) Timer0_Init(); // Initialize the Timer0 enable PORT_Init(); // Initialize Port I/O SYSCLK_Init(); // Initialize Oscillator UART0_Init(); EA = 1; // Enable global interrupts while(1) { if(LED == 0) { if(SW00 == 0) { bSwitch = 1; printf("SW00a%c", 13); } if(SW01 == 0) { bSwitch = 1; printf("SW01b%c", 13); } // ... 更多按钮的代码 ... if(bSwitch == 1) { bSwitch = 0; LED = 1; } } } }

接收端的tst_gets模块的行为如下:

void tst_gets(void) { int i = 2; // temporary int unsigned long temp_amplitude; unsigned char chksum; LED = 0; while(_getkey() != 'S'); if(_getkey() == 'W') { LED = 1; temp_amplitude = hex2char(); chksum = _getkey(); if(temp_amplitude == chksum-97) { if(temp_amplitude == 0) { P0 = 1; P1 = 0; P2 = 0; } else { // ... 更多逻辑 ... } counter = 0; } } }
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485