پست

افسانه جمرهای ارزان‌قیمت کالبدشکافی امنیت بلوتوث با ESP8266

افسانه جمرهای ارزان‌قیمت کالبدشکافی امنیت بلوتوث با ESP8266

تا به حال برایتان پیش آمده که در یک جلسه مهم، اسپیکر بلوتوثی همسایه یا سیستم صوتی یک مغازه، با پخش آهنگ‌های بلند مزاحم تمرکزتان شود؟ یا در حال تست یک دستگاه اینترنت اشیا هستید و می‌خواهید مقاومت آن را در برابر اختلالات بی‌سیم بسنجید؟ ابزاری که در این مقاله می‌سازیم، دقیقا برای همین کارها طراحی شده است.

این پروژه یک دستگاه محدودکننده (Jammer) در باند فرکانسی ۲.۴ گیگاهرتز است که با یک میکروکنترلر ارزان‌قیمت ESP8266 و ماژول‌های رادیویی NRF24L01+ ساخته می‌شود. با این دستگاه می‌توانید ارتباط بین یک اسپیکر بلوتوثی و گوشی را مختل کنید، شبکه وای‌فای را تحت فشار قرار دهید یا بفهمید دستگاه‌های بی‌سیم اطرافتان چقدر در برابر پارازیت مقاوم هستند.

در ادامه، از صفر شروع می‌کنیم. ابتدا می‌فهمیم این دستگاه چطور کار می‌کند، بعد قطعات را تهیه و مدار را می‌بندیم، کد را روی آن آپلود می‌کنیم و در نهایت یاد می‌گیریم چطور عملکردش را بهتر کنیم و ظاهرش را مرتب بسازیم.

نتیجه قطعی و صریح: این روش به‌طور قطعی کار نمی‌کند و هیچ انتظاری برای قطع کردن یک اسپیکر بلوتوثی از فاصله چند متری نداشته باشید. این مقاله یک راهنمای ساخت جمر کارآمد نیست؛ یک کالبدشکافی فنی است که نشان می‌دهد چرا ویدیوهای اینترنتی درباره «هک بلوتوث با ESP8266» گمراه‌کننده هستند. ما مدار را می‌سازیم، کد را اجرا می‌کنیم و سپس با تحلیل فیزیک امواج و پروتکل بلوتوث ثابت می‌کنیم که چرا این تلاش محکوم به شکست است.

توجه: استفاده از جمر بدون مجوز در بسیاری از کشورها غیرقانونی است. این پروژه صرفا برای اهداف آموزشی، تست‌های کنترل‌شده و آزمایش روی دستگاه‌های متعلق به خودتان طراحی شده است.


چرا یک ماژول کوچک می‌تواند بلوتوث را قطع کند؟

قبل از اینکه سراغ سیم و کد برویم، بیایید بفهمیم داستان چیست. بلوتوث و وای‌فای هر دو در باند ۲.۴ گیگاهرتز کار می‌کنند. این باند فرکانسی بین ۲۴۰۰ تا ۲۴۸۳.۵ مگاهرتز است و به کانال‌های کوچک‌تری تقسیم شده است. وای‌فای معمولا از کانال‌های پهن‌تر استفاده می‌کند، در حالی که بلوتوث کلاسیک از ۷۹ کانال باریک یک مگاهرتزی و بلوتوث کم‌مصرف (BLE) از ۴۰ کانال دو مگاهرتزی استفاده می‌کند.

نکته جالب اینجاست که بلوتوث از تکنیکی به نام پرش فرکانسی استفاده می‌کند؛ یعنی به‌سرعت بین کانال‌ها می‌پرد تا اگر یک کانال شلوغ بود، از کانال دیگری استفاده کند. به همین دلیل، قطع کردن کامل بلوتوث با یک ماژول ساده دشوار است، اما می‌توان با تولید نویز پیوسته روی کانال‌های مختلف، ارتباط را آن‌قدر مختل کرد که دستگاه‌ها نتوانند به‌درستی با هم حرف بزنند و اتصال قطع یا کیفیت صدا خراب شود.

ماژول NRF24L01+ یک فرستنده/گیرنده رادیویی است که دقیقا در همین باند کار می‌کند. این ماژول ۱۲۵ کانال قابل انتخاب دارد و می‌توان آن را طوری برنامه‌ریزی کرد که روی یک کانال مشخص، یک موج حامل پیوسته (Carrier Wave) بدون داده ارسال کند. این موج پیوسته، مثل یک نویز ثابت روی آن کانال عمل می‌کند و هر دستگاهی که بخواهد روی آن کانال ارتباط برقرار کند، با مشکل مواجه می‌شود.

ESP8266 وظیفه دارد این ماژول را کنترل کند، بین کانال‌ها سوئیچ کند و به کاربر بگوید در چه حالتی است.


قطعات مورد نیاز: چه چیزی بخریم؟

پروژه به چهار قطعه اصلی نیاز دارد:

قطعهمدل پیشنهادینقش
میکروکنترلرNodeMCU ESP8266 یا Wemos D1 Miniمغز دستگاه؛ کد را اجرا می‌کند و ماژول رادیویی را کنترل می‌کند
ماژول رادیوییNRF24L01+تولید سیگنال مزاحم در باند ۲.۴ گیگاهرتز
نمایشگرOLED 0.96 اینچی SSD1306 (۱۲۸×۶۴)نمایش حالت فعلی دستگاه
دکمه فشاریهر دکمه ساده (Push Button)تغییر بین حالت‌های مختلف

علاوه بر این‌ها به سیم‌های جامپر (مادگی-مادگی یا نرینگی-مادگی بسته به نوع برد)، یک منبع تغذیه ۳.۳ ولت (پاوربانک USB یا باتری لیتیومی) و یک خازن الکترولیتی ۱۰۰ میکروفاراد نیاز دارید. خازن اختیاری نیست؛ اگر آن را نخرید، احتمالا دستگاه‌تان به‌درستی کار نخواهد کرد. دلیلش را در بخش نکات فنی توضیح می‌دهیم.

انتخاب ماژول NRF24L01: حتما نسخه PA+LNA را بخرید

ماژول NRF24L01+ در دو نسخه اصلی عرضه می‌شود: نسخه استاندارد با آنتن PCB کوچک روی خود برد، و نسخه PA+LNA که یک تراشه تقویت‌کننده توان (PA) و یک تقویت‌کننده کم‌نویز (LNA) دارد و به یک آنتن خارجی SMA وصل می‌شود.

تفاوت برد این دو نسخه چشمگیر است. نسخه استاندارد در فضای باز حدود ۱۰ تا ۵۰ متر برد دارد، در حالی که نسخه PA+LNA با آنتن خارجی می‌تواند در فضای باز تا ۸۰۰ تا ۱۱۰۰ متر هم برسد. برای قطع کردن یک اسپیکر بلوتوثی در فاصله چند متری، نسخه استاندارد هم کافی است، اما اگر می‌خواهید دستگاه‌های دورتر را هم تحت تأثیر قرار دهید، نسخه PA+LNA انتخاب بهتری است.

نسخه PA+LNA هنگام کار جریان بیشتری می‌کشد و گرمای بیشتری تولید می‌کند، اما اگر تغذیه مناسبی برایش فراهم کنید، عملکرد بسیار بهتری خواهید گرفت.


مدار را چطور ببندیم؟

اتصالات مدار ساده هستند اما باید با دقت انجام شوند. مهم‌ترین نکته این است که ماژول NRF24L01+ فقط با ولتاژ ۳.۳ ولت کار می‌کند. اگر آن را به ۵ ولت وصل کنید، در چند ثانیه می‌سوزد.

اتصال NRF24L01+ به ESP8266

ESP8266NRF24L01+توضیح
D4 (GPIO2)CEفعال‌سازی ماژول (Chip Enable)
D8 (GPIO15)CSNانتخاب تراشه (Chip Select)
D5 (GPIO14)SCKکلاک سریال SPI
D7 (GPIO13)MOSIداده خروجی (Master Out Slave In)
D6 (GPIO12)MISOداده ورودی (Master In Slave Out)
3.3VVCCتغذیه
GNDGNDزمین

نکته مهم: در این اتصال، پین CSN روی D8 (GPIO15) قرار گرفته است که پین پیش‌فرض CS در ESP8266 است. این کار باعث می‌شود پین‌های D1 و D2 برای نمایشگر OLED آزاد بمانند و تعارض پین‌ها برطرف شود.

اتصال نمایشگر OLED SSD1306

نمایشگر از پروتکل I2C استفاده می‌کند و فقط به دو سیم داده و کلاک نیاز دارد. آدرس I2C آن معمولا 0x3C است.

ESP8266OLEDتوضیح
D1 (GPIO5)SDAخط داده سریال
D2 (GPIO4)SCLخط کلاک سریال
3.3VVCCتغذیه
GNDGNDزمین

نکته: پین‌های D1 و D2 در ESP8266 به‌عنوان پین‌های پیش‌فرض I2C شناخته می‌شوند و استفاده از آن‌ها برای OLED، هیچ تعارضی با پین‌های SPI (که برای NRF24L01 استفاده می‌شوند) ایجاد نمی‌کند.

اتصال دکمه

اتصال دکمه به تعداد ماژول‌های NRF24L01+ بستگی دارد:

حالت تک ماژول: دکمه یک سر به پین D3 (GPIO0) و سر دیگر به GND وصل می‌شود. این پین با مقاومت pull-up داخلی ESP8266 فعال می‌شود و نیازی به مقاومت خارجی ندارد.

حالت دو ماژول: چون پین D3 (GPIO0) برای CSN ماژول دوم اشغال می‌شود، دکمه باید به پین RX (GPIO3) منتقل شود. کد به‌صورت خودکار این تغییر را با شرط #if USE_SECOND_MODULE مدیریت می‌کند و نیازی به تغییر دستی نیست.

