如何制作 WiFi 干扰器,但使用 nRF24L01
WiFi干扰器,但带有nRF24L01
组件和耗材
应用和平台
1
Arduino IDE
项目介绍
编号:nRF24L01
该模块是一个收发器,这意味着它既可以发送也可以接收。这些模块价格非常便宜,体积小,该模块的工作电压为1.9至3.6伏,MOSI,MISO和SCK引脚是模块的SPI引脚。必须连接到Arduino中的SPI协议引脚。CSN 和 CE 引脚用于将模块设置为活动模式,并在命令模式和数据传输之间切换。这两个引脚可以连接到Arduino上的任何数字引脚。IRQ 引脚为中断引脚,无需连接。
这些模块的一些规格如下:
- 发送数据时的功耗约为 12 mA。
- 如果在户外使用天线,范围可以达到 1000 米
- 每个模块最多可以与 6 个其他模块通信。
- 使用 2.4 GHz 频段。
- 您可以以 1 MB 的速度发送 1 到 25 字节的原始数据。
2.4 GHz 网络频段的干扰
有许多设备在 2.4GHz 范围内运行,例如;电话、蓝牙、WiFi、汽车报警器、微波炉都在这个范围内,通过这个项目,我们将能够测量和显示这些值。通常不难发现干扰。作为频谱分析仪并使用标准USB接口连接到笔记本电脑的产品即将上市,这意味着干扰源可以很容易地与天线一起使用以查找干扰。
项目工作方式
nRF24射频无线电板的活动通过串行接口传输到Arduino板,并以ASCII代码显示任何类型的活动。在简单映射的帮助下,域显示在不同的通道中。在这个项目中,2.4GHz网络扫描仪甚至显示了微波和无线摄像头的干扰。当然,您可能想知道这款扫描仪和数据包监视器有什么区别?!作为回应,我不得不提一下,在监视器包中,它只监视可用于 WiFi 网络的 14 个通道,但在这个项目中,我们可以检测并实际看到 2.4 范围内的任何频率。在第二部分中,我们将更多地处理这个问题。在下文中,我们将使用OLED显示屏以图表的形式显示这些值。图形值基于扫描时的 nRF 功耗,在这种情况下,该功耗与输入数据直接相关。
所需物品
- Arduino的
- NRF24L01
- OLED的 0.96
需要安装库
首先,我们将在Arduino IDE软件中安装所需的库。请按照下列步骤操作:
- 按照以下路径绘制>包括库>管理库
- 搜索 Adafruit SSD1306.
- 安装库。
- 然后搜索单词“GFX”并安装它。
代码
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
#include <RF24.h>
#include <nRF24L01.h>
#include "printf.h"
#define CE 7
RF24 radio(7, 8);
#define CHANNELS 64
int channel[CHANNELS];
int line;
char grey[] = " .:-=+*aRW";
#define _NRF24_CONFIG 0x00
#define _NRF24_EN_AA 0x01
#define _NRF24_RF_CH 0x05
#define _NRF24_RF_SETUP 0x06
#define _NRF24_RPD 0x09
#define BT1 2
#define BT2 3
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);
byte count;
byte sensorArray[128];
byte drawHeight;
char filled = 'F';
char drawDirection = 'R';
char slope = 'W';
const uint8_t num_channels = 64;
int values[num_channels];
int valuesDisplay[32];
int channels = 0;
const byte address[6] = "00001";
const int num_reps = 50;
bool jamming = true;
byte getRegister(byte r)
{
byte c;
PORTB &=~_BV(2);
c = SPI.transfer(r&0x1F);
c = SPI.transfer(0);
PORTB |= _BV(2);
return(c);
}
void setup()
{
Serial.begin(57600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
radio.begin();
radio.startListening();
radio.stopListening();
pinMode(BT1, INPUT_PULLUP);
pinMode(BT2, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BT1), pressBt01, FALLING);
attachInterrupt(digitalPinToInterrupt(BT2), pressBt02, FALLING);
for (count = 0; count <= 128; count++)
{
sensorArray[count] = 0;
}
Serial.println("Starting 2.4GHz Scanner ...");
Serial.println();
Serial.println("Channel Layout");
printChannels();
SPI.begin();
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV2);
SPI.setBitOrder(MSBFIRST);
pinMode(CE,OUTPUT);
disable();
powerUp();
setRegister(_NRF24_EN_AA,0x0);
setRegister(_NRF24_RF_SETUP,0x0F);
}
void setRegister(byte r, byte v)
{
PORTB &=~_BV(2);
SPI.transfer((r&0x1F)|0x20);
SPI.transfer(v);
PORTB |= _BV(2);
}
void powerUp(void)
{
setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x02);
delayMicroseconds(130);
}
void powerDown(void)
{
setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)&~0x02);
}
void enable(void)
{
PORTB |= _BV(1);
}
void disable(void)
{
PORTB &=~_BV(1);
}
void setRX(void)
{
setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x01);
enable();
delayMicroseconds(100);
}
void scanChannels(void)
{
disable();
for( int j=0 ; j<255 ; j++)
{
for( int i=0 ; i< channels; i++)
{
setRegister(_NRF24_RF_CH,(128*i)/ channels);
setRX();
delayMicroseconds(40);
disable();
if( getRegister(_NRF24_RPD)>0 ) channel[i]++;
}
}
}
void outputChannels(void)
{
int norm = 0;
for( int i=0 ; i<CHANNELS ; i++)
if( channel[i]>norm ) norm = channel[i];
Serial.print('|');
for( int i=0 ; i<CHANNELS ; i++)
{
int pos;
if( norm!=0 ) pos = (channel[i]*10)/norm;
else pos = 0;
if( pos==0 && channel[i]>0 ) pos++;
if( pos>9 ) pos = 9;
Serial.print(grey[pos]);
channel[i] = 0;
}
Serial.print("| ");
Serial.println(norm);
display.setCursor(90, 10);
display.setTextSize(2);
display.setTextColor(WHITE);
display.print(norm);
display.setCursor(90, 8);
display.setTextSize(1);
display.setTextColor(WHITE);
display.print("");
display.drawLine(0, 10, 0, 32, WHITE);
display.drawLine(80, 10, 80, 32, WHITE);
for (count = 10; count < 80; count += 10)
{
display.drawPixel(count, 10 , WHITE);
display.drawPixel(count, 31 , WHITE);
}
drawHeight = map(norm, 0, 500, 0, 32 );
sensorArray[0] = drawHeight;
for (count = 1; count <= 80; count++ )
{
if (filled == 'D' || filled == 'd')
{
if (drawDirection == 'L' || drawDirection == 'l')
{
display.drawPixel(count, 32 - sensorArray[count - 1], WHITE);
}
else //else, draw dots from right to left
{
display.drawPixel(80 - count, 32 - sensorArray[count - 1], WHITE);
}
}
else
{
if (drawDirection == 'L' || drawDirection == 'l')
{
if (slope == 'W' || slope == 'w')
{
display.drawLine(count, 32, count, 32 - sensorArray[count - 1], WHITE);
}
else
{
display.drawLine(count, 1, count, 32 - sensorArray[count - 1], WHITE);
}
}
else
{
if (slope == 'W' || slope == 'w')
{
display.drawLine(80 - count, 32, 80 - count, 32 - sensorArray[count - 1], WHITE);
}
else
{
display.drawLine(80 - count, 1, 80 - count, 32 - sensorArray[count - 1], WHITE);
}
}
}
}
// drawAxises();
display.display();
display.clearDisplay();
for (count = 80; count >= 2; count--)
{
sensorArray[count - 1] = sensorArray[count - 2];
}
}
void printChannels(void)
{
Serial.println("> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <");
}
void jammer() {
const char text[] = "xxxxxxxxxxxxxxxx"; // send the noise
for (int i = ((channels * 5) + 1); i < ((channels * 5) + 23); i++) {
radio.setChannel(i);
radio.write( & text, sizeof(text));
}
}
void pressBt01() {
static unsigned long last_interrupt_time = 0;
unsigned long interrupt_time = millis();
if (interrupt_time - last_interrupt_time > 200) {
if (channels < 13) {
channels++;
} else {
channels = 0;
}
}
last_interrupt_time = interrupt_time;
}
void pressBt02() {
jamming = !jamming;
delay(200);
}
void loop()
{
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.print("channel: " + String(channels + 1));
//display.display();
if (jamming) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(("JAMMING CHANNEL" + String(channels + 1)));
radio.setPALevel(RF24_PA_HIGH);
radio.setDataRate(RF24_2MBPS);
display.display();
}
while (jamming) {
jammer();
}
scanChannels();
outputChannels();
if( line++>12 )
{
printChannels();
line = 0;
}
}