راه اندازی بلوتوث کلاسیک ESP32

راه اندازی بلوتوث کلاسیک ESP32

ما در این آموزش قصد داریم با راه اندازی بلوتوث کلاسیک ESP32 نحوه به کارگیری یکی دیگر از قابلیت های این تراشه را که هنوز برخی افراد با آن آشنا نیستند٬ بیان نماییم. اکثر مردم، خانواده میکروکنترلرهای ESP را با وای‌فای مرتبط می‌دانند و این موضوع منطقی است، زیرا آن‌ها به راه حلی برای آنلاین شدن سریع و آسان پروژه‌های شما تبدیل شده‌اند. اما با اینکه قابلیت‌ وای‌فای٬ کاربرد اصلی این میکروکنترلرها است، ESP32 مجهز به بلوتوث هم هست، هر چقدر هم وسعت کاربرد آن به اندازه ارتباط وای فای نباشد!

اگر شما هم علاقه‌مند به استفاده از قابلیت بلوتوث ماژول ESP32 هستید، این آموزش نقطه شروع خوبی برای شما خواهد بود.

قابلیت بلوتوث در ماژول ESP32

جالب است بدانید ماژول بردهای ESP32 از بلوتوث دو حالته پشتیبانی می‌کنند، به این معنا که هم از بلوتوث کلاسیک (Bluetooth Classic) و هم از بلوتوث کم مصرف BLE (Bluetooth Low Energy) پشتیبانی می‌کنند. با اینکه این دو پروتکل در موارد بسیار مهمی با یکدیگر اشتراک دارند؛ از جمله معماری و اینکه هر دو در باند فرکانسی 2.4 گیگاهرتز (ISM) فعالیت می‌کنند، اما لازم است بدانید که این دو کاملاَ با یکدیگر متفاوت‌اند.

معرفی بلوتوث کلاسیک

تکنولوژی اصلی بلوتوث، که ما از مدت ها قبل با آن از طریق اتصال تلفن‌های هوشمند خود به هدفون‌های بی‌سیم آشنا هستیم، به عنوان بلوتوث کلاسیک شناخته می‌شود. اگر تا به حال ماژول‌های بلوتوث به سریال مانند HC-05 یا HC-06 را با آردوینو مورد استفاده قرار داده‌اید، ناخودآگاه از بلوتوث کلاسیک استفاده کردید!

بلوتوث کلاسیک برای انتقال داده دوطرفه به صورت پیوسته و برای کاربردهای با گذردهی بالا (حداکثر 3 مگابیت بر ثانیه) طراحی شده‌است، اما تنها برای مسافت‌های کوتاه مناسب می‌باشد. همچنین از بیش از 79 کانال در باند فرکانسی 2.4 گیگاهرتز ISM استفاده می‌کند. این نوع بلوتوث عمدتاً در پروژه‌هایی به کار می‌رود که شما نیاز به انتقال مداوم داده دارید، مانند انتقال فایل یا صوتی.

همانطور که می دانید ما در این آموزش نحوه استفاده از بلوتوث کلاسیک در ESP32 را به طور کامل بیان خواهیم نمود. البته پیش از آن خوب است با نوع دیگر بلوتوث قابل پشتیبانی توسط ESP32 یعنی BLE آشنا شود و تفاوت این دو را درک نمایید.

بلوتوث کم مصرف (BLE) چیست؟

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

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

آموزش مرتبط به کارگیری BLE در ESP32 کمی پیچیده‌تر از بلوتوث کلاسیک است و در آموزش‌های آینده به آن خواهیم پرداخت.

مقایسه بلوتوث کم مصرف BLE و بلوتوث کلاسیک

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

  • توان مصرفی

معمولاً بلوتوث کلاسیک توان مصرفی بیشتری (حدود 1 وات) دارد، درحالی که BLE با توان مصرفی کم (بین 0.01 تا 0.5 وات) طراحی شده‌است و آن را برای استفاده در دستگاه‌هایی که تغذیه‌ آن‌ها از طریق باتری تأمین می‌شود و نیاز به فعالیت در دوره‌های طولانی را دارند، بسیار مناسب ساخته‌است.

  • نرخ انتقال داده

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

  • مسافت

هر دو بلوتوث کلاسیک و BLE می‌توانند تا حداکثر 100 متر را پوشش دهند، اما فاصله‌ی دقیق با توجه به محیط و پیاده‌سازی‌ها تغییر می‌کند.

  • تأخیر