نکته مهم: پین GPIO0 یک پین بوت‌حساس است. اگر هنگام روشن شدن ESP8266 این پین پایین (LOW) نگه داشته شود، دستگاه وارد حالت فلش می‌شود و برنامه اجرا نمی‌شود. به همین دلیل در حالت دو ماژول، دکمه را به RX منتقل کرده‌ایم.

خازن: قطعه کوچکی که همه چیز را تغییر می‌دهد

ماژول NRF24L01+ هنگام ارسال سیگنال، جریان لحظه‌ای بالایی می‌کشد. پین ۳.۳ ولت ESP8266 نمی‌تواند همیشه این جریان را به‌طور پایدار تأمین کند و در نتیجه ولتاژ افت می‌کند، ماژول ریست می‌شود و دستگاه کار نمی‌کند. یک خازن الکترولیتی ۱۰۰ میکروفاراد را بین VCC و GND ماژول NRF24L01+ (تا حد امکان نزدیک به پایه‌های ماژول) قرار دهید. خازن مانند یک منبع ذخیره انرژی کوچک عمل می‌کند و افت ولتاژ لحظه‌ای را جبران می‌کند. این ساده‌ترین و مؤثرترین بهبودی است که می‌توانید انجام دهید.


کد را چطور روی ESP8266 آپلود کنیم؟

نصب کتابخانه‌ها

ابتدا باید Arduino IDE را نصب کنید و پکیج برد ESP8266 را به آن اضافه کنید. در Arduino IDE به File → Preferences بروید و در قسمت «Additional Boards Manager URLs» آدرس زیر را وارد کنید:

1
https://arduino.esp8266.com/stable/package_esp8266com_index.json

سپس از Tools → Board → Boards Manager پکیج ESP8266 Community را نصب کنید و برد NodeMCU 1.0 (ESP-12E Module) را انتخاب کنید.

حالا کتابخانه‌های زیر را از Sketch → Include Library → Manage Libraries نصب کنید:

  • RF24 (برای کنترل NRF24L01+)
  • ezButton (برای مدیریت دکمه)
  • Adafruit GFX (کتابخانه گرافیکی پایه)
  • Adafruit SSD1306 (درایور نمایشگر OLED)
  • Wire (برای ارتباط I2C - معمولا از پیش نصب است)

کد کامل با پشتیبانی از چند ماژول NRF24L01

کد زیر از دو ماژول NRF24L01+ پشتیبانی می‌کند و از معماری غیرمسدودکننده (Non-Blocking) استفاده می‌کند. ماژول اول روی کانال جاری و ماژول دوم روی کانال بعدی کار می‌کند تا پوشش فرکانسی افزایش یابد.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <ezButton.h>

// ==================== تنظیمات نمایشگر OLED ====================
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// ==================== پین‌های ماژول اول ====================
#define CE_PIN_1   2   // D4 (GPIO2)
#define CSN_PIN_1  15  // D8 (GPIO15) - پین پیش‌فرض CS در ESP8266

// ==================== پین‌های ماژول دوم (اختیاری) ====================
// اگر فقط یک ماژول دارید، USE_SECOND_MODULE را 0 کنید
#define USE_SECOND_MODULE 1
#define CE_PIN_2   16  // D0 (GPIO16)
#define CSN_PIN_2  0   // D3 (GPIO0) - فقط اگر ماژول دوم فعال باشد

// ==================== پین دکمه ====================
// دکمه به RX (GPIO3) منتقل شد تا GPIO0 آزاد بماند
// اگر ماژول دوم غیرفعال است، می‌توانید از D3 استفاده کنید
#if USE_SECOND_MODULE
  #define BUTTON_PIN 3   // RX (GPIO3)
#else
  #define BUTTON_PIN 0   // D3 (GPIO0)
#endif

// ==================== تعریف ماژول‌ها ====================
RF24 radio1(CE_PIN_1, CSN_PIN_1);
#if USE_SECOND_MODULE
RF24 radio2(CE_PIN_2, CSN_PIN_2);
#endif

ezButton button(BUTTON_PIN);

// ==================== حالت‌های دستگاه ====================
enum Mode {
  IDLE,
  FULL_ATTACK,
  WIFI_ONLY
};

Mode currentMode = IDLE;
int modeIndex = 0;

// ==================== کانال‌های بلوتوث ====================
// بلوتوث کلاسیک: ۷۹ کانال (0-78)
// BLE: ۴۰ کانال (0-39)
const uint8_t btChannels[] = {
  2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
  21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
  40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78
};

// ==================== کانال‌های وای‌فای ====================
const uint8_t wifiChannels[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};

// ==================== متغیرهای زمان‌بندی (غیرمسدودکننده) ====================
unsigned long lastSwitchTime = 0;
const unsigned long SWITCH_INTERVAL = 2; // میلی‌ثانیه - حداقل تأخیر ممکن
int channelIndex = 0;

// ==================== متغیرهای نمایشگر ====================
unsigned long lastDisplayTime = 0;
const unsigned long DISPLAY_INTERVAL = 200; // هر ۲۰۰ میلی‌ثانیه OLED را آپدیت کن
int lastModeIndex = -1;

// ==================== وضعیت ماژول‌ها ====================
bool module1OK = false;
bool module2OK = false;

void setup() {
  Serial.begin(115200);
  delay(100);

  Serial.println("=== 2.4GHz RF Tester Started ===");
  Serial.println("Note: This device is for educational purposes only.");

  // ==================== راه‌اندازی نمایشگر ====================
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println("OLED failed!");
  } else {
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(SSD1306_WHITE);
    display.setCursor(0, 0);
    display.println("Initializing...");
    display.display();
  }

  // ==================== راه‌اندازی دکمه ====================
  button.setDebounceTime(50);

  // ==================== راه‌اندازی ماژول اول ====================
  if (!radio1.begin()) {
    Serial.println("NRF24 #1 not found!");
    module1OK = false;
  } else {
    module1OK = true;
    radio1.setAutoAck(false);
    radio1.stopListening();
    radio1.setRetries(0, 0);
    radio1.setPayloadSize(5);
    radio1.setAddressWidth(3);
    radio1.setPALevel(RF24_PA_MAX);
    radio1.setDataRate(RF24_2MBPS);
    radio1.setCRCLength(RF24_CRC_DISABLED);
    Serial.println("NRF24 #1 OK");
  }

  // ==================== راه‌اندازی ماژول دوم ====================
#if USE_SECOND_MODULE
  if (!radio2.begin()) {
    Serial.println("NRF24 #2 not found - continuing with one module");
    module2OK = false;
  } else {
    module2OK = true;
    radio2.setAutoAck(false);
    radio2.stopListening();
    radio2.setRetries(0, 0);
    radio2.setPayloadSize(5);
    radio2.setAddressWidth(3);
    radio2.setPALevel(RF24_PA_MAX);
    radio2.setDataRate(RF24_2MBPS);
    radio2.setCRCLength(RF24_CRC_DISABLED);
    Serial.println("NRF24 #2 OK");
  }
#endif

  // ==================== نمایش وضعیت اولیه ====================
  if (!module1OK) {
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("NRF24 #1 Error!");
    display.println("Check wiring.");
    display.display();
    while (1) { delay(10); } // فقط در صورت خطای ماژول اول متوقف شو
  }

  updateDisplay();
  Serial.println("Ready. Press button to change mode.");
}

void loop() {
  // ==================== خواندن دکمه (غیرمسدودکننده) ====================
  button.loop();

  if (button.isPressed()) {
    modeIndex = (modeIndex + 1) % 3;
    switch (modeIndex) {
      case 0: currentMode = IDLE; break;
      case 1: currentMode = FULL_ATTACK; break;
      case 2: currentMode = WIFI_ONLY; break;
    }
    channelIndex = 0;
    lastModeIndex = modeIndex;
    updateDisplay();
    Serial.print("Mode changed to: ");
    Serial.println(modeIndex);
  }

  // ==================== اجرای حالت فعلی (غیرمسدودکننده با millis) ====================
  unsigned long currentMillis = millis();

  // تغییر کانال فقط زمانی که زمان مقرر رسیده باشد
  if (currentMillis - lastSwitchTime >= SWITCH_INTERVAL) {
    lastSwitchTime = currentMillis;

    switch (currentMode) {
      case IDLE:
        // هیچ کاری نمی‌کنیم
        break;

      case FULL_ATTACK:
        fullAttack();
        break;

      case WIFI_ONLY:
        wifiAttack();
        break;
    }
  }

  // ==================== به‌روزرسانی نمایشگر (غیرمسدودکننده) ====================
  if (currentMillis - lastDisplayTime >= DISPLAY_INTERVAL) {
    lastDisplayTime = currentMillis;
    updateDisplay();
  }
}

// ==================== حمله کامل (بلوتوث + وای‌فای) ====================
void fullAttack() {
  if (!module1OK) return;

  // ماژول اول روی کانال جاری
  radio1.setChannel(btChannels[channelIndex]);
  radio1.startConstCarrier(RF24_PA_MAX, btChannels[channelIndex]);

#if USE_SECOND_MODULE
  if (module2OK) {
    // ماژول دوم روی کانال بعدی
    int nextIndex = (channelIndex + 1) % (sizeof(btChannels) / sizeof(btChannels[0]));
    radio2.setChannel(btChannels[nextIndex]);
    radio2.startConstCarrier(RF24_PA_MAX, btChannels[nextIndex]);
  }
#endif

  channelIndex++;
  if (channelIndex >= (sizeof(btChannels) / sizeof(btChannels[0]))) {
    channelIndex = 0;
  }
}

