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).