Rádio moduly 433 MHz pomocí knihovny VirtualWire

Zápisník experimentátora

Každý z nás se na Ebay setkal s neuvěřitelně levnými moduly, které umožňují bezdrátovou komunikaci mezi Arduinami. Nabídka je tam neuvěřitelně pestrá a my se v tomto článku podíváme na to nejlevnější v nabídce. Dvojici vysílač a přijímač, která spolu komunikuje na frekvenci 433 MHz.

Nákup součástek

Na fotografiích je použito Arduino Pro Mini a Arduino Mega. To vás nelimituje, můžete použít v podstatě libovolné Arduino.

  • Arduino Pro Mini (link) - Toto Arduino jsem použil jako přijímač.
  • Arduino Mega (link) - Toto Arduino jsem použil jako vysílač.
  • Mini Breadboard (link) - Rádiové moduly jsem zastrčil do tohoto zkušebního pole.
  • Rádiové moduly (link) - Rádiové moduly pro 433 MHz se obvykle prodávají po dvojicích. Mívají sice různé označení, ale zdá se, že jsou prakticky identické. Mívají tyto názvy: XD-RF-5V, MX-JS-05V, XD-FST, MX-FS-03V, XY-MK-5V, FS1000A. Rádiové moduly se prodávají bez antény. To má velký vliv na dosah vysílání. Pokud chcete vysílat i na více metrů, musíte k oběma modulům připevnit anténu.

Délka antény

Zde se na internetu údaje trochu rozcházejí, ale obvykle je to 17,5 cm (alternativně 15 cm). Tato délka nemusí být v amatérských podmínkách dodržena naprosto přesně. V podstatě každý kousek drátu, který tam připevníte výrazně zlepší vlastnosti vysílače.

VirtualWire

Tuto knihovnu nenajdete ve správci knihoven a musíte si ji nainstalovat ze ZIP souboru. Domovská stránka knihovny je http://www.airspayce.com/mikem/arduino/VirtualWire/index.html. Autor na stránce píše, že knihovna se již více nevyvíjí a byla nahrazena knihovnou RadioHead. To je knihovna od stejného autora a podíváme se na ni v dalším článku. To nás ale nemusí trápit a nainstalujte ji do adresáře [jméno uživatele]\documents\arduino\libraries\virtualwire.

Program

Na otestování modulů jsem napsal dva jednoduché programy. První odesílá postupně se zvyšující čísla, aby bylo možné snadno zkontrolovat výpadky spojení a druhý program tato čísla přijímá a zobrazuje je na sériový port. Ve výpisu vidíte, kolik znaků bylo přijato a jaký je rozdíl vůči předchozí zprávě. Pokud je rozdíl 1, potom nedošlo ke žádnému výpadku. Pokud je číslo větší, tak tolik zpráv mezitím vypadlo. Pak je jednoduché manipulovat s oběma Arduinami a sledovat, jak se to chová.

S připojenou anténou se v bytě moduly dokázali dorozumět na vzdálenost 6 metrů, přičemž mezi nimi byli i drobné překážky v podobě dveří. Na větší vzdálenost a přes betonové stěny již byla komunikace obtížnější.

Odesílání

Datový pin je připojen na pin 12 v Arduinu. Pokud vám to nevyhovuje, můžete jej změnit funkcí 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);
}

Přijímání

Datový pin je připojen na pin 11 v Arduinu. Pokud vám to nevyhovuje, můžete jej změnit funkcí 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 se nachází na serveru GitHub.


15.07.2017


Menu