Want to add wireless capabilities to your next Arduino project, for less than the price of a cup of coffee? Cóż, wtedy 433MHz RF Transmitter i Receiver Modules są właśnie dla Ciebie! Często można je dostać online za mniej niż dwa dolary za parę, co czyni je jednymi z najbardziej niedrogich opcji komunikacji danych, które można uzyskać. A co najlepsze, te moduły są super malutkie, pozwalając na włączenie bezprzewodowego interfejsu do prawie każdego projektu.

Przegląd sprzętu

Przyjrzyjrzyjmy się bliżej modułom nadajnika i odbiornika 433MHz RF.

Ten mały moduł jest nadajnikiem pomiędzy dwoma. Jest naprawdę prosty na jaki wygląda. Sercem modułu jest rezonator SAW, który jest dostrojony do pracy na częstotliwości 433,xx MHz. Jest jeszcze tranzystor przełączający i kilka elementów pasywnych, to wszystko.

Gdy na wejście DATA podana jest logiczna wartość HIGH, oscylator pracuje wytwarzając stałą wyjściową falę nośną RF o częstotliwości 433,xx MHz, a gdy na wejście DATA podana jest logiczna wartość LOW, oscylator zatrzymuje się. Ta technika jest znana jako Amplitude Shift Keying, którą omówimy szczegółowo wkrótce.

Ten jest moduł odbiornika. Choć wygląda na skomplikowany, jest równie prosty jak moduł nadajnika. Składa się on z układu dostrajającego RF i kilku wzmacniaczy OP, które wzmacniają odebraną falę nośną z nadajnika. Wzmocniony sygnał jest dalej podawany do PLL (Phase Lock Loop), który umożliwia dekoderowi „zablokowanie” na strumieniu bitów cyfrowych, co daje lepsze zdekodowane wyjście i odporność na zakłócenia.

ASK – Amplitude Shift Keying

Jak omówiono powyżej, do wysyłania danych cyfrowych przez radio, moduły te wykorzystują technikę zwaną Amplitude Shift Keying lub ASK. W Amplitude Shift Keying amplituda (tj. poziom) fali nośnej (w naszym przypadku jest to sygnał 433MHz) jest zmieniana w odpowiedzi na przychodzący sygnał danych.

Jest to bardzo podobne do analogowej techniki modulacji amplitudy, którą możesz znać, jeśli jesteś zaznajomiony z radiem AM. Jest to czasami nazywane binarnym kluczowaniem przesunięcia amplitudy, ponieważ są tylko dwa poziomy, którymi się zajmujemy. Możesz myśleć o tym jak o przełączniku ON/OFF.

  • Dla Digital 1 – To napędza nośną z pełną mocą.
  • Dla Digital 0 – To odcina nośną całkowicie.

Tak wygląda modulacja amplitudy:

Amplitude Shift keying ma tę zaletę, że jest bardzo proste w implementacji. Dość łatwo jest zaprojektować układ dekodera. Również ASK potrzebuje mniejszej szerokości pasma niż inne techniki modulacji, takie jak FSK (Frequency Shift Keying). Jest to jeden z powodów, dla których jest niedrogi.

Wadą jest jednak to, że ASK jest podatny na zakłócenia z innych urządzeń radiowych i szumu tła. Ale tak długo, jak utrzymać transmisję danych do stosunkowo niskiej prędkości, może pracować niezawodnie w większości środowisk.

433MHz RF Transmitter & Receiver Pinout

Przyjrzyjrzyjmy się pinout 433MHz RF Transmitter i Receiver Modules.

Pin DATA akceptuje dane cyfrowe do przesłania.

VCC dostarcza zasilanie dla nadajnika. Może to być dowolne dodatnie napięcie stałe z zakresu od 3,5V do 12V. Należy pamiętać, że moc wyjściowa RF jest proporcjonalna do napięcia zasilania, tzn. im wyższe napięcie, tym większy będzie zasięg.

GND to pin masy.