ارتباط مبتنی بر بلوتوث کلاسیک حداکثر 100 میلی ثانیه تأخیر خواهد داشت، در حالی که ارتباط مبتنی بر BLE تأخیری حدود 6 میلی ثانیه خواهد داشت. توجه داشته باشید هر چه تأخیر کمتر باشد، بهتر است.

  • سازگاری

بلوتوث کلاسیک بیشتر در دستگاه‌های قدیمی استفاده شده‌است، در حالی که BLE در تلفن‌های همراه هوشمند و سایر دستگاه‌های ارتباطی مدرن به کار رفته‌است.

در جدول زیر می‌توانید مقایسه‌ای از دو نوع بلوتوث کلاسیک و BLE را مشاهده نمایید.

بلوتوث کلاسیکبلوتوث کم مصرف (BLE)
نرخ انتقال داده1 مگابیت بر ثانیه به ازای BR2 3 مگابیت بر ثانیه به ازای EDR500 کیلوبیت بر ثانیه الی 1 مگابیت بر ثانیه
باند فرکانسی2.4 گیگاهرتز باند ISM2.4 گیگاهرتز باند ISM
تعداد کانال79 کانال با فاصله 1 مگاهرتز40 کانال با فاصله 2 مگاهرتز
محدوده ارتباطی8 الی 100 متر8 الی 100 متر
توان مصرفیزیاد (حداکثر 1 وات)کم (0.01 الی 0.5 وات)
جفت شدن دستگاه اجباری است؟بلهخیر
توپولوژی های قابل پشتیبانیPoint-to-Point(1:1)Piont-to-Point(1:1)
Broadcast(1:many)
Mesh(many:many)
روش های مدولاسیونGFSKᴨ/4 DQPSK8
DPSK
GFSK
تأخیر35 میلی ثانیه2 الی 16 میلی ثانیه (به طور متوسط 9 میلی ثانیه)

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

پشته پروتکل بلوتوث ESP32 چیست؟

قبل از اینکه ادامه دهیم، باید در مورد پشته پروتکل بلوتوث (Bluetoth protocol stack) بدانیم. این امر به شما کمک خواهد کرد تا بفهمید چرا از توابع خاصی در کد خود استفاده می‌کنیم.

اساساً، پشته پروتکل بلوتوث به دو بخش تقسیم می‌شود: پشته میزبان (host stack) و پشته کنترلر (controller stack).

پشته میزبان (هاست) همان پردازنده‌ی اصلی است که پشته بلوتوث را اجرا می‌کند و در حال حاضر ESP-IDF از دو پشته میزبان پشتیبانی می‌کند. پشته مبتنی بر BLUEDROID که از بلوتوث کلاسیک پشتیبانی می‌کند. از طرف دیگر، پشته مبتنی بر Apache NimBLE که فقط از BLE پشتیبانی می‌کند.

پشته کنترلر، رادیو بلوتوث را کنترل می‌کند. در واقع مانند یک خط داده عمل می‌کند: داده سریال دریافتی از طریق ارتباط مبتنی بر بلوتوث ارسال می‌شود و داده دریافتی از طریق بلوتوث به میزبان منتقل می‌شود.

نحوه انتقال داده ها از طریق بلوتوث کلاسیک ESP32 در پشته پروتکل بلوتوث ESP32 به دستگاه های مجاور

ارتباط بین میزبان و کنترلر از طریق رابط VHCI (رابط HCI مجازی که به صورت نرم‌افزاری پیاده‌سازی شده‌است) برقرار می‌شود.

اجرای برنامه بلوتوث سریال ماژول ESP32

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

آموزش مرتبط برای مشاهده نحوه آپلود کد بر روی ماژول‌های ESP32، می توانید طبق آموزش ساخت ربات ماشینی دوربین دار با ماژول ESP32-CAM که یکی از مقالات پرطرفدار این آکادمی است٬ تیتر «نحوه آپلود برنامه بر روی ماژول ESP32-CAM» را مطالعه کنید.

ابتدا IDE آردوینو خود را باز کرده و به مسیر File > Examples > BluetoothSerial > SerialtoSerialBT بروید.

پس از انتخاب این گزینه٬ کد زیر باز خواهد شد.

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {
  if (Serial.available()) {
    SerialBT.write(Serial.read());
  }
  if (SerialBT.available()) {
    Serial.write(SerialBT.read());
  }
  delay(20);
}

پس از اینکه این کد را بر روی ماژول ESP32 خود آپلود کردید، مانیتور سریال آردوینو را باز و باودریت را بر روی 115200 تنظیم کنید. در صورت آپلود موفقیت‌آمیز، پیغام “The device started, now you can pair it with Bluetooth!” را مشاهده خواهید کرد.

نحوه عملکرد این برنامه:

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

