Moduł komunikacji radiowej RF - FS100A


Tomasz Bartuś



2020-03-04
Moduł komunikacji radiowej RF - FS100A

Wstęp

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.

Układ nadajnika i odbiornika do komunikacji bezprzewodowej
Fig. 1. Układ nadajnika i odbiornika do komunikacji bezprzewodowej

Moduły komunikacji radiowej FS100A
Fig. 2. Moduły komunikacji radiowej FS100A; od lewej nadajnik i odbiornik

Nadajnik

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:

  1. platforma Arduino (u mnie Leonardo),
  2. nadajnik komunikacji radiowej FS100A (Fig. 2),
  3. dioda LED ( u mnie zielona),
  4. rezystor 135Ω,
  5. płytka prototypowa,
  6. przewody/mostki,

Schemat

Schemat montażowy nadajnika
Fig. 3. Schemat montażowy nadajnika

Kod

#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);
}

Odbiornik

Do zbudowania układu odbiornika (Fig. 4) będziemy potrzebowali:

  1. platforma Arduino (u mnie Uno),
  2. odbiornik komunikacji radiowej FS100A (Fig. 2),
  3. dioda LED (u mnie czerwona),
  4. rezystor 150Ω,
  5. płytka prototypowa,
  6. przewody/mostki.

Schemat

Schemat montażowy odbiornika
Fig. 4. Schemat montażowy odbiornika

Kod

#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
  }
}

Działanie

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

Komunikat odebrany w monitorze portu szeregowego
Fig. 5. Komunikat odebrany w monitorze portu szeregowego; znaki zakodowane w kodzie heksadecymalnym

Konwersji znaków zakodowanych w kodzie heksadecymalnym możemy dokonać w dowolnym konwerterze HEX -> ASCII (Fig. 6).

Wykorzystanie konwertera online do zamiany znaków w kodzie heksadecymalnym na kod ASCII
Fig. 6. Wykorzystanie konwertera online do zamiany znaków w kodzie heksadecymalnym na kod ASCII

Wykorzystane materiały

Elektro Maras, 2014, Jak przesyłać dane z użyciem nadajnika i odbiornika RF?
MateuszxD, 2014. Jak zacząć z RF?
Gałaś P., 2015. Kurs Arduino #10: Obsługa modułów RF 433MHz i 315MHz
 
 

Doktorat

Spis treści
Rozdzialy
Abstrakt [pl]
Abstract [eng]