آموزشی, علمی

راه اندازی ماژول LoRa SX1276 با میکروکنترلر STM32F103C

ماژول LoRa SX1276

فهرست مطالب

در این آموزش، رابط کاربری LoRa Module SX1276 با میکروکنترلر STM32 Bluepill را یاد می گیریم. ماژول LR1276UA-A-915 از آی سی SX1276 استفاده می کند و بر روی فرکانس 915 مگاهرتز کار می کند. با استفاده از پرش فرکانس، تعادل شیرینی از انتقال سیگنال با کیفیت را به شما می دهد که محدوده 915 مگاهرتز را پوشش می دهد. ماژول LoRa SX1276 با پروتکل ارتباطی SPI کار می کند، بنابراین می توان از آن با هر میکروکنترلری که از SPI پشتیبانی می کند استفاده کرد. ماژول SX1276 یا LR1276 را می توان به راحتی با تراشه STM32F103 متصل کرد.

 ماژول Reyax RYLR890 LoRa روی ارتباط UART کار می‌کند و در حین تست، ارتباط قطعی دارد. اما Gplus-IoT LR1276 یک ماژول SPI با عملکرد بهتر مشابه ماژول LoRa SX1278 است.

این آموزش شامل دو مثال است. در مثال اول، یک پیام ساده “Hello World” از فرستنده/فرستنده LoRa به گیرنده ارسال می کنیم. اما در مثال دوم داده های سنسور را به صورت بی سیم ارسال خواهیم کرد. سنسور دمای رطوبت DHT11 برای برنامه آزمایشی مناسب است. فرستنده STM32 LoRa داده های حسگر را به گیرنده STM32 LoRa ارسال می کند.

لیست قطعات لازم

لیست قطعات

این قطعات لازم برای راه اندازی ماژول LoRa SX1276 است 

ماژول LR1276 بر اساس SX1276 طراحی شده است. ماژول LoRa SX1276 دارای مودم طیف گسترده LoRa است که قادر به دستیابی به برد بسیار طولانی تری نسبت به سیستم های موجود مبتنی بر مدولاسیون FSK یا OOK است. در حداکثر نرخ داده LoRa، حساسیت 8dB بهتر از FSK است. اما استفاده از صورتحساب مواد کم هزینه با 2Oppm XTAL LoRa می تواند حساسیت گیرنده را تا بیش از 20 دسی بل در مقایسه با FSK بهبود بخشد.

LoRa Module LR1276 SX1276

ماژول LoRa SX1276 همچنین پیشرفت های قابل توجهی در گزینش پذیری و مسدود کردن عملکرد فراهم می کند و قابلیت اطمینان ارتباطات را بیشتر بهبود می بخشد. برای حداکثر انعطاف، کاربر ممکن است در مورد پهنای باند مدولاسیون طیف گسترده (BW)، ضریب گسترش (SF) و نرخ تصحیح خطا (CR) تصمیم بگیرد. یکی دیگر از مزایای مدولاسیون گسترش این است که هر عامل پخش متعامد است. این بدان معناست که چندین سیگنال ارسالی می توانند یک کانال را بدون تداخل اشغال کنند.

این همچنین امکان همزیستی ساده با سیستم های موجود مبتنی بر FSK را فراهم می کند. مدولاسیون استاندارد GFSK، FSK، 00K و GMSK نیز برای امکان سازگاری با سیستم ها یا استانداردهای موجود مانند MBUS بی سیم و IEEE 802.15.4g ارائه شده است.

ویژگی های ماژول LoRa SX1276:

  • LoRa Modem
  • 168 dB maximum link budget
  • +20 dBm – 100 mW constant RF output vs. V supply
  • +14 dBm high efficiency PA
  • Programmable bit rate up to 300 kbps
  • High sensitivity: down to -148 dBm
  • Bullet-proof front end: IIP3 = -11 dBm
  • Excellent blocking immunity
  • Operating Voltage 1.8-3.7V
  • Low RX current of 9.9 mA, 200 nA register retention
  • Fully integrated synthesizer with a resolution of 61 Hz
  • FSK, GFSK, MSK, GMSK, LoRaTMand 00K modulation
  • Built-in bit synchronizer for clock recovery
  • Preamble detection
  • 127 dB Dynamic Range RSSI
  • Automatic RF Sense and CAD with ultra-fast AFC
  • Packet engine up to 256 bytes with CRC
  • Built-in temperature sensor and low battery indicator

کاربرد های ماژول LoRa SX1276:

  • خواندن خودکار کنتور 
  • اتوماسیون خانه و ساختمان.
  • سیستم های هشدار و امنیت بی سیم.
  • نظارت و کنترل صنعتی
  • سیستم آبیاری دوربرد

LoRa Module LR1276 در مجموع دارای 18 پین است که عملکردها به شرح زیر است:

SX1276 Pinout 768x612 1

طراحی برد LR1276

