Страница 1 из 1

ВЧ Анализатор спектра 2,4ГГц на Ардуино

СообщениеДобавлено: 26 дек 2016, 23:42
-=dp=-
Радиочастотный анализатор 2,4ГГц на Ардуино.

2016 год я объявил для себя годом Радио :D и почти весь этот год был посвящен радио приемным и передающим устройствам.
И в завершении года Радио , прямо 24 декабря 2016 меня посетила очередная "Радио" мысль :D
Идея для изготовления радиочастотного анализатора спектра на 2,4 ГГц возникла как всегда спонтанно :D
И все из-за плохого качества WiFi сети :D На моем компьютере периодически отключался WiFi и я не мог найти причину пока не собрал данное устройство.
Дело в том, что диапазон 2,4 - 2,5 ГГц считается гражданским во всем мире и не требует лицензирования радио-передающих устройств, единственное ограничение по мощности излучения не более 100 мВт.
Производители электронных устройств, гаджетов, бытовой техники активно используют этот диапазон в своих устройствах, а именно:
Микроволновые печи (главный источник помех),
Беспроводные клавиатуры и мыши,
Bluethoth устройства,
Различные домашние метеостанции,
устройства контроля, счетчики с передачей данных по радиоканалу,
ну и WiFi устройства, которыми сейчас забито всё.
Так вот все эти гаджеты создают в радиоэфире столько помех, что в итоге просто напросто сами начинают глючить и не работают как надо.
А вот проверить и увидеть все эти сигналы и их помехи можно только с помощью высокочастотного анализатора спектра на 2,4 - 2,5 ГГц.
Вот и появилась у меня идея сделать данное устройство самостоятельно и как всегда на Ардуино!

Итак, поехали...
Для изготовления ВЧ анализатора спектра на 2,4 ГГц нам понадобятся следующие детали:
1. Плата Ардуино (УНО, НАНО, ПРО мини), я остановил свой выбор на Ардуино ПРО мини.
2. LCD дисплей шилд NOKIA 5110 для ардуино.
3. Модуль трансивера NRF24L01+, я взял с внешней антенной.
4. Макетная плата.
5. Стабилизатор питания на 3,3 В, AMS 1117.
6. Резисторы 560 ом 6 шт.
7. Корпус.

Re: Радиочастотный анализатор 2,4ГГц на Ардуино

СообщениеДобавлено: 26 дек 2016, 23:49
-=dp=-
Пока готовлю остальной материал и для нетерпеливых выкладываю библиотеку для дисплея.

Re: Радиочастотный анализатор 2,4ГГц на Ардуино

СообщениеДобавлено: 27 дек 2016, 12:09
-=dp=-
Начало изготовления.

Все модули я закрепил на макетной плате.
LCD дисплей 5110 подключил через разъем, чтобы был доступ под плату дисплея

Re: Радиочастотный анализатор 2,4ГГц на Ардуино

СообщениеДобавлено: 27 дек 2016, 12:13
-=dp=-
Распайка модулей довольно простая, модули LCD 5110 и NRF24L01+ распаивается 5 проводами к Ардуино.
Шину SPI дисплея распаиваем через резисторы 560 Ом.
Так же, для питания модулей необходим понижающий стабилизатор питания AMS 1117 на 3,3 В
Ардуину можно запитать от аккумулятора 3,7 В, работает!

Re: Радиочастотный анализатор 2,4ГГц на Ардуино

СообщениеДобавлено: 27 дек 2016, 12:16
-=dp=-
Корпус я использовал стандартный для поделок, 10х5 см, подошел идеально.
Единственно, надо быть очень осторожным при его обработке, сверловке, так как пластик очень хрупкий.

Re: Радиочастотный анализатор 2,4ГГц на Ардуино

СообщениеДобавлено: 27 дек 2016, 12:24
-=dp=-
Переднюю панель я отрисовал в Корел драве, откалибровал шкалу, вот что вышло

