Moduły komunikacji radiowej RF są najczęściej małymi urządzeniami elektronicznymi służącymi do przesyłania i / lub odbierania sygnałów radiowych. W praktyce komunikacja RF wymaga istninia dwóch urządzeń - nadajnika (TX) i odbiornika (RX) (Fig. 1). Urządzenia są budowane dla różnych zakresów częstotliwości. Jednym z najbardziej popularnych konstrukcji wykorzystywanych przy prototypowaniu z wykorzystaniem Arduino są układy FS100A (Fig. 2). Nadajnik i odbiornik komunikują się ze sobą na częstotliwości 433 MHz. Są zasilane napięciem 3,5-12V. Z mikrokontrolerami komunikują się za pomocą jednego przewodu (TX lub RX). Zasięg nadajnika to około 200m w terenie otwartym i około 40m w terenie zabudowanym.
W sieci istnieje cała masa różnych układów nadajników RF opartych na układzie FS100A. Przedstawiam tu prosty układ, którego celem będzie przesłanie ciągu znaków zapisanych w zmiennej typu string. Układ będzie dokonywał transmisji danych każdorazowo po naciśnięciu przycisku. Do obsługi zarówno nadajnika jak i odbiornka służy biblioteka VirtualWire. Należy pamiętać, że jeżeli nie zadeklarujemy tego inaczej, nadajnik domyślnie należy podpiąć do pinu 12 mikrokontrolera, a odbiornik do pinu 11. Do zbudowania układu (Fig. 3) nadajnika będziemy potrzebowali:
#include <VirtualWire.h> // Attach RF modules library
#define LED_PIN 5 // Define no of the LED pin
#define OK_PIN 3 // Define no of the button pin
#define TRANSMIT_PIN 6 // Define FS100A data transmit pin
void setup() {
pinMode(OK_PIN, INPUT_PULLUP); // OK button declaration
pinMode(LED_PIN, OUTPUT); // LED pin declaration
vw_set_tx_pin(TRANSMIT_PIN); // VirtualWire library settings of the data transmit pin
vw_setup(2000); // VirtualWire transmision speed
digitalWrite(LED_PIN, HIGH); // Turn off the LED
}
void loop() {
String toSend = ("Tomasz Bartus"); // Message text
char msg[20]; // Create 20-elements char table
toSend.toCharArray(msg, toSend.length() + 1); // convert text to char table
if (digitalRead(OK_PIN) == LOW) { // If an OK button has been pressed
delay(20); // Wait 20ms to stabilise button debounce
digitalWrite(LED_PIN, LOW); // Turn on the LED
vw_send((uint8_t *)msg, strlen(msg)); // Send the mesage
vw_wait_tx();
while (digitalRead(OK_PIN) == LOW) { // Wait until the button will be released
delay(20); // Wait 20ms to stabilise button debounce
}
}
digitalWrite(LED_PIN, HIGH); // Turn off the LED
delay(1000);
}
Do zbudowania układu odbiornika (Fig. 4) będziemy potrzebowali:
#include <VirtualWire.h> // Attach RF modules library
#define LED_PIN 2 // Define no of the LED pin
#define RECEIVE_PIN 11 // Define FS100A data receive pin
void setup() {
pinMode(LED_PIN, OUTPUT); // LED pin declaration
Serial.begin(9600); // Serial port monitor initialization
vw_set_rx_pin(RECEIVE_PIN); // VirtualWire library settings of the data receive pin
vw_setup(2000); // VirtualWire transmision speed
vw_rx_start(); // Receiver initialisation
}
void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) { // If the data will be receive
int i;
digitalWrite(LED_PIN, HIGH); // Switch the LED on
for (i = 0; i < buflen; i++) {
Serial.print(buf[i], HEX); //
Serial.print(' ');
}
Serial.println();
digitalWrite(LED_PIN, LOW); // Switch the LED on
}
}
W zmiennej toSend skryptu obsługującego nadajnik przechowywany jest komunikat, który ma zostać przesłany drogą radiową do odbiornika. Aby nadajnik przesłał go znak po znaku musimy go najpierw rozdzielić na pojedyncze znaki. Tworzona jest 20-elementowa tablica msg, do której zapisywane są kolejne znaki ciągu toSend. Przygotowana tablica jest następnie wykorzystywana przez funkcje biblioteki VirtualWire do wysłania całego stringu. Przesłanie informacji następuje kazdorażowo po naciśnieciu przycisku. O wysłaniu komunikatu informuje chwilowe zaświecenie się zielonej diody LED. Odbiornik po odebraniu informacji zaświeca czerwoną diodę LED i cały komunikat, znak po znaku przekazuje do monitora portu szeregowego (Fig. 5).
Konwersji znaków zakodowanych w kodzie heksadecymalnym możemy dokonać w dowolnym konwerterze HEX -> ASCII (Fig. 6).