#include "BluetoothSerial.h"

در قسمت بعدی کد، بررسی می‌شود که آیا بلوتوث به درستی فعال شده‌است یا خیر.

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

سپس، یک شیء از کلاس BluetoothSerial تحت عنوان SerialBT ساخته می‌شود. به سبب این امر، پشته بلوتوث بر روی ESP32 راه‌اندازی می‌شود و ارسال و دریافت داده را مدیریت می‌کند. این کلاس از IDF’s BluetoothSerial SerialBT استفاده می‌کند.

BluetoothSerial SerialBT;

در تابع setup، یک ارتباط سریال با باودریت 115200 راه‌اندازی می‌شود.

Serial.begin(115200);

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

توجه داشته باشید این متد یک مقدار Boolean برمی‌گرداند و بیانگر این است که مقداردهی اولیه با موفقیت انجام شده‌است یا خیر. در اینجا این مقدار را بررسی نکرده‌ایم، اما بهتر است در کاربردهای حساس‌تر، بررسی خطا را به کد خود اضافه کنید.

SerialBT.begin("ESP32test"); //Bluetooth device name

در تابع loop، انتقال داده دوطرفه بین مانیتور سریال و ماژول بلوتوث سریال ESP32 انجام می‌شود. اولین عبارت شرطی if بررسی می‌کند که آیا داده‌ی سریالی در پورت سریال استاندارد وجود دارد یا خیر (مانند زمانی که شما داده‌ای را از مانیتور سریال یک کامپیوتر ارسال می‌کنید). چنانچه داده‌ای در دسترس باشد، با استفاده از تابع Serial.read() خوانده می‌شود و با استفاده از تابع ()SerialBT.write تحت ارتباط سریال بلوتوث ارسال می‌شود. بنابراین، هر داده‌ای که شما از طریق پورت سریال از کامپیوتر خود ارسال می‌کنید، به دستگاه بلوتوث متصل شده، ارسال می‌شود.

if (Serial.available()) {
  SerialBT.write(Serial.read());
}

عبارت شرطی if بعدی، بررسی می‌کند که آیا داده‌ای از طریق ارتباط سریال بلوتوث دریافت شده‌است یا خیر (مانند زمانی که یک دستگاه بلوتوث جفت شده داده ای را ارسال می‌کند). چنانچه داده‌ای در دسترس باشد، آن را با تابع ()SerialBT.read خوانده و با استفاده از تابع ()Serial.write به مانیتور سریال ارسال می‌شود. بنابراین، هر داده سریال دریافتی از دستگاه بلوتوث به مانیتور سریال شما ارسال می‌شود.

if (SerialBT.available()) {
  Serial.write(SerialBT.read());
}

آموزش اتصال ESP32 به تلفن همراه اندروید با بلوتوث کلاسیک

اکنون بیایید یک ارتباط بی‌سیم بین ماژول ESP32 و تلفن همراه اندروید برقرار کنیم. این فرآیند ممکن است با توجه به دستگاه شما متفاوت باشد، اما در کل مراحل آن مشابه هم هستند.

۱- ابتدا تغدیه ماژول ESP32 خود را وصل کنید تا آماده‌ی برقراری یک ارتباط باشد.

۲- اکنون بلوتوث تلفن همراه خود را روشن کنید.

۳- آیکن بلوتوث تلفن همراه خود را لمس و بر روی آن نگه دارید، سپس گزینه “Pair new device” را انتخاب کرده و برای چند ثانیه منتظر بمانید.

۴- از میان دستگاه‌های قابل مشاهده، نام دستگاهی که می‌خواهید به آن متصل شوید را انتخاب کنید، در اینجا نام ماژول ما ESP32test است.

۵- به عنوان گام بعدی، شما به یک اپلیکیشن بلوتوث بر روی تلفن همراه خود نیاز دارید. پیشنهاد می‌کنیم از اپلیکیشن “Serial Bluetooth Terminal” استفاده کنید.

۶- پس از نصب اپلیکیشن، ترمینال بلوتوث سریال آن را باز کنید. بر روی آیکن گوشه سمت چپ اپلیکیشن کلیک کنید و گزینه Device را انتخاب کنید.

۷- اینجا لیستی از دستگاه‌هایی که قبلاً به آن‌ها متصل شده‌اید را نمایش می‌دهد. از این لیست ” ESP32test”را انتخاب کنید.

۸- یک پیام “Connected” دریافت خواهید کرد. اکنون تلفن همراه شما با موفقیت با ماژول ESP32 جفت شده و آماده‌ی برقراری ارتباط است.

