آردوینو Arduino Uno آموزش آردوینو آموزش رزبری پای پروژه رزبری پای

ارتباط رزبری پای با آردوینو از طریق شبکه بیسیم لورا Lora

lora-ra02-raspberry-pi-and-arduino-wireless-connection-digispark
نوشته شده توسط راضیه دست غیب

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

 


ماژول لورا Ra02


 Ra02 یا همان SX1278 یک ماژول ترنسیور وایرلس ۱۶ پایه ای لورا است. از طریق پروتکل SPI به سایر سخت افزارها از جمله آردوینو و رزبری پای متصل می‌شود. امکان انتقال دیتا به صورت wireless را برا ی آن‌ها فراهم می‌کند. از آنجا که تغذیه این ماژول ۳٫۳ ولت است و رزبری پای هم خروجی ۳٫۳ ولت دارد. امکان ارتباط فراهم است. بنابراین می توانیم بدون هیچ مشکلی این دو را ازطریق پروتکل SPI به یکدیگر متصل کنیم. قابلیت ارسال اطلاعات در باند رادیویی با مصرف انرزی کم و برد مسافتی زیادی را دارا میباشد.

 


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


 اتصال ماژول لورا ra02 به رزبری پای Raspberry pi

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

اتصالات ماژول لورا به رزبری پای - Digispark

 

 

اتصالات پایه‌های ماژول لورا به رزبری پای Raspberry pi - دیجی اسپارک

 

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

اتصالات ماژول لورا به آردوینو - Digispark

 

 

اتصالات پایه‌های ماژول لورا به آردوینو Arduino - دیجی اسپارک

 

بعد از این مراحل آنتن ۴۳۳Mhz یا سیم مسی به طول ۱۷ سانتی متر را به محل نصب آنتن لحیم می‌کنیم. سیم مسی به طول ۱۷ سانتی متر کار آنتن ۴۳۳ مگاهرتز را می‌کند. البته به این نکته توجه داشته باشید که لاک دوسر سیم را با سمباده یا وسیله‌ای دیگر بسابید که بتوانید لحیم کاری را انجام دهید. اگر در خصوص آنتن و روش انتخاب آن سوالی دارید، از طریق بخش نظرات همین آموزش مطرح کنید.

 


پکیج pylora و رزبری پای