// ==================== حمله فقط وای‌فای ====================
void wifiAttack() {
  if (!module1OK) return;

  int ch = wifiChannels[channelIndex % (sizeof(wifiChannels) / sizeof(wifiChannels[0]))];

  radio1.setChannel(ch);
  radio1.startConstCarrier(RF24_PA_MAX, ch);

#if USE_SECOND_MODULE
  if (module2OK) {
    int nextCh = wifiChannels[(channelIndex + 1) % (sizeof(wifiChannels) / sizeof(wifiChannels[0]))];
    radio2.setChannel(nextCh);
    radio2.startConstCarrier(RF24_PA_MAX, nextCh);
  }
#endif

  channelIndex++;
}

// ==================== به‌روزرسانی نمایشگر ====================
void updateDisplay() {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);

  display.setCursor(0, 0);
  display.println("2.4GHz RF Tester");
  display.drawLine(0, 10, 128, 10, SSD1306_WHITE);

  display.setCursor(0, 20);
  display.print("Mode: ");
  switch (currentMode) {
    case IDLE:
      display.println("Idle");
      break;
    case FULL_ATTACK:
      display.println("Full Attack");
      break;
    case WIFI_ONLY:
      display.println("WiFi Only");
      break;
  }

  display.setCursor(0, 35);
  display.print("Modules: ");
#if USE_SECOND_MODULE
  if (module1OK && module2OK) {
    display.println("2x NRF24");
  } else if (module1OK) {
    display.println("1x NRF24 (M2 err)");
  } else {
    display.println("No module!");
  }
#else
  display.println("1x NRF24");
#endif

  display.setCursor(0, 50);
  display.print("Ch: ");
  display.println(channelIndex);

  display.display();
}

توضیح بخش‌های کلیدی کد

**۱. دکمه و نمایشگر OLED در تمام لحظات پاسخ‌گو هستند و برنامه هیچ‌گاه مسدود نمی‌شود. متغیر lastSwitchTime زمان آخرین تغییر کانال را ذخیره می‌کند و فقط زمانی که SWITCH_INTERVAL میلی‌ثانیه گذشته باشد، کانال عوض می‌شود.

۲. پشتیبانی از دو ماژول: با تعریف USE_SECOND_MODULE می‌توانید ماژول دوم را فعال یا غیرفعال کنید. ماژول اول روی کانال جاری و ماژول دوم روی کانال بعدی کار می‌کند تا پوشش فرکانسی دو برابر شود.

۳. مدیریت هوشمند پین دکمه: کد به‌صورت خودکار پین دکمه را بر اساس تعداد ماژول‌ها انتخاب می‌کند. اگر دو ماژول فعال باشد، دکمه روی RX (GPIO3) و اگر یک ماژول باشد، روی D3 (GPIO0) قرار می‌گیرد. این کار از تعارض پین بوت‌حساس جلوگیری می‌کند.

۴. مدیریت خطای غیرمسدودکننده: اگر ماژول دوم پیدا نشود، برنامه متوقف نمی‌شود و با یک ماژول ادامه می‌دهد. وضعیت روی OLED نمایش داده می‌شود: "1x NRF24 (M2 err)".

۵. بهینه‌سازی نمایشگر: OLED هر ۲۰۰ میلی‌ثانیه یک بار آپدیت می‌شود، نه در هر حلقه. این کار از پرش و سوسو زدن نمایشگر جلوگیری می‌کند.

۶. تنظیمات رادیو: توان خروجی روی RF24_PA_MAX (حداکثر)، سرعت داده روی RF24_2MBPS (سریع‌ترین) و CRC غیرفعال تنظیم شده است تا نویز خالص و بدون سربار ارسال شود.


استفاده از دو یا چند ماژول NRF24L01 برای قدرت بیشتر

یکی از مؤثرترین راه‌ها برای بهبود عملکرد، استفاده از دو یا چند ماژول NRF24L01+ به‌جای یک ماژول است. منطق پشت این کار ساده است: بلوتوث از پرش فرکانسی استفاده می‌کند و یک ماژول تنها نمی‌تواند تمام کانال‌ها را همزمان پوشش دهد. اما اگر دو ماژول داشته باشید، می‌توانید هر کدام را روی نیمه‌ای از کانال‌ها تنظیم کنید. مثلا ماژول اول کانال‌های زوج و ماژول دوم کانال‌های فرد را پوشش دهد. به این ترتیب، شانس برخورد نویز با سیگنال بلوتوث تقریبا دو برابر می‌شود.

تحقیقات نشان داده که افزودن ماژول دوم، منابع اختلال را دو برابر می‌کند و اثربخشی را بدون نیاز به افزایش توان هر ماژول بهبود می‌دهد.

مدار اتصال دو ماژول

هر دو ماژول از یک باس SPI مشترک استفاده می‌کنند، اما هر کدام باید پین‌های CE و CSN مستقل داشته باشند تا بتوانید آن‌ها را جداگانه آدرس‌دهی کنید. پین‌های SPI (SCK، MOSI، MISO) بین دو ماژول مشترک هستند.

سیگنالماژول اولماژول دوم
CED4 (GPIO2)D0 (GPIO16)
CSND8 (GPIO15)D3 (GPIO0)
SCKD5 (GPIO14)D5 (GPIO14) - مشترک
MOSID7 (GPIO13)D7 (GPIO13) - مشترک
MISOD6 (GPIO12)D6 (GPIO12) - مشترک
VCC3.3V3.3V
GNDGNDGND

توجه: در حالت دو ماژول، پین D3 (GPIO0) برای CSN ماژول دوم و پین RX (GPIO3) برای دکمه استفاده می‌شود. کد جدید این تخصیص را به‌صورت خودکار با شرط #if USE_SECOND_MODULE مدیریت می‌کند و نیازی به تغییر دستی BUTTON_PIN نیست.

برای هر ماژول یک خازن ۱۰۰ میکروفاراد جداگانه قرار دهید. اگر از دو ماژول PA+LNA استفاده می‌کنید، جریان مصرفی بالاتر می‌رود و بهتر است یک منبع ۳.۳ ولت مجزا با رگولاتور برای ماژول‌ها در نظر بگیرید.

اگر بخواهید از سه یا چهار ماژول استفاده کنید، اصول کار همان است؛ فقط به پین‌های CE و CSN بیشتری نیاز دارید و باید مطمئن شوید که جریان تغذیه کافی است.


ترفندها و نکات ریز برای عملکرد بهتر

۱. تغذیه پایدار، مهم‌ترین عامل موفقیت

بزرگ‌ترین دلیل کار نکردن این پروژه‌ها، تغذیه ضعیف است. ماژول NRF24L01+ هنگام ارسال جریان زیادی می‌کشد و اگر پین ۳.۳ ولت ESP8266 نتواند آن را تأمین کند، ماژول ریست می‌شود. راه‌حل: از خازن ۱۰۰ میکروفاراد استفاده کنید و اگر ممکن است، یک رگولاتور ۳.۳ ولت مجزا مثل AMS1117-3.3 برای ماژول رادیویی تهیه کنید. این رگولاتور از ولتاژ ۵ ولت پاوربانک، ۳.۳ ولت پایدار تولید می‌کند.

۲. مدیریت حرارت ماژول

ماژول NRF24L01+ در حین کار مداوم داغ می‌شود. این طبیعی است و عملکرد را مختل نمی‌کند، اما اگر دستگاه را در دست بگیرید، ممکن است دستتان را بسوزاند. برای کاهش دما، سیکل کاری را کوتاه کنید. معماری غیرمسدودکننده با millis() پیاده‌سازی شده است. می‌توانید به‌سادگی یک شرط زمانی برای استراحت اضافه کنید: مثلاً بعد از ۲۰ ثانیه کار، ۵ ثانیه ماژول را خاموش کنید. ساختار کد این کار را بسیار ساده کرده است.

۳. آنتن بهتر، برد بیشتر

اگر از نسخه PA+LNA استفاده می‌کنید، آنتن پیش‌فرض SMA معمولا ۲ dBi بهره دارد. با تعویض آن با یک آنتن ۵ یا ۷ dBi می‌توانید برد را به‌طور محسوسی افزایش دهید. آنتن‌های جهت‌دار (مثل یاگی) برد را در یک جهت خاص بیشتر می‌کنند، در حالی که آنتن‌های همه‌جهته (Omni) پوشش دایره‌ای دارند.

۴. مکان قرارگیری دستگاه

قرار دادن جمر در ارتفاع بالاتر و دور از اجسام فلزی، برد را افزایش می‌دهد. اجسام فلزی و دیوارهای بتنی امواج ۲.۴ گیگاهرتز را به‌شدت ضعیف می‌کنند.

۵. باتری برای استفاده پرتابل

برای اینکه دستگاه قابل حمل باشد، می‌توانید از یک باتری لیتیوم-پلیمر (LiPo) ۳.۷ ولتی با ظرفیت ۵۰۰ تا ۱۰۰۰ میلی‌آمپر ساعت استفاده کنید. ESP8266 و NRF24L01+ هر دو با ۳.۳ ولت کار می‌کنند، بنابراین باتری ۳.۷ ولتی را از طریق یک رگولاتور ۳.۳ ولت (مثل MCP1700) به مدار وصل کنید. با یک باتری ۱۰۰۰ میلی‌آمپری، دستگاه حدود ۴ ساعت کار می‌کند.

۶. نکته‌ای درباره بلوتوث ۵ و BLE

