در این مطلب، روش اتصال ماژول LoRa SX1276 و میکروکنترلر STM32 Bluepill را مورد بررسی قرار می دهیم. ماژول LR1276UA-A-915 از آیسی SX1276 استفاده میکند و بر روی فرکانس 915 مگاهرتز کار میکند. با استفاده از پرش فرکانس (Frequency Hopping)، انتقال سیگنال را منتقل میکند و محدوده 915 مگاهرتز را پوشش میدهد. ماژول LoRa LR1276/SX1276 با پروتکل ارتباطی SPI کار میکند، بنابراین میتوان از آن در کنار هر میکروکنترلری که از SPI پشتیبانی میکند استفاده کرد. ماژول SX1276 یا LR1276 را میتوان به راحتی به تراشه STM32F103 متصل کرد.
در این مطلب، دو مثال را بررسی میکنیم. در مثال اول، یک پیام ساده “Hello World” از فرستنده LoRa به گیرنده ارسال میکنیم. اما در مثال دوم، دادههای سنسور را به صورت بیسیم ارسال خواهیم کرد. سنسور دمای رطوبت DHT11 برای کاربرد آزمایشی مناسب است. فرستنده STM32 LoRa دادههای سنسور را به گیرنده STM32 LoRa ارسال میکند.
فهرست قطعات موردنیاز در زیر آورده شده است.
ماژول LR1276 بااستفاده از SX1276 طراحی شده است. SX1276 دارای مودم طیف گسترده LoRa است که قادر به دستیابی به برد بسیار طولانیتری نسبت به سیستمهای موجود مبتنی بر مدولاسیون FSK یا OOK است. در حداکثر نرخ داده LoRa، حساسیت آن 8 دسیبل بهتر از FSK است و با استفاده از قطعات کمهزینه مثل 2Oppm XTAL میتواند حساسیت گیرنده را تا بیش از 20 دسیبل در مقایسه با FSK بهبود بخشد.
LoRa پیشرفتهای قابلتوجهی در قابلیت انتخاب (Selectivity) و مسدودکردن (Blocking) عملکرد دارد و قابلیت اطمینان ارتباطات را بهبود میبخشد. برای داشتن حداکثر انعطاف، کاربر میتواند پهنای باند مدولاسیون طیف گسترده (BW)، ضریب یا عامل گسترش (SF) و نرخ تصحیح خطا (CR) انتخاب کند. یکی دیگر از مزایای مدولاسیون طیف گسترده این است که هر عامل گسترش (spreading factor) عمود بر دیگری است به این معنی که چندین سیگنال ارسالی میتوانند یک کانال را بدون تداخل اشغال کنند. این امر، امکان سازگاری ساده با سیستمهای موجود مبتنی بر FSK را فراهم میکند. مدولاسیون استاندارد GFSK، FSK، 00K و GMSK نیز برای امکان سازگاری با سیستمها یا استانداردهای موجود مانند MBUS بیسیم و IEEE 802.15.4g ارائه شده است.
مشخصات LR1276/SX1276 عبارت است از:
کاربردهای LR1276/SX1276 در ادامه ذکر شده است:
ماژول Gplus-IoT LoRa LR1276 در مجموع دارای 18 پین است که عملکرد آنها در جدول زیر آورده شده است:
تراشه Gplus-IoT LR1276 از نظر اندازه بسیار کوچک است، بنابراین ارتباط آن با هر کنترلی بسیار دشوار است. در نتیجه، با استفاده از نرمافزار EasyEDA یک برد کوچک طراحی و آن را به PCB تبدیل کردهایم. طرح PCB چیزی شبیه شکل زیر است.
فایل Gerber برای PCB در زیر آورده شده است. بهسادگی میتوانید فایل Gerber را دانلود کنید و PCB را بسازید.
میتوانید از این فایل Gerber برای سفارش PCB باکیفیت بالا برای این پروژه استفاده کنید.
سپس، تراشه LR1276 را به PCB لحیم میکنیم. تراشه SX1276 فاصله بسیار کمی بین دو پین متوالی دارد؛ بنابراین، نیاز به مهارت لحیمکاری بالایی برای اتصال قطعات دارد.
کتابخانه آردوینو LoRa توسط برد STM32F103 پشتیبانی نمیشود و به همین دلیل یک کتابخانه برای برد STM32F103 مخصوص Arduino IDE ساخته شد. کتابخانه STM32 LoRa برای ارسال و دریافت داده با استفاده از LoRa استفاده میشود. برای دانلود کتابخانه به لینک زیر مراجعه کنید.
در ادامه، با شماتیک و اتصال Gplus-IoT LoRa LR1276/SX1276 با STM32 آشنا میشویم.
در این مرحله، ماژول LoRa LR1276/SX1276 را با برد STM32F103C وصل میکنیم و یک دستگاه گیرنده/فرستنده ساده STM32 LoRa میسازیم. ارتباط بین SX1276 و STM32F103 بهصورت جدول زیر است:
شماتیک در شکل زیر آورده شده است. میتوانید این دو مدار را روی برد بورد مونتاژ کنید. یکی از مدارها بهعنوان فرستنده و دیگری بهعنوان گیرنده عمل خواهد کرد.
کد فرستنده در ادامه آورده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 | #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); } |
کد گیرنده نیز به صورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #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()); } } |
پس از آپلود کد، Serial Monitor را برای فرستنده و گیرنده باز کنید. فرستنده دادههایی را ارسال میکند که توسط گیرنده دریافت میشود.
اکنون مثال دوم را مرور میکنیم. در این مثال، SX1276 را با سنسور STM32 و DHT11 به مدار فرستنده متصل خواهیم کرد. DHT11 یک سنسور دیجیتالی فوقالعاده و کمهزینه برای دما و رطوبت است. این دستگاه از یک سنسور خازنی رطوبت و یک ترمیستور برای اندازهگیری هوای اطراف استفاده میکند و یک سیگنال دیجیتال را روی پین داده پخش میکند. عملکرد سنسور نیازی به اتصال آنالوگ ندارد، بلکه اگر به یک پین دیجیتال متصل باشد، خروجی میدهد. اطلاعات سنسور DHT11 را بهصورت بیسیم از فرستنده STM32 LoRa به گیرنده STM32 LoRa ارسال میکنیم.
در قسمت گیرنده، یک صفحهنمایش 0.96 اینچی I2C OLED را به مدار اضافه میکنیم. پین VCC و GND OLED را به ترتیب به پینهای STM32 3.3V و GND وصل میکنیم. سپس پینهای SDA و SCL OLED را به ترتیب به PB7 و PB6 OLED متصل میکنیم.
کد فرستنده و گیرنده LoRa LR1276/SX1276 STM32 در زیر آورده شده است. این کدها به کتابخانههای زیر نیاز دارد. همه این کتابخانهها را دانلود کرده و از طریق Library Manager اضافه کنید.
کد فرستنده بهصورت زیر است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | #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); } |
کد گیرنده نیز در ادامه آورده شده است:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | #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 خوانده و بهصورت بیسیم ارسال میکند.
در سمت گیرنده، LoRa دادهها را بهصورت بیسیم دریافت میکند. دادههای دریافتی روی صفحهنمایش OLED نمایش داده میشود. هر زمان که بسته داده دریافت شود، مقدار دما و رطوبت بهروز میشود.
بهاینترتیب، میتوانیم با کمک میکروکنترلر STM32F103C بین دو ماژول Gplus-IoT LR1276 یا Generic SX1276 LoRa ارتباط نقطهبهنقطه برقرار کنیم.
منبع: how2electronics
درود تا چه فاصله ای جواب میدهد؟
نویسنده شو !
سیسوگ با افتخار فضایی برای اشتراک گذاری دانش شماست. برای ما مقاله بنویسید.