پروژه الکترونیکپروژه های آردوینوپروژه های پایتونپروژه های رزبری پای

آموزش ارتباط همتا به همتا رزبری پای و آردوینو با LoRa

سلام. آموزش ارتباط همتا به همتا رزبری پای و آردوینو با لورا را آماده کردیم. منظور از ارتباط همتا به همتا Peer to Peer است.

فناوری LoRa لورا چیست؟

فناوری LoRa با ظهور اینترنت اشیا، اتومبیل های متصل، M2M و… روز به روز محبوبیت بیشتری پیدا میکند و دلیل آن توانایی ارتباط با مسافت های طولانی با مصرف بسیار کمتر و مناسب برای پروژه هایی با منبع تغذیه باتری است. در کل لورا برای برقراری ارتباط فرستنده با گیرنده در نظر گرفته میشود اما حالتی وجود دارد که در آن فرستنده ها با هم از طریق مسافت های طولانی ارتباط برقرار میکنند.

فناوری LoRa لورا چیست؟

بنابراین در این آموزش می آموزیم که چگونه از ماژول LoRa SX1278 با رزبری پای استفاده کنیم تا اطلاعات را به یک ماژول LoRa SX1278 دیگر که متصل به برد آردوینو است منتقل کنیم. این روش ارتباطی میتواند بسیار مفید باشد زیرا Arduino میتواند به عنوان سرور عمل کند تا داده ها را از سنسور ها بگیرد و آن را برای مسافت های طولانی ارسال کند. بنابراین ، در این آموزش می آموزیم که چگونه از ماژول LoRa SX1278 با Raspberry pi برای ارتباط با SX1278 دیگر متصل به میکروکنترلر آردوینو استفاده کنیم.

قطعات مورد نیاز

  1. ماژول SX1278 433MHz LoRa – دو عدد
  2. آنتن 433MHz LoRa – دو عدد
  3. برد آردوینو UNO (یا نسخه دیگری)
  4. برد رزبری پای

هشدار: همیشه از ماژول SX1278 LoRa خود با آنتن های 433 مگاهرتز استفاده کنید. در غیر این صورت ممکن است ماژول خراب شود.

مدار اتصال LoRa به رزبری پای

قبل از ورود به قسمت نرم افزاری ، اجازه دهید سخت افزار را تشریح کنیم. SX1278 یک ماژول 16 پین لورا است که با استفاده از SPI در 3.3V ارتباط برقرار می کند. Raspberry pi در 3.3V کار می کند و همچنین دارای درگاه SPI داخلی و تنظیم کننده 3.3V است. بنابراین می توانیم بطور مستقیم ماژول LoRa را به رزبری پای متصل کنیم. جدول زیر اتصالات را نشان میدهد.

رزبری پایماژول لورا SX1278
3.3V3.3V
GroundGround
GPIO 10MOSI
GPIO 9MISO
GPIO 11SCK
GPIO 8Nss / Enable
GPIO 4DIO 0
GPIO 17DIO 1
GPIO 18DIO 2
GPIO 27DIO 3
GPIO 22RST

همچنین می توانید از شماتیک مدار زیر استفاده کنید. توجه داشته باشید که شماتیک مدار با استفاده از ماژول RFM9x که بسیار شبیه به ماژول SX1278 ایجاد شده است ، از این رو ممکن است از نظر ظاهری کمی متفاوت باشد.

مدار اتصال LoRa به رزبری پایاتصالات کاملا ساده هستند. تنها مشکلی که ممکن است با آن روبرو شوید این است که SX1278 با برد بورد سازگار نیست ، از این رو برای برقراری اتصالات باید از سیمهای اتصال مستقیم استفاده کنید. همچنین تعداد معدودی از افراد پیشنهاد می کنند که ماژول LoRa را با تغذیه 3.3 ولت جداگانه تغذیه کنید زیرا ممکن است رزبری پای نتواند به اندازه کافی جریان تامین کند. با این حال لورا یک ماژول کم مصرف است و با همان Raspberry pi نیز کار میکند.

پس از اتصال قطعات مدار این قسمت باید چیزی شبیه به تصویر زیر باشد.

ارتباط همتا به همتا رزبری پای و آردوینو با LoRa

مدار اتصال LoRa به آردوینو

مدار اتصال LoRa به آردوینو بسیار ساده است و در تصویر زیر میتوانید شماتیک را مشاهده کنید.