بلوتوث ۵ و بلوتوث کم‌مصرف (BLE) از کانال‌های باریک‌تر و پرش فرکانسی سریع‌تری استفاده می‌کنند. یک ماژول NRF24L01+ ممکن است نتواند تمام کانال‌های BLE را به‌طور کامل مسدود کند. برای اختلال مؤثرتر در BLE، استفاده از دو ماژول یا حتی یک ESP32 که خودش بلوتوث دارد، توصیه می‌شود.


ظاهر دستگاه را چطور بهتر کنیم؟

وقتی مدار روی میز کار می‌کند، نوبت به بسته‌بندی آن می‌رسد. یک دستگاه مرتب و قابل حمل، تجربه استفاده از آن را کاملا تغییر می‌دهد.

استفاده از کیس چاپ سه‌بعدی آماده

خوشبختانه برای این پروژه چند کیس چاپ سه‌بعدی آماده وجود دارد که به‌صورت رایگان در سایت‌هایی مثل Printables.com و Thingiverse در دسترس هستند. کافی است عبارت «ESP8266 NRF24L01 jammer case» را جستجو کنید. این کیس‌ها مخصوص همین قطعات طراحی شده‌اند و تمام قطعات داخل آن‌ها جای می‌گیرند.

اگر پرینتر سه‌بعدی ندارید

می‌توانید از یک جعبه پلاستیکی کوچک (مثل جعبه‌های پروژه‌ای که در فروشگاه‌های الکترونیک فروخته می‌شوند) استفاده کنید. با یک دریل یا هویه، سوراخ‌هایی برای نمایشگر، دکمه و آنتن ایجاد کنید. برای ثابت کردن برد، از پیچ‌های کوچک یا چسب حرارتی استفاده کنید.

نکته مهم: اگر از ماژول PA+LNA با آنتن خارجی استفاده می‌کنید، مطمئن شوید که آنتن از بدنه بیرون بماند و فلز یا پلاستیک ضخیم جلوی آن نباشد.

بهبود ظاهر با چند ترفند ساده

  • برچسب حرارتی یا برچسب شفاف روی نمایشگر OLED بچسبانید تا خط‌وخش نیفتد.
  • از سیم‌های رنگی برای اتصالات استفاده کنید تا داخل جعبه مرتب باشد.
  • یک کلید روشن/خاموش کوچک روی جعبه اضافه کنید تا مجبور نباشید هر بار کابل USB را جدا کنید.
  • اگر از باتری استفاده می‌کنید، یک مدار شارژ TP4056 با پورت Type-C داخل جعبه قرار دهید تا باتری را با کابل گوشی شارژ کنید.

عیب‌یابی سریع

مشکلاحتمالا چه چیزی است؟راه‌حل
ماژول NRF24L01+ شناسایی نمی‌شوداتصال SPI اشتباه یا تغذیه ناکافیاتصالات را چک کنید؛ ولتاژ VCC باید ۳.۳ ولت باشد؛ خازن اضافه کنید
کد آپلود می‌شود اما اثری نداردبرد اشتباه انتخاب شده یا فاصله زیادبرد NodeMCU 1.0 را انتخاب کنید؛ اسپیکر را نزدیک‌تر بیاورید
نمایشگر OLED روشن نمی‌شودآدرس I2C اشتباه یا اتصال SDA/SCL جابه‌جاآدرس I2C را با اسکچر I2C Scanner پیدا کنید؛ سیم‌ها را بررسی کنید
ماژول خیلی داغ می‌شودکار مداوم بدون استراحتسیکل کاری را کوتاه کنید (مثلا ۲۰ ثانیه کار، ۵ ثانیه استراحت)
دستگاه ریست می‌شودافت ولتاژ هنگام ارسال یا نگه داشتن دکمه روی GPIO0 هنگام بوتخازن بزرگ‌تر (۲۲۰ میکروفاراد) یا رگولاتور مجزا نصب کنید؛ دکمه را در حالت دو ماژول به RX منتقل کنید

نمای گرافیکی اتصالات

در این بخش، نمای شماتیک و گرافیکی اتصالات را به‌صورت گام‌به‌گام و با جزئیات کامل می‌بینی. از سه نمای مختلف استفاده می‌کنیم: نمای شماتیک کلی، نمای پین‌به‌پین ماژول‌ها و نمای فیزیکی چیدمان.

یادداشت: نماهای ۱، ۲ و ۳ حالت تک ماژول را نشان می‌دهند. در حالت دو ماژول، دکمه به RX (GPIO3) منتقل می‌شود و CSN ماژول دوم روی D3 قرار می‌گیرد.


نمای ۱: شماتیک کلی مدار (تک ماژول)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
                    ┌─────────────────────────────────────────────┐
                    │           منبع تغذیه ۳.۳ ولت                │
                    │        (پاوربانک + رگولاتور AMS1117)        │
                    └──────────────┬──────────────────────────────┘
                                   │
                    ┌──────────────┴──────────────┐
                    │                             │
                    │          3.3V               │
                    │           GND               │
                    │                             │
        ┌───────────┴─────────────┐   ┌───────────┴─────────────┐
        │                         │   │                         │
        │   ┌─────────────────┐   │   │   ┌─────────────────┐   │
        │   │   NodeMCU       │   │   │   │   OLED SSD1306  │   │
        │   │   ESP8266       │   │   │   │   128x64 I2C    │   │
        │   │                 │   │   │   │                 │   │
        │   │  3.3V ●─────────┼───┼───┼───● VCC             │   │
        │   │  GND  ●─────────┼───┼───┼───● GND             │   │
        │   │                 │   │   │   │                 │   │
        │   │  D1   ●─────────┼───┼───┼───● SDA             │   │
        │   │  D2   ●─────────┼───┼───┼───● SCL             │   │
        │   │                 │   │   │   └─────────────────┘   │
        │   │                 │   │   │                         │
        │   │  D4   ●─────────┼───┼───┼───────────┐             │
        │   │  D5   ●─────────┼───┼───┼───────┐   │             │
        │   │  D6   ●─────────┼───┼───┼───┐   │   │             │
        │   │  D7   ●─────────┼───┼───┼─┐ │   │   │             │
        │   │  D8   ●─────────┼───┼───┼─┼─┼───┼───┼─────┐       │
        │   │                 │   │   │ │ │   │   │     │       │
        │   │  D3   ●─────────┼───┼───┼─┼─┼───┼───┼───┐ │       │
        │   │  GND  ●─────────┼───┼───┼─┼─┼───┼───┼─┐ │ │       │
        │   └─────────────────┘   │   │ │ │   │   │ │ │ │       │
        │                         │   │ │ │   │   │ │ │ │       │
        └─────────────────────────┘   │ │ │   │   │ │ │ │       │
                                      │ │ │   │   │ │ │ │       │
                    ┌─────────────────┼─┼─┼───┼───┼─┼─┼─┼───────┘
                    │                 │ │ │   │   │ │ │ │
                    │   ┌─────────────┴─┴─┴───┴───┴─┴─┴───────┐
                    │   │         NRF24L01+ (ماژول اول)        │
                    │   │                                       │
                    │   │  VCC ●──── به 3.3V                    │
                    │   │  GND ●──── به GND                     │
                    │   │  CE  ●──── به D4 (GPIO2)              │
                    │   │  CSN ●──── به D8 (GPIO15)             │
                    │   │  SCK ●──── به D5 (GPIO14)             │
                    │   │  MOSI●──── به D7 (GPIO13)             │
                    │   │  MISO●──── به D6 (GPIO12)             │
                    │   │  IRQ ●──── (اتصال ندارد - NC)          │
                    │   └───────────────────────────────────────┘
                    │
                    │   ┌───────────────────┐
                    │   │  خازن ۱۰۰µF       │
                    │   │  (بین VCC و GND   │
                    │   │   ماژول NRF)      │
                    │   └───────────────────┘
                    │
                    │   ┌───────────────────┐
                    │   │  دکمه فشاری       │
                    │   │  یک سر → D3       │
                    │   │  سر دیگر → GND    │
                    │   └───────────────────┘
                    │

نمای ۲: نمای پین‌به‌پین دقیق (تک ماژول)

