再次关于433 MHz发射机和接收机

最简单的433 MHz ISM接收机和发射机组在电子爱好者中赢得了应有的欢迎。这些工具包很便宜(即使在Chip-Deep中,您也可以花300卢布买到它们,而在Ali上,他们说,通常是50美元),它们简单可靠。此外(您可能不会怀疑),这是无线数据交换的最远距离且最深入的方法-433 MHz频率的信号比障碍物更好地通过障碍物,并且其工作距离比流行的2.4 GHz频段(433 半米的混凝土墙完全延迟了 MHz ,而Wi-Fi已经死了10厘米)。我承认最近出现了MBee-868模块它们配备了合适的(定向)天线,可以进一步“射击”,但是它们至少要贵一个数量级,而且连接难度更大,需要节能管理和预配置。此外,868 MHz的频率穿过障碍物的频率是正常情况的两倍(当然,它比2.4 GHz的频率好得多)。当然,



关于433 MHz发送器和接收器(包括集线器)的文章很多。但是,似乎没有人出于某种奇怪的原因而知道如何在电路中正确包含该套件。当我再次在此处阅读该套件时,“该套件在视线范围内达到了8米,因此无法掌握9米“,我的耐心突然响起。还有什么8米?我可能以40至50的比例相信,尽管实际上,范围可能更大。

值得注意的是,我进一步解决了创建一条线来传输任意数据的问题,而不仅仅是控制任何智能插座或马达模型船。我的任务比较复杂,但是可靠操作的距离仍然更大。此外,在这样的任务中,不仅重要而且对视线内的距离不重要(它仅用于比较),而且对穿透各种障碍的能力也很重要。

我的工具包在城外以与原木壁成锐角的大约25-30米的距离工作,因此,信号路径中的墙壁和隔断(总共约一米)(部分被箔绝缘层屏蔽)总计。在更短的距离(几乎直接在墙后面),WiFi已经完全失去了信号。在城市中,信号从一个三居室城市公寓的一端通过两个内部隔断以及从阳台结束,在阳台上,发射器和接收器之间的直线上至少有80厘米的砖砌和一个石膏隔断。我没有使用上述评论中提到的任何更昂贵的套件选项。

该套件的另一个优点是,在暂停期间,发射机仅根据其设备原理就不会消耗任何东西,并且没有任何特殊的休眠模式(静止时的消耗电流可与锁定晶体管的集电极泄漏电流相当,即大约100 nA)。

让我们看看陷阱是什么。

变送器连接


如下图所示,该发射机(称为FS1000A)是基于433 MHz SAW谐振器的最简单的发生器。发生器组装在晶体管Q1上,而晶体管Q2就是数字输入的基础,在输入端存在高电平(逻辑单元)时,晶体管Q2只是将发生器连接到电源(到GND总线)的键。功率可以在5到12伏之间,根据制造商的说法,功率越高,连接的作用就越远。



我没有注意到增加营养作为工作的基本好处。但是,不应忽略这里没有特殊电源要求的事实,并且随着电压的升高,该设备将只能更好地工作。通过9-12伏适配器,电池或一组6个电池(Vin Arduino引脚)将变送器直接连接到电压很方便。在不稳定的电源(可能超过12伏)(例如电池)的情况下,我通常使用单独的9伏稳定器(您可以使用最简单的78L09)将变送器与主电路断开连接,并且在9伏和12伏之间看不到任何工作差异。使用Uno或Nano,您可以使用内置的5伏稳定器为控制器本身和其他电路(例如传感器)供电对于Mini(尤其是便宜的克隆),我建议您放置一个单独的5伏稳定器,并将其连接到5V引脚。

应该注意的是,最近出现的发射机看起来有些非标准(参见下图)。事实证明,没有L1节气门(三转),只有孔才留下,这是一种虚构,仅由相应的SMD组件代替。更糟糕的是,此选项有所不同:草率打印可能会误导数据引脚和电源的连接。正确的连接如图所示,所有选项均相同:



在这件事上最引人注目的是,当数据和电源混合在一起时,发送器继续在短距离内工作!如果看一下电路,您将了解它是什么:通过电阻将Q2基极连接到电源,晶体管始终处于打开状态,并且不影响电路的操作。电源总线上的逻辑高电平仅在适当的时间为发电机供电。荒谬之处始于一定距离-从逻辑结论可以明显看出,电源是坏的。

接收器连接


购买接收器(可能称为MX-RM-5V或XD-RF-5V)时,请注意端子的长度-我碰巧碰到了一批短针,这导致接收以最小的失真从标准PBS连接器中掉出来我必须特别重视董事会。

