433MHz无线通信--模块RXB90

该文介绍了433MHz接收模块RXB90,自定义编码规则及使用示波器捕捉信号的方法。文章详细展示了如何通过编程解析信号,包括识别同步码、提取数据和解码过程,特别关注了一个4位按钮发射的信号模式及其对应的解码函数实现。
摘要由CSDN通过智能技术生成

1、接收模块RXB90简介

两个数据输出是联通的。
在这里插入图片描述

2、自定义一个编码解码规则

组数据为“0x88 0x03 0xBD 0xB6”。
在这里插入图片描述

3、发射模块

如何使用示波器得到捕捉一个周期的图像?
通过date引脚连接示波器CH1,以及示波器探针的接地端接芯片的GND,分别一直长按1~4,得到每个按键的波形。
在这里插入图片描述
4个波形的整体特征
在这里插入图片描述
四个波形的各自特征

在这里插入图片描述
将方波缩短后如下图:
在这里插入图片描述

可以发现4个按钮发射出的信号分别为
11000010010100110010 00010
11000010010100110010 00100
11000010010100110010 01000
11000010010100110010 10000

4、编程

1)鉴别出同步码Td:

2)提取数据:

3)代码示例

/**
 * @brief 433解码函数 
 *   每50us执行一次。
 */
void RX_DATA1(void)
{   
    /* 查看接收到的电平 */
	if (HAL_GPIO_ReadPin(RF_GPIO_PORT,RF_PIN) == RESET) 
	{   // 检测到低电平
		ll_w++;   // 检测到低电平 低电平时间加1,记录本次电平状态old_rc5为0
		old_rc5 =0; 		
	} 
	else         
	{   // 检测到高电平
		hh_w++;
		if (!old_rc5)  					
		{   // 检测到从低到高的跳变	
			if( (tb_ok == 0)  && (ll_w>=160)) 
			{   // 最长12ms的同步码Td被检测到8ms
				lead_L = ll_w/31;

				lead_H = lead_L*3 ;
				tb_ok = 1 ;                     // 接收到同步码
				ma_x = 0;                       // 编码位号清零
				
				bma1=0; bma2=0; bma3=0; bma4=0; // 清零临时寄存器bma
				ll_w = 0;hh_w=0; 
			}
			else if ((tb_ok==1)&&((ll_w>=(lead_H-6))&&(ll_w<=(lead_H+6)))) 
			{   // 检测到从低到高的跳变,已经接收到同步码,数据部分的低电平时间大概在474~1074us,即电平低小于高,码元是值是0 ————接收到一个码元值为0的码元   
				if(ma_x>22)
				{   // 接收到24位编码
					if(rf_ok1==0) 
					{   // 数据a临时接收成功
						mma1=bma1;         // 将接收到的编码复制到解码寄存器mma中 
					    mma2=bma2;
						mma3=bma3;
						mma4=bma4;                                                       
						rf_ok1=1;          // 通知解码子程序数据a可以解码了            
						tb_ok=0;           // 没有接收到同步码
						time1=1500;    	   // 定时75ms					                       
					}
					else
					{   // 数据b临时接收成功
						mmb1=bma1;         // 将接收到的编码复制到解码寄存器mmb中  
						mmb2=bma2;
						mmb3=bma3;
						mmb4=bma4;  						                                             
						rf_ok2=1;          // 通知解码子程序数据b可以解码了          
						tb_ok=0;           // 没有接收到同步码                                                            
					}
					
					tb_ok=0;       // 没有接收到同步码
				}
				// 码元值为0的编码位不需要置1,直接前进一格编码位号
				ma_x++;      // 前进一格编码位号
			}  
			else if ((tb_ok==1)&&((ll_w>=(lead_L-6))&&(ll_w<(lead_L+6) )))   
			{ 	// 检测到从低到高的跳变,已经接收到同步码,数据部分的低电平时间大概在0~558us,即低大于高,码元是值是1 ————接收到一个码元值为1的码元		
				switch (ma_x)
				{   // 对接收到的码元值为1的编码位置1
					case 0 : { bma1=bma1 | 0x80; 
											break; }   //遥控编码第1位
					case 1 : { bma1=bma1 | 0x40;  
											break; }
					case 2 : { bma1=bma1 | 0x20; 
											break; }
					case 3 : { bma1=bma1 | 0x10; 
											break; }
					case 4 : { bma1=bma1 | 0x08; 
											break; }
					case 5 : { bma1=bma1 | 0x04; 
											break; }
					case 6 : { bma1=bma1 | 0x02;
											break; }
					case 7 : { bma1=bma1 | 0x01; 
											break; }
					
					case 8 : { bma2=bma2 | 0x80;  
											break; }
					case 9 : { bma2=bma2 | 0x40; 
											break; }
					case 10: { bma2=bma2 | 0x20; 
											break; }
					case 11: { bma2=bma2 | 0x10; 
											break; }
					case 12: { bma2=bma2 | 0x08; 
											break; }
					case 13: { bma2=bma2 | 0x04;
											break; }
					case 14: { bma2=bma2 | 0x02; 
											break; }
					case 15: { bma2=bma2 | 0x01; 
											break; }
					
					case 16: { bma3=bma3 | 0x80; 
											break; }
					case 17: { bma3=bma3 | 0x40; 
											break; }
					case 18: { bma3=bma3 | 0x20; 
											break; }
					case 19: { bma3=bma3 | 0x10; 
											break; }
					case 20: { bma3=bma3 | 0x08; 
											break; }// 按键状态第1位
					case 21: { bma3=bma3 | 0x04; 
											break; }
					case 22: { bma3=bma3 | 0x02; 
											break; }
					case 23:  bma3=bma3 | 0x01; 
						if(!rf_ok1)
						{   // 数据a临时接收成功
							mma1=bma1;
							mma2=bma2;
							mma3=bma3;         // 将接收到的编码复制到解码寄存器mma1~3中             		 
							rf_ok1=1;          // 通知解码子程序数据a可以解码了
							time1=1500;        //设置计时器,计时时间75ms                     
						}
						else
						{   // 数据b临时接收成功
							mmb1=bma1;
							mmb2=bma2;
							mmb3=bma3;         // 将再次接收到的编码复制到解码寄存器mmb1~3中,                             
							rf_ok2=1;          // 通知解码子程序数据b可以解码了	                                                                         
						} 
						tb_ok=0;      // 没有接收到同步码
						
					
					break; 														
					
					default:
					break;
				} 
				ma_x++;   // 前进一格编码位号
				
			}
			else
			{ //接收到不符合的高-低电平序列,不0值码元,也不符合1值码元
				ma_x=0; tb_ok=0;bma1=0;bma2=0; bma3=0; hh_w=1;ll_w=0;
			}                                      
			ll_w=0;hh_w=0; 
		}        
		old_rc5=1;      // 记录本次电平状态
	}
	
	
	
	
	/* 判断是否接收连续的数据a,数据b成功 */ 
	if(rf_ok1)  
	{   
		time1--;
		if(!time1) 
			rf_ok1=0;
		if(rf_ok2) 
		{   // 数据b临时接收成功,并且数据a在75ms内成功接收过
			if((mma1==mmb1)&&(mma2==mmb2)&&(mma3==mmb3))
			{
				rf_ok=1;     //接收连续的数据a,数据b成功            
			}
			else
			{
				rf_ok=0;     //接收连续的数据a,数据b失败
			} 
			rf_ok1=0;   // 数据a临时接收失败
			rf_ok2=0;   // 数据b临时接收失败						
		}                   
	}
	
	
	
	/* 如果接收到了连续的数据a,数据b,处理它 */
	if((rf_ok))             
	{   
        rf_ok=0;            // 成功接收的连续的数据a,数据b,标记为已经使用
        RF_ADDRESS[0]=mma1;
        RF_ADDRESS[1]=mma2;
        RF_ADDRESS[2]=mma3;
        time2 = 4000;       // 设置计时器,计时时间200ms,如果计时遥控按键不松开,计时时间200ms内会一直成功接收的连续的数据a,数据b,计时器会在从4000减少到零前重置为4000
        RF_OK = 1;          // 开启定时器time2  
        Rf_Control_Data=RF_ADDRESS[2]&0x0F;  // 接收到没有处理的连续的数据a,数据b成功,更新按下的遥控按键的按键值
	}
	if( RF_OK==1)
	{
		time2--;
		if(!time2)          // 定时器time2时间到。  
		{
			RF_OK = 0;      // 关闭定时器time2  
			decode_ok=1;    // 解码成功标志,即有新增数据
		}
	}
}