این نما دقیقا نشان می‌دهد کدام پین به کدام پین وصل می‌شود. این جدول را می‌توانی چاپ کنی و کنار دستت بگذاری.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
┌─────────────────────────────────────────────────────────────────────┐
│                        NodeMCU ESP8266                              │
│                                                                     │
│   ┌─────┐                                                           │
│   │ USB │                                                           │
│   └──┬──┘                                                           │
│      │                                                              │
│  ┌───┴────────────────────────────────────────────────────────┐     │
│  │  A0  │  RSV  │  RSV  │  SD3  │  SD2  │  SD1  │  CMD  │  SD0 │     │
│  │  ●   │   ●   │   ●   │   ●   │   ●   │   ●   │   ●   │   ●  │     │
│  └────────────────────────────────────────────────────────────┘     │
│                                                                     │
│  ┌────────────────────────────────────────────────────────────┐     │
│  │  ●   │   ●   │   ●   │   ●   │   ●   │   ●   │   ●   │  ●  │     │
│  │ GND  │  3V3  │  D0   │  D1   │  D2   │  D3   │  D4   │ 3V3 │     │
│  └──┬───┴───┬───┴───┬───┴───┬───┴───┬───┴───┬───┴───┬───┴──┬─┘     │
│     │       │       │       │       │       │       │      │       │
│     │       │       │       │       │       │       │      │       │
│    GND    3.3V     NC     SDA    SCL   BUTTON   CE    3.3V       │
│                            (OLED) (OLED)         (NRF)            │
│                                                                     │
│  ┌────────────────────────────────────────────────────────────┐     │
│  │  ●   │   ●   │   ●   │   ●   │   ●   │   ●   │   ●   │  ●  │     │
│  │  D5  │  D6   │  D7   │  D8   │  RX   │  TX   │  GND  │ 3V3 │     │
│  └──┬───┴───┬───┴───┬───┴───┬───┴───┬───┴───┬───┴───┬───┴──┬─┘     │
│     │       │       │       │       │       │       │      │       │
│     │       │       │       │       │       │       │      │       │
│    SCK     MISO    MOSI    CSN     NC      NC     GND    3.3V      │
│   (NRF)   (NRF)   (NRF)   (NRF)                                    │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│                      NRF24L01+ (ماژول اول)                          │
│                                                                     │
│         ┌───────────────────────────────────────┐                   │
│         │            آنتن (PCB یا SMA)          │                   │
│         └───────────────────────────────────────┘                   │
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  پین‌های ماژول (از چپ به راست):                              │    │
│  │                                                             │    │
│  │  GND │ VCC │ CE │ CSN │ SCK │ MOSI │ MISO │ IRQ           │    │
│  │   ●  │  ●  │ ●  │  ●  │  ●  │  ●   │  ●   │  ●            │    │
│  └───┬─┴──┬──┴─┬──┴──┬──┴──┬──┴───┬──┴───┬──┴───┬───────────┘    │
│      │    │    │     │     │      │      │      │                 │
│     GND  3.3V  D4    D8    D5     D7     D6    NC                 │
│           │   (CE)  (CSN) (SCK) (MOSI) (MISO)                     │
│           │                                                       │
│           └──── به 3.3V (با خازن ۱۰۰µF موازی)                     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│                      OLED SSD1306 (I2C)                             │
│                                                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │  پین‌های ماژول:                                              │    │
│  │                                                             │    │
│  │  GND │ VCC │ SCL │ SDA                                      │    │
│  │   ●  │  ●  │  ●  │  ●                                       │    │
│  └───┬─┴──┬──┴──┬──┴──┬────────────────────────────────────────┘    │
│      │    │     │     │                                            │
│     GND  3.3V   D2    D1                                           │
│                (SCL) (SDA)                                         │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────┐
│                         دکمه فشاری (Push Button)                    │
│                                                                     │
│         ┌─────────┐                                                 │
│         │  ●   ●  │                                                 │
│         │  │   │  │                                                 │
│         │  │   │  │                                                 │
│         └──┼───┼──┘                                                 │
│            │   │                                                    │
│           D3  GND                                                   │
│                                                                     │
│  (مقاومت pull-up داخلی ESP8266 فعال می‌شود - نیازی به مقاومت خارجی) │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

نمای ۳: چیدمان فیزیکی روی برد بورد (Breadboard)

این نما نشان می‌دهد چطور قطعات را روی یک برد بورد استاندارد قرار دهی. برای وضوح بیشتر، از نمای بالا استفاده می‌کنیم.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
                            ┌──────────────────────────────────────────────────┐
                            │                 برد بورد ۸۳۰ نقطه‌ای              │
                            │                                                  │
                            │   خط قرمز = ریل مثبت (3.3V)                       │
                            │   خط آبی = ریل منفی (GND)                         │
                            │                                                  │
                            │  ┌────────────────────────────────────────────┐  │
                            │  │  ریل بالا:  +  +  +  +  +  +  +  +  +  +  │  │
                            │  │             -  -  -  -  -  -  -  -  -  -  │  │
                            │  └────────────────────────────────────────────┘  │
                            │                                                  │
                            │       ┌───────────────────────────┐              │
                            │       │      NodeMCU ESP8266       │              │
                            │       │  ┌─────────────────────┐  │              │
                            │       │  │ USB                 │  │              │
                            │       │  └─────────────────────┘  │              │
                            │       │                           │              │
                            │       │  پین‌ها:                   │              │
                            │       │  GND  3V3  D0  D1  D2  D3 │              │
                            │       │   ●    ●    ●   ●   ●   ●  │              │
                            │       │  D4   D5   D6  D7  D8  RX │              │
                            │       │   ●    ●    ●   ●   ●   ●  │              │
                            │       └───┬────┬────┬───┬───┬───┬─┘              │
                            │           │    │    │   │   │   │                │
                            │           │    │    │   │   │   │                │
                            │           │    │    │   │   │   └─── دکمه        │
                            │           │    │    │   │   │                    │
                            │           │    │    │   │   └─────── CSN (NRF)  │
                            │           │    │    │   │                        │
                            │           │    │    │   └─────────── CE (NRF)   │
                            │           │    │    │                            │
                            │           │    │    └─────────────── MISO (NRF)  │
                            │           │    │                                │
                            │           │    └──────────────────── SCK (NRF)   │
                            │           │                                    │
                            │           └───────────────────────── SDA/SCL    │
                            │                                      (OLED)     │
                            │                                                  │
                            │       ┌───────────────────────────┐              │
                            │       │   NRF24L01+ (ماژول اول)    │              │
                            │       │  ┌─────────────────────┐  │              │
                            │       │  │      آنتن           │  │              │
                            │       │  └─────────────────────┘  │              │
                            │       │  GND VCC CE CSN SCK MOSI  │              │
                            │       │   ●   ●   ●  ●   ●   ●    │              │
                            │       │  MISO IRQ                │              │
                            │       │   ●   ●                  │              │
                            │       └───┬───┬───┬──┬───┬───┬──┘              │
                            │           │   │   │  │   │   │                  │
                            │           │   │   │  │   │   └── D7 (MOSI)       │
                            │           │   │   │  │   └────── D5 (SCK)        │
                            │           │   │   │  └────────── D8 (CSN)        │
                            │           │   │   └───────────── D4 (CE)         │
                            │           │   └───────────────── 3.3V            │
                            │           └───────────────────── GND             │
                            │                                                  │
                            │       ┌───────────────────────────┐              │
                            │       │   خازن ۱۰۰µF              │              │
                            │       │   (+) ── به VCC NRF       │              │
                            │       │   (-) ── به GND NRF       │              │
                            │       │   (تا حد امکان نزدیک)      │              │
                            │       └───────────────────────────┘              │
                            │                                                  │
                            │       ┌───────────────────────────┐              │
                            │       │   OLED SSD1306            │              │
                            │       │  ┌─────────────────────┐  │              │
                            │       │  │   نمایشگر ۱۲۸x۶۴    │  │              │
                            │       │  └─────────────────────┘  │              │
                            │       │   GND VCC SCL SDA         │              │
                            │       │    ●   ●   ●   ●          │              │
                            │       └────┬───┬───┬───┬──────────┘              │
                            │            │   │   │   │                         │
                            │            │   │   │   └── D1 (SDA)              │
                            │            │   │   └────── D2 (SCL)              │
                            │            │   └────────── 3.3V                  │
                            │            └────────────── GND                   │
                            │                                                  │
                            │  ┌────────────────────────────────────────────┐  │
                            │  │  ریل پایین:  +  +  +  +  +  +  +  +  +  +  │  │
                            │  │             -  -  -  -  -  -  -  -  -  -  │  │
                            │  └────────────────────────────────────────────┘  │
                            │                                                  │
                            │   نکته: ریل‌های بالا و پایین را با سیم به هم     │
                            │   وصل کن تا 3.3V و GND در همه نقاط در دسترس باشد│
                            │                                                  │
                            └──────────────────────────────────────────────────┘

نمای ۴: شماتیک مدار با دو ماژول NRF24L01

این نما اتصال دو ماژول را نشان می‌دهد. پین‌های SPI (SCK، MOSI، MISO) بین دو ماژول مشترک هستند و فقط CE و CSN مستقل می‌باشند.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
                    ┌─────────────────────────────────────────────┐
                    │           منبع تغذیه ۳.۳ ولت                │
                    │        (پاوربانک + رگولاتور AMS1117)        │
                    └──────────────┬──────────────────────────────┘
                                   │
                    ┌──────────────┴──────────────┐
                    │                             │
                    │          3.3V               │
                    │           GND               │
                    │                             │
        ┌───────────┴─────────────┐   ┌───────────┴─────────────┐
        │                         │   │                         │
        │   ┌─────────────────┐   │   │   ┌─────────────────┐   │
        │   │   NodeMCU       │   │   │   │   OLED SSD1306  │   │
        │   │   ESP8266       │   │   │   │                 │   │
        │   │                 │   │   │   │  VCC ●── به 3.3V │   │
        │   │  3.3V ●─────────┼───┼───┼───● GND ●── به GND  │   │
        │   │  GND  ●─────────┼───┼───┼───● SDA ●── به D1   │   │
        │   │  D1   ●─────────┼───┼───┼───● SCL ●── به D2   │   │
        │   │  D2   ●─────────┼───┼───┼───└─────────────────┘   │
        │   │                 │   │   │                         │
        │   │  D4   ●─────────┼───┼───┼──────────┐ (CE ماژول ۱)  │
        │   │  D5   ●─────────┼───┼───┼───────┐  │ (SCK مشترک)   │
        │   │  D6   ●─────────┼───┼───┼───┐   │  │ (MISO مشترک)  │
        │   │  D7   ●─────────┼───┼───┼─┐ │   │  │ (MOSI مشترک)  │
        │   │  D8   ●─────────┼───┼───┼─┼─┼───┼──┼──┐ (CSN ماژول۱) │
        │   │  D0   ●─────────┼───┼───┼─┼─┼───┼──┼──┼──┐ (CE ماژول۲)│
        │   │  D3   ●─────────┼───┼───┼─┼─┼───┼──┼──┼──┼──┐(CSN م۲)│
        │   │  RX   ●─────────┼───┼───┼─┼─┼───┼──┼──┼──┼──┼──┐    │
        │   │  GND  ●─────────┼───┼───┼─┼─┼───┼──┼──┼──┼──┼──┼──┐ │
        │   └─────────────────┘   │   │ │ │   │  │  │  │  │  │  │ │
        │                         │   │ │ │   │  │  │  │  │  │  │ │
        └─────────────────────────┘   │ │ │   │  │  │  │  │  │  │ │
                                      │ │ │   │  │  │  │  │  │  │ │
                    ┌─────────────────┼─┼─┼───┼──┼──┼──┼──┼──┼──┼─┘
                    │                 │ │ │   │  │  │  │  │  │  │
                    │   ┌─────────────┴─┴─┴───┴──┴──┴──┴──┴──┴──┴───────┐
                    │   │         NRF24L01+ (ماژول اول)                  │
                    │   │                                                 │
                    │   │  VCC ●── به 3.3V (با خازن ۱۰۰µF)              │
                    │   │  GND ●── به GND                                │
                    │   │  CE  ●── به D4 (GPIO2)                         │
                    │   │  CSN ●── به D8 (GPIO15)                        │
                    │   │  SCK ●── به D5 (GPIO14) ── مشترک              │
                    │   │  MOSI●── به D7 (GPIO13) ── مشترک              │
                    │   │  MISO●── به D6 (GPIO12) ── مشترک              │
                    │   │  IRQ ●── NC                                    │
                    │   └───────────────────────────────────────────────┘
                    │
                    │   ┌───────────────────────────────────────────────┐
                    │   │         NRF24L01+ (ماژول دوم)                  │
                    │   │                                                 │
                    │   │  VCC ●── به 3.3V (با خازن ۱۰۰µF جداگانه)       │
                    │   │  GND ●── به GND                                │
                    │   │  CE  ●── به D0 (GPIO16)                        │
                    │   │  CSN ●── به D3 (GPIO0)                         │
                    │   │  SCK ●── به D5 (GPIO14) ── مشترک با م۱        │
                    │   │  MOSI●── به D7 (GPIO13) ── مشترک با م۱        │
                    │   │  MISO●── به D6 (GPIO12) ── مشترک با م۱        │
                    │   │  IRQ ●── NC                                    │
                    │   └───────────────────────────────────────────────┘
                    │
                    │   ┌───────────────────┐
                    │   │  دکمه فشاری       │
                    │   │  (به پین RX منتقل │
                    │   │   می‌شود)          │
                    │   │  یک سر → RX       │
                    │   │  سر دیگر → GND    │
                    │   └───────────────────┘
                    │

