در مقالات گذشته به طور مفصل در رابطه با راه اندازی بلوتوث کم مصرف و بلوتوث کلاسیک در ماژول ESP32 بحث کردیم. در این مقاله قصد اتصال Raspberry Pi به ESP32 توسط بلوتوث کلاسیک را آموزش دهیم.
راه اندازی بلوتوث Raspberry Pi
کامپیوتر تک برد Raspberry Pi از زمان انتشار Raspberry Pi3 در سال 2016 دارای اتصال بلوتوث داخلی بوده است که به شما امکان می دهد لوازم جانبی بی سیم مانند صفحه کلید، کنترل کننده بازی، هدست و موارد دیگر را به دستگاه خود متصل کنید. اگر Raspberry Pi شما دارای بلوتوث داخلی نیست، می توانید از آداپتور USB برای افزودن پشتیبانی استفاده کنید. بسته به آداپتور مورد استفاده، ممکن است لازم باشد بسته های نرم افزاری دیگری را برای این کار نصب کنید. رزبری پای مورد استفاده در این پروژه مدل 3B+ می باشد.
برای نصب این ابزار ابتدا به ترمینال لینوکس بروید و مراحل زیر را طی کنید:
sudo apt update && sudo apt upgrade sudo apt install bluetooth pi-bluetooth bluez blueman
حال ابزارهای لازم جهت مدیریت بلوتوث را نصب کردید.
راه اندازی بلوتوث Raspberry Pi از طریق محیط گرافیک
BlueZ یک پروژه متن باز و پروتکل بلوتوث رسمی Linux است. این پروتکل از تمام پروتکل های اصلی بلوتوث پشتیبانی می کند و اکنون جزئی از هسته رسمی لینوکس است. Blueman رابط دسک تاپ را برای مدیریت و کنترل دستگاه های بلوتوث فراهم می کند. در رابط گرافیکی بعد از نصب، آیکون بلوتوث در دسکتاپ مشاهده خواهد شد. ابتدا روی گزینه Turn Bluetooth On جهت روشن شدن بلوتوث کلیک کنید.

پس از فعال شدن بلوتوث، روی گزینه Make Discoverable کلیک کنید. این گزینه به سایر دستگاه های دارای قابلیت بلوتوث اجازه می دهد تا رزبری پای شما را پیدا کنند و به آن ها امکان اتصال می دهد. با فعال بودن بلوتوث، روی گزینه Setup New Device کلیک کنید.با این کار شما می تونید به دیگر دستگاه های بلوتوثی متصل شوید. برای شروع Next را فشار دهید.

در مرحله بعد لیستی از دستگاه های بلوتوث قابل مشاهده محلی ظاهر می شود. روی نماد جستجو در پایین سمت چپ کلیک کنید تا دستگاه های اضافی را اسکن کنید. هنگامی که دستگاه بلوتوث شما ظاهر شد، آن را انتخاب کنید، سپس روی Next کلیک کنید.

برای شروع جفت شدن دستگاه بلوتوث خود، گزینه Pair Device را انتخاب کنید، سپس برای ادامه روی Next کلیک کنید. در صورت لزوم، روی تأیید کلیک کنید تا مجوز جفت شدن دستگاه را بگیرید. ممکن است لازم باشد مراحل مشابه را در دستگاه بلوتوث خود دنبال کنید. لیستی از روش های اتصال موجود در مرحله بعدی ظاهر می شود. گزینه مناسب را انتخاب، سپس روی Next کلیک کنید.