تراشه Gplus-IoT LR1276 از نظر اندازه بسیار کوچک است، بنابراین ارتباط آن با هر کنترلی بسیار دشوار است. بنابراین با استفاده از نرم‌افزار EasyEDA یک برد کوچک طراحی کردم و آن را به PCB تبدیل کردم. طرح PCB چیزی شبیه به این است.

LR1276 PCB
SX1276 PCB

سپس تراشه LR1276 را به PCB لحیم کردم. تراشه SX1276 فاصله بسیار کمی بین دو پین متوالی دارد. بنابراین نیاز به مهارت لحیم کاری خوب برای لحیم کاری قطعات دارد.

SX1276 Breakout Board 768x276 1

کتابخانه LoRa برای STM32

کتابخانه آردوینو LoRa توسط برد STM32F103 پشتیبانی نمی شود. به همین دلیل است که یک کتابخانه اصلاح شده برای برد STM32F103 برای Arduino IDE وجود دارد. کتابخانه STM32 LoRa برای ارسال و دریافت داده با استفاده از رادیوهای LoRa استفاده می شود.

این کتابخانه رادیو LoRa را مستقیماً در معرض دید قرار می دهد و به شما امکان می دهد داده ها را به هر رادیویی در محدوده با همان پارامترهای رادیویی ارسال کنید. همه داده ها پخش می شود و هیچ آدرسی وجود ندارد.

ارتباط Gplus-IoT LoRa LR1276/SX1276 با STM32

شماتیک و اتصالات
اکنون اجازه دهید ماژول LoRa SX1276 را با برد STM32F103C وصل کنیم و یک دستگاه گیرنده فرستنده ساده STM32 LoRa بسازیم. ارتباط بین SX1276 و STM32F103 به شرح زیر است:

SX1276 STM32 Connection

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

SX1276 STM32

کد فرستنده

				
					#include <SPI.h>
#include <LoRa_STM32.h>
 
#define SS PA4
#define RST PB0
#define DI0 PA1
 
#define TX_P 17
#define BAND 915E6
#define ENCRYPT 0x78
 
int counter = 0;
 
void setup() 
{
  Serial.begin(115200);
  while (!Serial);
 
  Serial.println("LoRa Sender");
 
  LoRa.setTxPower(TX_P);
  LoRa.setSyncWord(ENCRYPT);
  
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND)) 
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}
 
void loop() {
  Serial.print("Sending packet: ");
  Serial.println(counter);
 
  // send packet
  LoRa.beginPacket();
  LoRa.print("hello ");
  LoRa.print(counter);
  LoRa.endPacket();
 
  counter++;
 
  delay(5000);
}
				
			

کد گیرنده

				
					
#include <SPI.h>
#include <LoRa_STM32.h>
 
#define SS PA4
#define RST PB0
#define DI0 PA1
 
#define TX_P 17
#define BAND 915E6
#define ENCRYPT 0x78
 
void setup() 
{
  Serial.begin(115200);
  while (!Serial);
 
  Serial.println("LoRa Receiver");
  LoRa.setTxPower(TX_P);
  LoRa.setSyncWord(ENCRYPT);
  
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND)) 
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
}
 
void loop() {
  // try to parse packet
  int packetSize = LoRa.parsePacket();
  if (packetSize) {
    // received a packet
    Serial.print("Received packet '");
 
    // read packet
    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }
 
    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
  }
}
				
			

تست و آزمایش

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

LoRa Send Receive Data 780x249 1

ارسال داده های سنسور به صورت بی سیم با استفاده از ماژول LoRa

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

عملکرد سنسور نیازی به اتصال آنالوگ ندارد، بلکه اگر به یک پین دیجیتال وصل شود، خروجی می دهد. سنسور DHT11 را به صورت بی سیم از فرستنده STM32 LoRa به گیرنده STM32 LoRa ارسال می کنیم.

Reyax LoRa LR1276 STM32 1 768x438 1

در قسمت گیرنده، ما یک صفحه نمایش 0.96 اینچی I2C OLED را به مدار اضافه کردیم. پایه VCC و GND OLED را به ترتیب به پایه های STM32 3.3V و GND وصل کنید. سپس پین های SDA و SCL OLED را به ترتیب به PB7 و PB6 OLED متصل کنید.

 

کد فرستنده و گیرنده ماژول LoRa SX1276 با STM32 در زیر آورده شده است. کد فرستنده و گیرنده به کتابخانه های زیر نیاز دارد. همه این کتابخانه ها را دانلود کرده و از طریق مدیر کتابخانه اضافه کنید

کد فرستنده

 

				
					#include <SPI.h>
#include <LoRa_STM32.h>
 
#include<DHT.h>                     //Library for using DHT sensor 
#define DHTPIN PA0 
#define DHTTYPE DHT11
 
#define NSS PA4
#define RST PB0
#define DI0 PA1
 
#define TX_P 17
#define BAND 915E6
#define ENCRYPT 0x78
 
int counter = 0;
String LoRaMessage = "";
 