نکته مهم: در حالت دو ماژول، پین D3 برای CSN ماژول دوم و پین RX (GPIO3) برای دکمه استفاده می‌شود. کد جدید این تخصیص را به‌صورت خودکار مدیریت می‌کند، بنابراین فقط سیم دکمه را به RX منتقل کن و نیازی به تغییر کد نداری.


نمای ۵: جدول رنگی اتصالات

این جدول را می‌توانی چاپ کنی و کنار دستت بگذاری. هر رنگ نشان‌دهنده یک نوع سیگنال است.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
┌─────────────────────────────────────────────────────────────────────────────┐
│                        جدول اتصالات - تک ماژول NRF24L01                     │
├──────────────────┬──────────────────┬──────────────────┬────────────────────┤
│  از (ESP8266)    │  به (NRF24L01)   │  رنگ پیشنهادی    │  توضیح             │
├──────────────────┼──────────────────┼──────────────────┼────────────────────┤
│  D4 (GPIO2)      │  CE              │  🟡 زرد          │  فعال‌سازی ماژول     │
│  D8 (GPIO15)     │  CSN             │  🟠 نارنجی       │  انتخاب تراشه       │
│  D5 (GPIO14)     │  SCK             │  🟢 سبز          │  کلاک SPI          │
│  D7 (GPIO13)     │  MOSI            │  🔵 آبی          │  داده خروجی        │
│  D6 (GPIO12)     │  MISO            │  🟣 بنفش         │  داده ورودی        │
│  3.3V            │  VCC             │  🔴 قرمز         │  تغذیه مثبت        │
│  GND             │  GND             │  ⚫ مشکی         │  زمین              │
├──────────────────┼──────────────────┼──────────────────┼────────────────────┤
│  از (ESP8266)    │  به (OLED)       │  رنگ پیشنهادی    │  توضیح             │
├──────────────────┼──────────────────┼──────────────────┼────────────────────┤
│  D1 (GPIO5)      │  SDA             │  🔵 آبی          │  داده I2C          │
│  D2 (GPIO4)      │  SCL             │  🟡 زرد          │  کلاک I2C          │
│  3.3V            │  VCC             │  🔴 قرمز         │  تغذیه مثبت        │
│  GND             │  GND             │  ⚫ مشکی         │  زمین              │
├──────────────────┼──────────────────┼──────────────────┼────────────────────┤
│  از (ESP8266)    │  به (دکمه)       │  رنگ پیشنهادی    │  توضیح             │
├──────────────────┼──────────────────┼──────────────────┼────────────────────┤
│  D3 (GPIO0)      │  یک سر دکمه      │  🟤 قهوه‌ای       │  ورودی دیجیتال     │
│  GND             │  سر دیگر دکمه    │  ⚫ مشکی         │  زمین              │
└──────────────────┴──────────────────┴──────────────────┴────────────────────┘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
┌─────────────────────────────────────────────────────────────────────────────┐
│                    جدول اتصالات - دو ماژول NRF24L01 (اضافه‌شده)             │
├──────────────────┬──────────────────┬──────────────────┬────────────────────┤
│  از (ESP8266)    │  به (NRF24 م۲)   │  رنگ پیشنهادی    │  توضیح             │
├──────────────────┼──────────────────┼──────────────────┼────────────────────┤
│  D0 (GPIO16)     │  CE              │  🟡 زرد          │  فعال‌سازی ماژول ۲   │
│  D3 (GPIO0)      │  CSN             │  🟠 نارنجی       │  انتخاب تراشه ۲     │
│  D5 (GPIO14)     │  SCK             │  🟢 سبز (مشترک)  │  کلاک SPI          │
│  D7 (GPIO13)     │  MOSI            │  🔵 آبی (مشترک)  │  داده خروجی        │
│  D6 (GPIO12)     │  MISO            │  🟣 بنفش (مشترک) │  داده ورودی        │
│  3.3V            │  VCC             │  🔴 قرمز         │  تغذیه مثبت        │
│  GND             │  GND             │  ⚫ مشکی         │  زمین              │
├──────────────────┼──────────────────┼──────────────────┼────────────────────┤
│  در حالت دو ماژول، دکمه به‌صورت خودکار توسط کد به RX (GPIO3) منتقل     │
│  می‌شود. فقط سیم را به RX وصل کن.                                       │
└──────────────────┴──────────────────┴──────────────────┴────────────────────┘

نمای ۶: چیدمان پیشنهادی داخل کیس

این نما نشان می‌دهد قطعات را چطور داخل یک کیس پلاستیکی یا چاپ سه‌بعدی قرار دهی تا ظاهر مرتب و کارکرد بهتر باشد.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
                    ┌─────────────────────────────────────────────┐
                    │              نمای روبرو (Front)             │
                    │                                             │
                    │   ┌─────────────────────────────────────┐   │
                    │   │                                     │   │
                    │   │         ┌───────────────┐           │   │
                    │   │         │   نمایشگر     │           │   │
                    │   │         │   OLED        │           │   │
                    │   │         │   128x64      │           │   │
                    │   │         └───────────────┘           │   │
                    │   │                                     │   │
                    │   │         ┌───────┐                   │   │
                    │   │         │ دکمه  │                   │   │
                    │   │         └───────┘                   │   │
                    │   │                                     │   │
                    │   │    ┌─────┐                          │   │
                    │   │    │ LED │ (اختیاری)               │   │
                    │   │    └─────┘                          │   │
                    │   │                                     │   │
                    │   └─────────────────────────────────────┘   │
                    │                                             │
                    └─────────────────────────────────────────────┘

                    ┌─────────────────────────────────────────────┐
                    │              نمای بالا (Top)                │
                    │                                             │
                    │   ┌─────────────────────────────────────┐   │
                    │   │                                     │   │
                    │   │   ┌─────────┐     ┌─────────┐      │   │
                    │   │   │ NRF24   │     │ NRF24   │      │   │
                    │   │   │ ماژول ۱ │     │ ماژول ۲ │      │   │
                    │   │   │  ┌───┐  │     │  ┌───┐  │      │   │
                    │   │   │  │آنتن│  │     │  │آنتن│  │      │   │
                    │   │   │  └───┘  │     │  └───┘  │      │   │
                    │   │   └─────────┘     └─────────┘      │   │
                    │   │                                     │   │
                    │   │   ┌─────────────────────────────┐   │   │
                    │   │   │      NodeMCU ESP8266        │   │   │
                    │   │   │      (زیر برد اصلی)          │   │   │
                    │   │   └─────────────────────────────┘   │   │
                    │   │                                     │   │
                    │   │   ┌─────────┐                       │   │
                    │   │   │ باتری   │                       │   │
                    │   │   │ LiPo    │                       │   │
                    │   │   │ 1000mAh │                       │   │
                    │   │   └─────────┘                       │   │
                    │   │                                     │   │
                    │   └─────────────────────────────────────┘   │
                    │                                             │
                    └─────────────────────────────────────────────┘

                    ┌─────────────────────────────────────────────┐
                    │              نمای کنار (Side)               │
                    │                                             │
                    │   ┌─────────────────────────────────────┐   │
                    │   │                                     │   │
                    │   │   ┌───┐                             │   │
                    │   │   │آنتن│  ┌─────────────────────┐   │   │
                    │   │   │SMA │  │                     │   │   │
                    │   │   └───┘  │    بدنه کیس         │   │   │
                    │   │          │                     │   │   │
                    │   │          │  ┌───────────────┐  │   │   │
                    │   │          │  │  کلید روشن/   │  │   │   │
                    │   │          │  │  خاموش       │  │   │   │
                    │   │          │  └───────────────┘  │   │   │
                    │   │          │                     │   │   │
                    │   │          │  ┌───────────────┐  │   │   │
                    │   │          │  │  پورت USB     │  │   │   │
                    │   │          │  │  (شارژ)       │  │   │   │
                    │   │          │  └───────────────┘  │   │   │
                    │   │          │                     │   │   │
                    │   │          └─────────────────────┘   │   │
                    │   │                                     │   │
                    │   └─────────────────────────────────────┘   │
                    │                                             │
                    └─────────────────────────────────────────────┘