Re: Радиочастотный анализатор 2,4ГГц на Ардуино

СообщениеДобавлено: 27 дек 2016, 12:35
-=dp=-
А вот и схема соединения модулей :)

И еще фотографии готового устройства Arduino RF Explorer 2.4 GHz

Re: ВЧ Анализатор спектра 2,4ГГц на Ардуино

СообщениеДобавлено: 27 дек 2016, 13:19
-=dp=-
Выложил видео с демонстрацией работы
Arduinp RF Analyser https://youtu.be/AUuqj3fOfZU
:ugeek:

Re: ВЧ Анализатор спектра 2,4ГГц на Ардуино

СообщениеДобавлено: 24 фев 2018, 18:09
IROBOT
Подскажите ,а где скетч? :?:

Re: ВЧ Анализатор спектра 2,4ГГц на Ардуино

СообщениеДобавлено: 17 апр 2019, 20:00
-=dp=-
А вот и долгожданный скетч :!:
Еле нашел его в закромах, уже ОС несколько раз переустанавливал с тех пор, думал что потерял, но благодаря хорошему человеку - Алексею, пришлось "поднять задницу" и найти этот скетч :D

Код: выделить все

#include <SPI.h> 
#include <LiquidCrystal.h> 
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 5, 7, 6);
#define CE A1   
#define CHANNELS 83  //68
int channel[CHANNELS]; 
#define _NRF24_CONFIG   0x00 
#define _NRF24_EN_AA    0x01 
#define _NRF24_RF_CH    0x05 
#define _NRF24_RF_SETUP  0x06 
#define _NRF24_RPD     0x09 
byte getRegister(byte r) 
 {  byte c; 
  PORTB &=~_BV(2);
  c = SPI.transfer(r&0x1F); 
  c = SPI.transfer(0);   
  PORTB |= _BV(2); 
  return(c);  }   
 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) 
 { PORTC |= _BV(1);  } 
void disable(void) 
 { PORTC &=~_BV(1);  }   
 void setRX(void)  { 
  setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x01); 
  enable();   
  delayMicroseconds(100);   }   
 void scanChannels(void)  { 
  disable(); 
  for( int j=0 ; j<100 ; 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]; 
  for( int i=0 ; i<CHANNELS ; i++) 
  { 
   int pos; 
   if( norm!=0 ) {
     pos = (channel[i]*30)/norm; 
 
   int wpos=38-pos;
   
    display.drawLine(i, wpos, i, 38, BLACK);
    //display.drawLine(1, 35, 1, 38, BLACK);
    display.display();
   // Serial.print(i);
   // Serial.print("-");
   // Serial.println(pos);
   
 }
   else     pos = 0; 
   if( pos==0 && channel[i]>0 ) pos++; 
  // if( pos>8 ) pos = 8; 
  if( pos>8 ) pos = 8; 
   channel[i] = 0;
 display.drawLine(i, 38, i, 38, BLACK);
    //display.drawLine(1, 35, 1, 38, BLACK);
    display.display();   
  } 
 } 
 void setup() 
 {
  // Serial.begin(9600); 
  display.begin();
  display.clearDisplay();
  display.setContrast(58); // установка контраста
  display.drawRect(0, 0, 84, 40, BLACK);
  display.setTextSize(1);  // установка размера шрифта
  display.setTextColor(BLACK); // установка цвета текста
  display.setCursor(0,8); // установка текста
  display.println("    ARDUINO");
  display.println("  RF Explorer");
  display.println("  2,4-2,5 GHz");
  display.display();
  delay(2000);
  display.drawRect(0, 0, 84, 40, BLACK);
  display.fillRect(1, 1, 82, 38, WHITE);
  display.setTextSize(1);  // установка размера шрифта
  display.setTextColor(BLACK); // установка цвета текста
  display.setCursor(0,41); // установка текста
  display.println("2.4        2.5");
 display.display();
  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 loop()   
 {   

 scanChannels();   
 outputChannels();
 display.fillRect(1, 1, 82, 38, WHITE);
 delay(1);
 display.display();
 
 } 





Либы ищем в интернете, прошивал в среде Arduino IDE 1.5.7

Re: ВЧ Анализатор спектра 2,4ГГц на Ардуино

СообщениеДобавлено: 17 апр 2019, 20:03
-=dp=-
И еще одна модификация скетча

Код: выделить все
#include <SPI.h>   
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(8, 9, 5, 7, 6);
#define CE A1   
#define CHANNELS 84
int channel[CHANNELS]; 
#define _NRF24_CONFIG   0x00 
#define _NRF24_EN_AA    0x01 
#define _NRF24_RF_CH    0x05 
#define _NRF24_RF_SETUP  0x06 
#define _NRF24_RPD     0x09 
byte getRegister(byte r) 
 {  byte c; 
  PORTB &=~_BV(2);
  c = SPI.transfer(r&0x1F); 
  c = SPI.transfer(0);   
  PORTB |= _BV(2); 
  return(c);  }   
 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) 
 { PORTC |= _BV(1);  } 