پکیج‌های پایتون زیادی با رزبری پای استفاده می‌شوند. به ویژه برای ایجاد (LPWAN  (low power wide area network که تعداد زیادی نود به یک گیت وی از جمله رزبری پای متصل می‌شوند. اما در این آموزش فقط ارتباط یک نود و گیت وی Gateway را توضیح می‌دهیم. در این پست تصمیم به استفاده از pylora package گرفتیم. ماژول‌های rpsreal LoRa Arduino و rpsreal LoRa Raspberry pi را دارد که در محیط‌های رزبری و آردوینو به کار می روند.

 


تنظیم محیط رزبری پای


همانطور که گفتیم ماژول لورا با پروتکل SPI به رزبری متصل می‌شود. برای همین قبل از نصب پکیج pylora package لازم است که SPI را به ترتیب زیر روی برد رزبری پای به حالت enable تبدیل کنیم. با putty به رزبری متصل می‌شویم و با دستور زیر وارد پنجره configuration می‌شویم. اگر روش برقراری این نوع ارتباط را نمیدانید، کافیست از طریق بخش نظرات همین آموزش سوالتان را مطرح بفرمایید.

sudo raspi-config

Raspberry pi LoRa connection to Arduino-Digispark-3

 

تنظیمات محیط رزبری پای - Digispark

سپس گزینه Interfacing option را انتخاب کنید و SPI را فعال می‌کنیم. با این روش رابط SPi در برد رزبری پای Raspberry pi فعال می‌شود.

تنظیمات محیط رزبری پای - Digispark

 

تغییرات را ذخیره می‌کنیم  و اگر pip و python را روی رزبری نصب داشتیم؛ پکیج RPI GPIO را با دستور زیر نصب می‌کنیم.

pip install RPi.GPIO

نصب پکیج RPI GPIO برای ماژول لورا - digispark

 

همینطور پکیج SPI dev را نصب می کنیم spi dev برای راه اندازی پروتکل  spi استفاده می شود.

pip install spidev

نصب پکیج SPI dev در رزبری پای برای ماژول لورا - Digispark

 

حالا پکیج pylora را نصب می کنیم. این پکیج ماژول‌های رادیویی مرتبط با Lora را به همراه دارد.

pip install pyLoRa

نصب پکیج pylora ماژول لورا در رزبری پای - دیجی اسپارک

 

با دستورات زیر پکیج‌های python rpi gpio و spidev را دانلود و نصب می‌کنیم.

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

ترمینال در محیط رزبری پای مانند تصویر زیر خواهد بود.

نصب پکیج python rpi gpio در رزبری پای برای لورا - دیجی اسپارک

نصب پکیج spidev در رزبری پای برای لورا - دیجی اسپارک

همچنین از ادرس git زیر کتابخانه pysx127 را clone می‌کنیم.

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

نصب کتابخانه pysx127 در رزبری پای برای ماژول لورا - دیجی اسپارک

 

 


پروگرم کردن رزبری پای


برنامه پایتون ۳ را باز می‌کنیم. در IDE کدهای زیر را وارد می‌کنیم. به این نکته توجه کنید کتابخانه‌ها حتما در همان فابل کد پایتون، قرار گرفته باشند. برای سادگی کار فایل zip در کد پایتون به همراه کتابخانه‌های لازم را در پایان آموزش قرار داده‌ام. برنامه بسیار ساده است ابتدا باید ماژول لورا Lora را به نحوی تنظیم کنیم که در فرکانس ۴۳۳ مگاهرتز کار کند. سپس پکت‌های packet ارسال شده از نود را دریافت کند. طبق معمول ابتدا کتابخانه‌ها را import می‌کنیم.

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

کتابخانه time برای ایجاد delay به کار می‌رود. کتابخانه لورا برای ایجاد تنظیمات رادیویی و کتابخانه board.setup برای تنظیم برد است. در مرحله بعد یک کلاس پایتون به نام لورا ایجاد می‌کنیم، که دارای سه تابع init classs, start class و on_rx_done می‌باشد. حال تابع init ماژول لورا را در فرکانس ۴۳۳ مگاهرتز با پهنای باند ۱۲۵ کیلو هرتز و همچنین ماژول را در مود sleep تنظیم می‌کند. در این صورت مصرف انرژی کاهش پیدا می‌کند.

#  Medium Range  Defaults after init are 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on 13 dBm
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 و STATE و فرکانس کاری را مشخص می‌کنیم.

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 پکت‌هایی که دریافت کردیم را در متغیر payload ذخیره می‌کنیم. سپس از بافر rx عبور داده و flag را High می‌کنیم. سپس مقادیر دریافت شده را با 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


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

#include <SPI.h> //Import SPI librarey
#include <RH_RF95.h> // RF95 from RadioHead Librarey

#define RFM95_CS 10 //CS if Lora connected to pin 10
#define RFM95_RST 9 //RST of Lora connected to pin 9
#define RFM95_INT 2 //INT of Lora connected to pin 2

// Change to 434.0 or other frequency, must match RX's freq!
#define RF95_FREQ 434.0
char value='0';
// Singleton instance of the radio driver
RH_RF95 rf95(RFM95_CS, RFM95_INT);
void setup()
{
//Initialize Serial Monitor
  Serial.begin(9600);

// Reset LoRa Module
  pinMode(RFM95_RST, OUTPUT);
  digitalWrite(RFM95_RST, LOW);
  delay(10);
  digitalWrite(RFM95_RST, HIGH);
  delay(10);

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


 //Set the default frequency 434.0MHz

  if (!rf95.setFrequency(RF95_FREQ)) {
    Serial.println("setFrequency failed");
    while (1);
  }
  rf95.setTxPower(18); //Transmission power of the Lora Module
}
void loop()
{
  Serial.print("Send: ");
  char radiopacket[1] = {char(value)};
  rf95.send((uint8_t *)radiopacket, sizeof((uint8_t *)radiopacket));
  
  delay(1000);
  value++;
  if (value > '9'){
  value = 48;
}
}

 

بخش کدهای آردوینو در فایل‌های zip به نام‌های radio_head_master و arduino code قرار گرفته‌اند.

 


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


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

 

from time import sleep
from SX127x.LoRa import *
from SX127x.board_config import BOARD

BOARD.setup()

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

    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()
            

    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) 

lora = LoRaRcvCont(verbose=False)
lora.set_mode(MODE.STDBY)

#  Medium Range  Defaults after init are 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips/symbol, CRC on 13 dBm

lora.set_pa_config(pa_select=1)

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()

 

بخش کدهای پایتون رزبری پای در فایل زیپ با عنوان raspberry pi lora code قرار گرفته‌اند. دانلود کدها

 

ارتباط بی سیم آردوینو با رزبری پای از طریق ماژول لورا - Digispark

 

خروجی نرم افزار پایتون پس از اجرای پروژه ارتباط لورا Lora مانند تصویر زیر خواهد بود.

ارتباط بی سیم آردوینو با رزبری پای از طریق ماژول لورا - Digispark

 

 


لوازم مورد نیاز


آردوینو ARDUINO UNO

برد رزبری پای Raspberry 3B+

ماژول ترنسیور وایرلس LORA-RA02 با برد کمکی

آنتن۴۳۳MHz یا سیم مسی به طول ۱۷ سانتی متر

 

 

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

 


پروژه و دریافت بن ارسال رایگان


برای دریافت بن خرید از دانشجو کیت، کاربران بایستی با استفاده از وسایل این آموزش، پروژه را اجرا کرده و یا حتی مدار جدیدی تعریف کنید. سپس از اجرای کار فیلم گرفته و در شبکه‌های اجتماعی از جمله آپارات و اینستگرام، با هشتگ‌های دیجی_اسپارک   دانشجوکیت    digispark    daneshjookit منتشر کنند. سپس از طریق بخش نظرات در ادامه همین آموزش، جهت دریافت بن خرید ارسال رایگان به ارزش ۱۲۰۰۰ تومان از دانشجو کیت، لینک را زیر همین پست ارسال کنید.

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

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

راضیه دست غیب

سلام مهندس برق و برنامه نویس سخت افزار هستم و یکسالی است که در زمینه اینترنت اشیا فعالیت می کنم و سعی می کنم بخشی از تجربیاتم را در دیجی اسپارک با شما به اشتراک بگذارم.

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۷ دیدگاه

  • سلام و خسته نباشید
    با تشکر از آموزش شما سوال من این است که کتابخانه Sx127x چیست و چه نقشی ایفا می‌کند؟

    • سلام وقتتون بخیر ,در کد پایتون که برای رزبری پای نوشتم یک سری توابع از کتابخونه sx127 اضافه شده اند(import شده) . کلا کتابخونه ها برای سادگی کار و کاهش حجم کد ها همه جا استفاده می شوند

  • سلام
    بار اول که کد را روی آردوینو آپلود کردم بدون مشکل Send می فرستاد.اما وقتی آردوینو را یکبار قطع و وصل کردم ،از اون به بعد فقط یکبار Send می فرسته و لوپ متوقف میشه !!!
    هر تعداد بار که آردوینو را ریست می کنم همین اتفاق می افتد و توی رزبری هم همون یک Send دریافت میشه.
    علت از کار افتادن لوپ آردوینو چیست ؟؟؟

    • سلام، به نظر می رسد که در لحظه اول، بین فرستنده و گیرنده عمل همگام سازی(هم زمان سازی یا synchronization) می بایست صورت گیرد. بنابراین، با قطع ارتباط به هر دلیل، عمل ارسال و دریافت داده با اختلال مواجه خواهد شد.

  • سلام
    آیا امکان ساخت گیت وی لورا برای ارسال و دریافت اطلاعات تعداد حدود ۱۰ نود که همگی از برد آردوینو اونو استفاده می کنند به یک گیت وی که توسط رزبری پای ساخته شده، با استفاده از این ماژول Ra-02 وجود دارد؟ اگر اینطور نیست لطفا ماژول لورای مناسب را معرفی بفرمایید.

  • خسته نباشید پروژه عالی هستش. میخواستم بپرسم میشه گیرنده ( آردوینو ) و فرستنده (رزبری پای ) با فاصله یک کیلومتری از هم قرار بگیرند و یک رله رو کنترل کرد.؟؟؟؟؟؟؟؟؟ و یا فاصله ۳۰ متری..؟

  • سلام ممنون از اشتراک دانشتون.
    من متوجه نشدم که تنظیمات SPI برای آردوینو کجا انجام میشه و مقادیر پیش فرض چیه؟
    احتمالا در کتابخانهRH_RF95.h باشه ولی من نتونستم پیداش کنم، چون میخوام از یک برد آردوینو دیگه استفاده کنم ممنون میشم راهنمایی بفرمایید چطور میتونم تنظیمات پیش فرض SPI رو تغییر بدم

    • با سلام و تشکر از شما
      پایه‌های بردهای آردوینو مشخص هستند. پایه‌های SPI هم در متن آموزش دقیقا توضیح داده شده است که کدام پایه‌ها هستند. خواهشمندم متن را با دقت بیشتر بررسی کنید.

  • با سلام
    خیلی ممنون از سایت بی نظیری که دارید. به جرئت می تونم بگم تنها منبع فارسی موجود در این زمینه است.
    من میخوام با استفاده از رزبری پای و ماژول لورا یه LoRa Gateway بسازم. ماژول های زیادی هستند. مثل:
    IC880a LoRa concentrator board
    Lora Shields v95-868
    Libelium LoRa radio module
    HopeRF RFM92W/HopeRF RFM95W (or RFM96W for 433MHz)
    Modtronix inAir9/inAir9B (or inAir4 for 433MHz)
    NiceRF LoRa1276
    RAK833 Gateway
    ولی متاسفانه هیچ کدوم در بازار ایران فعلا در دسترس نیستند.
    ممکنه بفرمایید آیا شما سفارش خرید هر کدوم از ماژول های بالا رو قبول می کنید؟
    واینکه ممکن هست که یه ماژول مناسب به غیر از Ra02 برای این کار معرفی کنید که در بازار قایل دسترس باشه (البته میخوام رنج ارتباط تا حداکثر ممکن بالا باشه برای مثال تا ۱۰ کیلومتر)
    ممنون از وقتی که میذارید

  • سلام خیلی ممنون از سایت خوبتون
    سوالی که داشتم اینکه برای انواع کلاس های LoRaWAN (A,B,C) آیا نیازه برای هر کدوم از این کلاس ها یک ماژول مخصوص به خودش تهیه کرد یا اینکه با تهیه یک ماژول میتونیم هر کدوم از این کلاس هارو پیاده سازی کرد؟
    اگر امکانش هست به این سوالم پاسخ دهید.

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

    • با سلام
      برای این منظور بایستی یک ماژول لورا در بخش فرستنده و یک ماژول لورا در بخش گیرنده داشته باشید. بسته به اینکه از کدام مدل استفاده می‌کنید، بایستی کتابخانه مناسب همان مدل را هم انتخاب کنید. ماژول‌های لورا با تراشه SX1278 معمولا دارای رابط SPI هستند. اتصالا با میکروکنترلر برقرار کرده و سپس برای تبادل اطلاعات در کدنویسی پهنای باند و شدت توان را برای فرستنده و گیرنده مشخص کرده و اطلاعات مربوطه را در کدها قرار دهید.