۹- اکنون، در نوار ورودی درنظرگرفته شده در قسمت پایینی اپلیکیشن پیامی را تایپ کنید. برای مثال ما “Hi!” را نوشتیم.

۱۰- شما باید بلافاصله این پیام را در مانیتور سریال IDE آردوینو دریافت کنید.

۱۱- شما می‌توانید داده‌ها را بین مانیتور سریال و تلفن همراه خود تبادل کنید. داده‌ای را در نوار ورودی مانیتور سریال خود تایپ کنید و بر روی گزینه “Send” کلیک کنید.

12- شما بلافاصله این پیام را در ترمینال بلوتوث سریال اپلیکیشن خود دریافت می‌کنید.

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

فاز اول: سیم‌بندی

ماژول رله را مطابق آنچه در تصویر زیر نمایش داده شده‌است به ماژول ESP32 متصل کنید. این سیم بندی برای یک ماژول رله 2 کانال است و برای تعداد کانال بیشتر به طور مشابه انجام می‌شود.

فاز دوم: آپلود کد ESP32

پس از اتصال ماژول رله به ماژول ESP، کد زیر را بر روی ESP32 آپلود کنید.

#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

#if !defined(CONFIG_BT_SPP_ENABLED)
#error Serial Bluetooth not available or not enabled. It is only available for the ESP32 chip.
#endif

// GPIO where relay is connected to
const int relayPin =  5;

// Handle received messages
String message = "";

// Create BluetoothSerial object
BluetoothSerial SerialBT;

void setup() {
  // Begin serial communication with Arduino and Arduino IDE (Serial Monitor)
  Serial.begin(115200);

  // Initialize relayPin as an output
  pinMode(relayPin, OUTPUT);
  digitalWrite(relayPin, HIGH);
  
  // Initialize the Bluetooth stack
  SerialBT.begin("ESP32test"); //Bluetooth device name
  Serial.println("The device started, now you can pair it with bluetooth!");
}

void loop() {
  if (SerialBT.available()){
    char incomingChar = SerialBT.read();
    if (incomingChar != '\n'){
      message += String(incomingChar);
    }
    else{
      message = "";
    }
    Serial.write(incomingChar);  
  }
  // Check received message and control output accordingly
  if (message == "on"){
    digitalWrite(relayPin, LOW);
  }
  else if (message == "off"){
    digitalWrite(relayPin, HIGH);
  }
  delay(20);
}

پس از آپلود برنامه، مانیتور سریال را باز کرده و باودریت را بر روی 115200 تنظیم کنید. سپس کلید EN روی ماژول ESP را فشار دهید. شما باید پیغام زیر را در مانیتور سریال مشاهده کنید:

The device started, now you can pair it with Bluetooth!

در این مرحله، اپلیکیشن خود را باز کرده و از طریق ترمینال بلوتوث سریال به ماژول ESP32 خود متصل شوید. اکنون با تایپ کردن واژه “on” در نوار پایینی اپلیکیشن، رله بلافاصله فعال خواهد شد. همچنین با تایپ کردن واژه “off” در نوار پایینی اپلیکیشن، رله فوراً غیرفعال خواهد شد.

علاوه‌براین، شما پیغام زیر را در مانیتور سریال IDE آردوینو به منظور مانیتورینگ دریافت خواهید کرد.

این اپلیکیشن چندین ماکرو پیشنهاد می‌دهد که می‌توانید از آن‌ها متناسب با نیاز خود برای ذخیره‌ی پیام‌های پیش فرض استفاده کنید. برای مثال شما می‌توانید M1 را با پیام on و M2 را با پیام off مرتبط سازید. بدین صورت می‌توانید به آسانی رله خود را با ماکروهای از پیش تعریف شده کنترل و راحتی بیشتری به پروژه خود اضافه نمایید.

مقالات مشابه

۴ دیدگاه. Leave new

  • سلام
    میشه روی بلوتوث این برد هم مثل ماژول hc-05 رمز گذاشت؟

    پاسخ
    • درود بر شما علی عزیز
      تا جایی که بنده اطلاع دارم، ماژول این قابلیت رو پشتیبانی نمی کند.

      پاسخ
      • سلام
        ممنون از شما
        مطالب بسیار مفید بودند

        پاسخ
        • درود بر شما ارسلان عزیز
          خیلی خوش حالیم که مطالب آماده شده در این آموزش برای شما نتیجه بخش بوده، امیدواریم از دیگر مقالات موجود در آکادمی هم استفاده لازم را ببری و نظر و پیشنهاد خودت را برای ما به اشتراک بگذاری 🙂

          پاسخ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.
You need to agree with the terms to proceed

پر بازدید ترین مقالات