void disable(void) 
 { PORTC &=~_BV(1);  }   
 void setRX(void)  { 
  setRegister(_NRF24_CONFIG,getRegister(_NRF24_CONFIG)|0x01); 
  enable();   
  delayMicroseconds(100);   }   
 void scanChannels(void)  { 
  disable(); 
  for( int j=0 ; j<100 ; 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]; 
  for( int i=0 ; i<CHANNELS ; i++) 
  { 
   int pos; 
   if( norm!=0 ) {
     pos = (channel[i]*25)/norm; 
 
   int wpos=47-pos;
 
    display.drawLine(i, wpos, i, 47, BLACK);
    display.display();
   // Serial.print(i);
   // Serial.print("-");
   // Serial.println(pos);
   
 }
   else     pos = 0; 
 
   if( pos==0 && channel[i]>0 ) pos++; 
  // if( pos>8 ) pos = 8; 
  if( pos>8 ) pos = 8; 
   channel[i] = 0;
 
 display.drawLine(i, 47, i, 47, BLACK);
    //display.drawLine(1, 35, 1, 38, BLACK);
    display.display();   
  } 
 } 
 void setup() 
 {
  Serial.begin(9600); 
  display.begin();
  display.clearDisplay();
  display.setContrast(58); // установка контраста
display.drawRect(0, 0, 84, 40, BLACK);
display.setTextSize(1);  // установка размера шрифта
display.setTextColor(BLACK); // установка цвета текста
display.setCursor(0,8); // установка текста
display.println("    ARDUINO");
 display.println("  RF Explorer");
  display.println("  2,4-2,5 GHz");
  display.display();
  delay(2000);
 // display.drawRect(0, 7, 84, 40, BLACK);
  display.fillRect(0, 0, 84, 48, WHITE);
 display.setTextSize(1);  // установка размера шрифта
 display.setTextColor(BLACK); // установка цвета текста
 //display.setCursor(0,0); // установка текста
 // display.print("BAT + 3,7 v");
 display.display();
  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 loop()   
 {   
 int sensorValue = analogRead(A3);
 float voltage = sensorValue * (3.7 / 1023.0);
 display.setCursor(0,0);
 display.print("BAT=");
 display.print(voltage);
 display.print("v");
 display.display();
 scanChannels();   
 outputChannels(); 
 display.fillRect(0, 0, 84, 48, WHITE);
 display.display();
 

 
 } 






Вольтметр фейковый, просто выводит надпись на экране 3,7v, я его так и не доделал.
Вот теперь дорабатывайте как душе угодно, и я был бы очень признателен если оживите этот топик и будете сюда выкладывать доработки и модификации ;)

Re: ВЧ Анализатор спектра 2,4ГГц на Ардуино

