ارتباط ESP32 با پلتفرم Things Network با LoRa
![](/wp-content/uploads/2023/12/ارتباط-ESP32-با-پلتفرم-Things-Network-با-LoRa.jpg)
محتویات
- پین اوت ماژول فرستنده بی سیم SX1276
- ماژول SX1276 LoRa-868 مگاهرتز
- تفاوت بین HPD13A SX1276 و ماژول LoRa RFM95W
- ساخت بورد بریک اوت ( مبدل پاور سرور) با پرف بورد
- مدار اتصال SX1276 به ESP32
- مقایسه روش فعالسازی OTAA و ABP
- راه اندازی end node ها در شبکه TTN
- اضافه کردن Application
- کد آردوینو برای اتصال ماژول SX1276 به ESP32
- تست LoRaWAN node با روش ABP
- تست LoRaWAN node با روش OTAA
- عملکرد ماژول SX1276 LoRa
اکنون که درباره LoRa صحبت میکنیم، بیش از 10 سال از راه اندازی رسمی آن میگذرد و از آن موقع تا الآن، LoRa روز به روز معروف تر شده است. این پروتکل توان مصرفی کم اما برد بسیار بالایی داشته و میتواند کاربردهای زیادی داشته باشد. انتظار میرود که تا سال 2025، 29 میلیارد دستگاه متصل به اینترنت وجود داشته باشد. جالب است بدانید که این عدد 4 برابر جمعیت کنونی کره زمین است.
در این آموزش تصمیم گرفتیم که ماژول HDPA13A معروف که یک SX1276 LoRa end Node (ماژول فرستنده بی سیم) است را با ESP32 راه اندازی کرده و داده را به شبکه TTN ارسال کنیم. برای اینکار از یک ماژول گیت وی RG186 LoRa که در یکی از پروژه های پیشین نحوه راه اندازی آن را آموختیم، استفاده میکنیم. همچنین ماژول فرستنده بی سیم SX1276 با فرکانس کاری 868 مگاهرتز را راه اندازی کرده و آن را برای کار با استاندارد INDIA پیکربندی میکنیم. در نهایت هم درباره مشکلاتی که حین کار به آن ها برخوردیم و راهکارهایی که برای آن ها یافتیم تا ارتباط با شبکه TNN را برقرار کنیم، بحث خواهیم کرد.
پس بدون معطلی سراغ پروژه خود میرویم.
پین اوت ماژول فرستنده بی سیم SX1276
پین اوت ماژول بی سیم LoRa SX1276 در تصویر پایین نشان داده شده است. در این آموزش، از ماژول LoRa HDP13A V1.1 که توسط HPDTek ( یک سازنده مطرح در چین) طراحی شده و سپس توسعه داده شده است، استفاده خواهیم کرد. پین اوت ماژول در تصویر پایین نشان داده شده است.
- GND : این پایه، پایه زمین ماژول است و باید به پایه زمین ESP32 یا هر میکروکنترلر آردوینوی دیگری که استفاده میکنید، متصل شود. در مجموع 3 پایه رمین روی بورد داریم که همه آن ها در داخل ماژول به هم متصل شده اند.
- SDO (MISO) : پایه SDO، پایه داده سریال خروجی میکروکنترلر است. یک سیگنال خروجی دستگاه که داده را به یک دستگاه SPI دیگر میفرستد.
- SDI (MOSI): این پایه، پایه داده سریال ورودی میکروکنترلر است. یک سیگنال ورودی دستگاه که داده را از یک دستگاه SPI دیگر دریافت میکند.
- SCK: این پایه، پایه کلاک سریال است. کلاک سریال توسط میکروکنترلر تولید میشود.
- SEL: این پایه، پایه انتخابگر تراشه ماژول است که توسط کنترل کننده فعال شده تا ارتباط را با یک دستگاه جانبی مشخص آغاز کند.
- RST: این پایه، پایه ریست بورد ماژول است و برای ریست کردن میکروکنترلر به مقادیر اولیه اش استفاده میشود.
- IO2-5 : این پایه ها، پایه های GPIO ماژول LoRa هستند و میتوانیم وضعیت آن ها را در نرم افزار روی LOW یا HIGH تنظیم کنیم.
- ANT : این پایه، پایه ای است که باید به آنتن متصل شود. شما باید یک آنتن مناسب براساس دیتاشیت را به این پایه وصل کنید.
- VCC: این پایه، پایه تغذیه ماژول است. از آنجایی که حداکثر ولتاژ قابل تحمل این ماژول 3.3 ولت است، میتوانید آن را به هر کدام از پایه های 3.3 ولت که خواستید وصل کنید.
ماژول SX1276 LoRa-868 مگاهرتز
در این آموزش، از ماژول LoRa با فرکانس کاری 868 مگاهرتز که توسط SEMTECH طراحی و ساخته شده است، استفاده خواهیم کرد. استفاده از این ماژول بسیار آسان بوده و کم هزینه نیز هست. این ماژول، یک ماژول با بازدهی بالاست که میتواند در پروژه های مختلفی استفاده شود.
ترنسیور (فرستنده-گیرنده) های SX1276/77/78/79 دارای مودم دوربرد LoRaTM هستند. این مودم، درحالیکه مصرف جریان را به حداقل میرساند، امکان برقراری ارتباط در یک طیف گسترده و با برد بسیار بالا را فراهم کرده و همچنین مصونیت یا ایمنی بالایی را دربرابر تداخل از خود نشان میدهد. گفته میشود که با استفاده از SX1276، یک کریستال ارزان و لیستی از قطعات، میتوان به حساسیت بالای 148- دسیبل متر رسید.
تفاوت بین HPD13A SX1276 و ماژول LoRa RFM95W
همانگونه که میتوانید در تصویر بالا مشاهده کنید، نامی که روی ماژول نوشته شده HPD13A است ولی طبق لیست موجود در سایت توزیع کننده، این ماژول، یک SX1276 LoRa است. این امر در ابتدا بسیار گیچ کننده بود.
پس تصمیم گرفتیم که ماژول را باز کرده و از دورن آن خبردار شویم. میتوانید در تصویر بالا مشاهده کنید که کارخانه HPDTek این ماژول را مونتاژ کرده و سپس نام و شماره خود را روی آن درج کرده است. اما اگر زیر درپوش یا محافظ ماژول را ببینیم، مشخص میشود که این ماژول از تراشه SX1276 LoRa ساخته شده است.
حال باید به این سوال پاسخ دهیم که تفاوت بین دو تراشه RFM95W و SX1276 چیست. این ماژول ها یکسان بوده و ویژگی های یکسانی نیز دارند و اگر هدف شما برقراری ارتباط لوراست، انجام این کار سخت نیست. HopeRF به این تکنولوژی ساخته شده توسط SEMTECH مجوز و لایسنس میدهد.
پس ماژول RFM95W بدون محافظ، تقریبا مشابه برخی از ماژول های SX1276 است و همچنین پایه ها و نرم افزار آن ها، با هم سازگاری دارند.
در تصویر بالا میتوانید تفاوت بین دو ماژول را ببینید.
ساخت بورد بریک اوت ( مبدل پاور سرور) با پرف بورد
اگر به پایه های ماژول نگاه کنید، متوجه میشوید که نمیتوانیم آن ها را مستقیما به بردبورد متصل کنیم. پس باید برای این ماژول یک بورد بریک اوت بسازیم و برای اینکار، دو روش داریم.
میتوانیم با لحیم کردن ماژول روی پرف بورد و سپس لحیم کاری چند پین هدر به آن، یک بورد بریک اوت بسازیم. و روش دوم این است که برای مدل خود یک PCB ساخته و ماژول را روی آن لحیم کنیم. در این پروژه ما از روش اول استفاده میکنیم زیرا که بسیار آسان بوده و زمان کمتری هم میگیرد.
بورد بریک اوت ساخته شده کامل را میتوانید در تصویر پایین مشاهده کنید.
اگر نگاهی به ماژول HPD13A بیندازیم، میبینیم که این ماژول به همراه یک محافظ فلزی برای کاهش EMI و تداخل عرضه میشود. ما این محافظ را برداشته ایم تا همانطور که در تصویر بالا مشخص است، ساختار دورنی ماژول را ببینیم و دید بهتری از درون ماژول داشته باشیم.
مدار اتصال SX1276 به ESP32
شماتیک مدار اتصال ماژول SX1276 به ESP32 بسیار ساده و دست راست است. شماتیک کامل مدار را در تصویر پایین مشاهده میکنید.
همانطور که پیشتر اشاره کردیم، ماژول HX1276 دارای 16 پایه است که در هر طرف 8 پایه قرار گرفته اند. از بین 16 پایه، 3 پایه، پایه های زمین بوده و یک پایه VCC است که میتواند تا ولتاژ 3.3 ولت را تحمل کند. بقیه پایه ها، پایه های SPI هستند. حال باید پایه های SPI ماژول LoRa را مطابق تصویر بالا به پایه های SPI میکروکنترلر متصل کنیم.
شما میتوانید برای اطمینان از صحت اتصالات خود از جدول زیر استفاده کنید.
ماژول ESP32 WROOM Dev | ماژول HPD13A LoRa SX1276 |
3.3 ولت | 3.3 ولت |
GND | GND |
D18(SCLK) | SCK |
D23(MOSI) | SDI (MOSI) |
D19(MISO) | SDO (MISO) |
D26(تعریف شده توسط کاربر) | SEL (CS) |
D25(تعریف شده توسط کاربر) | RST |
D23(تعریف شده توسط کاربر) | IO0 |
D22(تعریف شده توسط کاربر) | IO1 |
برای اتصال ماژول HPD13A به ESP32 از سیم های جامپر بردبورد استفاده کردیم. مدار سخت افزاری نهایی در تصویر پایین نشان داده شده است.
مقایسه روش فعالسازی OTAA و ABP
هر end device یا دستگاه انتهایی باید قبل از ارسال و دریافت پیام ها در یک شبکه ثبت شود. نام این پروسه فعالسازی است.
2 متد یا روش فعالسازی داریم:
- OTAA یا Over-The-Air-Application: این روش، امن ترین و توصیه شده ترین روش فعالسازی end nodeهاست. در این روش دستگاه، پروسه اتصال به شبکه را انجام میدهد و در طی این پروسه یک آدرس داینامیک به دستگاه اختصاص داده شده و کلیدهای امنیتی با دستگاه مبادله میشوند.
- ABP یا Activation By Personalization: این روش نیازمند کدنویسی سخت یا هارد-کدینگ آدرس دستگاه به همراه کلیدهای امنیتی است. این روش نسبت به OTAA از امنیت کمتری برخوردار است و عیب دیگر آن، این است که دستگاه ها نمیتوانند به شبکه دیگری سوئیچ کنند مگر اینکه کلیدهای دستگاه به صورتی دستی تغییر یابند.
پروسه اتصال LoRaWAN 1.0X و 1.1 اندکی با هم تفاوت دارند. در دو قسمت بعدی پروسه اتصال هر کدام را به صورت جداگانه توضیح میدهیم. اگر میخواهید درباره پروسه فعالسازی دستگاه در TTN بیشتر بیاموزید، میتوانید با استفاده از لینک قرار داده شده به سایت TTN رفته و در این باره بیشتر مطالعه کنید.
راه اندازی end node ها در شبکه TTN
برای ارسال داده به شبکه TTN، ابتدا باید گیت وی یا دروازه خود را راه اندازی کنید. پس از این مرحله، باید end node را به طور مناسب راه اندازی کنیم تا دستگاه بتواند به درستی کار کند. برای این منظور باید یک حساب TTN ساخته یا به حساب از پیش ساخته شده خود وارد شوید.
وقتی توانستید با موفقیت وارد سایت شوید، باید کنسول TTN را وارد کنید. اگر تمام مراحل را به درستی انجام دهید، صفحه ای مانند تصویر زیر به شما نشان داده خواهد شد.
حال باید یک کلاستر یا دسته انتخاب کنیم. اگر نیاز است که درباره کلاسترها بیشتر بدانید، روی گزینه more information کلیک کنید. در این پروژه، ما کلاستر europe1 را انتخاب میکنیم.
پس از انتخاب کلاستر، صفحه ای مانند تصویر بالا به شما نشان داده خواهد شد. حال روی Go to application کلیک کنید.
صقحه ای مانند تصویر بالا به شما نشان داده خواهد شد. در این مرحله نیاز است که روی گزینه Add application کلیک کرده تا اولین اپلیکیشن خود را ایجاد کنید.
اضافه کردن Application
حال باید با انتخاب یک Application ID و یک نام منحصر به فرد، اپلیکیشن خود را ایجاد کنید. از آنجایی که قسمت Description اختیاری است، پس از تعیین نام و ID میتوانید روی گزینه Create Application کلیک کنید.
پس از کامل کردن این مرحله، صفحه ای مانند تصویر بالا به شما نشان داده خواهد شد. حال باید برای اپلیکیشن خود end node هایی را ایجاد کنید. همانطور که پیشتر اشاره شد، end node ها دستگاه هایی هستند که داده را به سرور اپلیکیشن ارسال میکنند.
حال روی newly created application، سپس روی گزینه end node در سمت چپ و بعد هم روی گزینه add application در سمت راست کلیک کنید. همانطور که در تصویر بالا مشاهده میکنید، ما پیش از این دو end node ساخته ایم. یکی برای آزمایش روش ABP و دیگری برای آزمایش روش OTAA.
پس از کلیک کردن روی گزینه add end node صفحه نمایشی مانند تصویر بالا به شما ارائه میشود. به بخش manually رفته و این مراحل را انجام دهید.
ابتدا frequency plan، LoRaWAN specification و ActivationMode را انتخاب میکنیم. برای اولین مثال خود از روش OTAA استفاده خواهیم کرد.
سپس، باید برای end node تان کلیدهایی تولید کنید. پس از انجام این مرحله، کار شما به پایان میرسد.
برای تکمیل پروسه روی گزینه Register end device کلیک کنید. لطفا در نظر داشته باشید که DeviceEUI، AppKey وappEUI سه کلید بسیار مهم هستند که باید به آن ها توجه داشته باشید. در قسمت بعدی، می آموزیم که چگونه با روش فعالسازی ABP یک اپلیکیشن بسازیم. این دو پروسه بسیار به هم شبیه هستند. تنها باید در قسمت activation mode، مد فعالسازی را ABP انتخاب کرده و این بار کلیدها را مناسب این روش تولید کنید.
در تصویر بالا، میتوانید ببینید که روش فعالسازی ABP را انتخاب و آدرس دستگاه، NwSKey و AppSKey را تولید کرده ایم. Device EUI به صورت خودکار تولید خواهد شد. پس از انجام تمام این مراحل، میتوانید برای کامل کردن پروسه، روی Register end device کلیک کنید.
حال که تمام کارهای مربوط به TTN را انجام داده ایم، به سراغ کدنویسی این پروژه میرویم.
کد آردوینو برای اتصال ماژول SX1276 به ESP32
کد اتصال ماژول لورا HPD13A SX1276 بسیار آسان و قابل فهم است. ما باید کتابخانه Arduino-lmic از mcci-catena را دانلود کرده و از نمونه کد آن برای ارتباط با ماژول SX1276 استفاده کنیم. اما پیش از آنکه بتوانیم از نمونه کد موجود در کتابخانه استفاده کنیم، باید آن را به گونه ای تنظیم و پیکربندی کنیم تا با HX1276 با فرکانس کاری 868 مگاهرتز سازگار شود.
// project-specific definitions // project-specific definitions #define CFG_eu868 1 //#define CFG_us915 1 //#define CFG_au915 1 //#define CFG_as923 1 // #define LMIC_COUNTRY_CODE LMIC_COUNTRY_CODE_JP /* for as923-JP; also define CFG_as923 */ //#define CFG_kr920 1 //#define CFG_in866 1 #define CFG_sx1276_radio 1
برای انجام اینکار باید پیکربندی پروژه (project configuration) که در بالا نشان داده شده است را تغییر دهیم. این project configuration را میتوانید در کتابخانه Arduino-lmic و درون داکیومنت های کتابخانه آردوینو بیابید. پس از انجام این مرحله، میتوانیم نمونه کد TTN-OTAA را باز کرده و روی ESP32 آپلود کنیم. اما پیش از آن باید کلیدهای خود را برای برقراری ارتباط با شبکه TTN در کد وارد کنیم. نمونه کد TTN-OTAA را با رفتن به منو File، بخش Example، MCCI LoRaWAN LMIC Library و در نهایت ttn-otaa باز کنید.
// This EUI must be in little-endian format, so least-significant-byte // first. When copying an EUI from ttnctl output, this means to reverse // the bytes. For TTN issued EUIs the last bytes should be 0xD5, 0xB3, // 0x70. static const u1_t PROGMEM APPEUI[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; void os_getArtEui (u1_t* buf) { memcpy_P(buf, APPEUI, 8); } // This should also be in little endian format, see above. static const u1_t PROGMEM DEVEUI[8] = { 0xFF, 0x43, 0x45, 0xD0, 0xDE, 0xD5, 0xB3, 0x70 }; void os_getDevEui (u1_t* buf) { memcpy_P(buf, DEVEUI, 8); } // This key should be in big endian format (or, since it is not really a // number but a block of memory, endianness does not really apply). In // practice, a key taken from ttnctl can be copied as-is. static const u1_t PROGMEM APPKEY[16] = { 0xBB, 0xAB, 0xAA, 0xD6, 0x47, 0x5A, 0xAC, 0xBC, 0x36, 0xAC, 0x22, 0x4A, 0xF2, 0x78, 0x33, 0x72 };
حال اگر با دقت به کد نگاه کنید، میتوانید جاهایی که برای کلیدها درنظر گرفته شده را ببینید. کلیدها را متناسب با فرمت MSB یا LSB در کد پیست کنید. اگر به کامنت های موجود در قطعه کد بالا توجه کنید، میتوانید محل پیست کردن هر کلید را تشخیص دهید.
اکنون باید پایه های ماژول را مقداردهی کنیم.درون کد، ساختاری مشابه ساختار پایین خواهید دید.
const lmic_pinmap lmic_pins = { .nss = 5, .rxtx = LMIC_UNUSED_PIN, .rst = 4, .dio = {34, 35, LMIC_UNUSED_PIN}, };
در این ساختار، باید پایه های nss، rst IO0 و IO1 را به منظور عملکرد مناسب ماژول مقدار دهی کنید. حال میتوانیم کد نمونه را روی ESP32 آپلود کنیم.
مراحلی که نام برده شد، تمام آن چیزی است که باید برای مثال TTN-OTAA انجام دهید. اکنون ببینیم که مثال TTN-ABP چگونه کار میکند.
// LoRaWAN NwkSKey, network session key // This should be in big-endian (aka msb). static const PROGMEM u1_t NWKSKEY[16] = { 0xE8, 0x72, 0x48, 0x5E, 0x58, 0x57, 0xFF, 0xDB, 0xFA, 0x57, 0x0B, 0x18, 0x95, 0x04, 0x90, 0x21 }; // LoRaWAN AppSKey, application session key // This should also be in big-endian (aka msb). static const u1_t PROGMEM APPSKEY[16] = { 0x44, 0x29, 0x95, 0xC5, 0x13, 0xDB, 0x7C, 0xE0, 0xEB, 0x8C, 0x41, 0x07, 0x56, 0x41, 0x82, 0xC8 }; // LoRaWAN end-device address (DevAddr) // See http://thethingsnetwork.org/wiki/AddressSpace // The library converts the address to network byte order as needed, so this should be in big-endian (aka msb) too. static const u4_t DEVADDR = 0x260B9869 ; // <-- Change this address for every node! const lmic_pinmap lmic_pins = { .nss = 5, .rxtx = LMIC_UNUSED_PIN, .rst = 4, .dio = {34, 35, LMIC_UNUSED_PIN}, };
کد مثال TTN-ABP عملا مشابه کد مثال قبلی است.
تنها تغییراتی که شما باید ایجاد کنید قرار دادن مقادیر DEVADDR(نام دستگاه)، APPSKEY(App Session Key) و NWKSKEY(Network session key) است.
سپس میتوانید کد را آپلود کنید. کد کامل شده را میتوانید در انتهای این مطلب بیابید.
تست LoRaWAN node با روش ABP
پس از آپلود کد، برای بررسی اینکه ماژول به درستی کار میکند یا نه، سریال مانیتور را باز میکنیم.
همانگونه که از داده خروجی در پنجره سریال مانیتور مشخص است، به صورت مداوم در حال انتقال داده هستیم و در سمت شبکه TTN هم آن ها را دریافت میکنیم.
اگر مقدار HEX (48656C6C6F2C20776F726C6421) را به متن تبدیل کنید، میتوانید پیام ها را بخوانید.
تست LoRaWAN node با روش OTAA
کد روش OTAA را آپلود کرده و پنجره سریال مانیتور را باز میکنیم. میتوانید پیام ها و کلیدها بسیاری را ببینید که نشان از ارتباط موفق با TTN دارد.
در سمت TTN هم این پیام چیزی شبیه به تصویر بالا به نظر میرسد.
و در تصویر بالا، میتوانید پیام ها را در قالب متن ببینید.
عملکرد ماژول SX1276 LoRa
برای تست مداری که ساخته ایم، تغییر کوچکی در کد ایجاد کرده و یک کانتر یا شمارنده به آن اضافه میکنیم. این کانتر هر ثانیه یک واحد افزایش پیدا کرده و داده کانتر را به شبکه TTN میفرستد.
در گیف زیر، میتوانید ببینید که ماژول را راه اندازی کرده ایم و ماژول در حال ارسال داده به شبکه TTN است. میتوانیم این امر را از طریق کنار هم قرار دادن پنجره سریال مانیتور و پنجره TTN در کنار هم تایید کنیم.
در انتهای این آموزش، اگر هر گونه سوال یا شکی برای شما باقی مانده، لطفا آن را در قسمت نظرات با ما در میان بگذارید. همچنین میتوانید از تالار گفتگو، برای شروع گفتگو با مهندسین ما استفاده کنید.
میتوانید از لینک زیر تمام فایل های ضروری را بیابید.
موارد موجود در فایل : سورس کامل، فایل های سه بعدی و …
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود