آموزش‌های کاربردیاینترنت اشیاء (IOT)بایگانی مطالبپروژه‌های ESP32پروژه‌های Raspberry Pi

راه اندازی بلوتوث کلاسیک در Raspberry Pi و اتصال آن به ماژول ESP32

در مقالات گذشته به طور مفصل در رابطه با راه اندازی بلوتوث کم مصرف و بلوتوث کلاسیک در ماژول 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 جهت روشن شدن بلوتوث کلیک کنید.

فعالسازی بلوتوث Raspberry Pi

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

فعالسازی بلوتوث Raspberry Pi

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

فعالسازی بلوتوث Raspberry Pi

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

فعالسازی بلوتوث Raspberry Pi

امکانات ابزار مدیریت بلوتوث

هنگامی که روند جفت شدن با موفقیت به پایان رسید، می توانید دستگاه (و خدمات موجود) را با کلیک روی نماد منوی بلوتوث و انتخاب گزینه 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
8
+1
57
+1
4
مشاهده بیشتر

پریسا اکبری

کارشناس برق- قدرت و کارشناس ارشد کنترل. علاقه مند به سیستم های هوشمند و اینترنت اشیا. به مدت بیش از 1 سال است که در تیم سخت افزار سازان نام آور مشغول به فعالیت هستم.

نوشته های مشابه

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

دکمه بازگشت به بالا