Una vez más, unos 433 MHz transmisores y receptores

El conjunto más simple de receptor y transmisor ISM de 433 MHz ha ganado una merecida popularidad entre los amantes de la electrónica. Los kits son baratos (incluso en Chip-Deep puedes comprarlos por 300 rublos, y en Ali, dicen, generalmente por cincuenta dólares), son simples y confiables. Además (que probablemente no sospeche), este es el método de intercambio de datos inalámbrico de mayor alcance y penetración: una señal a una frecuencia de 433 MHz pasa mucho mejor a través de obstáculos y opera a una distancia mayor que en la popular banda de 2.4 GHz (433 MHz está completamente retrasado por una pared de medio metro de concreto, y el Wi-Fi ya está muriendo por 10 centímetros). Admito que aparecieron recientemente los módulos MBee-868Al estar equipados con una antena apropiada (direccional), "disparan" aún más, pero son al menos un orden de magnitud más caros, más difíciles de conectar, requieren gestión de ahorro de energía y preconfiguración. Y además, la frecuencia de 868 MHz pasa a través de obstáculos dos veces más mala (aunque, por supuesto, es incomparablemente mejor que la frecuencia de 2.4 GHz).



Por supuesto, se ha escrito mucho sobre transmisores y receptores de 433 MHz (incluso en el concentrador) . Sin embargo, parece que nadie sabe cómo incluir correctamente este kit en el circuito por alguna extraña razón. Cuando una vez más leí aquí que el kit " tomó 8 metros dentro de la línea de visión, el noveno metro no pudo ser dominado", Se me rompió la paciencia. ¿Qué otros 8 metros? En 40-50 habría creído, aunque en realidad, probablemente, el rango es aún mayor.

Vale la pena señalar que resuelvo aún más el problema de crear una línea para transferir datos arbitrarios, y no solo controlar cualquier enchufe inteligente o barco modelo. Mi tarea es más complicada, pero aún así la distancia de operación confiable es mucho mayor. Además, en tal tarea es importante no solo y no tanto la distancia dentro de la línea de visión (puede servir solo como comparación), sino la capacidad de penetrar varios obstáculos.

Tengo un kit de este tipo que trabaja en el país a una distancia de aproximadamente 25-30 metros en un ángulo agudo con respecto a la pared de troncos, de modo que aproximadamente un metro (en total) de paredes y particiones, parcialmente protegido por aislamiento de aluminio, está en la ruta de la señal. A una distancia mucho más corta, casi directamente detrás de la pared, WiFi ya está perdiendo señal por completo. En la ciudad, la señal termina desde un extremo de un departamento urbano de tres habitaciones al otro a través de dos divisiones interiores, así como desde el balcón, donde en una línea recta entre el transmisor y el receptor hay al menos 80 centímetros de ladrillo y una división de yeso. No utilicé ninguna opción de kit más costosa mencionada en la revisión anterior.

Una ventaja adicional del kit es que, en pausas, el transmisor no consume nada y sin modos de suspensión especiales, simplemente por el principio de su dispositivo (la corriente de consumo en reposo es comparable a las corrientes de fuga del colector de un transistor bloqueado, es decir, aproximadamente 100 nA).

Veamos cuáles son las trampas.

Conexión del transmisor


El transmisor (se llama FS1000A), como vemos en su diagrama a continuación, es el generador más simple basado en un resonador SAW de 433 MHz. El generador se ensambla en el transistor Q1, y el transistor Q2, en base al cual se suministran los datos digitales, es simplemente una clave que conecta el generador a la alimentación (al bus GND) en presencia de un alto nivel (unidad lógica) en la entrada. La potencia puede ser de 5 a 12 voltios y, según los fabricantes, cuanto mayor sea la potencia, más lejos funcionará la conexión.



No he notado las ventajas fundamentales de una mayor nutrición como parte de mi tarea. Sin embargo, uno no debe descuidar el hecho de que no hay requisitos especiales de energía aquí, y con un aumento de voltaje, el dispositivo solo funcionará mejor. Es conveniente conectar el transmisor directamente al voltaje de un adaptador de 9-12 voltios, una batería o un conjunto de 6 baterías (pin Vin Arduino). Con una fuente de alimentación no estabilizada, que puede superar los 12 voltios (como, por ejemplo, con baterías), generalmente desacople el transmisor del circuito principal con un estabilizador de 9 voltios separado (puede usar el 78L09 más simple), y no veo ninguna diferencia en la operación entre los 9 y 12 voltios. Con Uno o Nano, puede usar el estabilizador de 5 voltios incorporado para alimentar el controlador y otros circuitos (por ejemplo, sensores)y para Mini (especialmente sus clones baratos), le recomendaría que coloque un estabilizador de 5 voltios por separado, conectándolo al pin de 5V.