مدار اتصال LoRa به آردوینو

می توانید از پین 3.3V در Arduino Uno استفاده کنید یا از یک تنظیم کننده 3.3V جداگانه استفاده کنید. جدول اتصال پین ها در زیر آورده شده است تا به شما کمک کند.

ماژول لورا SX1278 برد آردوینو Uno
3.3V3.3V
GndGnd
En/NssD10
G0/DIO0D2
SCKD13
MISOD12
MOSID11
RSTD9

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

آموزش اتصال آردوینو به لورا

اگر در مورد این مطلب سوالی داشتید در انتهای صفحه در قسمت نظرات بپرسید.

پیکربندی رزبری پای برای ماژول لورا

بسته های پایتون بسیاری وجود دارد که می توانید برای LoRa از آنها استفاده کنید. در این پروژه هدف ما برقراری ارتباط Peer to Peer بین دو ماژول Raspberry Pi یا بین Raspberry Pi و Arduino است. بنابراین ، من تصمیم گرفتم که از بسته pyLoRa استفاده کنم. همانطور که قبلاً گفته شد ماژول LoRa با ارتباطات SPI کار می کند ، بنابراین باید SPI را روی رزبری پای فعال کنیم و سپس بسته pylora را نصب کنیم. برای انجام این کار ، مراحل زیر را دنبال کنید.

حتما ببینید :  ساخت دماسنج بدون تماس با آردوینو (مخصوص کرونا و ثبت در فرمت اکسل)

مرحله 1: با استفاده از دستور زیر وارد پنجره تنظیمات شوید.

sudo raspi-config

بسته pyLoRa برای رزبری پای

فعال سازی ارتباط SPI در Raspberry pi

مرحله 2: به گزینه interfacing  بروید و SPI را همانطور که در تصویر زیر نشان داده شده است فعال کنید.

فعال سازی SPI برای ارتباط رزبری پای و لورا

مرحله 3: تغییرات را ذخیره کنید و به پنجره ترمینال برگردید. اطمینان حاصل کنید که پیپ و پایتون به روز شده و سپس بسته RPi.GPIO را با استفاده از دستور زیر نصب کنید.

 pip install RPi.GPIO

آموزش نصب بسته RPi.GPIO

این کلاس پکیج به ما کمک می کند تا پین های GPIO را در Pi کنترل کنیم. اگر با موفقیت نصب شود صفحه شما مانند تصویر بالا میشود.

مرحله 4: نصب بسته spidev را با استفاده از دستور زیر به انجام دهید. Spidev یک اتصال پایتون برای لینوکس است که می تواند برای انجام ارتباطات SPI در Raspberry Pi استفاده شود.

 pip install spidev   

اگر نصب موفقیت آمیز باشد ، ترمینال باید چیزی شبیه به تصویر زیر باشد.

نصب بسته SPIDEV در رزبری پای

مرحله 5: بعد بسته pyLoRa را با استفاده از دستور پیپ زیر نصب میکنیم. این بسته مدل های رادیویی مرتبط با LoRa را نصب می کند.

pip install pyLoRa

در صورت موفقیت آمیز بودن نصب ، صفحه زیر را مشاهده خواهید کرد.

نصب پکیج پای لورا برای RAspberry pi

مرحله 6: بسته Python-rpi.gpio و بسته spidev را با استفاده از دستور زیر بارگیری و نصب کنید.

sudo apt-get install python-rpi.gpio python3-rpi.gpio
sudo apt-get install python-spidev python3-spidev

پنجره ترمینال باید بعد از هر دو نصب ، چیزی شبیه به این را نشان دهد.

نصب پکیج مورد نیاز برای لورا

نصب پکیج LORA در برد رزبری پای

مرحله 7: همچنین git را نصب کنید و سپس از آن برای کلون کردن دایرکتوری پایتون برای Raspberry Pi استفاده کنید. می توانید با استفاده از دستورات زیر این کار را انجام دهید.

sudo apt-get install git
sudo git clone https://github.com/rpsreal/pySX127x

پس از اتمام این مرحله ، باید پوشه فرعی SX127x را در دایرکتوری خانه Raspberry Pi پیدا کنید. این دایکتوری دارای کلیه پرونده های مورد نیاز مرتبط با کتابخانه خواهد بود.

برنامه نویسی رزبری پای برای LoRa

