Nochmals ca. 433 MHz Sender und Empfänger

Der einfachste Satz von 433-MHz- ISM- Empfängern und -Sendern hat bei Elektronikliebhabern wohlverdiente Popularität erlangt. Die Kits sind billig (selbst in Chip-Deep kann man sie für 300 Rubel kaufen, und bei Ali, sagen sie, im Allgemeinen für fünfzig Dollar), sie sind einfach und zuverlässig. Darüber hinaus (was Sie wahrscheinlich nicht vermuten) ist dies die weitreichendste und durchdringendste Methode des drahtlosen Datenaustauschs - ein Signal mit einer Frequenz von 433 MHz passiert Hindernisse viel besser und arbeitet in größerer Entfernung als im beliebten 2,4-GHz-Band (433) MHz wird durch eine Wand aus einem halben Meter Beton vollständig verzögert , und Wi-Fi stirbt bereits um 10 Zentimeter. Ich gebe zu, dass kürzlich MBee-868- Module erschienen sindDa sie mit einer geeigneten (Richt-) Antenne ausgestattet sind, „schießen“ sie weiter, sind jedoch mindestens eine Größenordnung teurer, schwieriger anzuschließen, erfordern ein energiesparendes Management und eine Vorkonfiguration. Außerdem passiert die Frequenz von 868 MHz doppelt so schlechte Hindernisse (obwohl sie natürlich unvergleichlich besser ist als die Frequenz von 2,4 GHz). Natürlich wurde



viel über 433-MHz-Sender und -Empfänger (einschließlich des Hubs) geschrieben . Es scheint jedoch, dass niemand aus irgendeinem seltsamen Grund weiß, wie man dieses Kit korrekt in die Schaltung einbindet. Als ich hier noch einmal las , dass das Kit „ 8 Meter in Sichtweite nahm, konnte der 9. Meter nicht gemeistert werden", Meine Geduld schnappte. Welche anderen 8 Meter ?! Bei 40-50 hätte ich geglaubt, obwohl in Wirklichkeit die Reichweite wahrscheinlich noch größer ist.

Es ist erwähnenswert, dass ich das Problem, eine Leitung für die Übertragung beliebiger Daten zu erstellen und nicht nur intelligente Steckdosen oder Motormodellboote zu steuern, weiter löse. Meine Aufgabe ist komplizierter, aber der Abstand zum zuverlässigen Betrieb ist immer noch viel größer. Darüber hinaus ist bei einer solchen Aufgabe nicht nur und nicht so sehr die Entfernung innerhalb der Sichtlinie wichtig (sie kann nur zum Vergleich dienen), sondern auch die Fähigkeit, verschiedene Hindernisse zu durchdringen.

Ich habe ein solches Kit, das auf dem Land in einem Abstand von etwa 25 bis 30 Metern in einem spitzen Winkel zur Blockwand arbeitet, so dass sich ungefähr ein Meter (insgesamt) Wände und Trennwände, die teilweise durch Folienisolierung abgeschirmt sind, im Signalweg befinden. In einer viel kürzeren Entfernung, fast direkt hinter der Wand, verliert WiFi bereits das Signal vollständig. In der Stadt endet das Signal von einem Ende einer Dreizimmer-Stadtwohnung zum anderen durch zwei innere Trennwände sowie vom Balkon, wo in einer geraden Linie zwischen Sender und Empfänger mindestens 80 Zentimeter Mauerwerk und eine Putztrennwand vorhanden sind. Ich habe keine teureren Kit-Optionen verwendet, die in der obigen Bewertung erwähnt wurden.

Ein zusätzlicher Vorteil des Kits besteht darin, dass der Sender in Pausen nichts und ohne spezielle Ruhemodi einfach nach dem Prinzip seines Geräts verbraucht (der Verbrauchsstrom in Ruhe ist vergleichbar mit den Kollektorleckströmen eines verriegelten Transistors, dh etwa 100 nA).

Mal sehen, was die Fallstricke sind.

Senderverbindung


Der Sender (FS1000A) ist, wie aus dem folgenden Diagramm hervorgeht, der einfachste Generator, der auf einem 433-MHz-SAW-Resonator basiert. Der Generator ist auf dem Transistor Q1 montiert, und der Transistor Q2, auf dessen Grundlage digitale Daten geliefert werden, ist einfach ein Schlüssel, der den Generator bei Vorhandensein eines hohen Pegels (logische Einheit) am Eingang mit Strom (an den GND-Bus) verbindet. Die Leistung kann zwischen 5 und 12 Volt liegen. Je höher die Leistung, desto weiter funktioniert die Verbindung laut Hersteller.



