Encore une fois environ 433 MHz émetteurs et récepteurs

L'ensemble le plus simple de récepteur et d'émetteur ISM 433 MHz a gagné une popularité bien méritée parmi les amateurs d'électronique. Les kits sont bon marché (même dans Chip-Deep, vous pouvez les acheter pour 300 roubles, et sur Ali, disent-ils, généralement pour une cinquantaine de dollars), ils sont simples et fiables. De plus (ce que vous ne soupçonnez probablement pas), il s'agit de la méthode d'échange de données sans fil la plus longue et la plus pénétrante - un signal à une fréquence de 433 MHz passe beaucoup mieux à travers des obstacles et fonctionne à une distance plus éloignée que dans la bande populaire de 2,4 GHz (433 MHz est complètement retardé par un mur d'un demi-mètre de béton, et le Wi-Fi est déjà en train de mourir de 10 centimètres). J'avoue que les modules MBee-868 sont récemment apparusEquipés d'une antenne (directionnelle) appropriée, ils "tirent" plus loin, mais ils sont au moins un ordre de grandeur plus chers, plus difficiles à connecter, nécessitent une gestion économe en énergie et une préconfiguration. Et en plus, la fréquence de 868 MHz traverse des obstacles deux fois plus mauvais (bien que, bien sûr, elle soit incomparablement meilleure que la fréquence de 2,4 GHz).



Beaucoup a été écrit sur les émetteurs et récepteurs 433 MHz (y compris sur le concentrateur) , bien sûr. Cependant, il semble que personne ne sache comment inclure correctement ce kit dans le circuit pour une raison étrange. Quand je lis encore une fois ici que le kit «a pris 8 mètres en ligne de mire, le 9ème mètre n'a pas pu être maîtrisé", Ma patience a cassé. Quels autres 8 mètres?! À 40-50 j'aurais cru, même si en réalité, probablement, la gamme est encore plus grande.

Il convient de noter que je résous davantage le problème de la création d'une ligne de transfert de données arbitraires, et pas seulement le contrôle de prises intelligentes ou de modèles réduits de bateaux. Ma tâche est plus compliquée, mais la distance de fonctionnement fiable est encore beaucoup plus grande. De plus, dans une telle tâche, il est important non seulement et non pas tant la distance à l'intérieur de la ligne de visée (elle ne peut servir qu'à des fins de comparaison), mais la capacité de pénétrer divers obstacles.

J'ai un tel kit qui fonctionne dans le pays à une distance d'environ 25-30 mètres à un angle aigu par rapport au mur en rondins, de sorte qu'environ un mètre (au total) de murs et de cloisons, partiellement protégés par une feuille isolante, se trouve dans le chemin du signal. À une distance beaucoup plus courte, presque directement derrière le mur, le WiFi perd déjà complètement le signal. En ville, le signal se termine d'un bout à l'autre d'un appartement de trois pièces en ville à travers deux cloisons intérieures, ainsi que depuis le balcon, où en ligne droite entre l'émetteur et le récepteur au moins 80 centimètres de maçonnerie et une cloison en plâtre. Je n'ai pas utilisé d'options de kit plus chères mentionnées dans l'examen ci-dessus.

Un avantage supplémentaire du kit est que, dans les pauses, l'émetteur ne consomme rien, et sans modes de veille spéciaux, simplement par le principe de son appareil (le courant de consommation au repos est comparable aux courants de fuite du collecteur d'un transistor verrouillé, soit environ 100 nA).

Voyons quels sont les pièges.

Connexion de l'émetteur


L'émetteur (il est appelé FS1000A), comme nous le voyons sur son schéma ci-dessous, est le générateur le plus simple basé sur un résonateur SAW 433 MHz. Le générateur est assemblé sur le transistor Q1, et le transistor Q2, sur la base duquel des données numériques sont fournies, est simplement une clé qui relie le générateur à l'alimentation (au bus GND) en présence d'un niveau élevé (unité logique) à l'entrée. La puissance peut être de 5 à 12 volts et, selon les fabricants, plus la puissance est élevée, plus la connexion fonctionne.



