Opis modułu
Moduł transmisji opiera się na paśmie 2.4 GHz. Płytka zawiera wbudowaną antenę. Teoretyczny zasięg deklarowany w idealnych warunkach ma wynosić 100m. Zbadany zasięg pozwala na osiągnięcie odległości około 25m.
Poniżej przedstawiam opis najważniejszych elementów układu:
- Zasilanie 3.3V, Akceptowane z zakresu od 1.9V do 3.6V.
- Pobór prądu - odbieranie 13mA, wysyłanie 12mA
- Częstotliwość 2,4GHz
- Prędkość transmisji 250kbps, 1Mbps, 2Mbps
- Antena wbudowana w moduł
- Wzmocnienie sygnału 0 dB, -6 dB, -12 dB, -18 dB,
Rys. 1. nRF24L01+
Podczas odbierania danych pobierany jest prąd o wartości 13 mA. Natomiast podczas odbioru 12 mA. Wartość pobieranego prądu można zmniejszyć wykorzystując jeden ze stanów oszczędzania energii.
Układ posiada następujące wyprowadzenia:
- GND - Masa
- VCC - Zasilanie
- CE - Pin aktywacyjny(Chip Enable)
- CSN - Wyjście wybierające (Chip Select)
- SCK - Sygnał zegarowy (Serial Clock)
- MOSI - Dane dla układu peryferyjnego (Master Output Slave Input)
Pin aktywacyjny CE odpowiada za wybranie sposobu pracy układu czy będzie występowało nadawanie bądź odbieranie danych. Piny CSN, SCK, MOSI oraz MISO są wyprowadzeniami interfejsu SPI. Mają one za zadanie wybranie układu peryferyjnego, zadania sygnału taktujące, obsługi danych wejściowych oraz wyjściowych.
Do transmisji danych wykorzystywana jest modulacja GFSK. Jest ona odmianą modulacji FSK, która jest stosowana przy wykonywaniu różnego typu łączności bezprzewodowej. Wartość logicznej jedynki jest generowana poprzez dodanie odchylenia częstotliwości , natomiast logiczne zero jest wyrażone poprzez ujemne odchylenie.
Ten moduł nie posiada wzmacniacza sygnału, możliwe jest wyłącznie tłumienie sygnału, w celu obniżenia wartości prądu jaki jest potrzebny do działania układu. Poniżej przedstawiam listę możliwych wartości wzmocnienia wraz z wartością prądu jaki jest pobierany:
Ten moduł nie posiada wzmacniacza sygnału, możliwe jest wyłącznie tłumienie sygnału, w celu obniżenia wartości prądu jaki jest potrzebny do działania układu. Poniżej przedstawiam listę możliwych wartości wzmocnienia wraz z wartością prądu jaki jest pobierany:
- 0dBm - 11,3 mA
- -6dBm - 9mA
- -12dBm - 7,5mA
- -18dBm - 7,0mA
Oczywiście im mniejsza wartość wzmocnienia tym zasięg ulega drastycznemu zmniejszeniu. Przy wartości -18dBm, efektywny zakres pracy będzie się znajdował w granicach 2-3 metów.
Podłączenie
Układ należy podłączyć w następujący sposób:
VCC - 3,3V
GND - GND
MOSI - Pin 11 Arduino
MISO - Pin 12 Arduino
SCK - Pin 13 Arduino
CE - Pin 2 Arduino
CSN - Pin 3 Arduino
Dodatkowo jak najbliżej układu dobrze jest podłączyć kondensator 10uF. Inny sposób polega na podłączeniu dwóch równolegle jeden 10uF, drugi natomiast 0,1uF.
Rozkład pinów na module do komunikacji jest taki jak na rysunku 2.
Rys. 2. Rozmieszczenie wyprowadzeń
Programowanie
Wykorzystywane są moduły jeden pracuje w trybie nadajnika, drugi natomiast jako odbiornik.
Pierwszy program będzie wysyłał stałą wartość w postaci ciągu znaków co określony interwał czasowy.
- //Dołączone biblioteki
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h>
- //Obiekt o nazwie radio
- //Jako dane piny do podłączenia
- //Odpowiednio CE oraz CSN
- RF24 radio(2, 3);
- //Stworzenie tablicy
- //z podanym adresem urządzenia
- //Istotne w przypadku podłączenie
- //kilku takich modółów
- const byte rxAddr[6] = "00001";
- void setup()
- {
- //Aktywacja układu
- radio.begin();
- //ilosc prob jakie nastapia
- //do utraty polaczenia, w tym przypadku
- //wystąpi 20 prób
- radio.setRetries(20, 20);
- //dodanie nazwy adresu odbiornika z ktorym
- //nastąpi komunikacja
- radio.openWritingPipe(rxAddr);
- //przełączenie układu do trybu transmisji
- radio.stopListening();
- }
- void loop()
- {
- //zdefiniowanie tablicy z danymi
- const char text[] = "Dziala!";
- //Przeslanie danych
- radio.write(&text, sizeof(text));
- //Funckja opozniajaca
- delay(4000);
- }
Teraz wersja oprogramowania dla odbiornika.
- //Dołączone biblioteki
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h>
- //Obiekt o nazwie radio
- //Jako dane piny do podłączenia
- //Odpowiednio CE oraz CSN
- RF24 radio(2, 3);
- //Stworzenie tablicy
- //z podanym adresem urządzenia
- //Istotne w przypadku podłączenie
- //kilku takich modółów
- const byte rxAddr[6] = "00001";
- void setup()
- {
- //Oczekiwanie na włączenie
- //transmisji szeregowej
- while (!Serial);
- Serial.begin(9600);
- //Aktywacja układu
- radio.begin();
- //Podanie adresu oraz liczby strumieni
- //z danymi
- radio.openReadingPipe(0, rxAddr);
- //przełączenie układu do trybu transmisji
- radio.startListening();
- }
- void loop()
- {
- //sprawdzenie czy jakies dane zostały dostarczone
- if (radio.available())
- {
- //Definicja tablicy z danymi
- char text[32] = {0};
- //Odczytanie danych
- radio.read(&text, sizeof(text));
- //Wyswietlenie danych
- Serial.println(text);
- }
- }
Kolejny program będzie odczytywał dane z potencjometru, które po przesłaniu będą wyświetlane poprzez port szeregowy oraz wyświetlacz ze sterownikiem HD44780 podłączony poprzez konwerter I2C.
W pierwszej kolejności przychodzi program z nadajnika:
- //Dołączone biblioteki
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h>
- //Obiekt o nazwie radio
- //Jako dane piny do podłączenia
- //Odpowiednio CE oraz CSN
- RF24 radio(2, 3);
- //Stworzenie tablicy
- //z podanym adresem urządzenia
- //Istotne w przypadku podłączenie
- //kilku takich modółów
- const byte rxAddr[6] = "00001";
- const int PotPin = 0;
- int PotencjometrWar;
- char Pomocnicza;
- void setup()
- {
- //Oczekiwanie na włączenie
- //transmisji szeregowej
- while (!Serial);
- Serial.begin(9600);
- //Aktywacja układu
- radio.begin();
- //ilosc prob jakie nastapia
- //do utraty polaczenia, w tym przypadku
- //wystąpi 20 prób
- radio.setRetries(20, 20);
- //dodanie nazwy adresu odbiornika z ktorym
- //nastąpi komunikacja
- radio.openWritingPipe(rxAddr);
- //przełączenie układu do trybu transmisji
- radio.stopListening();
- }
- void loop()
- {
- PotencjometrWar = analogRead(PotPin);
- //Pomocnicza = int(PotencjometrWar);
- //zdefiniowanie tablicy z danymi
- int wart = PotencjometrWar;
- //Przeslanie danych
- radio.write(&wart, sizeof(wart));
- //Funckja opozniajaca
- delay(1000);
- //Wyswietlenie danych
- Serial.println(PotencjometrWar);
- Serial.println(wart);
- }
Program dla odbiornika:
- //Dołączone biblioteki
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h>
- #include <Wire.h>
- #include <LiquidCrystal_I2C.h>
- //Ustawienie adresu układu
- LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
- //Obiekt o nazwie radio
- //Jako dane piny do podłączenia
- //Odpowiednio CE oraz CSN
- RF24 radio(2, 3);
- //Stworzenie tablicy
- //z podanym adresem urządzenia
- //Istotne w przypadku podłączenie
- //kilku takich modółów
- const byte rxAddr[6] = "00001";
- void setup()
- {
- //Oczekiwanie na włączenie
- //transmisji szeregowej
- while (!Serial);
- Serial.begin(9600);
- //Aktywacja układu
- radio.begin();
- //Rozpoczęcie pracy wyświetlacza
- lcd.begin(16,2);
- //Włączenie podświetlania
- lcd.backlight();
- //Ustawienie kursora w pozycji poczatkowej
- lcd.setCursor(0,0);
- //Podanie adresu oraz liczby strumieni
- //z danymi
- radio.openReadingPipe(0, rxAddr);
- //przełączenie układu do trybu transmisji
- radio.startListening();
- }
- void loop()
- {
- //sprawdzenie czy jakies dane zostały dostarczone
- if (radio.available())
- {
- lcd.clear();
- //Definicja tablicy z danymi
- int wart = 0;
- //Odczytanie danych
- radio.read(&wart, sizeof(wart));
- lcd.println(wart);
- //Wyswietlenie danych
- Serial.println(wart);
- }
- }