بررسی اجمالی: در این پروژه قصد داریم با استفاده از آردوینو و ESP8266، یک ردیاب GPS کممصرف مبتنی بر پروتکل LoRa بسازیم. این ردیاب، نوع خاصی از ردیاب GPS است، چون با پروتکل LoRa کار میکند و با بردهای Arduino و ESP8266 ساخته شده است. پروتکل LoRa تکنولوژی ای است که به دستگاهها اجازه میدهد تا در فواصل بسیار طولانی و بدون مصرف انرژی زیاد با یکدیگر ارتباط داشته باشند.
در اینجا، بخش ترانسمیتر (فرستنده) ردیاب GPS ما یک دستگاه کوچک است که از چندین قطعه SMD ساخته شده است که قطعات اصلی آن یک میکروکنترلر به نام Atmega328، یک چیپ LoRa به نام SX1276 و یک ماژول GPS L80 هستند. این میکروکنترلر مانند مغز ردیاب است، چیپ LoRa به ردیاب این امکان را میدهد تا موقعیت مکانی GPS را ارسال کند و ماژول GPS مکان را با طول و عرض جغرافیایی نشان میدهد. برای صرفهجویی در مصرف برق، باید دستگاه زمانی که از آن استفاده نمیشود، به حالت خواب (sleep mode) برود و از طریق کابل USB شارژ شود.
همچنین، ما گیرنده این پروژه را با استفاده از ESP8266 و ماژول SX1276 LoRa ساختیم. ردیاب، اطلاعات لوکیشن را به گیرندهای میفرستد؛ این گیرنده دیتاهای GPS و چیپ ESP8266 را برای اتصال به وایفای به دیتایی قابلفهمتر و سادهتر تبدیل میکند. سپس این گیرنده اطلاعات لوکیشن (موقعیت مکانی) را به برنامه Blynk میفرستد که میتواند به شما نشان دهد که ردیاب در گوگلمپ کجاست.
این نوع ردیاب میتواند در مواردی مانند پیداکردن حیوانات خانگی گمشده، ردیابی اقلام ارزشمند یا حتی در تحقیقات علمی برای ردیابی حرکات حیوانات در حیاتوحش، کاربرد داشته باشد.
لازم به ذکر است چون این مقاله ترجمه می باشد، برخی از خدمات استفاده شده در این پروژه برای همراهان ما که داخل ایران هستند، در دسترس نمیباشد.
موارد موردنیاز برای انجام پروژه
برای انجام این پروژه و ساخت این ردیاب GPS مبتنی بر پروتکل LoRa به موارد زیر نیاز داریم:
قطعه سازنده | تعداد | فوت پرینت | نام | شماره |
ATMEGA328-AU | 1 | TQFP-32_L7.0-W7.0-P0 | ATMEGA328-AU MCU | 1 |
ESP-12E | 1 | WIFIM-SMD_ESP-12E | ESP-12E WiFi MCU | 2 |
HT7333-7 | 2 | SOT-89-3_L4.5-W2.5-P1.50 | LDO HT7333 | 3 |
1 | GPSM-SMD_L80-R | L80 GPS Module | 4 | |
2 | HPD13A | LoRa SX1276 (HPD13A) | 5 | |
MCP73831T-2ATI/OT | 2 | SOT-23-5 | MCP73831 | 6 |
5 | C0805 | Capacitor 10uF | 7 | |
4 | C0805 | Capacitor 4.7uF | 8 | |
8 | C0805 | Capacitor 0.1uF | 9 | |
2 | C0805 | Capacitor 22pF | 10 | |
1 | C0805 | Capacitor 470pF | 11 | |
1 | R0805 | Resistor 470E | 12 | |
1 | R0805 | Resistor 10K | 13 | |
5 | R0805 | Resistor 12K | 14 | |
2 | R0805 | Resistor 2K | 15 | |
1 | R0805 | Resistor 470 | 16 | |
1 | R0805 | Resistor 330 | 17 | |
2 | R0805 | Resistor 47K | 18 | |
2 | R0805 | Resistor 22K | 19 | |
2 | LED0805 | LED Red | 20 | |
2 | SOT23 | Transistor BC847 | 21 | |
SS12D06 | 1 | TOGGLE SWITCH (1P2T) SPDT | Slide Switch | 22 |
U.FL-R-SMT-1(40) | 2 | ANT-SMD_UFL-R-SMT-1 | U.FL-R-SMT | 23 |
U-F-M5DD-Y-L | 1 | MICRO-USB-SMD_MICRO-USB-18 | Micro USBFemale | 24 |
2 | Battery Connector | 25 | ||
HDR-TH_6P-P2.54-V-F | Male Header (PROG) | 26 | ||
Header-Male-2.54_1x6 | 1 | HDR-TH_6P-P2.54-V-M-1 | Female Header (PROG) | 27 |
HEADER 1X1 | 2 | 868MHz LoRa Antenna | 28 | |
Pulsador | 3 | SWITCH SMD 3X4X2MM | Reset Switch | 29 |
HC-49US 16.000MHz | 1 | HC49US | 16MHz Crystal | 30 |
2 | 1000MAh | LiPo Battery 3.7V | 31 | |
1 | FTDI Module | 32 | ||
6 | Jumper Wires | 33 |
طراحی سختافزار LoRa GPS Tracker
ازآنجاییکه این پروژه از فناوری LoRa استفاده میکند، تصمیم گرفتیم برای انجام آن، از محبوبترین چیپ LoRa که یک چیپ کممصرف است، استفاده کنیم. در اروپا فرکانس LoRa پشتیبانی شده 868 مگاهرتز است. در دبی و هند نیز فرکانس مجاز LoRa حدود 868 مگاهرتز است. در ایالات متحده آمریکا و کانادا، فرکانس مجاز LoRa حدود 915 مگاهرتز است. همچنین، در اکثر کشورهای قاره آسیا، باند فرکانسی مجاز 433 مگاهرتز است.
ازآنجاییکه ما در کانادا هستیم، از LoRa Module SX1276 استفاده کردیم که این دستگاه از هر دو باند فرکانسی 868 مگاهرتز و 915 مگاهرتز پشتیبانی می کند.
SX1276 که توسط شرکت Semtech تولید شده است، یک مدار مجتمع فرکانس رادیویی است که دارای برد زیاد و مصرف کم (RFIC) است و به طور گسترده در دستگاههای IoT برای ارتباطات LPWAN استفاده میشود. این دستگاه در محدوده فرکانس 868 تا 915 مگاهرتز کار میکند، از انواع مدولاسیون از جمله LoRa پشتیبانی میکند و در کاهش مصرف انرژی موثر است که آن را به انتخابی مناسب برای دستگاههای battery-operated تبدیل میکند.
به طور مشابه برای قسمت GPS، ما از GPS Module L80 شرکت Quectel استفاده کردیم که دارای یک آنتن پچ امبدد است و در دریافت سیگنالهای ماهوارهای عالی عمل میکند. برای کسب اطلاعات بیشتر در مورد این ماژول GPS میتوانید به راهنمای Arduino L80 interfacing مراجعه کنید.
بخش سختافزاری این پروژه شامل فرستنده و گیرنده است. هر دو بخش فرستنده و گیرنده توسط باتری لیتیوم یونی 3.7 ولت تغذیه می شوند. برای شارژ باتری لیتیوم یونی، ما از BMS و آی سی شارژ باتری MCP73831 میکروچیپ استفاده کردیم. کل مدار با ولتاژ 3.3 ولت کار می کند. از این رو ما از LDO HT7333 از Holtek استفاده کردیم.
طراحی و شماتیک قطعات ترانسمیتر (فرستنده)
ترانسمیتر (فرستنده) قابلحمل است و از ماژولهای LoRa و GPS برای ارتباط استفاده میکند. در زیر یک شماتیک کامل برای قسمت فرستنده آورده شده است.
ما از میکروکنترلر ATMega328 با بوت لودر آردوینو استفاده کردیم. شما میتوانید بوت لودر را روی چیپ خام SMD ATMega328 رایت کنید یا چیپ ATMega328 را مستقیماً از برد آردوینو نانو جدا کنید.
همچنین، شما میتوانید یک شارژر میکروUSB پنج (5) ولتی را به پورت USB وصل کنید و باتری را شارژ کنید. LED1 وضعیت شارژ را نشان میدهد. یک باتری لیتیوم یونی یا LiPo با ولتاژ 3.7 را میتوان به یک کانکتور باتری متصل کرد تا کل مدار را تغذیه کند. SW1 سوئیچی برای روشن/خاموشکردن ماژول است. برق از باتری به LDO HT7333 منتقل میشود که ولتاژ را به 3.3 ولت میرساند. کل مدار با ولتاژ 3.3 ولت کار میکند.
برای تشخیص ولتاژ باتری خوانده شده توسط میکروکنترلر، از یک شبکه تقسیمکننده ولتاژ با مقاومتهای R4 و R5 استفاده شده است. مقدار ولتاژ، نصف می شود و از پین آنالوگ A0 برد آردوینو تغذیه می شود. ماژول GPS L80 یک ماژول UART است، بنابراین Tx و Rx L80 به ترتیب به D2 و D3 در آردوینو متصل می شوند. در اینجا ما می توانیم از نرم افزار سریال برای ارتباطات UART استفاده کنیم.
ماژول LoRa SX1276 با استفاده از پروتکل ارتباطی SPI به کار گرفته میشود. SS، RST و DIO0 SX1276 به بردهای آردوینو D10، D9 و D7 متصل می شوند. سایر پین های SPI SX1276 نیز به صورت پیش فرض به ATmega328 متصل می شوند. ماژول LoRa به یک آنتن نیاز دارد. شما می توانید از هر آنتن LoRa که فرکانس آن 868 مگاهرتز است، استفاده کنید. یک کانکتور UFL نیز برای اتصال آنتن ارائه شده است یا اینکه شما می توانید آنتن دیگری را در نقطه ANT1 لحیم کنید.
برای پروگرام چیپ ATMega328، شما میتوانید از پین ISP P1 استفاده کنید. یک ماژول FTDI یا کانورتر USB-to-TTL را میتوان مستقیماً به پین هدر متصل کرد.
طراحی و شماتیک قطعه گیرنده
بخش گیرنده این پروژه از چیپ خام ESP8266 و LoRa Module SX1276 تشکیل شده است. گیرنده پیام دریافتی را از فرستنده دریافت میکند و مختصات GPS را در برنامه Blynk آپلود میکند. در اینجا شماتیک کامل گیرنده ردیاب GPS LoRa آورده شده است:
یک شماتیک قابلاجرا از مدار ESP8266 در اینجا استفاده شده است. در حین آپلود کد نیازی به فشاردادن دکمه ریست یا بوت نیست. شما میتوانید ماژول کانورتر USB-to-TTL را به پینهای PROG متصل کنید و مدار را پروگرام کنید. فرایند پروگرام کردن بهصورت اتوماتیک و توسط دو سوئیچ (FLS و RST)، دو ترانزیستور BC547 (Q1 و Q2) و چند قطعه دیگر انجام می شود.
سیگنال RTS ، ESP8266 را ریست میکند و سیگنال DTR، ESP8266 را در مد فلاش (flash mode) قرار میدهد. زمانی که مقدار هر دوی این سیگنالها کم است، میتوان با استفاده از Q1 و Q2 از ریست شدن چیپ، جلوگیری کرد. به محض تشخیص کامند آپلود، ماژول ESP برای آپلود یکپارچه طرح به مد فلاش تبدیل می شود. در صورت عدم وجود کامند آپلود، ESP-12E/F در مد نرمال (normal mode) شروع به کار می کند.
مدار مرجع طراحی را در اینجا بررسی کنید: ESP8266 Automatic Programmer Circuit
یک شارژرMicro-USB ۵ ولتی را میتوان برای شارژ باتری در پورت USB قرار داد و LED1 وضعیت شارژ را نشان میدهد. برق کل مدار را میتوان با اتصال یک لیتیوم یون 3.7 ولت به کانکتور باتری تأمین کرد. SW1 بهعنوان یک سوئیچ ON/OFF ماژول عمل میکند. برق باتری به LDO HT7333 هدایت میشود که ولتاژ را به 3.3 ولت محدود میکند و اطمینان میدهد که کل مدار در این ولتاژ کار میکند.
LoRa Module SX1276 از طریق پینهای SPI به ESP8266 متصل میشود. ما از پینهای SS، RST و DIO0 به ترتیب بهعنوان GPIO15، GPIO16 و GPIO4 استفاده کردیم. یک آنتن با فرکانس 868 مگاهرتز و با حساسیت و قدرت بیش تر در ترمینال ANT1 وصل کنید. شما می توانید یک آنتن مارپیچی لحیم کنید یا یک آنتن را با یک کانکتور UFL وصل کنید.
طراحی PCB، فایلهای Gerber و سفارش PCB
هر دو شماتیک بالا با استفاده از EasyEDA طراحی شدهاند. شما میتوانید شماتیک را به PCB تبدیل کنید.
PCBها دارای قطعات SMD با مقاومت و خازن با پکیج SMD 0805 هستند. سایر آیسیها نیز در پکیج SMD هستند. قسمت جلوی PCB فرستنده و گیرنده چیزی شبیه به شکل زیر است:
به طور مشابه، نمای سهبعدی PCB به این شکل است:
در زیر فایل Gerber برای PCB آورده شده است.
دانلود فایل Gerber: ترانسمیتر PCB
دانلود فایل Gerber: گیرنده PCB
شما میتوانید از طریق این فایل Gerber، از یک PCB با کیفیت بالا برای انجام این پروژه استفاده کنید. برای سفارش PCB ما به وبسایت ALLPCB مراجعه کردیم که لینک آن در زیر آمده است.
با انتخاب گزینه Quote Now فایل Gerber را آپلود کنید. از بین این گزینهها میتوانید نوع متریال، ابعاد، مقدار، ضخامت، رنگ ماسک لحیمکاری و سایر پارامترهای موردنیاز را انتخاب کنید.
پس از انتخاب تمامی این موارد، کشور و روش ارسال خود را انتخاب کنید و در نهایت، میتوانید سفارش خود را ثبت کنید.
PCB و مونتاژ سختافزار نهایی
بعد از ثبت سفارش PCB، حدود 5 روز طول کشید تا سفارشم به دستم رسید.
به دلیل کیفیت بسیار بالای PCBهای ALLPCB، اکثر مردم برای خریداری PCB/PCBA به سایت ALLPCB مراجعه میکنند.
در ترانسمیتر (فرستنده) PCB، ابتدا تمام اجزای SMD مانند مقاومتها، خازنها، ترانزیستورها، LED، دکمههای فشاری و پورت میکرو USB را لحیم کنید. پس از لحیمکاری همه اینها، میتوانید چیپ ATMega328 را لحیم کنید.
در اینجا، من چیپ ATMega328 را از آردوینو نانو جدا کردم؛ زیرا بوت لودر از قبل نصب شده بود. ماژول SX1276 LoRa و ماژول GPS نیز لحیمکاری شده بودند. سپس شما باید اسیلاتور کریستالی، کانکتور باتری، سوئیچ و پینهای مادگی را لحیم کنید.
در گیرنده PCB، ابتدا شما باید تمام اجزای SMD مانند مقاومتها، خازنها، ترانزیستورها، LED، دکمههای فشاری و پورت میکرو USB را لحیم کنید. دراینبین، مراقب SMD LED polarity باشید و آن را در جهت مناسب قرار دهید. پس از لحیمکاری همه این موارد، شما میتوانید ماژول SX1276 LoRa و چیپ خام ESP8266 را لحیم کنید. سپس کانکتور باتری، سوئیچ و پینهای نری را لحیم کنید.
اکنون باتری را به ترانسمیتر (فرستنده) و گیرنده برد PCB وصل کنید.
اکنون، سختافزار LoRa GPS Tracker با استفاده از Arduino (ATMega328) و ESP8266 آماده است و میتوانید فرایند پروگرام کردن را شروع کنید.
راهاندازی برنامه Blynk
اکنون برای بررسی دیتای GPS بهصورت وایرلس (بیسیم) و نظارت بر آن بهصورت آنلاین، به یک سرور IoT (اینترنت اشیا) با داشبورد نیاز داریم. برنامه Blynk برای این کار، بهترین گزینه است.
وارد سایت blynk.cloud شوید و یک حساب Blynk در وبسایت Blynk بسازید یا میتوانید بهراحتی با استفاده از ایمیل ID ثبت شده وارد شوید.
روی New Templat + کلیک کنید.
هر نامی میخواهید به سختافزار “LoRa GPS Tracker” بدهید. نوع سختافزار را ESP8266 و نوع اتصال را وایفای انتخاب کنید.
تمپلیت با موفقیت ساخته شد.
اکنون باید Datastreams را راهاندازی کنیم؛ بنابراین روی گزینه New Datastreams + کلیک کنید و Virtual Pin را انتخاب نمایید.
- ایمیج این دیتا استریم متعلق به Latitude (عرض جغرافیایی) است و Virtual Pin V1، به آن اختصاصدادهشده است.
- این دیتا استریم متعلق به Longitude (طول جغرافیایی) است و Virtual Pin V2، به آن اختصاصدادهشده است.
- این دیتا استریم متعلق به Speed (سرعت) است و Virtual Pin V3، به آن اختصاصدادهشده است.
- ایمیج این دیتا استریم متعلق به Map (نقشه) است و Virtual Pin V0، به آن اختصاصدادهشده است.
ازاینرو، بخش Datastream (جریان داده) تکمیل میشود.
حال به وب داشبورد بروید؛ زیرا باید داشبورد را تنظیم کنید.
اکنون 4 ویجت (widget) را بکشید و رها کنید. Map widget برای نمایش نقشه است. نقشه یک بخش پریمیوم است. یعنی باید آن را خریداری کنید. به غیر از Map (نقشه)، 3 ویجت دیگر نیز برای Latitude (عرض جغرافیایی)، Longitude (طول جغرافیایی) و Speed (سرعت) وجود دارد.
اکنون باید قسمت Map (نقشه) را تنظیم کنیم. برای این کار روی تنظیمات کلیک کنید و مانند تصویر زیر، این گزینه ها را انتخاب کنید.
به طور مشابه، Virtual Pin V1 را به Latitude (عرض جغرافیایی)، Virtual Pin V2 را به Longitude (طول جغرافیایی) و Virtual Pin V3 را به Speed (سرعت) اختصاص دهید.
اکنون، راهاندازی داشبورد کامل شده است؛ بنابراین، روی گزینه Save کلیک کنید.
حالا به بخش Home بروید و روی گزینه Add First Device کلیک کنید.
یک نام دلخواه برای دستگاه انتخاب کنید مانند LoRa GPS Tracker و سپس روی گزینه Create کلیک کنید.
اکنون دستگاه با موفقیت ایجاد شد و توکن احراز هویت نیز تولید شد.
حال میتوانید از این توکن احراز هویت برای اتصال ESP8266 به داشبورد Blynk استفاده کنید.
سورس کد (کد منبع) و پروگرام LoRa GPS Tracker
اکنون میخواهیم بخش پروگرام کردن ردیاب GPS مبتنی بر پروتکل LoRa با برد آردوینو و ESP8266 را بررسی کنیم. ازآنجاییکه ما مدارهای ترانسمیتر (فرستنده) و گیرنده داریم، بنابراین باید کدهایی برای مدارهای فرستنده و گیرنده بنویسیم.
کد ترانسمیتر (فرستنده)
ما کد قسمت ترانسمیتر را نوشتهایم که دارای میکروکنترلر ATMega328 است. ترانسمیتر دیتاها را از ماهواره با استفاده از ماژول گیرنده GPS L80 به دست میآورد. LoRa SX1276 دیتا را بهصورت وایرلس (بیسیم) منتقل میکند که این دیتا باید توسط گیرنده دریافت و خوانده شود. تا زمانی که ردیاب، مختصات درست GPS را دریافت نکند، انتقال دیتا انجام نخواهد شد و پس از دریافت مختصات GPS، انتقال دیتا LoRa آغاز میشود.
همچنین، ما قابلیت Sleep Mode را فعال کردیم تا برای صرفهجویی در مصرف انرژی، باتری دستگاه به حالت Sleep برود. فقط در حین انتقال دیتا دستگاه از حالت Sleep خارج میشود و بعد از آن دوباره به حالت Sleep میرود. ازآنجاییکه در کد ترانسمیتر (فرستنده)، دستگاه فقط به مدت 12 ثانیه در حالت Sleep قرار می گیرد، ممکن است لازم باشد کد را تغییر دهید تا دستگاه برای مدت زمان بیش تری در حالت Sleep قرار گیرد.
همچنین، میتوانید ولتاژ باتری را با استفاده از ADC pin A0 که در بخش سختافزاری توسط یک شبکه تقسیمکننده ولتاژ با دو مقاومت K47 کانفینگ شده است، اندازهگیری کنید. این کد برای اندازه گیری ولتاژ باتری پیاده سازی نشده است. برای انجام این کار می توانید به پروژه سیستم مانیتورینگ باتری مراجعه کنید.
در زیر کد کامل قسمت ترانسمیتر (فرستنده) آورده شده است:
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 | #include <TinyGPS++.h> #include <SoftwareSerial.h> #include <LoRa.h> #include <avr/sleep.h> #include <avr/power.h> #include <avr/wdt.h> // Define GPS serial communication pins #define rxGPS 3 #define txGPS 2 // Define LoRa parameters #define ss 10 // Pin for the CS (chip select) #define rst 9 // Pin for the RESET #define dio0 7 // Pin for the interrupt. Can be any digital pin. // Create gps and serial instance TinyGPSPlus gps; // This is the GPS object that will manage the GPS data SoftwareSerial gpsSerial(rxGPS, txGPS); // This will be the serial connection to the GPS volatile int f_wdt = 1; // This flag is used to keep track of the sleep status // Watchdog timer interrupt service routine ISR(WDT_vect) { if (f_wdt == 0) { f_wdt = 1; // If f_wdt was 0, set it to 1 } else { WDTCSR |= _BV(WDIE); // Enable the WD interrupt (note no reset) } } void setup() { Serial.begin(9600); // Begin serial communication with a baud rate of 9600 gpsSerial.begin(9600); // Begin GPS Serial with a baud rate of 9600 Serial.println("GPS initialized..."); // Initialize LoRa with specific pins and frequency LoRa.setPins(ss, rst, dio0); if (!LoRa.begin(868E6)) { // If LoRa does not start successfully, print an error message Serial.println("Starting LoRa failed!"); while (1); } Serial.println("LoRa initialized..."); // Set sleep mode to power down mode for energy efficiency set_sleep_mode(SLEEP_MODE_PWR_DOWN); } void loop() { while (gpsSerial.available()) { // Check if there is communication from GPS if (gps.encode(gpsSerial.read())) { // If GPS data can be encoded... if (gps.location.isValid()) { // ...and if the GPS data is valid // Store GPS data in strings String lat = String(gps.location.lat(), 6); String lon = String(gps.location.lng(), 6); String speed = String(gps.speed.mps()); // Print the acquired GPS data to the Serial Monitor Serial.println("GPS data acquired..."); Serial.println("LAT: " + lat); Serial.println("LONG: " + lon); Serial.println("SPEED: " + speed); // Combine GPS data into one string to send String dataToSend = "LAT:" + lat + ",LONG:" + lon + ",SPEED:" + speed; // Begin LoRa transmission LoRa.beginPacket(); LoRa.print(dataToSend); // Send the GPS data string int result = LoRa.endPacket(); // Finish LoRa transmission // Check if the LoRa transmission was successful and print result to Serial Monitor if (result) { Serial.println("Packet transmission successful"); } else { Serial.println("Packet transmission failed"); } delay(2000); // Wait 2 seconds // Go to sleep mode to save energy Serial.println("Going to sleep now"); Serial.println(); delay(100); // Sleep for 12 seconds (8 seconds + 4 seconds) f_wdt = 0; setup_watchdog(9); // Set watchdog timer for approx 8 seconds while (f_wdt == 0) { system_sleep(); } f_wdt = 0; setup_watchdog(8); // Set watchdog timer for approx 4 seconds while (f_wdt == 0) { system_sleep(); } // Disable watchdog timer wdt_disable(); delay(2000); // Wait 2 seconds } else { Serial.println("Waiting for valid GPS data..."); // If the GPS data is invalid, print an error message } } } } // Function to put the system to sleep to save energy void system_sleep() { ADCSRA &= ~(1 << ADEN); // Switch Analog to Digitalconverter OFF set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Set sleep mode to power down mode sleep_enable(); // Enable sleep mode sleep_mode(); // System actually sleeps here sleep_disable(); // Disable sleep mode ADCSRA |= (1 << ADEN); // Switch Analog to Digitalconverter ON } // Function to set up watchdog timer void setup_watchdog(int i) { byte bb; int ww; if (i > 9 ) i = 9; // Ensure that the interval does not exceed the maximum bb = i & 7; if (i > 7) bb |= (1 << 5); // Set the correct bit for longer time intervals bb |= (1 << WDCE); // Enable changes ww = bb; MCUSR &= ~(1 << WDRF); // Reset the reset flag WDTCSR |= (1 << WDCE) | (1 << WDE); // Start timed sequence WDTCSR = bb; // Set new watchdog timeout value WDTCSR |= _BV(WDIE); // Enable watchdog interrupt } |
برای آپلود کد روی چیپ ATMega328، ماژول FTDI را به پین هدر Female برد وصل کنید. ماژول FTDI بهخوبی با طراحی سختافزاری سازگار است.
از قسمت board manager، برد آردوینو نانو و پورت COM را انتخاب کنید. سپس دکمه آپلود را بزنید تا کد آپلود شود.
کد گیرنده (Receiver)
ما کد قسمت گیرنده (Receiver) را نوشتهایم که دارای چیپ ESP8266 است. مدار گیرنده، دیتا را از ترانسمیتر (فرستنده) دریافت میکند. دیتاهای دریافتی برای خواندن عرض جغرافیایی، طول جغرافیایی و سرعت از هم جدا میشوند. سپس دیتا به برنامه Blynk ارسال میشود.
از خطوط زیر، SSID WiFi، Password و Blynk Authentication Token را تغییر دهید.
1 2 3 | char auth[] = "************"; // Blynk Authentication Token char ssid[] = "************"; // WiFi SSID char pass[] = "************"; // WiFi Password |
در اینجا کد کامل قسمت گیرنده آورده شده است:
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 | #include <SPI.h> #include <LoRa.h> #include <ESP8266WiFi.h> #include <BlynkSimpleEsp8266.h> #define SS 15 // GPIO15 -- SX1276's CS #define RST 16 // GPIO16 -- SX1276's RESET #define DI0 4 // GPIO4 -- SX1276's IRQ(Interrupt Request) #define BLYNK_TEMPLATE_ID "TMPL6iHPnSeDn" #define BLYNK_TEMPLATE_NAME "LoRa GPS Tracker" char auth[] = "************"; // Blynk Authentication Token char ssid[] = "************"; // WiFi SSID char pass[] = "************"; // WiFi Password void setup() { Serial.begin(115200); // Start the Serial communication to send messages to the computer Blynk.begin(auth, ssid, pass); // Start Blynk delay(1000); // wait for a second // Start LoRa using the frequency appropriate for your region (eg. 868E6 for Europe, 915E6 for North America) LoRa.setPins(SS,RST,DI0); if (!LoRa.begin(868E6)) { Serial.println("Starting LoRa failed!"); while (1); } Serial.println("LoRa Receiver"); } void loop() { Blynk.run(); // Initiates Blynk // try to parse packet int packetSize = LoRa.parsePacket(); if (packetSize) { // received a packet Serial.println("Received packet:"); String incoming = ""; while (LoRa.available()) { incoming += (char)LoRa.read(); } // Parse out the latitude, longitude and speed int latIndex = incoming.indexOf("LAT:"); int lonIndex = incoming.indexOf(",LONG:"); int speedIndex = incoming.indexOf(",SPEED:"); float lat = incoming.substring(latIndex + 4, lonIndex).toFloat(); float lon = incoming.substring(lonIndex + 6, speedIndex).toFloat(); float speed = incoming.substring(speedIndex + 7).toFloat(); // Reformat the strings with specified number of digits after decimal String latString = String(lat, 6); String lonString = String(lon, 6); String speedString = String(speed, 2) + " kmph"; // Assuming speed is in meters per second Serial.print("Latitude: "); Serial.println(latString); Serial.print("Longitude: "); Serial.println(lonString); Serial.print("Speed: "); Serial.println(speedString); // print RSSI of packet Serial.print("RSSI: "); Serial.println(LoRa.packetRssi()); //Send to Blynk Blynk.virtualWrite(V1, latString.c_str()); Blynk.virtualWrite(V2, lonString.c_str()); Blynk.virtualWrite(V3, speedString.c_str()); //Send to Google Map Widget Blynk.virtualWrite(V0, (lonString+","+latString).c_str()); } } |
ماژول FTDI را با استفاده از سیمهای جامپر به هدر Male قسمت گیرنده وصل کنید. فراموش نکنید که پین RTS را نیز وصل کنید.
از قسمت Board Manager گزینه NodeMCU 1.0 Board و COM Port را انتخاب کنید. سپس برای آپلود کد، روی دکمه آپلود کلیک کنید.
تست و نمایش دستگاه ردیاب GPS Location
بعد از آپلود کد میتوانید شروع به آزمایش دستگاه فرستنده و گیرنده کنید.
اگر سریال مانیتور قسمت فرستنده را باز کنید، اطلاعات زیر را مشاهده خواهید کرد:
پس از ارسال دیتا توسط فرستنده، گیرنده بلافاصله پیغامها را دریافت میکند. اگر سریال مانیتور قسمت گیرنده را باز کنید، اطلاعات زیر را مشاهده خواهید کرد:
همانطور که در تصاویر بالا نشاندادهشده است، فرستنده و گیرنده با یکدیگر در ارتباط هستند، به این معنی که سختافزار نهایی، برای آزمایش در فضای باز، مناسب است.
اکنون میتوانید مدار گیرنده را که به شبکه وایفای متصل است، در خانه نگه دارید.
اما، فرستنده میتواند قابلحمل باشد و برای آزمایش به بیرون از خانه برده شود.
اکنون میتوانید از داشبورد Blynk خود، بازدید کنید. در داشبورد Blynk، مکان فرستنده را خواهید دید.
به طور مشابه، شما میتوانید داشبورد موبایل خود را نیز برای بررسی مکان GPS مشاهده کنید.
مختصات به طور اتوماتیک بر اساس حرکت ردیاب آپدیت میشود. اما برای دیدن مکان بر روی نقشه، باید هر بار آن را آپدیت کنید.
جمعبندی
در این پروژه نشان داده شد که چگونه میتوان یک ردیاب GPS کممصرف مبتنی بر پروتکل LoRa را با استفاده از برد آردوینو و ESP8266 مونتاژ کرد. این ردیاب با ترکیب منحصربهفرد خود یعنی میکروکنترلر Atmega328، چیپ SX1276 LoRa و ماژول GPS L80، میتواند ارتباطات دوربرد را با مصرف انرژی کم ارائه میدهد. همچنین، این دستگاه به دلیل داشتن قابلیتهای sleep mode و شارژ USB، دستگاهی بسیار کارآمدی محسوب میشود.
این دستگاه یک ابزار دقیق و مفید برای ردیابی است و دارای یک گیرنده است که به وایفای متصل میشود و دیتاهای مربوط به موقعیت مکانی (لوکیشن) را به برنامه Blynk ارسال میکند. از جمله مهمترین کاربردهای این دستگاه عبارتاند از:
- یافتن حیوانات خانگی گمشده
- محافظت از اموال ارزشمند
- تسهیل تحقیقات مربوط به حیاتوحش
- ردیابی هرچیزی
منبع: https://how2electronics.com
lora نهایت توی فضای آزاد 10km برد داره و توی شهر به 3km کاهش پیدا میکنه اینطوری که به مشکل میخوره