Je n'ai pas remarqué les avantages fondamentaux d'une meilleure nutrition dans le cadre de ma tâche. Néanmoins, il ne faut pas négliger le fait qu'il n'y a pas ici d'alimentation électrique particulière, et avec une tension accrue, l'appareil ne fonctionnera que mieux. Il est pratique de connecter l'émetteur directement à la tension d'un adaptateur 9-12 volts, d'une batterie ou d'un ensemble de 6 batteries (broche Vin Arduino). Avec une alimentation non stabilisée, qui peut dépasser 12 volts (comme, par exemple, avec des batteries), je dissocie généralement l'émetteur du circuit principal avec un stabilisateur 9 volts séparé (vous pouvez utiliser le 78L09 le plus simple), et je ne vois aucune différence de fonctionnement entre les 9 et 12 volts. Avec Uno ou Nano, vous pouvez utiliser le stabilisateur intégré de 5 volts pour alimenter le contrôleur lui-même et d'autres circuits (par exemple, des capteurs)et pour Mini (en particulier ses clones bon marché), je vous conseille de mettre un stabilisateur séparé de 5 volts, en le connectant à la broche 5V.

Il convient de noter que récemment des émetteurs sont apparus qui semblent quelque peu non standard (voir. Fig. Ci-dessous). Il s'est avéré que l'absence d'un accélérateur L1 (trois tours), dont il ne restait que des trous - une fiction, il a simplement été remplacé par le composant SMD correspondant. Le pire dans cette option est différent: l'impression bâclée peut être trompeuse en ce qui concerne la connexion des sorties de données et de l'alimentation. La connexion correcte est indiquée sur la figure, elle est la même pour toutes les options:



La chose la plus frappante à ce sujet est que lorsque les données et la puissance sont mélangées, l'émetteur continue de fonctionner sur de courtes distances! Si vous regardez le circuit, vous comprendrez de quoi il s'agit: la base Q2 à travers la résistance est connectée à l'alimentation, le transistor est toujours ouvert et n'affecte pas le fonctionnement du circuit. Un niveau logique élevé sur le bus d'alimentation alimente simplement le générateur au bon moment. Les absurdités commencent à une certaine distance - il est clair que d'une conclusion logique, la source d'alimentation est mauvaise.

Connexion récepteur


Lors de l'achat d'un récepteur (il peut être appelé MX-RM-5V ou XD-RF-5V), faites attention à la longueur des terminaux - je suis tombé sur un lot entier avec des broches raccourcies, ce qui a fait tomber le récepteur du connecteur PBS standard à la moindre distorsion et son Je devais m'attacher spécifiquement au tableau.

Le circuit récepteur est beaucoup plus compliqué (je ne le jouerai pas, mais vous pouvez le trouver, par exemple, ici ). Il doit recevoir et amplifier un signal haute fréquence, filtrer la fréquence de 433 MHz, isoler les salves et les convertir en niveaux logiques. Le récepteur a une self de réglage (au milieu de la carte), mais sans instruments précis pour mesurer les caractéristiques amplitude-fréquence, je ne recommande pas de le tordre - très probablement, vous n'améliorerez rien, mais vous le gâterez seulement.

Étant donné que déjà à courte distance, le signal sera beaucoup moins d'interférences, il est clair que nous devons traiter les interférences sur tous les fronts: ainsi que les circuits et les méthodes logicielles. Les bibliothèques font la dernière chose pour nous, mais peu importe les mathématiques utilisées dans le traitement logiciel, il est conseillé de tout faire en premier afin que l'unité logique à la sortie n'apparaisse que lorsqu'un signal utile éclate et n'apparaisse pas en cas d'interférence. En d'autres termes, il serait bien de se désaccorder au maximum à l'avance contre les interférences pendant la réception.