Antena to pin dla anteny zewnętrznej. Jak omówiono wcześniej, będziesz chciał przylutować 17,3 cm kawałek stałego drutu do tego pinu, aby uzyskać lepszy zasięg.

VCC jest zasilaniem dla odbiornika. W przeciwieństwie do nadajnika, napięcie zasilania odbiornika musi wynosić 5V.

Piny DATA wyprowadzają odebrane dane cyfrowe. Dwa środkowe piny są wewnętrznie związane razem, więc możesz użyć jednego z nich do wyprowadzenia danych.

GND jest pinem masy.

Antena jest pinem dla anteny zewnętrznej, który często nie jest oznaczony. Jest to pad w lewej dolnej części modułu, tuż obok małej cewki. Ponownie, będziesz chciał przylutować 17,3 cm kawałek solidnego drutu do tego pinu, aby poprawić zasięg.

Okablowanie – Podłączenie 433MHz RF Transmitter i Receiver do Arduino UNO

Teraz, gdy wiemy już wszystko o modułach, nadszedł czas, aby je wykorzystać!

Ponieważ będziemy przesyłać dane pomiędzy dwoma płytkami Arduino, będziemy oczywiście potrzebować dwóch płytek Arduino, dwóch desek chlebowych i kilku zworek.

Okablowanie nadajnika jest dość proste. Ma tylko trzy połączenia. Podłącz pin VCC do pinu 5V, a GND do masy na Arduino. Pin Data-In powinien być podłączony do cyfrowego pinu #12 Arduino. Powinieneś spróbować użyć pinu 12, ponieważ domyślnie biblioteka, której będziemy używać w naszym szkicu, używa tego pinu do wprowadzania danych.

Następująca ilustracja pokazuje okablowanie.

Gdy masz już okablowany nadajnik, możesz przejść do odbiornika. Okablowanie odbiornika jest tak samo proste jak nadajnika.

Po raz kolejny są tylko trzy połączenia do wykonania. Połącz pin VCC z pinem 5V i GND z masą na Arduino. Każdy z dwóch środkowych pinów Data-Out powinien być podłączony do pinu cyfrowego #11 na Arduino.

Tak powinno wyglądać okablowanie odbiornika.

Teraz, gdy nadajnik i odbiornik są już podłączone, musimy napisać jakiś kod i wysłać go do odpowiednich płytek Arduino. Ponieważ prawdopodobnie masz tylko jeden komputer, zaczniemy od nadajnika. Gdy kod zostanie tam załadowany, przejdziemy do odbiornika. Arduino, do którego podłączony jest nadajnik, może być następnie zasilane za pomocą zasilacza lub baterii.

Biblioteka RadioHead – scyzoryk szwajcarski dla modułów bezprzewodowych

Zanim zaczniemy kodować, w naszym Arduino IDE musimy zainstalować bibliotekę o nazwie RadioHead, która sprawi, że pisanie kodu będzie o wiele prostsze.

RadioHead to biblioteka umożliwiająca proste przesyłanie danych między płytkami Arduino. Jest tak uniwersalna, że może być używana do sterowania wszelkiego rodzaju urządzeniami komunikacji radiowej, w tym naszymi modułami 433MHz.

To, co robi biblioteka RadioHead, to pobieranie naszych danych, enkapsulacja ich w pakiet danych, który zawiera CRC (Cyclic Redundancy Check), a następnie wysłanie go z niezbędną preambułą i nagłówkiem do innego Arduino. Jeśli dane zostaną poprawnie odebrane, odbierające Arduino jest informowane, że dane są dostępne i przystępuje do ich dekodowania i działania.

Pakiet RadioHead składa się z następujących elementów: 36 bitowy strumień par bitów „1” i „0”, zwany „Training Preamble”, jest wysyłany na początku każdej transmisji. Te bity są niezbędne dla odbiornika, aby dostosować swoje wzmocnienie przed otrzymaniem rzeczywistych danych. Po niej następuje 12 bitowy „Symbol Startowy”, a następnie dodawane są właściwe dane (payload).