4)对上述代码针对空间进行优化

### 回答1: Arduino RF 433接收模块是一种用于接收无线信号的模块,频率为433MHz。它可以与Arduino开发板一起使用,用于接收来自其他无线设备的信号,并将其转换成可用的数据。 Arduino RF 433接收模块的工作原理是接收来自发射器发送的无线信号。当接收到信号时,它会将信号转换成数字信号,并通过Arduino开发板进行处理。用户可以使用Arduino的开发环境编写程序,根据接收到的信号进行相应的操作。 Arduino RF 433接收模块的应用非常广泛。它可以用于远程控制、无线通信、安防系统、智能家居等领域。例如,我们可以使用Arduino RF 433接收模块来控制家庭电器的开关,监测温度传感器发送的数据,或者接收来自无线遥控器的指令。 使用Arduino RF 433接收模块时,我们需要注意一些事项。首先,模块的天线需要正确连接,并确保天线没有被遮挡,以保证接收信号的效果。其次,我们需要了解所使用的无线频率,并选择合适的库和程序来接收信号。最后,我们还需要进行合适的信号调试和测试,以确保接收到的信号正确且稳定。 总之,Arduino RF 433接收模块是一种功能强大且易于使用的无线接收模块。通过与Arduino开发板的配合,我们可以实现很多有趣和实用的应用,以满足不同的需求。 ### 回答2: Arduino RF 433接收模块是一种用于接收无线信号的设备,可以通过无线电频率433MHz接收来自其他设备或无线传输器发送的信号。 该模块通常由一个RF接收器和一个天线组成。RF接收器可以接收到其他设备通过433MHz频率发送的信号,并将其转换为数字信号,以便Arduino可以读取和处理。 要使用Arduino RF 433接收模块,我们首先需要通过连接天线将其与Arduino开发板相连。然后,我们可以通过编写Arduino代码来初始化和配置该模块,并在接收到信号时执行相应的操作。 使用Arduino库中的相关函数,我们可以设置接收模块的引脚,使其接收和解码来自发射器的信号。一旦接收到信号,我们可以使用Arduino的逻辑来处理数据,并根据需要执行相应的任务。例如,我们可以将接收到的信号用于控制其他设备,或将其存储到内存中以供将来使用。 Arduino RF 433接收模块在无线遥控、安全系统以及物联网等应用中具有广泛的应用。它可以与其他Arduino模块和传感器进行配合使用,以实现许多有趣和创造性的项目。 总之,Arduino RF 433接收模块是一种非常有用的设备,可用于接收和处理来自其他设备或无线传输器的无线信号,并通过Arduino来执行相应的操作。 ### 回答3: Arduino RF 433接收模块是一种能够接收无线信号的模块。它通过射频信号接收器来接收从发射器发送过来的无线信号,并将信号转换为数字信号,以便被Arduino或其他微控制器读取和处理。 Arduino RF 433接收模块通常由一个外部接收天线和一个RF接收芯片组成。接收天线用于接收来自发射器的无线信号,并将其传递到RF接收芯片。RF接收芯片负责解码和转换接收到的射频信号,将其转换为数字信号。 在使用Arduino RF 433接收模块时,我们需要首先将模块与Arduino连接。通常,我们需要将模块的VCC引脚连接到Arduino的5V引脚,将GND引脚连接到Arduino的GND引脚,将DATA引脚连接到Arduino的数字引脚。之后,我们可以使用Arduino编写代码来读取和处理接收到的射频信号。 通过编写适当的代码,我们可以将Arduino RF 433接收模块用于许多实际应用。例如,我们可以将其用于无线遥控器,将接收到的信号用于控制电机、灯光或其他设备。我们也可以将其用于无线传感器网络,接收传感器节点发送过来的数据。 总之,Arduino RF 433接收模块是一种功能强大的模块,可以接收和处理无线信号。它在各种物联网和通信应用中具有重要的作用,为我们的项目和创意提供了更多的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值