Текущее время: 28 мар 2024, 17:29

Калининград & ХОББИ

Занятие любимым хобби - это путь к счастливой жизни!

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

Тут собраны схемы различных устройств сделанных на контроллерах Ардуино, Лазерный гравер на Ардуино, Металлоискатель на Ардуино, Метеостанция, Кодовый замок, и множество других устройств и изобретений
Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 26 дек 2016, 23:42

Радиочастотный анализатор 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. Корпус.


Вложения
Arduino.jpg
анализатор 2,4ГГц на Ардуино
Arduino.jpg (14.8 KiB) Просмотров: 73242
5110.jpg
анализатор 2,4ГГц на Ардуино
5110.jpg (11.72 KiB) Просмотров: 73242
NRF24L01.jpg
анализатор 2,4ГГц на Ардуино
NRF24L01.jpg (8.96 KiB) Просмотров: 73242

Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 26 дек 2016, 23:49

Пока готовлю остальной материал и для нетерпеливых выкладываю библиотеку для дисплея.


Вложения
0.jpg
Высокочастотный анализатор спектра на Ардуино
Adafruit_GFX.rar
Библиотека для LCD дисплея 5110
(21.24 KiB) Скачиваний: 3768

Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 дек 2016, 12:09

Начало изготовления.

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


Вложения
1.jpg
Arduino RF Explorer 2.4 GHz
2.jpg
Arduino RF Explorer 2.4 GHz
3.jpg
Arduino RF Explorer 2.4 GHz

Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 дек 2016, 12:13

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


Вложения
4.jpg
Arduino RF Explorer 2.4 GHz
5.jpg
Arduino RF Explorer 2.4 GHz
7.jpg
Arduino RF Explorer 2.4 GHz

Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 дек 2016, 12:16

Корпус я использовал стандартный для поделок, 10х5 см, подошел идеально.
Единственно, надо быть очень осторожным при его обработке, сверловке, так как пластик очень хрупкий.


Вложения
8.jpg
Arduino RF Explorer 2.4 GHz
9.jpg
Arduino RF Explorer 2.4 GHz

Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 дек 2016, 12:24

Переднюю панель я отрисовал в Корел драве, откалибровал шкалу, вот что вышло


Вложения
10.jpg
Arduino RF Explorer 2.4 GHz
11.jpg
Arduino RF Explorer 2.4 GHz
front RF Explorer.jpg
Arduino RF Explorer 2.4 GHz

Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 дек 2016, 12:35

А вот и схема соединения модулей :)

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


Вложения
15.jpg
Arduino RF Explorer 2.4 GHz
12.jpg
Arduino RF Explorer 2.4 GHz
схема RF Explorer2.jpg
Arduino RF Explorer 2.4 GHz

Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 27 дек 2016, 13:19

Выложил видео с демонстрацией работы
Arduinp RF Analyser https://youtu.be/AUuqj3fOfZU
:ugeek:



 
Сообщений: 15
Зарегистрирован: 02 янв 2016, 16:11

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

Сообщение IROBOT » 24 фев 2018, 18:09

Подскажите ,а где скетч? :?:



Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 17 апр 2019, 20:00

А вот и долгожданный скетч :!:
Еле нашел его в закромах, уже ОС несколько раз переустанавливал с тех пор, думал что потерял, но благодаря хорошему человеку - Алексею, пришлось "поднять задницу" и найти этот скетч :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



Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 17 апр 2019, 20:03

И еще одна модификация скетча

Код: выделить все
#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, я его так и не доделал.
Вот теперь дорабатывайте как душе угодно, и я был бы очень признателен если оживите этот топик и будете сюда выкладывать доработки и модификации ;)



Аватар пользователя
 
Сообщений: 799
Зарегистрирован: 27 мар 2013, 22:12

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

Сообщение -=dp=- » 17 апр 2019, 20:17

И вот еще одна модификация 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);   
  } 
 }





Вернуться в Устройства на Ардуино

Кто сейчас на форуме

Сейчас этот форум просматривают: MailRu [Bot] и гости: 9