نکات نهایی درباره اتصالات

۱. رنگ‌بندی سیم‌ها: حتما از سیم‌های رنگی طبق جدول بالا استفاده کن. این کار عیب‌یابی را بسیار ساده‌تر می‌کند. اگر سیم رنگی نداری، با برچسب‌های کوچک شماره‌گذاری کن.

۲. طول سیم‌ها: سیم‌های SPI (SCK، MOSI، MISO) را تا حد امکان کوتاه نگه‌دار (زیر ۱۰ سانتی‌متر). سیم‌های بلند باعث افت سیگنال و اختلال در ارتباط می‌شوند.

۳. خازن‌ها را فراموش نکن: برای هر ماژول NRF24L01 یک خازن ۱۰۰ میکروفاراد جداگانه، تا حد امکان نزدیک به پایه‌های VCC و GND ماژول قرار بده. این مهم‌ترین عامل پایداری است.

۴. اتصال GND مشترک: تمام GNDها (ESP8266، هر دو ماژول NRF، OLED، دکمه، باتری) باید به یک نقطه مشترک وصل شوند. بدون GND مشترک، مدار کار نمی‌کند.

۵. تست مرحله‌به‌مرحله: ابتدا فقط ESP8266 و OLED را وصل کن و کد ساده‌ای برای نمایش متن روی OLED آپلود کن. بعد NRF24L01 اول را اضافه کن و تست کن. سپس ماژول دوم را اضافه کن. این روش باعث می‌شود اگر مشکلی پیش آمد، سریع‌تر آن را پیدا کنی.

۶. ولتاژسنج: قبل از اتصال ماژول‌های NRF24L01، با مولتی‌متر مطمئن شو که ولتاژ بین VCC و GND دقیقا ۳.۳ ولت است. حتی ۳.۶ ولت هم می‌تواند در طولانی‌مدت به ماژول آسیب بزند.


دانش امواج، پروتکل بلوتوث و محدودیت‌های واقعی جمرها

در بالا، ساخت یک جمر ۲.۴ گیگاهرتز با ESP8266 و ماژول‌های NRF24L01+ را گام‌به‌گام بررسی کردیم. اما قبل از استفاده از هر ابزاری، باید دقیقا بداند آن ابزار چه کاری می‌تواند انجام دهد و چه کاری از عهده‌اش خارج است. در این بخش، ابتدا دنیای امواج و پروتکل بلوتوث را کالبدشکافی می‌کنیم و سپس با نگاهی صادقانه، محدودیت‌های فیزیکی و پروتکلی جمرهای مبتنی بر NRF24L01+ را بررسی می‌کنیم.


بخش اول: دنیای امواج و باند ۲.۴ گیگاهرتز

امواج رادیویی و باند ISM

همه ارتباطات بی‌سیم روی امواج الکترومغناطیسی سوار می‌شوند. این امواج بر اساس فرکانس (تعداد نوسان در ثانیه) دسته‌بندی می‌شوند. فرکانس با واحد هرتز (Hz) اندازه‌گیری می‌شود و هرچه فرکانس بالاتر باشد، موج انرژی بیشتری دارد اما برد کمتری خواهد داشت.

باند ۲.۴ گیگاهرتز که در آن کار می‌کنیم، به دلیل ویژگی‌های منحصربه‌فردش به یک منطقه آزاد و بدون مجوز تبدیل شده است. این باند به عنوان باند ISM (Industrial, Scientific and Medical) شناخته می‌شود و در سراسر جهان برای کاربردهای صنعتی، علمی و پزشکی آزاد است. به همین دلیل، وای‌فای، بلوتوث، زیگبی، ماوس و کیبورد بی‌سیم، دوربین‌های بی‌سیم و بسیاری دستگاه‌های دیگر همگی در همین باند کار می‌کنند.

باند ۲.۴ گیگاهرتز بین ۲۴۰۲ تا ۲۴۸۰ مگاهرتز گسترده شده است. این یعنی پهنای باند کلی حدود ۸۳.۵ مگاهرتز است. تصور کنید این باند یک بزرگراه چندبانده است که هزاران خودرو (سیگنال) در آن در حال حرکت هستند. هر دستگاه بی‌سیم، باند مخصوص به خود را از این بزرگراه اشغال می‌کند.

چرا بلوتوث و وای‌فای در این باند با هم تداخل می‌کنند؟

وای‌فای معمولا از کانال‌های پهن (۲۰ مگاهرتز یا بیشتر) استفاده می‌کند، در حالی که بلوتوث از کانال‌های باریک‌تر (۱ یا ۲ مگاهرتز) استفاده می‌کند. این تفاوت در پهنای کانال باعث می‌شود که یک کانال وای‌فای بتواند روی چندین کانال بلوتوث بیفتد. به همین دلیل است که وقتی یک روتر وای‌فای قدرتمند در نزدیکی شما روشن است، ممکن است صدای هدفون بلوتوثی‌تان دچار پرش و اختلال شود.


بخش دوم: بلوتوث - از کجا آمد و به کجا رفت؟

تاریخچه بلوتوث: از یک ایده تا استاندارد جهانی

بلوتوث در اواخر دهه ۱۹۹۰ توسط شرکت اریکسون به عنوان یک فناوری جایگزین کابل برای اتصال دستگاه‌های الکترونیکی معرفی شد. نام «بلوتوث» از پادشاه دانمارکی هارالد بلوتوث (Harald Bluetooth) گرفته شده که در قرن دهم میلادی، دانمارک و نروژ را متحد کرد؛ همانطور که این فناوری، دستگاه‌های مختلف را به هم متصل می‌کند.

نسخه ۱.۰ بلوتوث در سال ۱۹۹۹ منتشر شد و اولین محصولات تجاری بلوتوث در همین سال به بازار آمدند. این نسخه اولیه که بعدا Bluetooth BR (Basic Rate) نام گرفت، سرعت خام ۱ مگابیت بر ثانیه داشت و برای اتصال ساده دو دستگاه طراحی شده بود. در آن زمان، کاربرد اصلی بلوتوث در گوشی‌های همراه و هندزفری‌های خودرو بود.

نسخه‌های مختلف بلوتوث: یک نگاه سریع

نسخهسال انتشارمهم‌ترین ویژگیحداکثر سرعت
۱.۰۱۹۹۹اولین نسخه تجاری۷۲۱ کیلوبیت بر ثانیه
۱.۱۲۰۰۲رفع اشکالات نسخه اول~۸۱۰ کیلوبیت بر ثانیه
۱.۲۲۰۰۳بهبود همزیستی با وای‌فای۱ مگابیت بر ثانیه
۲.۰ + EDR۲۰۰۴سرعت بالاتر با EDR~۲ مگابیت بر ثانیه
۲.۱ + EDR۲۰۰۷اتصال ساده‌تر (SSP)~۲ مگابیت بر ثانیه
۳.۰ + HS۲۰۰۹استفاده از وای‌فای برای سرعت بالا~۲۴ مگابیت بر ثانیه
۴.۰۲۰۱۰معرفی BLE (کم‌مصرف)۱ مگابیت بر ثانیه
۴.۱۲۰۱۳بهبود IoT۱ مگابیت بر ثانیه
۴.۲۲۰۱۴پشتیبانی از IPv6۱ مگابیت بر ثانیه
۵.۰۲۰۱۶۴ برابر برد، ۲ برابر سرعت۲ مگابیت بر ثانیه

تفاوت کلیدی: بلوتوث کلاسیک در مقابل BLE

بزرگ‌ترین تغییر در تاریخ بلوتوث، معرفی Bluetooth Low Energy (BLE) در نسخه ۴.۰ بود. این یک فناوری کاملا جدید نبود، بلکه استانداردی بود که از Wibree (فناوری کم‌مصرف نوکیا) نشأت گرفته بود و در نهایت به BLE تغییر نام یافت.

تفاوت بین بلوتوث کلاسیک و BLE فقط در مصرف انرژی نیست؛ بلکه در معماری فیزیکی و نحوه ارسال داده نیز تفاوت‌های بنیادین دارند:

مشخصهبلوتوث کلاسیک (BR/EDR)BLE (Bluetooth Low Energy)
تعداد کانال‌ها۷۹ کانال با فاصله ۱ مگاهرتز۴۰ کانال با فاصله ۲ مگاهرتز
نرخ پرش فرکانسیتا ۱۶۰۰ بار در ثانیهبین ۱۳۳ تا ۰.۲۵ بار در ثانیه
کاربرد اصلیپخش صدا، هندزفری، اسپیکرIoT، سنسورها، ساعت هوشمند
مصرف انرژینسبتا بالابسیار کم

نکته کلیدی: یک اسپیکر بلوتوثی معمولی از بلوتوث کلاسیک استفاده می‌کند، در حالی که ساعت هوشمند یا سنسور دما از BLE بهره می‌برد. این تفاوت برای درک محدودیت‌های جمر حیاتی است.

بلوتوث کلاسیک دقیقا چطور کار می‌کند؟