در ارتباط همتا به همتا LoRa به ماژول انتقال اطلاعات “سرور” گفته می شود و ماژول دریافت اطلاعات ، “مشتری” نامیده می شود. در بیشتر موارد از Arduino در این زمینه با یک سنسور برای اندازه گیری داده استفاده می شود و برای دریافت این داده ها از Pi استفاده می شود. بنابراین ، من تصمیم گرفتم که از Raspberry Pi به عنوان “مشتری” و از آردوینو به عنوان “سرور” در این آموزش استفاده کنم. کد کامل پروژه در انتهای صفحه قرار داده شده است. در اینجا بعضی از قسمت های کد را بررسی میکنیم.

اطمینان حاصل کنید که فایل برنامه در همان دایرکتوری است که پوشه کتابخانه SX127x در آن قرار دارد. در صورت تمایل به انتقال پروژه می توانید این پوشه را کپی کرده و از آن در هر نقطه استفاده کنید.

این برنامه بسیار ساده است. ما باید ماژول LoRa را در 433 مگاهرتز تنظیم کنیم و سپس اطلاعات ورودی را بخوانیم. در صورت دریافت هر چیزی ، آنها بر روی کنسول چاپ می شوند. مثل همیشه برنامه را با وارد کردن کتابخانه های مورد نیاز پایتون شروع می کنیم.

from time import sleep
from SX127x.LoRa import *
from SX127x.board_config import BOARD
BOARD.setup()

در این جا از بسته time برای ایجاد تأخیر استفاده می شود ، از بسته Lora برای ارتباط LoRa استفاده می شود و از board_config برای تنظیم برد و پارامترهای LoRa استفاده می شود. ما همچنین برد را با استفاده از عملکرد BOARD.setup () تنظیم می کنیم.

بعد کلاس پایتون LoRa را با سه تعریف ایجاد می کنیم. از آنجا که ما می خواهیم این برنامه فقط به عنوان مشتری کار کند ، این کلاس تنها سه کارکرد دارد یعنی کلاس init ، کلاس start و کلاس __rx_done. کلاس init ماژول LoRa را در 433 مگاهرتز با پهنای باند 125kHz طبق روش set_pa_config تنظیم می کند. سپس این ماژول را نیز برای صرفه جویی در مصرف برق ، در حالت خواب قرار می دهد.

lora.set_pa_config(pa_select=1)

    def __init__(self, verbose=False):
        super(LoRaRcvCont, self).__init__(verbose)
        self.set_mode(MODE.SLEEP)
        self.set_dio_mapping([0] * 6)

تابع start در جایی است که ماژول را به عنوان گیرنده پیکربندی می کنیم و RSSI (دریافت شاخص قدرت سیگنال) ، وضعیت ، فرکانس کارکرد و … را بدست می آوریم. برای خواندن مقادیری مانند RSSI و وضعیت مودم ما همچنین داده ها را در بافر سریال روی ترمینال می ریزیم.

    def start(self):
        self.reset_ptr_rx()
        self.set_mode(MODE.RXCONT)
        while True:
            sleep(.5)
            rssi_value = self.get_rssi_value()
            status = self.get_modem_status()
            sys.stdout.flush()

سرانجام بعد از خواندن بسته دریافتی ، عملکرد on_rx_done اجرا می شود. در این تابع مقادیر دریافت شده با utf-8 رمزگشایی می شود تا داده های قابل خواندن کاربر را چاپ کند. ما همچنین ماژول را در حالت خواب قرار می دهیم تا مقدار دیگری دریافت شود.

    def on_rx_done(self):
        print("\nReceived: ")
        self.clear_irq_flags(RxDone=1)
        payload = self.read_payload(nocheck=True)
        print(bytes(payload).decode("utf-8",'ignore'))
        self.set_mode(MODE.SLEEP)
        self.reset_ptr_rx()
        self.set_mode(MODE.RXCONT)

بخش باقیمانده برنامه فقط برای چاپ مقادیر دریافت شده روی کنسول و خاتمه برنامه با استفاده از صفحه کلید است. ما حتی پس از خاتمه برنامه برای صرفه جویی در مصرف برق ، برد را در حالت خواب قرار دادیم.

try:
    lora.start()
except KeyboardInterrupt:
    sys.stdout.flush()
    print("")
    sys.stderr.write("KeyboardInterrupt\n")
