Teraz przyszła pora na zaprogramowanie urządzeń. Pierwszym programem niech będzie tradycyjne już “Hello World” [Witaj Świecie].
Sprawię, że jedno urządzenie z modemem będzie wysyłało napis do drugiego urządzenia. Drugie urządzenie zaś wyśle odebrany napis do komputera, żeby wyświetlić go w Monitorze Portu Szeregowego Arduino.
Do do programowania modemu nRF24L01 potrzebujesz biblioteki RF24. Znajdziesz ja na stronie projektu RF24 na Github.
Wystarczy kliknąć przycisk “Download ZIP” i pobrać plik biblioteki.
Bibliotekę możesz zainstalować w Arduino IDE poprzez menu Szkic->Importuj bibliotekę->Dodaj bibliotekę. Inny sposób to rozpakować plik zip do katalogu domowego Arduino/librares na Linuksie lub do DokumentyArduinolibrares w Windows.
Program Nadajnika wygląda tak:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); const byte rxAddr[6] = "00001"; void setup() { radio.begin(); radio.setRetries(15, 15); radio.openWritingPipe(rxAddr); radio.stopListening(); } void loop() { const char text[] = "Hello World"; radio.write(&text, sizeof(text)); delay(1000); }
Na początku informuje program jakich będę używał bibliotek.
- SPI.h – do obsługi interfejsu komunikacji z modemem
- nRF24L01.h – do obsługi tego konkretnego sterownika modemu
- RF24.h – biblioteka która ułatwia nam sterowanie modemem radiowym
W dalszej części tworzę obiekt o nazwie “radio”.
RF24 radio(7, 8);
Obiekt ten reprezentuje podłączony do Arduino modem. Argumenty 7 i 8 to numery pinów cyfrowych, do których podłączone są sygnały CE i CSN. Jeśli podłączyłeś je do innych pinów to możesz zmienić argumenty na inne :-).
Potem tworzę globalną tablicę o nazwie “rxAddr”.
const byte rxAddr[6] = "00001";
Zapisałem w niej adres modemu do którego Arduino będzie nadawać dane. Adres ma wartość “00001”, jednak jeśli chcesz możesz mu nadać inną jako dowolny 5 literowy napis.
Adres jest po to, że jeśli w sieci masz kilka modemów, to dzięki adresowi możesz wybrać jeden konkretny modem do którego wysyłasz dane.
W funkcji “setup” wywołuję metodę “radio.begin();” [radio.rozpocznij]. Aktywuje ona modem do działania.
Następnie ustawiam metodę “radio.setRetires(15, 15);” [radio.ustaw kiedy mam sobie darować]. Ustala ona co jaki czas i ile razy modem ma ponawiać wysłanie danych jeśli odbiorca ich nie dostał.
Pierwszy argument ustala co jaki czas ponawiać próbę. Jest on wielokrotnością 250 mikrosekund. 15 * 250 = 3750. Czyli jeśli odbiorca nie odbierze danych modem będzie starał się je wysyłać co 3,75 milisekund.
Drugi argument to liczba prób. Czyli, że ma próbować wysyłać 15 razy zanim da sobie spokój i uzna, że odbiornik jest po za zasięgiem, albo jest wyłączony.
Metoda “radio.openWritingPipe(rxAddr);” [radio.otwórz rurę/kanał do zapisu] ustawia adres odbiornika do którego program ma wysyłać dane. Jej argumentem jest utworzona wcześniej tablica z adresem odbiornika.
Ostatnia metoda funkcji “setup” to “radio.stopListening();” [radio.skończ nasłuchiwać]. Przestawia ona modem w tryb nadawania danych.
W funkcji “loop” zaczynam od stworzenia napisu który chcę wysłać przez modem.
const char text[] = "Hello World";
Jest to tablica znaków/liter typu “char” [znak] o nazwie “text” do której przypisałem napis “Hello World” [Witaj Świecie].
Następnie za pomocą metody “radio.write(&text, sizeof(text));” [radio.zapisz] wysyłam tekst przez radio do modemu, którego adres ustaliłem wcześniej przez “openWritingPipe”.
Pierwszy argument metody to wskaźnik na zmienną, która przechowuje dane do wysłania. Dlatego używam przed nazwą zmiennej “&”, żeby zrobić z niej wskaźnik.
Drugi argument to ilość bajtów jakie radio ma pobrać ze zmiennej do wysłania. Użyłem tu funkcji “sizeof()” [rozmiar/wielkość], która automatycznie oblicza ile bajtów ma napis w zmiennej “text”.
Przez tą metodę można wysłać maksymalnie 32 bajty na raz. Bo taki jest maksymalny rozmiar danych pojedynczego pakietu modemu.
Jeśli potrzebne ci jest potwierdzenie, że odbiornik odebrał dane, to metoda “radio.write” zwraca wartośc typu “bool”. Jak zwróci “true” [prawda], to dane dotarły do odbiornika. Jeśli zwróci “false” [fałsz/kłamstwo/bzdura] to dane nie zostały odebrane.
Metoda “radio.write” blokuje działanie programu do czasu potwierdzenia odebrania danych lub do czasu aż skończą się wszystkie próby nadawania ustalone w metodzie “radio.setRetires”.
Ostatnią częścią funkcji “loop” jest wywołanie funkcji “delay(1000);”. Blokuje ona program na 1000 milisekund, czyli jedną sekundę. Sprawia, że program będzie co sekundę wysyłał napis “Hello World” do odbiornika.
Program odbiornika w drugim urządzeniu z modemem będzie wyglądał tak:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> RF24 radio(7, 8); const byte rxAddr[6] = "00001"; void setup() { while (!Serial); Serial.begin(9600); radio.begin(); radio.openReadingPipe(0, rxAddr); radio.startListening(); } void loop() { if (radio.available()) { char text[32] = {0}; radio.read(&text, sizeof(text)); Serial.println(text); } }
Program wygląda z grubsza dość podobnie do programu nadajnika. Najpierw wybierane są biblioteki, których będziemy używać, potem tworzony jest obiekt “radio” z wybranymi pinami sterującymi, w kolejnej linii widać tablicę z adresem odbiornika – takim samym jak w programie nadajnika.
W funkcji “setup” na początku ustawiam obiekt “Serial” do komunikacji Arduino z komputerem.
while (!Serial);
Ten fragment czeka, aż port USB w Arduino przełączy się w tryb portu szeregowego COM:
Metoda “Serial.begin(9600);” [Port Szeregowy.rozpocznij] ustawia prędkość komunikacji z komputerem przez USB/COM.
Następna częśc funkcji to ustawianie modemu. Rozpoczyna je znana z poprzedniego programu metoda “radio.begin();” ustawiająca modem do działania z programem.
Kolejna linia programu to “radio.openReadinPipe(0, rxAddr);” [radio.otwórz rurę/kanał do odczytu], która ustala jaki nasz modem ma adres pod którym odbiera dane.
Pierwszy argument to numer rury/strumienia. Można stworzyć do 6 strumieni odczytu reagujących na różne adresy. Ja utworzyłam adres tylko dla strumienia numer 0.
Drugi argument to adres na jaki ma reagować strumień, żeby odebrać dane. Ustawiłem tu adres przypisany do tablicy “rxAddr”.
Kolejną czynnością jest włączenie odbierania danych przez modem za pomocą metody “radio.startListening();”. Od tej chwili modem czeka na dane wysłane pod ustalony adres.
W funkcji “loop” program wykonuje następujące operacje.
Najpierw sprawdza czy dotarły jakieś dane na adres modemu za pomocą metody “radio.available();”. Metoda ta zwraca wartość “true” [prawda]jeśli czekają na nas jakieś dane, lub “false” [fałsz] jeśli nikt nic nie wysłał.
char text[32] = {0};
Jeśli dane czekają, to tworzę 32-elementową tablicę typu “char” o nazwie “text” wypełnioną zerami, do której zapiszę odebrane dane.
By odczytać dane używam metody “radio.read(&text, sizeof(text));”.
Pierwszym argumentem metody jest wskaźnik do zmiennej do której mają być zapisane dane odebrane przez modem. By przedstawić zmienną jako wskaźnik zastosowałem znak “&” przed jej nazwą.
Drugim argumentem jest ilość danych do zapisania w zmiennej. Zastosowałem tu znowu funkcję “sizeof()” [rozmiar/wielkość], która automatycznie obliczy rozmiar tablicy “text”.
Po odebraniu danych, przekazuje je do metody “Serial.println(text);”, która wysyła odebrany tekst do komputera, gdzie można go podglądać w “Monitorze portu szeregowego” za pomocą Arduino IDE.
Przy poprawnych połączeniach i działaniu programu, monitor powinien zwracać takie wartości.
Modem nRF24L01 możesz kupić w sklepie Nettigo:
sprae