Na końcu pakietu dodawana jest sekwencja kontroli ramki lub CRC, która jest przeliczana przez RadioHead na końcu odbiornika i jeśli kontrola CRC jest poprawna, urządzenie odbiorcze jest o tym powiadamiane. Jeśli sprawdzenie CRC nie powiedzie się, pakiet jest odrzucany.

Cały pakiet wygląda mniej więcej tak:

Możesz pobrać bibliotekę, odwiedzając stronę airspayce.com lub po prostu kliknij ten przycisk, aby pobrać zip:

Aby ją zainstalować, otwórz Arduino IDE, przejdź do Sketch > Include Library > Add .ZIP Library, a następnie wybierz plik RadioHead, który właśnie pobrałeś. Jeśli potrzebujesz więcej szczegółów na temat instalacji biblioteki, odwiedź ten tutorial Installing an Arduino Library.

Kod Arduino – For 433MHz RF Transmitter

W naszym eksperymencie będziemy po prostu wysyłać prostą wiadomość tekstową z nadajnika do odbiornika. Będzie to pomocne w zrozumieniu, jak używać modułów i może służyć jako podstawa do bardziej praktycznych eksperymentów i projektów.

Oto szkic, którego użyjemy dla naszego nadajnika:

// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init();} void loop(){ const char *msg = "Hello World"; rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000);}

To dość krótki szkic, ale to wszystko, czego potrzebujesz, aby uzyskać przesyłany sygnał.

Szkic zaczyna się od włączenia biblioteki RadioHead ASK. Musimy również dołączyć bibliotekę SPI Arduino, ponieważ biblioteka RadioHead jest od niej zależna.

#include <RH_ASK.h>#include <SPI.h>

Następnie musimy utworzyć obiekt ASK, aby uzyskać dostęp do specjalnych funkcji związanych z biblioteką RadioHead ASK.

// Create Amplitude Shift Keying ObjectRH_ASK rf_driver;

W funkcji setup musimy zainicjalizować obiekt ASK.

// Initialize ASK Objectrf_driver.init();

W funkcji loop zaczynamy od przygotowania komunikatu. Jest to prosty łańcuch tekstowy i jest przechowywany we wskaźniku znaków o nazwie msg. Pamiętaj, że twoja wiadomość może być dowolna, ale nie powinna przekraczać 27 znaków dla lepszej wydajności. I pamiętaj, aby policzyć ilość znaków w wiadomości, gdyż będzie ona potrzebna w kodzie odbiornika. W naszym przypadku, mamy 11 znaków.

// Preparing a messageconst char *msg = "Hello World";

Wiadomość jest następnie przekazywana za pomocą funkcji send(). Ma ona dwa parametry: pierwszy to tablica danych, a drugi to liczba bajtów (długość danych) do przesłania. Po funkcji send() zwykle następuje funkcja waitPacketSent(), która czeka aż zakończy się transmisja poprzedniego pakietu. Następnie szkic czeka przez sekundę, aby dać naszemu odbiornikowi czas na przyjęcie wszystkiego.

rf_driver.send((uint8_t *)msg, strlen(msg));rf_driver.waitPacketSent();delay(1000);

Kod Arduino – dla odbiornika RF 433MHz

Podłącz odbiornik Arduino do komputera i załaduj następujący kod:

// Include RadioHead Amplitude Shift Keying Library#include <RH_ASK.h>// Include dependant SPI Library #include <SPI.h> // Create Amplitude Shift Keying ObjectRH_ASK rf_driver; void setup(){ // Initialize ASK Object rf_driver.init(); // Setup Serial Monitor Serial.begin(9600);} void loop(){ // Set buffer to size of expected message uint8_t buf; uint8_t buflen = sizeof(buf); // Check if received packet is correct size if (rf_driver.recv(buf, &buflen)) { // Message received with valid checksum Serial.print("Message Received: "); Serial.println((char*)buf); }}

Tak jak w przypadku nadajnika, kod odbiornika zaczyna się od załadowania bibliotek RadioHead i SPI oraz utworzenia obiektu ASK.