finally:
    sys.stdout.flush()
    print("")
    lora.set_mode(MODE.SLEEP)
    BOARD.teardown()

کد آردوینو برای برقراری ارتباط LoRa با رزبری پای

در اینجا ما Arduino را برای کار به عنوان سرور LoRa برای ارسال بسته ها مانند 0 تا 9 برنامه ریزی می کنیم. کد کامل برای انجام این کار را می توانید مانند همیشه در انتهای این صفحه پیدا کنید. در اینجا چند خط مهم در برنامه را توضیح خواهم داد. در اینجا از کتابخانه RadioHead استفاده میکنیم که در فایل دانلودی قرار داده شده است.

حتما ببینید :  ساخت سرور بلوتوث کم مصرف BLE با ESP32 (+پروژه نمایش میزان باتری)

ما برنامه را با وارد کردن كتابخانه SPI (نصب شده به صورت پيش فرض) براي استفاده از پروتكل SPI و سپس كتابخانه RH_RF95 از Radio head برای انجام ارتباط با LoRa شروع مي كنيم. سپس تعریف می کنیم که کدام پین Arduino را متصل کرده ایم. سرانجام تعریف می کنیم که این ماژول باید در فرکانس 434MHz کار کند.

#include <SPI.h> 
#include <RH_RF95.h> 

#define RFM95_CS 10 
#define RFM95_RST 9 
#define RFM95_INT 2 

#define RF95_FREQ 434.0

RH_RF95 rf95(RFM95_CS, RFM95_INT);

در داخل تابع void setup، پین Reset ماژول LoRa را به مدت 10 میلی ثانیه Low میکنیم تا شروع به کار کند. سپس آن را به صورت اولیه پیکربندی میکنیم و فرکانس و قدرت انتقال را برای سرور لورا تنظیم میکنیم. انتقال به فاصله بیشتر انرژی بیشتری مصرف میکند.

void setup()
{
  Serial.begin(9600);

  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, LOW);
  delay(10);
  digitalWrite(RFM95_RST, HIGH);
  delay(10);

  while (!rf95.init()) {
    Serial.println("LoRa radio init failed");
    while (1);
  }

  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("setFrequency failed");
    while (1);
  }
  rf95.setTxPower(18); 
}

در داخل تابع void loop ، ما به سادگی باید بسته های داده را از طریق ماژول LoRa ارسال کنیم. این داده ها می توانند هر چیزی مثلا داده های یک سنسور باشند. اما برای سادگی مقدار 0 تا 9 را با فاصله 1 ثانیه ارسال می کنیم و بعد از رسیدن به 9. مقدار را دوباره به 0 تبدیل می کنیم. توجه داشته باشید که مقادیر را می توان فقط با فرمت array char ارسال کرد و نوع داده ها باید unit8_t باشد. کد انجام این کار در زیر نشان داده شده است

void loop()
{
  Serial.print("Send: ");
  char radiopacket[1] = char(value)};
  rf95.send((uint8_t *)radiopacket, 1);

  delay(1000);
  value++;
  if (value > '9')
  value = 48;
}

تست ارتباط LoRa بین رزبری پای و آردوینو

اکنون که سخت افزار و برنامه خود را آماده کردیم ، کافی است کدهای آردوینو را در برد UNO بارگذاری کنیم و برنامه پایتون باید بر روی رزبری پای راه اندازی شود. پس از راه اندازی هر دو برد، باید بسته های ارسال از آردوینو را در shell window مشاهده کنید. فیلم زیر به شما در درک نحوه کار این پروژه کمک میکند.

دانلود فیلم پروژه ارتباط LoRa بین رزبری پای و آردوینو

موارد موجود در فایل : سورس کامل ، شماتیک

برای دانلود فایل های پروژه ثبت نام کنید، تنها چند ثانیه زمان لازم است. از طریق فرم زیر اقدام کنید.

ایمیل خود را وارد کنید

نظرتان را در مورد این مطلب با ستاره دادن اعلام کنید امیدوارم این مطلب برای شما مفید بوده باشد. نظرات ، مشکلات و پیشنهادات خود را در پایین صفحه اعلام کنید
برچسب ها

محمد رحیمی

محمد رحیمی هستم. سعی میکنم در آیرنکس مطالب مفید را قرار دهم. (در خصوص سوال در مورد این مطلب از قسمت نظرات همین مطلب اقدام کنید)

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

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

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