Ich habe die grundlegenden Vorteile einer erhöhten Ernährung als Teil meiner Aufgabe nicht bemerkt. Nichtsdestotrotz sollte man nicht vernachlässigen, dass hier keine besonderen Leistungsanforderungen bestehen und das Gerät mit erhöhter Spannung nur besser funktioniert. Es ist praktisch, den Sender direkt an die Spannung eines 9-12-Volt-Adapters, einer Batterie oder eines Satzes von 6 Batterien (Vin Arduino-Pin) anzuschließen. Bei einer instabilen Stromversorgung, die 12 Volt überschreiten kann (wie zum Beispiel bei Batterien), entkopple ich den Sender normalerweise mit einem separaten 9-Volt-Stabilisator vom Hauptstromkreis (Sie können den einfachsten 78L09 verwenden), und ich sehe keinen Unterschied im Betrieb zwischen 9 und 12 Volt. Mit Uno oder Nano können Sie den eingebauten 5-Volt-Stabilisator verwenden, um den Controller selbst und andere Schaltkreise (z. B. Sensoren) mit Strom zu versorgen.und für Mini (insbesondere seine billigen Klone) würde ich Ihnen raten, einen separaten 5-Volt-Stabilisator zu verwenden, der an den 5-V-Pin angeschlossen wird.

Es ist zu beachten, dass kürzlich Sender erschienen sind, die etwas unüblich aussehen (siehe Abb. Unten). Es stellte sich heraus, dass das Fehlen eines L1-Gashebels (drei Umdrehungen), von dem nur noch Löcher übrig waren - eine Fiktion, die einfach durch die entsprechende SMD-Komponente ersetzt wurde. Schlimmer bei dieser Option ist anders: Schlampiges Drucken kann hinsichtlich der Verbindung von Datenpins und Strom irreführend sein. Die richtige Verbindung ist in der Abbildung dargestellt. Sie ist für alle Optionen gleich:



Das Auffälligste in dieser Angelegenheit ist, dass der Sender bei einer Verwechslung von Daten und Leistung über kurze Entfernungen weiter arbeitet! Wenn Sie sich die Schaltung ansehen, werden Sie verstehen, was es ist: Die Q2-Basis über den Widerstand ist mit der Stromversorgung verbunden, der Transistor ist immer offen und hat keinen Einfluss auf den Betrieb der Schaltung. Ein logisch hoher Pegel auf dem Leistungsbus versorgt den Generator nur zum richtigen Zeitpunkt. Die Absurditäten beginnen in einiger Entfernung - es ist klar, dass aus einer logischen Schlussfolgerung die Stromquelle schlecht ist.

Empfängerverbindung


Achten Sie beim Kauf eines Empfängers (er kann als MX-RM-5V oder XD-RF-5V bezeichnet werden) auf die Länge der Klemmen - ich bin irgendwie auf eine ganze Charge mit verkürzten Stiften gestoßen, die dazu führte, dass der Empfänger bei der geringsten Verzerrung aus dem Standard- PBS- Anschluss herausfiel Ich musste mich speziell an das Board binden.

Die Empfängerschaltung ist viel komplizierter (ich werde sie nicht spielen, aber Sie können sie zum Beispiel hier finden ). Es sollte ein Hochfrequenzsignal empfangen und verstärken, die Frequenz von 433 MHz herausfiltern, Bursts isolieren und in logische Pegel umwandeln. Der Empfänger hat eine Stimmdrossel (in der Mitte der Platine), aber ohne genaue Instrumente zur Messung der Amplituden-Frequenz-Eigenschaften empfehle ich nicht, sie zu verdrehen - höchstwahrscheinlich werden Sie nichts verbessern, sondern nur verderben.

Da das Signal bereits in geringer Entfernung viel weniger Interferenzen aufweist, ist es klar, dass wir uns mit Interferenzen an allen Fronten befassen müssen: mit Schaltkreisen und Softwaremethoden. Bibliotheken erledigen das Letzte für uns, aber unabhängig davon, welche Mathematik in der Softwareverarbeitung verwendet wird, ist es ratsam, zuerst alles zu tun, damit die logische Einheit am Ausgang nur erscheint, wenn ein nützliches Signal platzt und nicht bei Störungen auftritt. Mit anderen Worten, es wäre schön, im Voraus auf Störungen während des Empfangs auf das Maximum abzustimmen.

Die Standardmethode zur Rauschunterdrückung, die in meiner Zeit jedem Schüler bekannt ist, der mindestens ein Radio oder einen Verstärker zusammengebaut hat, besteht darin, dass für störungsempfindliche Knoten eine separate Stromversorgung erforderlich ist, die maximal von anderen Schaltkreisen isoliert ist. Sie können dies auf verschiedene Arten tun: Nachdem Sie eine separate Zenerdiode installiert haben, isolieren diese häufig die Leistung eines Problemknotens mit einem LC-Filter (dies wird beispielsweise für ADCs empfohlen, siehe Datenblätter für AVR-Controller). Unter unseren Bedingungen, wenn moderne Komponenten klein und billig sind, ist es jedoch einfacher, einen vom Rest getrennten Stabilisator am Empfänger anzubringen.