接收器电路要复杂得多(我不会播放它,但是您可以在这里找到它)。它应该接收并放大高频信号,滤除433 MHz的频率,隔离脉冲串并将其转换为逻辑电平。接收器有一个扼流圈(位于板的中间),但是由于没有用于测量幅度-频率特性的精确仪器,我不建议扭曲它-最有可能的是,您不会改善任何东西,而只会破坏它。

由于信号已经很近了,因此干扰将大大减少,因此很明显,我们必须处理所有方面的干扰:电路和软件方法。图书馆对我们来说是最后一件事,但是无论软件处理中使用什么数学方法,建议都先做所有事情,以使输出的逻辑单元仅在有用信号突发时出现,并且在没有干扰的情况下才出现。换句话说,最好是在接收期间从干扰中调到最大。

我的时间对每个组装至少一个收音机或放大器的学生都知道,降低噪声的标准方法是,对于对干扰敏感的节点,必须制造一个独立的电源,该电源应与其他电路最大隔离。您可以用不同的方法来做到这一点:一旦安装了一个单独的齐纳二极管,现在它们通常会使用LC滤波器隔离问题节点的电源(例如,对于ADC推荐这样做,请参见AVR控制器的数据手册)。但是在我们的条件下,当现代组件又小又便宜时,将稳定器与接收器上的其余部分分开放置会更容易。



例如,一个LP2950-5.0型稳定器,再加上两个最便宜的必需电容器(当两个电容器都是陶瓷的时,在1-3微法拉范围内),将使电路成本增加60倍。但我不想省钱:在输出处放普通陶瓷,在输入处放电解质(10-100微法拉),此外,还放固态(聚合物)或钽。如果7-12伏的输入电压来自电池或另一个模拟稳定器,则陶瓷电容器可以在任何地方和那里都省掉。脉冲稳定源和最简单的不稳定整流器需要额外的滤波。如果将0.1微法拉的陶瓷平行放置,则可以使用便宜的铝电解质,最好在几分之一或几毫单位的输入端放置一个串联电感。

稳定器应直接安装在接收器附近,导体的长度应最短。代替LP2950,您可以使用具有低直通电压的LM2931或类似产品(如果电路由电池供电,这尤其重要-对于常规LM78L05,输入电压应至少为7.5,最好为8-9伏)。

与所有出版物中推荐的直接从Arduino给接收器供电的情况相比(我从未见过例外),您会对获得的效果感到惊讶-穿透墙壁的范围和能力立即显着增加。为了方便,接收器和稳定器可以在单独的小盒子中进行携带。您可以使用最长3米甚至更长的三芯线(两个电源和一个信号导体)将其输出连接到主体中的控制器。这更加方便,因为仍然需要天线,并且根据规则,如果它们在空间上彼此平行会更好,并且不能总是放置大箱子以使天线以正确的方向伸出。

在最简单的版本中,作为天线,您可以处理横截面至少为0.5毫米,长度为17厘米±1-3毫米的单芯电线。不要使用绞合的安装线!更紧凑的螺旋天线正在销售中,但是我个人还没有测试其有效性。发射器和接收器的天线尖端均密封在板角的相应孔中(在发射器的升级版本中不要弄错-ANT这个词也不合适,请参见上图)。

生成和处理传输的数据


这是大多数关于我们主题的评论的第二个主要缺点:作者将自己局限于某些局部问题,而没有以一般的方式来表述,例如在一个包中传输任意数据。从上面的描述可以理解,我们的设备只能传输一个简单的比特序列。标准的VirtualWire以一种特殊的方式对它们进行编码(每个四位编码为6位,在前面添加一个同步头,并为整个数据包添加一个校验和),然后将输出转换为更熟悉的字节序列。但是程序员已经必须自己处理它。

此外,我们假设发送器和接收器已连接到Arduino。除了VirtualWire之外,随着“智能家居”的兴起,还有许多其他功能,例如RC-Switch或RemoteSwitch,但它们专注于其他任务,显然不值得使用它们来传输任意数据。

VirtualWire中单个消息的最大长度为27个字节(请参阅文档)。以我选择的1200 bps的速度传输一条完整的消息(自动添加签名0xb38,消息长度值和校验和)的时间为0.35秒。

顺便说一下,选择的传输速度越大,传输范围就越小。根据使用RS-232的经验,可以知道随着范围的增加,允许的传输速度呈指数下降:以19,200的速度,一条无屏蔽的线路以15米的速度运行9600-150米,以1200的速度-超过一公里。通过实验找出这种依赖关系的性质对于我们的案例将是很有趣的,因为这里很多都取决于所使用的数学。