La méthode standard de réduction du bruit, connue à mon époque pour chaque étudiant qui a assemblé au moins une radio ou un amplificateur, est que pour les nœuds sensibles aux interférences, il est nécessaire de faire une alimentation séparée, isolée au maximum des autres circuits. Vous pouvez le faire de différentes manières: une fois que vous avez installé une diode Zener distincte, elles isolent désormais souvent la puissance d'un nœud problématique avec un filtre LC (cela est recommandé, par exemple, pour les ADC, voir les fiches techniques des contrôleurs AVR). Mais dans nos conditions, lorsque les composants modernes sont petits et bon marché, il est plus facile de simplement mettre un stabilisateur séparé du reste sur le récepteur.



Un stabilisateur, par exemple, du type LP2950-5.0 plus deux condensateurs nécessaires pour celui-ci dans l'option la moins chère (lorsque les deux condensateurs sont en céramique, dans la gamme 1-3 microfarads) ajouteront soixante maximum au coût de votre circuit. Mais je préfère ne pas économiser: en sortie je mets une céramique ordinaire, et en entrée je mets un électrolyte (10-100 microfarads), en plus, à l'état solide (polymère) ou au tantale. Les condensateurs en céramique peuvent être supprimés à la fois là et là, si la tension d'entrée de 7-12 volts provient de batteries-batteries ou d'un autre stabilisateur analogique. Les sources stabilisées pulsées et les redresseurs non stabilisés les plus simples nécessitent un filtrage supplémentaire. Vous pouvez utiliser un électrolyte en aluminium bon marché si vous mettez un microfarad en céramique 0,1 parallèle à celui-ci,il est même préférable de mettre une inductance série à l'entrée de plusieurs fractions ou unités de milligenri.

Le stabilisateur doit être installé directement près du récepteur, la longueur des conducteurs doit être minimale. Au lieu du LP2950, ​​vous pouvez prendre le LM2931 ou similaire avec une petite tension de traversée (cela est particulièrement important si le circuit est alimenté par des piles - pour un LM78L05 ordinaire, la tension d'entrée doit être d'au moins 7,5, et de préférence de 8 à 9 volts).

Comparé au cas de l'alimentation du récepteur directement depuis Arduino, comme recommandé dans toutes les publications (je n'ai pas vu d'exceptions), vous serez étonné de l'effet obtenu - la portée et la capacité de pénétrer à travers les murs augmentent immédiatement de manière significative. Le récepteur, ainsi que le stabilisateur, peuvent être placés dans une petite boîte séparée pour plus de commodité. Vous pouvez connecter sa sortie au contrôleur dans le corps principal avec n'importe quel fil à trois fils (deux alimentations et un conducteur de signal) jusqu'à 3 mètres de long, et peut-être plus. C'est plus pratique car les antennes sont toujours nécessaires, et selon les règles, ce sera mieux si elles sont parallèles les unes aux autres dans l'espace, et les grands boîtiers ne peuvent pas toujours être placés de sorte que les antennes dépassent dans la bonne orientation.