Cabe señalar que recientemente han aparecido transmisores que parecen algo no estándar (ver. Fig. A continuación). Resultó que la ausencia de un acelerador L1 (tres vueltas), del que solo quedaban agujeros, una ficción, simplemente fue reemplazado por el componente SMD correspondiente. Lo peor de esta opción es diferente: la impresión descuidada puede ser engañosa con respecto a la conexión de los pines de datos y la alimentación. La conexión correcta se muestra en la figura, es la misma para todas las opciones:



¡Lo más sorprendente en este asunto es que cuando los datos y la potencia se mezclan, el transmisor continúa trabajando a distancias cortas! Si observa el circuito, comprenderá qué es: la base Q2 a través de la resistencia está conectada a la fuente de alimentación, el transistor siempre está abierto y no afecta el funcionamiento del circuito. Un nivel lógico alto en el bus de energía solo alimenta el generador en el momento adecuado. Los absurdos comienzan a cierta distancia: está claro que, desde una conclusión lógica, la fuente de energía es mala.

Conexión del receptor


Al comprar un receptor (puede llamarse MX-RM-5V o XD-RF-5V), preste atención a la longitud de los terminales: de alguna manera me encontré con un lote completo con pines acortados, lo que provocó que el receptor se caiga del conector PBS estándar con la menor distorsión y su Tuve que unirme específicamente al tablero.

El circuito receptor es mucho más complicado (no lo jugaré, pero puedes encontrarlo, por ejemplo, aquí ). Debe recibir y amplificar una señal de alta frecuencia, filtrar la frecuencia de 433 MHz, aislar ráfagas y convertirlas a niveles lógicos. El receptor tiene un acelerador de sintonización (en el centro del tablero), pero sin instrumentos precisos para medir las características de amplitud-frecuencia, no recomiendo girarlo; lo más probable es que no mejore nada, solo lo estropeará.

Como ya a una corta distancia la señal será mucho menos interferencia, está claro que debemos lidiar con la interferencia en todos los frentes: circuitos y métodos de software. Las bibliotecas hacen lo último por nosotros, pero no importa qué matemáticas se usen en el procesamiento del software, es recomendable hacer todo primero para que la unidad lógica en la salida aparezca solo cuando una señal útil explote y no aparezca cuando haya interferencia. En otras palabras, sería bueno desconectarse al máximo de antemano de la interferencia durante la recepción.

El método estándar de reducción de ruido, conocido en mi tiempo por cada estudiante que ha ensamblado al menos una radio o amplificador, es que para los nodos que son sensibles a la interferencia, es necesario hacer una fuente de alimentación separada, aislada al máximo de otros circuitos. Puede hacerlo de diferentes maneras: una vez que instaló un diodo zener separado, ahora a menudo aíslan la potencia de un nodo problemático con un filtro LC (esto se recomienda, por ejemplo, para ADC, consulte las hojas de datos para controladores AVR). Pero en nuestras condiciones, cuando los componentes modernos son pequeños y baratos, es más fácil colocar un estabilizador separado del resto en el receptor.



Un estabilizador, por ejemplo, del tipo LP2950-5.0 más dos condensadores necesarios para él en la opción más barata (cuando ambos condensadores son de cerámica, en el rango de 1-3 microfaradios) agregará sesenta como máximo al costo de su circuito. Pero prefiero no ahorrar: en la salida puse una cerámica ordinaria, y en la entrada un electrolito (10-100 microfaradios), además, estado sólido (polímero) o tántalo. Los condensadores de cerámica se pueden prescindir tanto de allí como de allí, si el voltaje de entrada de 7-12 voltios proviene de baterías de batería o de otro estabilizador analógico. Las fuentes estabilizadas pulsadas y los rectificadores no estabilizados más simples requieren un filtrado adicional. Puedes usar electrolitos de aluminio baratos si colocas un 0.1 microfaradio de cerámica paralelo a él,es incluso mejor poner una inductancia en serie en la entrada de varias fracciones o unidades de miligenri.

El estabilizador debe instalarse directamente cerca del receptor, la longitud de los conductores debe ser mínima. En lugar del LP2950, ​​puede tomar el LM2931 o similar con un voltaje de alimentación pequeño (esto es especialmente importante si el circuito funciona con baterías; para un LM78L05 normal, el voltaje de entrada debe ser de al menos 7,5 y preferiblemente de 8 a 9 voltios).

En comparación con el caso de alimentar el receptor directamente desde Arduino, como se recomienda en todas las publicaciones (no he visto excepciones), se sorprenderá del efecto obtenido: el alcance y la capacidad de penetrar a través de las paredes aumentan significativamente de inmediato. El receptor, junto con el estabilizador, se puede llevar a cabo en una caja pequeña separada para mayor comodidad. Puede conectar su salida al controlador en el cuerpo principal con cualquier cable de tres hilos (dos fuentes de alimentación y un conductor de señal) de hasta 3 metros de largo, y tal vez más. Esto es más conveniente porque todavía se necesitan antenas, y de acuerdo con las reglas, será mejor si son paralelas entre sí en el espacio, y los casos grandes no siempre se pueden colocar para que las antenas sobresalgan en la orientación correcta.