DHT dht(DHTPIN, DHTTYPE);
 
 
void setup() 
{
  Serial.begin(115200);
  while (!Serial);
 
  Serial.println(F("LoRa Sender"));
 
  //LoRa.setTxPower(TX_P);
  LoRa.setSyncWord(ENCRYPT);
  
  LoRa.setPins(NSS, RST, DI0);
  if (!LoRa.begin(BAND)) 
  {
    Serial.println(F("Starting LoRa failed!"));
    while (1);
  }
  dht.begin();
}
 
void loop() 
{
  float humidity = dht.readHumidity();       //Gets Humidity value
  float temperature = dht.readTemperature();    //Gets Temperature value
  
  Serial.print(F("Sending packet: "));
  Serial.println(counter);
  
  Serial.print(F("Temperature: "));
  Serial.print(temperature);
  Serial.println(F("*C"));
 
  Serial.print(F("Humidity: "));
  Serial.print(humidity);
  Serial.println(F("%"));
 
  Serial.println();
 
  LoRaMessage = String(counter) + "/" + String(temperature) + "&" + String(humidity);
 
  // send packet
  LoRa.beginPacket();
  LoRa.print(LoRaMessage);
  LoRa.endPacket();
 
  counter++;
 
  delay(3000);
}
				
			

کد گیرنده

				
					#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <LoRa_STM32.h>
 
#define SCREEN_WIDTH 128  // OLED display width, in pixels
#define SCREEN_HEIGHT 64  // OLED display height, in pixels
#define OLED_RESET    -1  // Reset pin # (or -1 if sharing reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
 
#define SS PA4
#define RST PB0
#define DI0 PA1
 
#define TX_P 17
#define BAND 915E6
#define ENCRYPT 0x78
 
String counter;
String temperature;
String humidity;
 
void setup()
{
  Serial.begin(115200);
  while (!Serial);
 
  Serial.println("LoRa Receiver");
  //LoRa.setTxPower(TX_P);
  LoRa.setSyncWord(ENCRYPT);
 
  LoRa.setPins(SS, RST, DI0);
  if (!LoRa.begin(BAND))
  {
    Serial.println("Starting LoRa failed!");
    while (1);
  }
 
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
  {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;); // Don't proceed, loop forever
  }
 
}
 
void loop() {
  // try to parse packet
  int pos1, pos2;
 
  int packetSize = LoRa.parsePacket();
  if (packetSize)
  {
    // received a packet
    Serial.print("Received packet:  ");
    String LoRaData = LoRa.readString();
    Serial.print(LoRaData);
    // read packet
    while (LoRa.available()) {
      Serial.print((char)LoRa.read());
    }
    // print RSSI of packet
    Serial.print("' with RSSI ");
    Serial.println(LoRa.packetRssi());
 
    pos1 = LoRaData.indexOf('/');
    pos2 = LoRaData.indexOf('&');
 
 
    counter = LoRaData.substring(0, pos1);
    temperature = LoRaData.substring(pos1 + 1, pos2);
    humidity = LoRaData.substring(pos2 + 1, LoRaData.length());
 
 
    Serial.print(F("Packet No. = "));
    Serial.println(counter);
 
    Serial.print(F("Temperature = "));
    Serial.print(temperature);
    Serial.println(F("*C"));
 
    Serial.print(F("Humidity = "));
    Serial.print(humidity);
    Serial.println(F("%"));
    Serial.println();
 
    display.clearDisplay();
    display.setTextColor(WHITE);
    
    display.setTextSize(2);
    display.setCursor(0, 10);
    display.print("T: ");
    display.print(temperature);
    display.print("*C");
 
    display.setTextSize(2);
    display.setCursor(0, 40);
    display.print("H: ");
    display.print(humidity);
    display.print("%");
    display.display();
    delay(500);
  }
}
				
			

تست و نتایج
پس از آپلود کد در مدار فرستنده و گیرنده، فرستنده LoRa شروع به کار می کند. این بدان معناست که مدار فرستنده داده های دمای رطوبت را از سنسور DHT11 خوانده و به صورت بی سیم ارسال می کند.

Reyax LR1276 STM32F103C 1

در سمت گیرنده، LoRa داده ها را به صورت بی سیم دریافت می کند. داده های دریافتی روی صفحه نمایش OLED نمایش داده می شود. هر زمان که بسته داده دریافت شود، مقدار دما و رطوبت به روز می شود.

SX1276 with STM32F103C

به این ترتیب می توانید با کمک میکروکنترلر STM32F103C بین دو ماژول Gplus-IoT LR1276 یا Generic SX1276 LoRa ارتباط نقطه به نقطه برقرار کنید.

فیلم پروژه

کارشناسان ایلکو

شما می توانید در با کارشناسان ما در رابطه با خرید قطعات و یا واردات از چین مشورت کنید

پس در تصمیم گیری و مشاوره خرید زمان را از دست ندهید

09103206800

09134488925

 

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