在VirtualWire中初始化发送器如下所示:

. . . . .
#include <VirtualWire.h>
. . . . .
void setup() {
  vw_setup(1200); //   VirtualWire
  vw_set_tx_pin(10);   //   VirtualWire D10
. . . . .
}

我们将使用一个特定的示例来分析数据生成的原理。让我们有一个远程温度湿度传感器。它以带符号(浮点)的实数形式给出值(温度和湿度变量)。为了使在接收端更容易理解,我们都将减至一个小数位数至少为4的正整数,将这些位分别转换为ASCII字符,传输结果字符串,并在接收端执行反向操作。当然,您可以简化任务(例如,无需转换为ASCII并缩短数字),但是事实证明,对于几乎所有类型的数字数据而言,它都是相同的,从而简化了接收时的反汇编。

实际上,使用String类型编写消息很方便,如下所示:

. . . . .
//    
#define ledPin 13 //  (D13,  19 ATmega) 
char msg[13];
volatile int tmpr=0;
volatile int hum=0;
. . . . .
void loop() {
  delay(1000); // 1 c
float temperature;
float humidity;
. . . . .  //   temperature  humidity  
//       4 :
  tmpr = temperature*10+2731; //2731 =     
//    4 :
  hum = humidity*10+1000; 
//  :
  digitalWrite (ledPin,HIGH); //  —  
  String strMsg="DAH"; // - 
  strMsg+=tmpr; //  
  strMsg+=hum; // 
  strMsg.toCharArray(msg,12); //   , 12 –  
//  :
  vw_send((uint8_t *)msg, strlen(msg)); //  
  vw_wait_tx(); //   
  delay(500); // 500 
  digitalWrite (ledPin, LOW); //  —  
}

如果您需要传送带有大量数字的更准确的数字,则只需增加msg数组的长度即可。如果将多个读数取平均值,则需要全局“易失”变量tmpr和hum,否则也可以在loop()函数内部将它们声明为局部变量。如您所见,该消息由转换后的温度和湿度值组成,每个字符串包含四个字节的ASCII字符串,之后是三个“ DAH”字符的字符串(字符可以是ASCII表中的任何其他字符)。这是一个签名,可以使您将该消息与类似设备发送的其他消息区分开。即使您认为不要在此范围内使用其他设备,也不要忽略签名,同时,它可以作为对接收数据完整性的额外保证。

还要注意,将字符串转换为数组时,必须指定一个比消息总长度多的字符(3 + 4 + 4 = 11),这要考虑到关闭字符串的零字符。并且msg []数组的大小必须指定一个空白,并且可以为任意大小,在这种情况下,为13到27个字节。传输时,它仍将按照strlen(msg)函数返回的值发送,即11字节+空字符。

在接收部分,必须解析得到的ASCII码数组。但是首先,您需要接受它。要初始化接收,请执行以下操作:

#include <VirtualWire.h>
char str[5];     ASCII  
  uint8_t buf [VW_MAX_MESSAGE_LEN];  //    
  uint8_t buflen = VW_MAX_MESSAGE_LEN;  // max   
. . . . .

void setup() {
  vw_set_rx_pin(2); //D2   VirtualWire
  vw_setup(1200); //   VirtualWire
. . . . .
} 

实际上,解析行的技术是这样的:

void loop() {
  vw_rx_start();  //  
  buflen = VW_MAX_MESSAGE_LEN; //    
 if (vw_have_message()) { // 
 if (vw_get_message(buf, &buflen)) //   
  {
    vw_rx_stop(); //   :
        for (byte i=0; i<3; i++)  //    
                str[i]= buf[i]; // 
                str[3]='\0';
      if ((str[0]=='D')&&(str[1]=='A')&&(str[2]=='H')) {
// ,  
       for (byte i=3;i<7;i++)  //    
                str[i-3]= buf[i]; //    
      int tmpr=atoi(str); //   
      tmpr=tmpr-2731; // 2731,     
. . . . .//    10    float,  
. . . . . //    -
// :
      for (byte i=7;i<11;i++)  //    
                str[i-7]= buf[i]; //    
      int hh = atoi(str); //   
      hh=(hh-1000)/10;
      if (hh>99) hh=99; //   %,  
. . . . . // -
   } //end   DAT
  } //end  
 } // 
} // end loop

希望您现在对使用这些便宜且易于使用的设备的疑问有所减少。

All Articles