Ein Stabilisator vom Typ LP2950-5.0 plus zwei dafür erforderliche Kondensatoren in der billigsten Option (wenn beide Kondensatoren aus Keramik im Bereich von 1 bis 3 Mikrofarad bestehen) erhöht die Kosten Ihrer Schaltung um maximal 60. Aber ich möchte lieber nicht sparen: Am Ausgang habe ich eine gewöhnliche Keramik und am Eingang einen Elektrolyten (10-100 μF), außerdem Festkörper (Polymer) oder Tantal. Auf Keramikkondensatoren kann sowohl dort als auch dort verzichtet werden, wenn die Eingangsspannung von 7-12 Volt von Batterie-Batterien oder von einem anderen analogen Stabilisator stammt. Gepulste stabilisierte Quellen und die einfachsten nicht stabilisierten Gleichrichter erfordern eine zusätzliche Filterung. Sie können billigen Aluminiumelektrolyten verwenden, wenn Sie eine keramische 0,1-Mikrofarad parallel dazu platzieren.Es ist sogar noch besser, eine Reiheninduktivität am Eingang mehrerer Fraktionen oder Einheiten von Milligenri anzubringen.

Der Stabilisator sollte direkt in der Nähe des Empfängers installiert werden, die Länge der Leiter sollte minimal sein. Anstelle des LP2950 können Sie den LM2931 oder ähnliches mit einer kleinen Durchgangsspannung verwenden (dies ist besonders wichtig, wenn der Stromkreis mit Batterien betrieben wird - für einen normalen LM78L05 sollte die Eingangsspannung mindestens 7,5 und vorzugsweise 8-9 Volt betragen).

Verglichen mit dem Fall, dass der Empfänger direkt von Arduino aus mit Strom versorgt wird, wie in allen Veröffentlichungen empfohlen (ich habe keine Ausnahmen gesehen), werden Sie erstaunt sein über den erzielten Effekt - die Reichweite und die Fähigkeit, durch die Wände zu dringen, nehmen sofort erheblich zu. Der Empfänger kann zusammen mit dem Stabilisator zur Vereinfachung in einer separaten kleinen Box ausgeführt werden. Sie können den Ausgang mit einem dreiadrigen Kabel (zwei Netzteile und ein Signalleiter) mit einer Länge von bis zu 3 Metern und möglicherweise mehr mit dem Controller im Hauptgehäuse verbinden. Dies ist bequemer, da immer noch Antennen benötigt werden. Gemäß den Regeln ist es besser, wenn sie im Raum parallel zueinander sind. Große Gehäuse können nicht immer so platziert werden, dass die Antennen in der richtigen Ausrichtung hervorstehen.

In der einfachsten Version können Sie als Antennen einadrige Drahtabfälle mit einem Querschnitt von mindestens 0,5 mm und einer Länge von 17 cm ± 1-3 mm verwenden. Verwenden Sie keinen verseilten Befestigungsdraht! Kompaktere Spiralantennen werden zum Verkauf angeboten, aber ich persönlich habe ihre Wirksamkeit nicht getestet. Die Antennenspitze sowohl des Senders als auch des Empfängers ist in das entsprechende Loch in der Ecke der Platine eingeschlossen (machen Sie keinen Fehler in der aktualisierten Version des Senders - das Wort ANT ist auch dort fehl am Platz, siehe Abb. Oben).

Erzeugung und Verarbeitung übertragener Daten


Dies ist der zweite große Nachteil der meisten Bewertungen zu unserem Thema: Die Autoren beschränken sich auf ein lokales Problem, ohne es allgemein zu formulieren, wie die Übertragung beliebiger Daten in einem Paket. Wie Sie aus der obigen Beschreibung verstanden haben, kann von unserem Satz nur eine einfache Folge von Bits übertragen werden. Die Standard- VirtualWire- Bibliothek codiert sie auf spezielle Weise (jede Tetrade wird mit 6 Bit codiert, ein Synchronisationsheader wird vorne hinzugefügt und eine Prüfsumme für das gesamte Paket wird hinzugefügt) und wandelt die Ausgabe in eine bekanntere Folge von Bytes um. Aber der Programmierer muss sich schon selbst darum kümmern.