امکانات ابزار مدیریت بلوتوث
هنگامی که روند جفت شدن با موفقیت به پایان رسید، می توانید دستگاه (و خدمات موجود) را با کلیک روی نماد منوی بلوتوث و انتخاب گزینه Devices مشاهده کنید. در این لیست دستگاه های بلوتوث محلی و دستگاه هایی که با آنها جفت شده اید، مشاهده می کنید. با کلیک راست روی دستگاه و کلیک روی Pair یا Setup، می توانید به هر یک از این دستگاه ها به صورت دستی متصل شوید تا مراحل راه اندازی آغاز شود. شما می توانید هر دستگاه بلوتوث را با کلیک کردن روی Unpair یا لغو اعتماد برای حذف آن از لیست دستگاه های مورد اعتماد خود لغو کنید. این روش اتصال به بلوتوث جهت ارسال فایل های صوتی و تصویری به گوشی و یا کامپیوتر مناسب است.
راه اندازی بلوتوث Raspberry Pi از طریق محیط خط فرمان
اگر محیط دسکتاپ گرافیکی در اختیار ندارید یا اگر می خواهید بلوتوث را از راه دور روی SSH راه اندازی کنید، می توانید از دستورات ترمینال برای تنظیم اتصالات بلوتوث Raspberry Pi خود استفاده کنید.
برای راه اندازی بلوتوث از طریق خط فرمان مراحل زیر را طی کنید:
sudo apt update && sudo apt upgrade sudo apt install bluetooth pi-bluetooth bluez
پس از نصب بسته ها دستور زیر را وارد کنید و فایل مورد نظر را به صورت زیر وارایش کنید:
sudo nano /etc/systemd/system/dbus-org.bluez.service
پرچم سازگاری ‘-C’ را در انتهای خط ‘ExecStart =‘ اضافه کنید. پس از آن یک خط جدید اضافه کنید تا نمایه SP را اضافه کنید. دو خط باید شبیه این باشد:
ExecStart=/usr/lib/bluetooth/bluetoothd -C ExecStartPost=/usr/bin/sdptool add SP
فایل را ذخیره کنید و به ترمینال برگردید و دستور زیر را وارد کنید:
sudo rfcomm watch hci0
برنامه نویسی برای بلوتوث از مدل برنامه نویسی سوکت تبعیت می کند و ارتباطات بین دستگاه های بلوتوث از طریق سوکت RFCOMM انجام می شود. مشخصات درگاه سریال بلوتوث براساس این پروتکل تنظیم شده است. RFCOMM به دلیل پشتیبانی گسترده و API عمومی، در پروژه های بلوتوث بسیار محبوب است.
حال Raspberry Pi خود را با تایپ کردن sudo reboot راه اندازی مجدد کنید.
شروع اتصال به بلوتوث Raspberry Pi
در صورت اتصال از راه دور، باید اتصال SSH خود را دوباره برقرار کنید. با باز شدن پنجره ترمینال (یا اتصال SSH از راه دور)، sudo bluetoothctl را تایپ کنید. برای تأیید این مورد، ممکن است لازم باشد نام کاربری و رمز عبور خود را مجددا تایپ کنید. با این کار ابزار پیکربندی ترمینال بلوتوث راه اندازی می شود. برای شروع جست و جو و اتصال مراحل زیر را طی کنید:
sudo bluetoothctl Controller XX:XX:XX:XX:XX:XX %h-BlueZ [default] [NEW] Device XX:XX:XX:XX:XX:XX S11-FLEX HD ----------------------------------------------- power on Changing power on succeeded ----------------------------------------------- agent on Agent registered ----------------------------------------------- default-agent Default agent request successful ----------------------------------------------- scan Discovery started [NEW] Device XX:XX:XX:XX:XX:XX devicename pair XX:XX:XX:XX:XX:XX Attempting to pair with XX:XX:XX:XX:XX:XX [CHG] Device XX:XX:XX:XX:XX:XX Connected: yes [CHG] Device XX:XX:XX:XX:XX:XX UUIDs has unsupported type Pairing successful [CHG] Device XX:XX:XX:XX:XX:XX Connected: no [bluetooth]# trust XX:XX:XX:XX:XX:XX [CHG] Device XX:XX:XX:XX:XX:XX Trusted: yes Changing XX:XX:XX:XX:XX:XX trust succeeded [bluetooth]# connect XX:XX:XX:XX:XX:XX Attempting to connect to XX:XX:XX:XX:XX:XX [CHG] Device XX:XX:XX:XX:XX:XX Connected: yes Connection successful [devicename]#
شما الان به بلوتوث مورد نظر وصل شدید.
تبادل اطلاعات میان Raspberry Pi و ماژول ESP32 از طریق بلوتوث
برای تبادل اطلاعات با ماژول ESP32 می توان از محیط خط فرمان و یا نرم افزار putty استفاده کرد. ابتدا کد زیر را بر روی ماژول 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 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); }
اگر از نرم افزار putty استفاده می کنید با تنظیم بادریت و انتخاب کانال مورد نظر ، می توانید هر متنی را به سریال مانیتور Arduino IDE بفرستید و همچنین از ماژول ESP32 دیتا به رزبری بفرستید.

