WiFi scanner nRF24L01+ modullal
A Nordic nFR24L01+ chip köré épült áramkörök a könnyű kezelhetőségükkel, egyszerű használatukkal vívtak ki elismerést Arduno környezetben. Azonban alkalmazási lehetőségének egyik speciális módja, amikor a kiválasztott kommunkációs csatornán a jelerősséget figyeli. A modul a 2.400...2.525 Mhz sávban működik: azaz egyszerű WIFI-Scanner készíthető segítségével, mely a zajszennyezést méri a különböző WIFI csatornákon. A modul a 2.4GHz sávon működik, így az 5GHz sáv vizsgálatára nem alkalmas! Az nRF24L01 eljáráskönyvtár a frekvenciapásztázó a funkciót nem tartalmazza, így közvetlen SPI buszon át történő regisztermanipulálással lehet adatot kinyerni belőle. A megjelenítés egyszerűen soros vonalon kiküldött adatokból a terminálképernyőn lehetséges. Az SPI busz kellően gyors a méréshez, a megjelenítésre szolgáló soros adatfolyam nem korlátozza a mérést.
As common FR24L01 libraries do not interface well with SPI-lib of the current Arduino IDE (22), The necessary interface was written from scratch. Some timing is pushing the limit of the device(s), as we wanted to scan as fast as possible, but they are working reliably with my setup. Basically, the setup is very simple. The nRF24L01p is a SPI-device, and you have to run cables from the Arduino-specific pins to the nRF24L01p-breakout board. Specifically, the connections are:
A modul bekötése:
- SS : Arduino Pin 10 -> Breakout Board CSN
- MOSI : Arduino Pin 11 -> Breakout Board MOSI
- MISO : Arduino Pin 12 -> Breakout Board MISO
- SCK : Arduino Pin 13 -> Breakout Board SCK
A programkód és kapcsolás A vázolt működés miatt a program a lehető legegyszerűbb. A setup() részen az SPI busz kijelölésre kerül, valamint a működéshez szükséges ChipEnable kivezetés. A bekötést egyszerűsíti, hogy bár a modul 3.3V tápfeszültségről jár, a ki/bemenetei 5V toleránsak. Azonban ha nem akarunk a forrasztásokal bajlódni, akkor illesztőpanelt is használhatunk: kapcs. rajz A wifiscanner program ide kattintva letölthető. megvalósulási foto A kapott eredmény az Arduino terminal képernyőn - a wifi csatornák ábrázolásával: eredmény Tapasztalatok, trükkök Ha nem akarunk bajlódni kiegészítő áramkörrel, akkor például a Nano IO board is bevethető. Ez többféle feladatra is alkalmas, így nem csak egy nagyranőtt wifi scannerünk lesz. És az illesztést már tartalmazza is az alappanel! Az nrf24l01/nrf24l01+ chippel szerelt lapkából többféle kialakítású is létezik: - nrf24l01 modul, nyák antennával (nrf24l01), - nrf24l01 nagynyereségű antennával, (nrf24l01 pa) - nrf24l01 erősítővel és nagynyereségű antennával (nrf24l01 pa la) A teszthez érdemes a botantennás kivitelt választani. A vétel során az adóerősítőt nem használjuk, de később ha szükség lesz 1 km átlövésére, jó szolgálatot tehet (a végfok nélküli, botantennás nrf24l01 gyártása megszűnt). A nyákantennás kivitel érzéketlenebb a kialakítása miatt, így kevesebb zajt lehet vele mérni. összehasonlítási ábra A WifiScanner nem csak a wifi jelre érzékeny. Bármely más, ezen a frekvencián működó eszköz zavaró hatását vizsgálhatjuk. a legegyszerűbb a bluetooth kapcsolat.l Ezt bekapcsolva jól látható a 2.4 GHz rádiós jelek megjelenése: bt ésbt nélkül. Ugyanilyen frekvencián működő eszköz a mikrohullámú sütó. Bekapcsolva kijut ebből is zaj a környezretbe: ábra mikro, wifionly A soros kommunikáció helyett látványos görbesor lehet az LCD-re való kiírás. Az egyszerűbb kábelezés miatt IIC bővítőmodulal lett a kijelző használva.
kép, eredmlny, progrmkód.
Furthermore, do not forget to connect the CE line which is required to drive the nRF24L01 to RX and also triggers the RF power reading. It is defined in the program as Arduino Pin 9: CE : Arduino Pin 9 -> Breakout Board CE A WiFi scanner CODE:
#include<spi.h> // Poor Man's Wireless 2.4GHz Scanner // // uses an nRF24L01p connected to an Arduino // // Cables are: // SS -> 10 // MOSI -> 11 // MISO -> 12 // SCK -> 13 // // and CE -> 9 // // created March 2011 by Rolf Henkel // #define CE 9 // Array to hold Channel data #define CHANNELS 64 int channel[CHANNELS]; // greyscale mapping int line; char grey[] = " .:-=+*aRW"; nRF24L01P registers we need #define _NRF24_CONFIG 0x00 #define _NRF24_EN_AA 0x01 #define _NRF24_RF_CH 0x05 #define _NRF24_RF_SETUP 0x06 #define _NRF24_RPD 0x09 // get the value of a nRF24L01p register byte getRegister(byte r) { byte c; PORTB &=~_BV(2); c = SPI.transfer(r&0x1F); c = SPI.transfer(0); PORTB |= _BV(2); return(c); } // set the value of a nRF24L01p register void setRegister(byte r, byte v) { PORTB &=~_BV(2); SPI.transfer((r&0x1F)|0x20); SPI.transfer(v); PORTB |= _BV(2); } // power up the nRF24L01p chip void powerUp(void) { setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x02); delayMicroseconds(130); } // switch nRF24L01p off void powerDown(void) { setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)&~0x02); } // enable RX void enable(void) { PORTB |= _BV(1); } // disable RX void disable(void) { PORTB &=~_BV(1); } // setup RX-Mode of nRF24L01p void setRX(void) { setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x01); enable(); // this is slightly shorter than // the recommended delay of 130 usec // - but it works for me and speeds things up a little... delayMicroseconds(100); } // scanning all channels in the 2.4GHz band void scanChannels(void) { disable(); for( int j=0 ; j<200 ; j++) { for( int i=0 ; i <CHANNELS ; i++) { // select a new channel setRegister(_NRF24_RF_CH,(128*i)/CHANNELS); // switch on RX setRX(); // wait enough for RX-things to settle delayMicroseconds(40); // this is actually the point where the RPD-flag // is set, when CE goes low disable(); // read out RPD flag; set to 1 if // received power > -64dBm if( getRegister(_NRF24_RPD)>0 ) channel[i]++; } } } // outputs channel data as a simple grey map void outputChannels(void) { int norm = 0; // find the maximal count in channel array for( int i=0 ; i norm ) norm = channel[i]; // now output the data Serial.print('|'); for( int i=0 ; i 0 ) pos++; // clamp large values if( pos>9 ) pos = 9; // print it out Serial.print(grey[pos]); channel[i] = 0; } // indicate overall power Serial.print("| "); Serial.println(norm); } // give a visual reference between WLAN-channels and displayed data void printChannels(void) { // output approximate positions of WLAN-channels Serial.println("> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <"); } void setup() { Serial.begin(57600); Serial.println("Starting Poor Man's Wireless 2.4GHz Scanner ..."); Serial.println(); // Channel Layout // 0 1 2 3 4 5 6 // 0123456789012345678901234567890123456789012345678901234567890123 // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // Serial.println("Channel Layout"); printChannels(); // Setup SPI SPI.begin(); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV2); SPI.setBitOrder(MSBFIRST); // Activate Chip Enable pinMode(CE,OUTPUT); disable(); // now start receiver powerUp(); // switch off Shockburst setRegister(_NRF24_EN_AA,0x0); // make sure RF-section is set properly // - just write default value... setRegister(_NRF24_RF_SETUP,0x0F); // reset line counter line = 0; } void loop() { // do the scan scanChannels(); // output the result outputChannels(); // output WLAN-channel reference every 12th line if( line++>12 ) { printChannels(); line = 0; } }
TavIR-Facebook