En la versión más simple, como antenas, puede hacerlo con trozos de cable de un solo núcleo con una sección transversal de al menos 0,5 mm y una longitud de 17 cm ± 1-3 mm. ¡No utilice cables de montaje trenzados! Se venden antenas espirales más compactas, pero personalmente no he probado su efectividad. La punta de la antena, tanto del transmisor como del receptor, está sellada en el orificio correspondiente en la esquina de la placa (no se equivoque en la versión mejorada del transmisor; la palabra ANT también está fuera de lugar allí, vea la figura anterior).

Generación y procesamiento de datos transmitidos.


Este es el segundo inconveniente importante de la mayoría de las revisiones sobre nuestro tema: los autores se limitan a algún problema local, sin formularlo de manera general, como transferir datos arbitrarios en un paquete. Como entendió por la descripción anterior, nuestro conjunto solo puede transmitir una secuencia simple de bits. La biblioteca estándar de VirtualWire los codifica de una manera especial (cada tétrada se codifica con 6 bits, se agrega un encabezado de sincronización al frente y se agrega una suma de verificación para todo el paquete) y convierte la salida en una secuencia más familiar de bytes. Pero el programador ya tiene que lidiar con eso por su cuenta.

Además, suponemos que el transmisor y el receptor están conectados al Arduino. Además de VirtualWire, en relación con el auge de las "casas inteligentes", hay muchas otras cosas como RC-Switch o RemoteSwitch, pero están enfocadas en otras tareas, y claramente no vale la pena usarlas para transferir datos arbitrarios.

La longitud máxima de un solo mensaje en VirtualWire es de 27 bytes (consulte la documentación ). La transmisión de un mensaje completo (se complementa automáticamente con una firma 0xb38, un valor de longitud del mensaje y una suma de comprobación) a la velocidad elegida de 1200 bps es de 0,35 segundos.

Cuanto más, por cierto, la velocidad de transmisión seleccionada, el rango de transmisión será menor. Por la experiencia de usar RS-232, se sabe que con un rango creciente, la velocidad de transmisión permisible disminuye exponencialmente: a una velocidad de 19,200, una línea sin blindaje corre por 15 metros, a 9600 - 150 metros, y a una velocidad de 1200 - más de un kilómetro. Sería interesante descubrir experimentalmente la naturaleza de esta dependencia para nuestro caso, porque aquí mucho depende de las matemáticas utilizadas.

La inicialización del transmisor en VirtualWire se ve así:

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

Analizaremos los principios de generación de datos utilizando un ejemplo específico. Tengamos un sensor remoto de temperatura y humedad. Da valores (variables de temperatura y humedad) en forma de un número real con un signo (flotante). Para que sea más fácil de entender en el extremo receptor, todos reduciremos a un número entero positivo con el número de decimales al menos 4, traduciremos los bits individualmente en caracteres ASCII, transferiremos la cadena resultante y realizaremos operaciones inversas en el extremo receptor. Por supuesto, puede simplificar la tarea (por ejemplo, prescindir de la conversión a ASCII y acortar los números), pero de esta forma resulta ser la misma para casi cualquier tipo de datos digitales, lo que simplifica el desmontaje al recibirlos.

En la práctica, es conveniente usar el tipo de cadena para redactar un mensaje, algo como esto:

. . . . .
//    
#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); //  —  
}

Si necesita transferir números más precisos con una gran cantidad de dígitos, simplemente aumente la longitud de la matriz de mensajes. Las variables globales "volátiles" tmpr y hum son necesarias si promedia varias lecturas, de lo contrario, también pueden declararse locales dentro de la función loop (). El mensaje, como puede ver, consiste en valores de temperatura y humedad convertidos, en cadenas ASCII de cuatro bytes cada una, precedidas por una cadena de tres caracteres "DAH" (los caracteres pueden ser cualquier otro de la tabla ASCII). Esta es una firma que le permitirá distinguir este mensaje de los otros posibles enviados por dispositivos similares. No descuide la firma, incluso si cree que no se esperan otros dispositivos cercanos en este rango, al mismo tiempo sirve como una garantía adicional de la integridad de los datos recibidos.

Tenga en cuenta también que al convertir una cadena en una matriz, debe especificar un carácter más que la longitud total del mensaje (3 + 4 + 4 = 11), esto tiene en cuenta el carácter cero que cierra la cadena. Y el tamaño de la matriz msg [] debe especificarse con un margen y puede ser cualquiera, en este caso de 13 a 27 bytes. Al transmitir, aún enviará exactamente lo mismo que devolverá la función strlen (msg), es decir, 11 bytes + un carácter nulo.

En la parte receptora, la matriz resultante de códigos ASCII deberá analizarse. Pero primero debes aceptarlo. Para inicializar la recepción, se realizan las siguientes acciones:

#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
. . . . .
} 

En realidad, la técnica para analizar una línea es esta:

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

Espero que ahora tenga menos preguntas sobre el uso de estos dispositivos baratos y fáciles de usar.

All Articles