Weiterhin nehmen wir an, dass der Sender und der Empfänger mit dem Arduino verbunden sind. Neben VirtualWire gibt es im Zusammenhang mit dem Boom von „Smart Homes“ viele andere Dinge wie RC-Switch oder RemoteSwitch, die sich jedoch auf andere Aufgaben konzentrieren, und es lohnt sich eindeutig nicht, sie zur Übertragung beliebiger Daten zu verwenden.

Die maximale Länge einer einzelnen Nachricht in VirtualWire beträgt 27 Byte (siehe Dokumentation ). Die Übertragung einer vollständigen Nachricht (sie wird automatisch mit einer Signatur 0xb38, einem Nachrichtenlängenwert und einer Prüfsumme ergänzt) mit meiner gewählten Geschwindigkeit von 1200 Bit / s beträgt 0,35 Sekunden.

Je höher übrigens die gewählte Übertragungsgeschwindigkeit ist, desto geringer ist die Übertragungsreichweite. Aus der Erfahrung mit RS-232 ist bekannt, dass mit zunehmender Reichweite die zulässige Übertragungsgeschwindigkeit exponentiell abnimmt: Bei einer Geschwindigkeit von 19.200 läuft eine ungeschirmte Leitung 15 Meter lang, bei 9600 - 150 Metern und bei einer Geschwindigkeit von 1200 - mehr als einem Kilometer. Es wäre interessant, die Art dieser Abhängigkeit für unseren Fall experimentell herauszufinden, da hier viel von der verwendeten Mathematik abhängt.

Das Initialisieren des Senders in VirtualWire sieht folgendermaßen aus:

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

Wir werden die Prinzipien der Datengenerierung anhand eines konkreten Beispiels analysieren. Lassen Sie uns einen entfernten Temperatur-Feuchtigkeits-Sensor haben. Es gibt Werte (Temperatur- und Feuchtigkeitsvariablen) in Form einer reellen Zahl mit einem Vorzeichen (float) an. Um das Verständnis auf der Empfangsseite zu vereinfachen, werden wir alle auf eine positive Ganzzahl mit einer Anzahl von mindestens 4 Dezimalstellen reduzieren, die Bits einzeln in ASCII-Zeichen übersetzen, die resultierende Zeichenfolge übertragen und auf der Empfangsseite umgekehrte Operationen ausführen. Natürlich können Sie die Aufgabe vereinfachen (z. B. auf die Konvertierung in ASCII verzichten und die Zahlen verkürzen), aber in dieser Form ist sie für fast alle Arten von digitalen Daten gleich, was die Demontage beim Empfang vereinfacht.

In der Praxis ist es praktisch, den String-Typ zu verwenden, um eine Nachricht zu erstellen.

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

Wenn Sie genauere Zahlen mit einer großen Anzahl von Ziffern übertragen müssen, erhöhen Sie einfach die Länge des msg-Arrays. Die globalen „flüchtigen“ Variablen tmpr und hum werden benötigt, wenn Sie mehrere Messwerte mitteln. Andernfalls können sie auch innerhalb der Funktion loop () als lokal deklariert werden. Wie Sie sehen, besteht die Nachricht aus konvertierten Temperatur- und Feuchtigkeitswerten in ASCII-Zeichenfolgen mit jeweils vier Bytes, denen eine Zeichenfolge mit drei DAH-Zeichen vorangestellt ist (Zeichen können beliebige Zeichen aus der ASCII-Tabelle sein). Dies ist eine Signatur, mit der Sie diese Nachricht von den möglichen anderen unterscheiden können, die von ähnlichen Geräten gesendet werden. Vernachlässigen Sie die Signatur nicht, auch wenn Sie der Meinung sind, dass andere Geräte in der Nähe dieses Bereichs nicht erwartet werden. Gleichzeitig dient sie als zusätzliche Garantie für die Integrität der empfangenen Daten.

Beachten Sie auch, dass Sie beim Konvertieren einer Zeichenfolge in ein Array ein Zeichen mehr als die Gesamtlänge der Nachricht angeben müssen (3 + 4 + 4 = 11). Dies berücksichtigt das Nullzeichen, das die Zeichenfolge schließt. Die Größe des msg [] -Arrays muss mit einem Rand angegeben werden und kann beliebig sein, in diesem Fall zwischen 13 und 27 Byte. Bei der Übertragung wird immer noch genau so viel gesendet, wie die Funktion strlen (msg) zurückgibt, dh 11 Byte + ein Nullzeichen.

Im empfangenden Teil muss das resultierende Array von ASCII-Codes analysiert werden. Aber zuerst müssen Sie es akzeptieren. Um den Empfang zu initialisieren, werden die folgenden Aktionen ausgeführt:

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

Tatsächlich ist die Technik beim Parsen einer Linie folgende:

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

Ich hoffe, Sie haben jetzt weniger Fragen zur Verwendung dieser billigen und benutzerfreundlichen Geräte.

All Articles