تبادل اطلاعات در محیط خط فرمان
برای تبادل اطلاعات از طریق محیط خط فرمان ابتدا یک ترمینال باز کنید و با یک ویرایشگر مناسب فایل زیر را بسازید:
Sudo nano /etc/Bluetooth/rfcomm.conf
داخل پوشه ساخته شده خطوط زیر را وارد کنید:
rfcomm1 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device xx:xx:xx:xx:xx:xx; # RFCOMM channel for the connection channel 1; # Description of the connection comment "My Bluetooth Connection"; }
در این کد مک ادرس دستگاهی که قصد برقراری ارتباط با آن را داریم وارد می کنیم. سپس کد را ذخیره کنید و وارد خط فرمان شوید. دستور زیر امکان ارسال هر داده ای به ماژول ESP32 را می دهد. بعنوان مثال عبارت “How are you” ارسال می کنیم که در سریال مانیتور قابل مشاهده هستش.
echo"how are you">/dev/rfcomm1
همچنین با دستور زیر رزبری خود را در حالت آماده به خواندن قرار داده و هر داده ای در سریال مانیتور ESP32 بنویسد در خط فرمان مشاهد می کنید:
cat /dev/rfcomm1
کد آپلود شده بر روی ماژول 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 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، وارد محیط خط فرمان شوید و با یک ویرایشگر مناسب فایل زیر را بسازید:
Sudo nano /etc/Bluetooth/rfcomm.conf
داخل پوشه ای که ساختید کد های زیر را وارد کنید:
rfcomm1 { # Automatically bind the device at startup bind yes; # Bluetooth address of the device device xx:xx:xx:xx:xx:xx; # RFCOMM channel for the connection channel 1; # Description of the connectio comment "My Bluetooth Connection"; }
کد را ذخیره کنید و وارد خط فرمان شوید. سپس با دستور زیر می توانید هر داده ای را به ماژول ESP32 بفرستید و در سریال مانیتور آن را مشاهده کنید در این جا داده ارسالی عبارت “How are you” است:
> /dev/rfcomm1"How are you"echo
همچنین با دستور زیر رزبری خود را در حالت آماده به خواندن قرار داده و هر داده ای در سریال مانیتور ESP32 بنویسد در خط فرمان مشاهد می کنید:
cat /dev/rfcomm1
تبادل اطلاعات از طریق کد پایتون و بلوتوث
برای ارتباط بلوتوث به کتابخانه پایتون نیاز داریم تا بتوانیم داده ها را از طریق RFCOMM با استفاده از زبان پایتون ارسال و دریافت کنیم:
sudo apt-get install python-bluetooth
با نوشتن کد به زبان پایتون و ران کردن آن در رزبری پای می توان با ماژول ESP32 از طریق بلوتوث ارتباط برقرار کرد. برای این منظور ابتدا یک فایل جهت نوشتن کد پایتون در رزبری با دستور زیر باز کنید:
sudo nano run.py
کد پایتون زیر را در آن قرار دهید. سپس دستور python run.py را تایپ کنید. عبارت Waiting for connection on RFCOMM channel 1 را مشاهده خواهید کرد. می توان با گوشی یا با ماژول ESP32 به ارسال دیتا پرداخت، درضمن نام فایل ذخیره شده توسط پایتون run.py هستش و همچنین عبارت ارسالی از سمت رزبری پای !Hello می باشد. توجه داشته باشید کد را متناسب با نیاز و پروژه خود تغییر دهید.
برای تبادل اطلاعات میان رزبری پای و گوشی هوشمند باید از نرم افزار serial bluetoth terminal استفاده کنید. با ویرایش کد هم می توان دیتا را به چندین دستگاه ارسال کرد.
کد پایتون:
import os import glob import time import RPi.GPIO as GPIO from bluetooth import * os.system('modprobe w1-gpio') os.system('modprobe w1-therm') server_sock=BluetoothSocket( RFCOMM ) server_sock.bind(("",PORT_ANY)) server_sock.listen(1) port = server_sock.getsockname()[1] uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee" advertise_service( server_sock, "AquaPiServer", service_id = uuid, service_classes = [ uuid, SERIAL_PORT_CLASS ], profiles = [ SERIAL_PORT_PROFILE ], # protocols = [ OBEX_UUID ] ) while True: print("Waiting for connection on RFCOMM channel %d" % port) client_sock, client_info = server_sock.accept() print("Accepted connection from ", client_info) try: data = client_sock.recv(1024) if len(data) == 0: break print("received [%s]" % data) data = 'Hello!' client_sock.send(data) print("sending [%s]" % data) except IOError: pass except KeyboardInterrupt: print("disconnected") client_sock.close() server_sock.close() print("all done") break

1 دیدگاه