بلوتوث کلاسیک از تکنیکی به نام FHSS (Frequency-Hopping Spread Spectrum) استفاده می‌کند. در این روش، فرستنده و گیرنده از قبل توافق می‌کنند که در چه ترتیبی بین ۷۹ کانال جابه‌جا شوند. این کار باعث می‌شود اگر یک کانال توسط دستگاه دیگری اشغال باشد، ارتباط بلوتوث فقط برای یک لحظه کوتاه مختل شود و سپس به کانال بعدی برود.

در بلوتوث کلاسیک، هر کانال ۱ مگاهرتز پهنا دارد و دستگاه‌ها تا ۱۶۰۰ بار در ثانیه فرکانس خود را تغییر می‌دهند. این سرعت پرش بسیار بالاست و باعث می‌شود جمر کردن آن دشوار باشد.


بخش سوم: AFH - سلاح مخفی بلوتوث در برابر جمر

AFH چیست و چطور کار می‌کند؟

Adaptive Frequency Hopping (AFH) یا «پرش فرکانسی تطبیقی» یکی از مهم‌ترین مکانیزم‌های دفاعی بلوتوث در برابر تداخل و جمر است. در AFH، دستگاه بلوتوث به‌طور مداوم کیفیت تمام ۷۹ کانال را می‌سنجد. اگر کانالی کیفیت پایینی داشته باشد (مثلا به دلیل وجود نویز یا جمر)، آن کانال در لیست سیاه (Blacklist) قرار می‌گیرد و از چرخه پرش حذف می‌شود.

این فرآیند به‌صورت پویا و لحظه‌ای انجام می‌شود. به محض اینکه جمر شروع به ارسال نویز روی یک کانال کند، بلوتوث در کسری از ثانیه آن کانال را شناسایی کرده و از لیست پرش خود حذف می‌کند. سپس ارتباط خود را روی کانال‌های تمیز ادامه می‌دهد.

چرا AFH جمرهای ساده را ناکارآمد می‌کند؟

تصور کنید ۷۹ کانال بلوتوث را مانند ۷۹ لاین یک بزرگراه در نظر بگیرید. جمر شما یک ماشین است که در چند لاین پارک کرده و راه را بسته است. راننده بلوتوث (اسپیکر و گوشی) با دیدن این موانع، به‌سرعت از لاین‌های بسته عبور کرده و از لاین‌های باز استفاده می‌کند.

برای اینکه جمر شما واقعا مؤثر باشد، باید تمام ۷۹ لاین را همزمان ببندد. اما یک ماژول NRF24L01+ در هر لحظه فقط می‌تواند روی یک کانال نویز بفرستد. حتی اگر با سرعت بین کانال‌ها سوئیچ کنید، باز هم همیشه «لحظه‌ای» وجود دارد که بلوتوث از یک کانال تمیز استفاده می‌کند.

BLE و AFH: تفاوت‌های ظریف

در BLE، مکانیزم AFH نیز وجود دارد، اما با تفاوت‌های مهمی. BLE از ۴۰ کانال استفاده می‌کند (۳۷ کانال داده + ۳ کانال تبلیغاتی) و نرخ پرش آن بسیار کمتر از بلوتوث کلاسیک است. این باعث می‌شود که BLE در برابر جمر آسیب‌پذیرتر باشد، اما همچنان AFH آن را تا حدی مقاوم می‌کند.

در BLE، کانال‌های تبلیغاتی (Advertising Channels) روی فرکانس‌های ۲۴۰۲، ۲۴۲۶ و ۲۴۸۰ مگاهرتز قرار دارند و برخلاف کانال‌های داده، از AFH استفاده نمی‌کنند. این بدان معناست که اگر جمر را دقیقا روی این سه فرکانس تنظیم کنید، می‌توانید فرآیند کشف و اتصال دستگاه‌های BLE را مختل کنید.


بخش چهارم: محدودیت‌های واقعی جمر NRF24L01+

محدودیت ۱: پهنای باند و توان خروجی

ماژول NRF24L01+ توان خروجی حداکثر +۲۰ dBm (۱۰۰ میلی‌وات) دارد. در حالی که یک روتر وای‌فای خانگی معمولی حدود ۲۰ dBm توان دارد، جمرهای صنعتی از توان‌های چند وات تا چند صد وات استفاده می‌کنند.

برای مقایسه، یک جمر حرفه‌ای ۲.۴ گیگاهرتز می‌تواند تا ۵۰ وات توان داشته باشد و برد آن به چند کیلومتر برسد. در مقابل، یک ماژول NRF24L01+ با آنتن استاندارد، در بهترین حالت (نسخه PA+LNA) برد مؤثری حدود ۱۰ تا ۳۰ متر در فضای باز دارد.

محدودیت ۲: سرعت سوئیچ بین کانال‌ها

ماژول NRF24L01+ برای تغییر کانال، باید رجیسترهای داخلی خود را از طریق پروتکل SPI پیکربندی کند. این فرآیند چند صد میکروثانیه زمان می‌برد. در حالی که بلوتوث کلاسیک هر ۶۲۵ میکروثانیه یک بار کانال خود را عوض می‌کند، جمر شما کندتر از هدف حرکت می‌کند.

به بیان ساده: شما در حال تعقیب یک خرگوش با سرعت ۱۶۰۰ پرش در ثانیه هستید، در حالی که سرعت خود شما کمتر از این است. در همان لحظه‌ای که جمر شما در حال سوئیچ به کانال بعدی است، بلوتوث قبلا چند بار کانال خود را عوض کرده و داده‌اش را منتقل کرده است.

محدودیت ۳: AFH در عمل

مهم‌ترین محدودیت، همان AFH است. آزمایش‌های عملی نشان می‌دهد که پروژه‌های مبتنی بر NRF24L01+ می‌توانند بلوتوث کلاسیک را به‌طور کامل مسدود کنند، اما BLE را فقط مختل می‌کنند و نمی‌توانند به‌طور کامل قطع کنند. دلیل این تفاوت، AFH قوی‌تر در BLE است.

محدودیت ۴: برد واقعی در عمل

بر اساس گزارش‌های کاربران، یک جمر مبتنی بر NRF24L01+ با آنتن استاندارد، در فاصله ۳ سانتی‌متری می‌تواند یک اسپیکر JBL GO 3 را قطع کند، و با آنتن‌های قوی‌تر، این فاصله به حدود ۳۰ سانتی‌متر افزایش می‌یابد. حتی با دو ماژول و آنتن‌های PA+LNA، برد مؤثر معمولا از چند متر فراتر نمی‌رود.

در یک آزمایش عملی دیگر، محققان نشان دادند که وقتی گوشی فقط ۲۰ سانتی‌متر از اسپیکر فاصله دارد، جمر کردن تقریبا غیرممکن است. اما وقتی فاصله به ۲ متر می‌رسد، جمر می‌تواند سیگنال را در فاصله چند متری مسدود کند.

محدودیت ۵: تداخل با وای‌فای

اگرچه جمر شما در باند ۲.۴ گیگاهرتز کار می‌کند، اما نمی‌تواند وای‌فای را به‌طور کامل مسدود کند. کانال‌های وای‌فای پهن‌تر هستند (۲۰ مگاهرتز) و جمر شما فقط می‌تواند بخش کوچکی از آنها را تحت تأثیر قرار دهد. برای مسدود کردن مؤثر وای‌فای، به توان بسیار بالاتری نیاز است.


بخش پنجم: جمع‌بندی صادقانه - این جمر چه کاری می‌کند و چه کاری نمی‌کند؟

آنچه جمر شما می‌تواند انجام دهد:

  • مختل کردن صدای اسپیکرهای بلوتوثی کلاسیک در فاصله نزدیک (چند متر)
  • قطع موقت اتصال بلوتوث کلاسیک در فاصله بسیار نزدیک
  • ایجاد اختلال در شبکه‌های وای‌فای در فاصله نزدیک (کاهش سرعت، افزایش پکت لاست)
  • مختل کردن ارتباط دستگاه‌های BLE (ساعت هوشمند، سنسورها) در فاصله نزدیک
  • به‌عنوان یک ابزار آموزشی برای درک امواج رادیویی و پروتکل‌های بی‌سیم

آنچه جمر شما نمی‌تواند انجام دهد:

  • قطع کامل و قابل‌اعتماد بلوتوث کلاسیک در هر فاصله‌ای
  • مسدود کردن BLE به‌طور کامل (به دلیل AFH)
  • مسدود کردن وای‌فای به‌طور کامل
  • داشتن برد چند ده متری (مگر با آنتن‌های خاص و شرایط ایده‌آل)
  • رقابت با جمرهای حرفه‌ای از نظر توان و برد

چرا این جمر «کار می‌کند» اما «قابل‌اعتماد نیست»؟

پاسخ در یک کلمه خلاصه می‌شود: AFH. بلوتوث به‌طور فعالانه کانال‌های شلوغ را شناسایی و حذف می‌کند. جمر شما می‌تواند چند کانال را مسدود کند، اما بلوتوث به‌سرعت از کانال‌های تمیز استفاده می‌کند. این شبیه به این است که بخواهید یک رودخانه را با چند سنگ مسدود کنید؛ آب همیشه راهی برای عبور پیدا می‌کند.

در نتیجه، این جمر ممکن است در شرایط خاص (فاصله کم، اسپیکر بلوتوث کلاسیک قدیمی، عدم وجود وای‌فای در نزدیکی) کار کند، اما در شرایط دیگر (فاصله زیاد، اسپیکر BLE، حضور روتر وای‌فای) ناکارآمد خواهد بود. این یک ابزار آزمایشی و آموزشی است، نه یک راه‌حل حرفه‌ای برای مسدود کردن ارتباطات.