Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska
nrf24l01 transmisja w trybie Shockburst W tym trybie ramka ma prostą strukturę: Zakończona jest opcjonalnym polem kontrolnym, które obsługiwane jest sprzętowo wewnątrz układu RF Programista wybiera adres 3-5 bajtów Wysłanie preambuły i realizacja synchronizacji bitowej i bajtowej realizowane jest przez układ RF Taka organizacja ramki pozwala na wykorzystanie układu nrf24l01 do pracy w bardzo różnych protokołach transmisji Pole ładunku może być wypełnione różną treścią, wymaganą przez dany protokół. 2
nrf24l01 transmisja w trybie Shockburst Można wykorzystać specyficzną cechę układu RF, dostępną w trybie RX a polegającą na użyciu do 6 kanałów logicznych (adresów) w ramach danego kanału radiowego 3
nrf24l01 transmisja w trybie Shockburst Można wykorzystać specyficzną cechę układu RF, dostępną w trybie RX a polegającą na użyciu do 6 kanałów logicznych (adresów) w ramach danego kanału radiowego (MultiCeiver) 4
nrf24l01 transmisja w trybie Shockburst Przykładowe adresowanie w MultiCeiver 5
nrf24l01 transmisja w trybie Shockburst Biblioteka RF24 https://maniacbug.github.io/rf24/classrf24.html 6
nrf24l01 transmisja w trybie Shockburst Biblioteka RF24 https://maniacbug.github.io/rf24/classrf24.html 7
nrf24l01 transmisja w trybie Shockburst Biblioteka RF24 https://maniacbug.github.io/rf24/classrf24.html 8
nrf24l01 transmisja w trybie Shockburst Biblioteka RF24 https://maniacbug.github.io/rf24/classrf24.html 9
nrf24l01 transmisja w trybie Shockburst Biblioteka RF24 https://maniacbug.github.io/rf24/classrf24.html 10
nrf24l01 transmisja w trybie Shockburst Biblioteka RF24 https://maniacbug.github.io/rf24/classrf24.html 11
nrf24l01 transmisja w trybie Shockburst 12
Szkic Arduino //*************************************************** // Transmisja typu N->O #include <SPI.h> #include nrf24l01.h #include RF24.h #include printf.h #define TXBUF_SIZE #define RXBUF_SIZE 0x20 0x20 unsigned char [TXBUF_SIZE] = { xxxxxximie Nazwisko }; unsigned char[rxbuf_size] = {}; 13
Szkic Arduino // Konfiguracja const int Btn = 5; const int Led = 13; // Połączenie sygnałów CE i CSN układu nrf24l01+ z Arduino // CE -> 9; CSN -> 10 // Pozostałe sygnały SPI zgodne z Arduino // MOSI -> 11; MISO -> 12; SCK -> 13 RF24 radio(9,10); 14
Szkic Arduino // Ustalenie roli węzła. Połączenie role_pin do GND nadajnik // Bez połączenia odbiornik const int role_pin = 7; // Tryby pracy węzła typedef enum {nadajnik = 1, odbiornik} rola_e; // Nazwy ról const char* stan_wezla[] = { Niedostepny, Nadajnik, Odbiornik }; // Zmienna określająca bieżącą rolę węzła rola_e rola; unsigned char frcnt = 0; // licznik ramek węzła 15
Szkic Arduino // Topologia // Adresy do komunikacji dwukierunkowej const uint64_t pipes[2] = {0xE2E2E2E231LL, 0xE2E2E2E253LL}; 16
Szkic Arduino void setup() { pinmode(led, OUTPUT); pinmode(btn, INPUT_PULLUP); // Konfiguracja pinu roli węzła (wejście) pinmode(role_pin, INPUT_PULLUP); digitalwrite(role_pin,high); delay(20); // Wymagane opóźnienie // Oczyt roli węzła if (!digitalread(role_pin)) rola = nadajnik; else rola = odbiornik; 17
Szkic Arduino // Informacja startowa Serial.begin(19200); printf_begin(); printf( \n\ nrf24l01+ transmisja N -> O/\n\r ); printf( Rola wezla: %s\n\r, stan_wezla[rola]); 18
Szkic Arduino // Konfiguracja układu RF radio.begin(); // radio.disablecrc(); // bez CRC radio.setcrclength(rf24_crc_16); // sprzętowe CRC radio.setchannel(33); // 2433 MHz // Wybór trybu Shock Burst radio.setpayloadsize(txbuf_size); // l. bajtów 1-32 radio.setautoack(false); // blokada potwierdzeń radio.setdatarate(rf24_1mbps); // lub RF_250KBPS radio.setretries(0,0); // zerowa liczba powtórzeń 19
Szkic Arduino // Otwarcie kanałów logicznych dla komunikacji // Przydział adresów dla nadawania i odbioru if (rola == nadajnik) // tu tylko pipes[0] { radio.openwritingpipe(pipes[0]); // radio.openwritingpipe(1, pipes[1]); } else { // radio.openwritingpipe(pipes[1]); radio.openwritingpipe(1, pipes[0]); } 20
Szkic Arduino // Start nasłuchu radio.startlistening(); // Wydruk konfiguracji wybranych rejestrów radio.printdetails(); } // Koniec funkcji setup() 21
Szkic Arduino - funkcja loop() void loop() { // Rola nadajnika if (rola == nadajnik) { // Zatrzymanie nasłuchu radio.stoplistening(); 22
Szkic Arduino - funkcja loop() /* Wysłać ramkę z następującym ładunkiem TxBuf[0] - rozmiar pola ładunku TxBuf[1] - stan przycisku Btn TxBuf[2] - nr sekwencyjny ramki (frcnt) TxBuf[3] - stały bajt 0xFF Pozostała część bufora od i=6 tekst ASCII Wydruk zawartości wysłanej ramki */ radio.startlistening(); delay(1000); } // koniec nadawania 23
Szkic Arduino - funkcja loop() // Rola nadajnika skorzystać z funkcji radio.write() 24
Szkic Arduino - funkcja loop() // Rola odbiornika if (rola == odbiornik) { // Jeśli są dane do odczytu if (radio.available()) { /* Odczyt danych do bufora RxBuf Wydruk: dane (Rxbuf[0] RxBuf[3]), tekst od RxBuf[6] */ } } } // koniec odbioru 25
Szkic Arduino - funkcja loop() // Rola odbiornika skorzystać z funkcji radio.read() 26
Dziękuję Zygmunt Kubiak 27 11-201 6