در این پروژه یک اسکنر شبکه های ۲٫۴GHz از نوع Wlan در محدوده ۲٫۴GHz با استفاده از برد رادیویی nRF24L01 خواهیم ساخت. پیش از این روش راه اندازی برد NRF24L01 با بردهای آردوینو در دیجی اسپارک آموزش داده شده است. در این پروژه خروجی تمام تداخل ها و اطلاعات موجود در محدوده اسکن شده را به صورت کدهای ASCII تحویل میدهد. در پروژه ساخت اسکنر وای فای از آردوینو نانو به عنوان پردازنده استفاده خواهیم کرد. در بخش دوم این پروزه یک نمایشگر Oled اضافه خواهیم کرد و مقادیر اسکن شده را بصورت گراف و نمودار نمایش خواهیم داد. توسط ماژول nRF24 میتوانیم کل شبکه ۲٫۴GHz را اسکن و مشاهده کنیم. این موضوع کمک میکند وضعیت سیگنالها را در شبکه بتوانیم بررسی کنیم. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
برد nRF24L01
این ماژول یک transceiver به حساب می آید به این معنی که هر دو فرآیند ارسال (send) و دریافت (receive) را انجام می دهد. این ماژول ها بسیار ارزان با اندازه کوچک عرضه می شوند، ولتاژ کاری این ماژول nRF24L01 از ۱٫۹ تا ۳٫۶ ولت است، پایه های MOSI, MISO و SCK پایه های SPI ماژول هستند. باید به پایه های مربوط به پروتکل SPI در آردوینو متصل شوند. پایه های CSN و CE برای تنظیم ماژول به حالت فعال و تعویض بین حالت فرمان و انتقال اطلاعات هستند. این دو پایه را می توان به هر پایه دیجیتال در آردوینو متصل کرد. پین IRQ پین وقفه است و لازم به اتصال آن نیست.
برخی از مشخصات این ماژول ها به شرح زیر است:
- مصرف انرژی هنگام ارسال اطلاعات، حدود ۱۲ میلی آمپر است.
-
رنج،در صورت استفاده در فضای باز و با آنتن می تواند تا ۱۰۰ متر هم برسد
-
می تواند داده ها را همزمان ارسال و دریافت کند.
-
هر ماژول می تواند با حداکثر ۶ ماژول دیگر ارتباط برقرار کند.
-
از باند ۲٫۴ گیگاهرتز استفاده می کند.
-
می تواند ۱ تا ۲۵ بایت داده خام با سرعت ۱ مگابایت ارسال کند.
تداخل در باند شبکه های ۲.۴ گیگاهرتز
دستگاه های مختلفی وجود دارند که در رنج ۲٫۴GHz کار میکنند مانند؛ تلفن، بلوتوث، وایفای، دزدگیر ماشین، مایکروویو که به همین تداخلی در این رنج وجود دارند که با استفاده از این پروژه قادر خواهیم بود این مقادیر را اندازه گیری و نمایش دهیم. بهطور معمول پیدا کردن تداخل خیلی سخت نیست. محصولاتی به بازار ارزان میآیند که به عنوان تجزیه و تحلیل طیف عمل میکنند و از یک رابط USB استاندارد به یک لپ تاپ استفاده میکنند، به این معنی که منبع تداخل میتواند به آسانی با یک آنتن برای پیدا کردن دخالت استفاده شود.
نمایشگر Oled 0.96 SSD1306
معمولا در پروژه های اینترنت اشیا و دیگر پروژه های امبدد از برای نمایش متن و مقادیر مختلف از نمایشگر های Oled استفاده می شود، این ماژول ها بدر انواع مختلق بسته به نوع درایور اندازه یافت می شوند که یکی از پرطرفدار ترین آن ها SSD1306 می باشد، این نوع از Oled ها معمولا در اندازه های ۰٫۹۶ و ۱٫۳ اینچ ساخته می شوند همچنین پروتکل ارتباطی Oled ها I2C می باشد. صفحه نمایش دیود ساطع کننده نور (OLED) که ما در این آموزش استفاده خواهیم کرد مدل SSD1306 است، یک صفحه نمایش تک رنگ، ۰٫۹۶ اینچی با ۱۲۸ × ۶۴ پیکسل همانطور که در شکل زیر نشان داده شده است. نمایشگر OLED نیازی به نور پس زمینه ندارد، که نتیجه آن ایجاد تضاد بسیار خوب در محیط های تاریک است. همچنین پیکسل های آن فقط هنگام روشن بودن انرژی مصرف می کنند، بنابراین صفحه نمایش OLED در مقایسه با سایر نمایشگرها، مصرف برق کمتری دارد.
برد آردوینو Arduino
مجموعه بردهای آردوینو از جمله بردهای توسعه پرطرفدار بین مهندسین امبدد هستند که در مدل های مختلفی از جمله Micro , proMini , Nano , Uno و همچنین Mega قابل تهیه هستند، هسته مرکزی این برد های محبوب از سری AtMega328 می باشد. آردوینو پلتفرم سختافزاری و نرمافزاری متنباز است. همان طور که قبل تر اشاره کردیم، پلتفرم آردوینو شامل یک میکروکنترلر تکبردی متنباز است که قسمت سختافزار آردوینو را تشکیل میدهد. علاوه بر این، پلتفرم آردوینو یک نرمافزار آردوینو IDE که به منظور برنامهنویسی برای بردهای آردوینو طراحی شدهاست و یک بوت لودر نرمافزاری که بر روی میکروکنترلر بارگذاری میشود را در بر میگیرد.
روش کار پروژه
فعالیت برد رادیویی RF مدل nRF24 از طریق رابط سریال به برد Arduino منتقل شده و هر نوع فعالیتی را به صورت کد های ASCII نمایش میدهد. دامنه در کانالهای مختلف با کمک یک نقشه برداری ساده نمایش داده می شود. در این پروژه اسکنر شبکه های ۲٫۴GHz حتی تداخل امواج مایکروویو و دوربین های وایرلس را نمایش میدهد. البته شاید این سوال برای شما پیش آمده باشد که تفاوت این اسکنر با پکت مانیتور ها چیست؟! در جواب باید این مورد را ذکر کنم که در پک مانیتور تنها در نهایت ۱۴ کانال موجود برای شبکه های WiFi را مانیتور میکند اما در این پروژه ما هر فرکانسی که در رنج ۲٫۴ باشد را میتوانیم تشخیص دهیم و در واقع ببینیم. در پارت دوم به این مورد بیشتر میپردازیم. در ادامه این مقادیر را با استفاده از نمایشگر Oled بصورت نمودار هایی نمایش خواهیم داد، مقادیر نمودار بر اساس پاور مصرفی nRF در لحظه اسکن است که در این سناریو با دیتا ورودی رابطه مستقیم دارند.
وسایل مورد نیاز
نصب کتابخانه مورد نیاز
ابتدا در نرم افزار Arduino IDE اقدام به نصب کتابخانه مورد نیاز خواهیمکرد. مراحل زیر را دنبال کنید:
- این مسیر را دنبال کنید Sketch > Include Library > Manage Libraries
- کلمه Adafruit SSD1306 را جستجو کنید.
- کتابخانه را نصب کنید.
- سپس کلمه “GFX” را جستجو کنید و آن را نصب کنید.
اتصالات و راهاندازی
برای راهاندازی ابتدایی این پروژه ابتدا اتصالات بین ماژول nRF24 و آردوینو را برقرار خواهیم کرد، برای برقراری اتصالات از جدول و شماتیک زیر استفاده کنید.
-
شماتیک پروژه اسکنر شبکه های ۲٫۴GHz با استفاده از nRF24L01
در این مرحله بخش های مهمی از کد که نیاز به توضیح دارند را بررسی خواهیم کرد. در قسمت اول کتابخانه مورد نیاز را فراخوانی خواهیم کرد.
#include <SPI.h>
در این قسمت مقیاس نمایش مقادیر که به آن مقیاس خاکستری میگویند را مشخص خواهیم کرد.
char grey[] = " .:-=+*aRW";
در این بخش تنظیمان مربوط به پروتکل SPI را راهاندازی میکنیم.
SPI.begin(); SPI.setDataMode(SPI_MODE0); SPI.setClockDivider(SPI_CLOCK_DIV2); SPI.setBitOrder(MSBFIRST);
این بخش مربوط به اسکن تمام مقادیر در باند ۲٫۴GHz است.
void scanChannels(void) { disable(); for( int j=0 ; j<200 ; 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]++; } } }
این قسمت مقادیر نمودار grey را مشخص میکنیم و در ادامه این مقادیر را در سریال مانیتور پرینت خواهیم کرد.
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;
کد کامل پروژه اسکنر شبکه های۲٫۴ GHz با استفاده از nRF24L01
#include <SPI.h> #define CE 9 #define CHANNELS 64 int channel[CHANNELS]; 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 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) { PORTB |= _BV(1); } void disable(void) { PORTB &=~_BV(1); } 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); } void scanChannels(void) { disable(); for( int j=0 ; j<200 ; 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); } void printChannels(void) { Serial.println("> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 <"); } void setup() { Serial.begin(57600); Serial.println("Starting 2.4GHz Scanner ..."); Serial.println(); 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(); powerUp(); setRegister(_NRF24_EN_AA,0x0); setRegister(_NRF24_RF_SETUP,0x0F); line = 0; } void loop() { scanChannels(); outputChannels(); if( line++>12 ) { printChannels(); line = 0; } }
اتصالات و راهاندازی پروژه با افزودن نمایشگر Oled
در اولین مرحله برای راهاندازی پروژه بعد از نصب کتابخانه های مورد نیاز، اقدام به برقراری اتصالات بین برد nRF24، آردوینو و نمایشگر Oled خواهیم کرد. اتصالات را مطابق جدول و شماتیک زیر برقرار کنید.
- شماتیک پروژه اسکنر شبکه های ۲٫۴ GHz با nRF24L01 و نمایش در OLED
در این مرحله اقدام به آپلود کد در برد آردوینو نانو خواهیم کرد، اما ابتدا بخش هایی از کد را مورد بررسی قرار خواهیم داد. در این کد کتابخانه های زیر استفاده شد، نسبت به آموزش قبل که تنها از یک کتابخانه استفاده شده بود تعداد آن ها افزایش داشت.
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>
این خط از کد بخش مهمی از پروژه را در بر میگیرد که تعریف کننده نمدار Gray است که در سریال دیتا دریافتی را به نشان میدهد.
char grey[] = " .:-=+*aRW";
در این چند خط به ترتیب چند Void تعریف شده که در اولین مورد رجیستر های مورد نیاز را راهاندازی کردهایم.
void setRegister(byte r, byte v) { PORTB &=~_BV(2); SPI.transfer((r&0x1F)|0x20); SPI.transfer(v); PORTB |= _BV(2); }
در این قسمت مقادیری که در سمت راست Oled نمایش داده میشوند را تنظیم میکنیم.
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("");
در ادامه با استفاده از map مقادیر بدست آمده به اشکال مورد نظر معادل سازی میکنیم.
drawHeight = map(norm, 0, 200, 0, 32 );
کد کامل پروژه اسکنر شبکه های ۲٫۴ GHz با nRF24L01 و نمایش در OLED
#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 4 #define CE 9 #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 Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire); byte count; byte sensorArray[128]; byte drawHeight; char filled = 'F'; char drawDirection = 'R'; char slope = 'W'; 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) { 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<200 ; 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, 0, 0, 32, WHITE); display.drawLine(80, 0, 80, 32, WHITE); for (count = 0; count < 40; count += 10) { display.drawLine(80, count, 75, count, WHITE); display.drawLine(0, count, 5, count, WHITE); } for (count = 10; count < 80; count += 10) { display.drawPixel(count, 0 , WHITE); display.drawPixel(count, 31 , WHITE); } drawHeight = map(norm, 0, 200, 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 setup() { Serial.begin(57600); display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 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 loop() { scanChannels(); outputChannels(); if( line++>12 ) { printChannels(); line = 0; } }
جمع بندی
در این پروژه با استفاده از برد nRF24 و همچین یک آردوینو nano یک اسکنر در رنج شبکه های ۲٫۴GHz ساختیم که در پروژه های مختلفی مورد استفاده قرار میگیرد، در بخش دوم از پروژه به تحلیل مقادیر و همچنین نمایش آن ها بصورت گرافیکی و نمودار در نمایشگر Oled پرداختیم. از این پروژه میتوانید برای اسکن ترافیک شبکه موجود تا فاصله زیادی استفاده کنید و همچنین با تحلیل نمودار gray میتوانیم تشخیص که این اطلاعات از چه منبعی و برای چه دستگاهی هستند.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام
با این پروژه میشه هرچی که توی شبکه ۲/۴ گیگاهرتز هست را جستجو کرد؟
سلام، بله در محدوده شما اگر ترافیکی در جریان باشد قابل تشخیص است.
سلام وقتتون بخیر ببخشید خواستم بدونم میشه ال سی دی تاچ استفاده کرد یا ال سی دی با ابعاد بزرگتر از این که شما فرمودین؟!؟!اگر بخواهیم نمایشگر بزرگتر استفاده کنیم فرقی میکنه؟!؟!؟!؟!ممنونم
با سلام
بله اما باید در کد برنامه تغییرات را لحاظ کنید.
سلام یک سوال چطوری با یک نمایشگر کوچک میشه با استفاده از این برد میشه فهمید الان سیگنال مال چه دستگاهی هست وردشو زد
خروجی هایی که با به شکل ASCII در خروجی سریال مانبتور دریافت میکنید، در صورت تحلیل شدن میتوانند برای این مورد هم استفاده شوند.
چطوری میشه تحلیل کرد برنامه خاصی داره ؟
برنامه خاصی فکر نمیکنم وجود داشته باشه برای این مورد، اما در کل اگر درباره نمودار Gray تحقیق کنید، درک بهتری از خروجی پیدا خواهید کرد.
باسلام
میشه در مورد ردیابی مکان سیگنال با تحلیل کد اسکی بیشتر توضیح دهید یا اگر مرجعی هست معرفی نمایید
ممنون میشم
سلام، متاسفانه مرجع خاصی برای این مورد نمیشناسم. اما با یک سرچ ساده مقالات در این مورد پیدا میکنید.
سلام خسته نباشید
استاد ما اگه بخوایم اون عدد کنار نمایش گر رو بدست بیاریم از کدوم قسمت کد باید بخونیمش مثلا اونجا که کنار طیف نوشته ۸۶ من اون رو میخوام کدوم قسمت کد اون رو میده
با سلام
دقیقا متوجه سوالتان نشدم ولی برای نمایش هر عددی در نمایشگر بایستی دستور آنرا بنویسید. سپس مشخص کنید که عدد مورد نظر از کجا خوانده شده و روی نمایشگر نمایش داده شود.
درود مهندس چگونه یک جمر را به این پروژه اضافه کنیم؟
با سلام
اطلاعی در این خصوص نداریم.