Dans la version la plus simple, en tant qu'antennes, vous pouvez le faire avec des bouts de fil unipolaire d'une section d'au moins 0,5 mm et d'une longueur de 17 cm ± 1-3 mm. N'utilisez pas de fil de montage toronné! Des antennes spirales plus compactes sont en vente, mais je n'ai personnellement pas testé leur efficacité. La pointe de l'antenne de l'émetteur et du récepteur est scellée dans le trou correspondant dans le coin de la carte (ne vous y trompez pas dans la version améliorée de l'émetteur - le mot ANT est également hors de propos, voir fig. Ci-dessus).

Génération et traitement des données transmises


C'est le deuxième inconvénient majeur de la plupart des critiques sur notre sujet: les auteurs se limitent à un problème local, sans le formuler de manière générale, comme le transfert de données arbitraires dans un seul package. Comme vous l'avez compris à partir de la description ci-dessus, seule une simple séquence de bits peut être transmise par notre ensemble. La bibliothèque VirtualWire standard les encode d'une manière spéciale (chaque tétrade est codée avec 6 bits, un en-tête de synchronisation est ajouté en face et une somme de contrôle pour le paquet entier est ajoutée) et transforme la sortie en une séquence d'octets plus familière. Mais le programmeur doit déjà s'en occuper seul.

De plus, nous supposons que l'émetteur et le récepteur sont connectés à l'Arduino. En plus de VirtualWire, en lien avec l'essor des «maisons intelligentes», il y en a beaucoup plus, comme RC-Switch ou RemoteSwitch, mais ils se concentrent sur d'autres tâches, et cela ne vaut clairement pas la peine de les utiliser pour transférer des données arbitraires.

La longueur maximale d'un seul message dans VirtualWire est de 27 octets (voir la documentation ). La transmission d'un message complet (il est automatiquement complété par une signature 0xb38, une valeur de longueur de message et une somme de contrôle) à ma vitesse choisie de 1200 bps est de 0,35 seconde.

Plus, par ailleurs, la vitesse de transmission sélectionnée, la portée de transmission sera moindre. D'après l'expérience de l'utilisation du RS-232, on sait qu'avec une portée croissante, la vitesse de transmission autorisée diminue de façon exponentielle: à une vitesse de 19200, une ligne non blindée parcourt 15 mètres, à 9600 - 150 mètres et à une vitesse de 1200 - plus d'un kilomètre. Il serait intéressant de découvrir expérimentalement la nature de cette dépendance pour notre cas, car beaucoup ici dépend des mathématiques utilisées.

L'initialisation de l'émetteur dans VirtualWire ressemble à ceci:

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

Nous analyserons les principes de la génération de données à l'aide d'un exemple spécifique. Ayons un capteur de température-humidité à distance. Il donne des valeurs (variables de température et d'humidité) sous la forme d'un nombre réel avec un signe (flottant). Pour faciliter la compréhension à l'extrémité de réception, nous allons tous réduire à un entier positif avec le nombre de décimales au moins 4, traduire les bits individuellement en caractères ASCII, transférer la chaîne résultante et effectuer des opérations inverses à l'extrémité de réception. Bien sûr, vous pouvez simplifier la tâche (par exemple, vous passer de la conversion en ASCII et raccourcir les nombres), mais sous cette forme, il s'avère être le même pour presque n'importe quel type de données numériques, ce qui simplifie le désassemblage lors de la réception.

En pratique, il est pratique d'utiliser le type String pour composer un message, quelque chose comme ceci:

. . . . .
//    
#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 vous devez transférer des nombres plus précis avec un grand nombre de chiffres, vous augmentez simplement la longueur du tableau msg. Les variables globales «volatiles» tmpr et hum sont nécessaires si vous faites la moyenne de plusieurs lectures, sinon elles peuvent également être déclarées locales dans la fonction loop (). Le message, comme vous le voyez, se compose des valeurs de température et d'humidité converties, en chaînes ASCII de quatre octets chacune, précédées d'une chaîne de trois caractères «DAH» (les caractères peuvent être tout autre de la table ASCII). Il s'agit d'une signature qui vous permettra de distinguer ce message des autres possibles envoyés par des appareils similaires. Ne négligez pas la signature, même si vous pensez que d'autres appareils à proximité de cette plage ne sont pas attendus, en même temps, elle sert de garantie supplémentaire de l'intégrité des données reçues.

Notez également que lors de la conversion d'une chaîne en un tableau, vous devez spécifier un caractère de plus que la longueur totale du message (3 + 4 + 4 = 11), cela prend en compte le caractère zéro qui ferme la chaîne. Et la taille du tableau msg [] doit être spécifiée avec une marge et peut être quelconque, dans ce cas de 13 à 27 octets. Lors du transfert, il sera toujours envoyé exactement autant que la fonction strlen (msg) renverra, soit 11 octets + un caractère nul.

Dans la partie réceptrice, le tableau résultant de codes ASCII devra être analysé. Mais vous devez d'abord l'accepter. Pour initialiser la réception, les actions suivantes sont effectuées:

#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 fait, la technique d'analyse d'une ligne est la suivante:

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

J'espère que vous avez maintenant moins de questions sur l'utilisation de ces appareils bon marché et faciles à utiliser.

All Articles