СообщениеДобавлено: 17 апр 2019, 20:17
-=dp=-
И вот еще одна модификация Arduino RF анализатора на LCD1602.
Этот двухстрочный дисплей очень распространен и я думаю данный скетч будет многим полезен :idea:
Кстати, именно этот скетч я взял за основу,модифицировал под дисплей от нокии, спасибо автору Rolf Henkel


Код: выделить все

#include <SPI.h> 
 #include <LiquidCrystal.h> 
 // The LCD is conected to pins 8, 9, 4, 5, 6, 7 
 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 
 byte minibars[8][8]; 
 //credits to Poor Man's Wireless 2.4GHz Scanner 
 // credits to all others 
 // uses an nRF24L01p connected to an Arduino 
 //   
 // Cables are: 
 //   SS    -> 10 
 //   MOSI   -> 11 
 //   MISO   -> 12 
 //   SCK   -> 13 
 //   
 // and CE    -> A1 
 // 
 // created March 2011 by Rolf Henkel 
 // 
 #define CE A1 
 // Array to hold Channel data 
 #define CHANNELS 64 
 int channel[CHANNELS]; 
 // 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 
 //SoftSPI<SOFT_SPI_MISO_PIN, SOFT_SPI_MOSI_PIN, SOFT_SPI_SCK_PIN, SPI_MODE> spi; 
 // get the value of a nRF24L01p register 
 byte getRegister(byte r) 
 { 
  byte c; 
  PORTB &=~_BV(2); //D10 
  //PORTC &=~_BV(1); //analogue 1 as SS 
  c = SPI.transfer(r&0x1F); 
  c = SPI.transfer(0);   
  PORTB |= _BV(2); 
  //PORTC |= _BV(1); //analogue 1 as SS 
  return(c); 
 } 
 // set the value of a nRF24L01p register 
 void setRegister(byte r, byte v) 
 { 
  PORTB &=~_BV(2); 
  //PORTC &=~_BV(1); 
  SPI.transfer((r&0x1F)|0x20); 
  SPI.transfer(v); 
  PORTB |= _BV(2); 
  //PORTC |= _BV(1); 
 } 
 // 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) 
 { 
   PORTC |= _BV(1); 
 } 
 // disable RX 
 void disable(void) 
 { 
   PORTC &=~_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<100 ; 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]++; 
   } 
  } 
 } 
 void outputChannels(void) 
 { 
  int norm = 0; 
  for( int i=0 ; i<CHANNELS ; i++) 
   if( channel[i]>norm ) norm = channel[i]; 
  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>8 ) pos = 8; 
   plot_minibars(i/4, pos*2); 
   channel[i] = 0; 
  } 
 } 
 void setup() 
 {   
  for (int j=0; j<=7; j++)   
  { 
   for (int i=0; i<=7; i++) 
   { 
    if (i<=j) 
    { minibars[j][7-i] = B01110;}   
    else 
    { minibars[j][7-i] = 0;} 
   } 
  }   
  for (int i=0; i<=7;i++) 
  { 
   lcd.createChar(i, minibars[i]); 
  } 
  lcd.begin(16, 2);     
  for (int j=0; j<=7;j++) 
  { 
   lcd.setCursor(j, 0); 
   lcd.write(j); 
   lcd.setCursor(j, 1); 
   lcd.write(7);   
  } 
  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 loop()   
 {   
  scanChannels();   
  outputChannels();   
 } 
 void plot_minibars(int location, int strngth) 
 { 
  if (strngth>7) 
  { 
   lcd.setCursor(location, 1); 
   lcd.write(7); 
   lcd.setCursor(location, 0); 
   lcd.write(strngth-8);   
  } 
  else 
  { 
   lcd.setCursor(location, 1); 
   lcd.write(strngth); 
   lcd.setCursor(location, 0); 
   lcd.write(32);   
  } 
 }