Rádio moduly 433 MHz pomocí knihovny RadioHead

Zápisník experimentátora

Dnes plynule navážeme na předchozí článek. S rádiovými moduly budeme pracovat pomocí knihovny Radiohead. Opět využijeme dvojici vysílač a přijímač, která spolu komunikuje na frekvenci 433 MHz. Dnešní kód se bude chovat stejně, ale podle mých zkušeností nelze kombinovat VirtualWire a RadioHead. Do budoucna se budu věnovat už jen Radiohead, neboť to doporučuje i samotný autor a mám pocit, že je tato nová knihovna stabilnější.

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.

RadioHead

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/RadioHead/index.html. Nainstalujte si ji do adresáře [jméno uživatele]\documents\arduino\libraries\radiohead. Knihovna je určena pro ovládání více modulů. Proto je třeba si zapamatovat, že pro tyto moduly 433 MHz třeba z ní použivat třídu RH_ASK.

Program

Tyto dva jednoduché programy spolu komunikují. 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á.

V knihovně RadioHead je vidno posun k c++. Vše je naprogramováno jako třídy a voláte jejich funkce. Vzhledem k tomu, že knihovna RadioHead je určena pro velké množství rádiových modulů, je třeba si zapamatovat, že pro nejlevnější moduly se používá hlavičkový soubor RH_ASK.H.

Odesílání

Datový pin je připojen na pin 12 v Arduinu. Pokud vám to nevyhovuje, můžete jej změnit parametrem v konstruktoru objektu driver.

#include <RH_ASK.h>

RH_ASK driver;
char buffer[10];
int idx = 0;

void setup()
{
  Serial.begin(9600);   // Debugging only
  if (!driver.init())
    Serial.println("init failed");
}

void loop()
{
  sprintf(buffer, "%d", idx);
  idx++;

  driver.send((uint8_t *)buffer, strlen(buffer));
  driver.waitPacketSent();
  delay(200);
}

Přijímání

Datový pin je připojen na pin 11 v Arduinu. Pokud vám to nevyhovuje, můžete jej změnit parametrem v konstruktoru objektu driver.

#include <RH_ASK.h>

RH_ASK driver;
int last_idx = 0;

void setup()
{
  Serial.begin(9600); // Debugging only
  if (!driver.init())
    Serial.println("init failed");
}

void loop()
{
  uint8_t buf[RH_ASK_MAX_MESSAGE_LEN];
  uint8_t buflen = sizeof(buf);

  if (driver.recv(buf, &buflen)) // Non-blocking
  {
    // Message with a good checksum received, dump it.
    buf[buflen]=0;
    Serial.print("Received(");
    Serial.print(buflen);
    Serial.print(",");
    int idx=atoi(buf);
    Serial.print(idx>last_idx ? "+" : "-");
    Serial.print(idx-last_idx);
    last_idx=idx;
    Serial.print("}: ");
    driver.printBuffer(buf, buf, buflen);
  }
}

Zdrojový kód

Zdrojový kód se nachází na serveru GitHub.


15.07.2017


Menu