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.
Na fotografiích je použito Arduino Pro Mini a Arduino Mega. To vás nelimituje, můžete použít v podstatě libovolné Arduino.
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.
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
.
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ší.
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);
}
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 se nachází na serveru GitHub.
15.07.2017