Rádio moduly 433 MHz pomocou knižnice VirtualWire

Zápisník experimentátora

Každý z nás sa na Ebay stretol s neuveriteľne lacnými modulmi, ktoré umožňujú bezdrôtovú komunikáciu medzi Arduinami. Ponuka je tam neuveriteľne pestrá a my sa v tomto článku pozrieme na to najlacnejšie v ponuke. Dvojicu vysielač a príjímač, ktorá spolu komunikuje na frekvencii 433 MHz.

Nákup súčiastok

Na fotografiách je použité Arduino Pro Mini a Arduino Mega. To vás nelimituje, môžete použiť v podstate ľubovoľné Arduino.

  • Arduino Pro Mini (link) - Toto Arduino som použil ako prijímač.
  • Arduino Mega (link) - Toto Arduino som použil ako vysielač.
  • Mini Breadboard (link) - Rádiové moduly som zastrčil do tohoto skúšobného pola.
  • Rádiové moduly (link) - Rádiové moduly pre 433 MHz sa obvykle predávajú po dvojiciach. Mávajú síce rôzne označenie, ale zdá sa, že sú prakticky identické. Mavajú tieto názvy: XD-RF-5V, MX-JS-05V, XD-FST, MX-FS-03v, XY-MK-5V, FS1000A. Rádiové moduly sa predávajú bez antény. To má veľký vplyv na dosah vysielania. Ak chcete vysielať aj na viac metrov, musíte k obom modulom pripevniť anténu.

Dĺžka antény

Tu sa na internete údaje trochu rozchádzajú, ale obvykle je to 17,5 cm (alternatívne 15 cm). Táto dĺžka nemusí byť v amatérskych podmienkach dodržaná úplne presne. V podstate každý kúsok drôtu, ktorý tam pripevníte výrazne zlepší vlastnosti vysielača.

VirtualWire

Túto knižnicu nenájdete v správcovi knižníc a musíte si ju nainštalovať zo ZIP súboru. Domovská stránka knižnice je http://www.airspayce.com/mikem/arduino/VirtualWire/index.html. Autor na stránke píše, že knižnica sa už viac nevyvíja a bola nahradená knižnicou RadioHead. To je knižnica od rovnakého autora a pozrieme sa na ňu v ďalšom článku. To nás ale nemusí trápiť a nainštalujte si ju do adresára [meno užívateľa]\documents\arduino\libraries\virtualwire.

Program

Na otestovanie modulov som napísal dva jednoduché programy. Prvý odosiela postupne sa zvyšujúce čísla, aby bolo možné ľahko skontrolovať výpadky spojenia a druhý program tieto čísla prijíma a zobrazuje ich na sériový port. Vo výpise vidíte, koľko znakov sa prijalo a aký je rozdiel voči predchádzajúcej správe. Ak je rozdiel 1, potom nedošlo ku žiadnemu výpadku. Ak je číslo väčšie, tak toľko správ medzitým vypadlo. Potom je jednoduché manipulovať s oboma Arduinami a sledovať, ako sa to správa.

S pripojenou anténou sa v byte moduly dokázali dorozumieť na vzdialenosť 6 metrov, pričom medzi nimi boli aj drobné prekážky v podobe dvier. Na väčšiu vzdialenosť a cez betónové steny už bola komunikácia obtiažnejšia.

Odosielanie

Dátový pin je pripojený na pin 12 v Arduine. Ak vám to nevyhovuje, môžete ho zmeniť funkciou vw_set_tx_pin.

#include <VirtualWire.h>

char buffer[10];
int idx=0;

void setup()
{
  // Initialize the IO and ISR
  vw_setup(2000); // Bits per sec
  pinMode(LED_BUILTIN,OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  sprintf(buffer,"%d",idx);
  idx++;
 
  send(buffer);
  //send("Hello!");
  delay(1000);
}

void send (char *message)
{
  digitalWrite(LED_BUILTIN,HIGH);
  Serial.print("Transmited: ");
  Serial.println(message);
  vw_send((uint8_t *)message, strlen(message));
  vw_wait_tx(); // Wait until the whole message is gone
  digitalWrite(LED_BUILTIN,LOW);
}

Prijímanie

Dátový pin je pripojený na pin 11 v Arduine. Ak vám to nevyhovuje, môžete ho zmeniť funkciou vw_set_rx_pin.

#include <VirtualWire.h>

char message[VW_MAX_MESSAGE_LEN]; // a buffer to store the incoming messages
byte messageLength = VW_MAX_MESSAGE_LEN; // the size of the message
int last_idx = 0;

void setup()
{
  Serial.begin(9600);

  Serial.println("Device is ready");

  // Initialize the IO and ISR
  vw_setup(2000); // Bits per sec

  vw_rx_start(); // Start the receiver
}

void loop()
{
  if (vw_get_message(message, &messageLength)) // Non-blocking
  {
    message[messageLength] = 0;
    Serial.print("Received(");
    Serial.print(messageLength);
    Serial.print("}: ");
    Serial.print(message);
   
    Serial.print(" (");
    int idx=atoi(message);
    Serial.print(idx>last_idx ? "+" : "-");
    Serial.print(idx-last_idx);
    last_idx=idx;
    Serial.print(")");
    Serial.println();
  }
}

Zdrojový kód

Zdrojový kód sa nachádza na serveri GitHub.


13.05.2017


Menu