#include <RH_ASK.h>#include <SPI.h> RH_ASK rf_driver;

W funkcji setup: inicjalizujemy obiekt ASK, a także ustawiamy monitor szeregowy, ponieważ w ten sposób będziemy oglądać naszą odebraną wiadomość.

rf_driver.init();Serial.begin(9600);

W funkcji loop: tworzymy bufor o rozmiarze takim samym jak nadawana wiadomość. W naszym przypadku jest to 11, pamiętasz? Będziesz musiał dostosować to do długości swojej wiadomości. Pamiętaj, aby uwzględnić wszelkie spacje i znaki interpunkcyjne, ponieważ są one liczone jako znaki.

uint8_t buf;uint8_t buflen = sizeof(buf);

Następnie wywołujemy funkcję recv(). Włącza ona odbiornik, jeśli jeszcze nie jest włączony. Jeśli jest dostępna ważna wiadomość, kopiuje ją do swojego pierwszego bufora parametrów i zwraca true, w przeciwnym razie zwraca false. Jeśli funkcja zwraca true, szkic przechodzi do instrukcji if i drukuje odebraną wiadomość na monitorze szeregowym.

if (rf_driver.recv(buf, &buflen)){ Serial.print("Message Received: "); Serial.println((char*)buf); }

Potem wracamy do początku pętli i robimy wszystko od nowa.

Po załadowaniu szkicu otwórz monitor szeregowy. Jeśli wszystko jest w porządku, powinieneś zobaczyć swoją wiadomość.

433MHz Wireless RF Module Output on Serial Monitor – Receiver

Poprawa zasięgu modułów RF 433MHz

Antena, której używasz zarówno dla nadajnika, jak i odbiornika, może naprawdę wpłynąć na zasięg, jaki będziesz w stanie uzyskać z tymi modułami RF. W rzeczywistości bez anteny będziesz miał szczęście, aby komunikować się na odległość większą niż metr.

Z właściwej konstrukcji anteny, będziesz w stanie komunikować się na odległość 50 metrów. Oczywiście to jest na zewnątrz w otwartej przestrzeni. Twój zasięg w pomieszczeniach, zwłaszcza przez ściany, będzie nieco osłabiony.

Antena nie musi być skomplikowana. Zwykły kawałek drutu jednożyłowego może stanowić doskonałą antenę zarówno dla nadajnika jak i odbiornika. Średnica anteny nie ma prawie żadnego znaczenia, tak długo, jak długość anteny jest zachowana.

Najbardziej efektywna antena ma taką samą długość, jak długość fali, dla której jest używana. Dla celów praktycznych wystarczy połowa lub jedna czwarta tej długości.

Długość fali o danej częstotliwości oblicza się jako:

Długość fali częstotliwości = Prędkość transmisji (v)
Częstotliwość transmisji (f)

W powietrzu prędkość transmisji jest równa prędkości światła, czyli dokładnie 299,792,458 m/s. Zatem dla pasma 433 MHz długość fali wynosi:

Długość fali o częstotliwości = 299,792,458 m/s
433,000,000 Hz
= 0.6924 metrów
= 69,24 cm

Jako antena pełnofalowa 69,24 cm to dość długa antena, nie jest zbyt praktyczna w użyciu. Dlatego zdecydujemy się na antenę ćwierćfalową, która działa na około 17,3 cm lub 6,8 cala.

Na wszelki wypadek, jeśli eksperymentujesz z innymi nadajnikami radiowymi, które używają różnych częstotliwości, możesz użyć tego samego wzoru do obliczenia wymaganej długości anteny. Całkiem proste, prawda?

Nawet antena o długości 17,3 cm może wydawać się niewygodna w Twoim małym projekcie Arduino. Ale NIE ulegaj pokusie zwijania anteny, aby uczynić ją bardziej kompaktową, ponieważ poważnie wpłynie to na zasięg. Prosta antena jest zawsze najlepsza!

.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.