ساخت ردیاب مکان GPS بر پایه IOT با استفاده از ماژول NodeMCU و Save GPS – GPS مختصات و دید بر روی نقشه های گوگل
در این آموزش DIY، قصد داریم ساخت ردیاب مکان GPS بر پایه IoT را با استفاده از ماژول NEO- 6M GPS بسازیم. این برد ردیاب مکان از یک NodeMCU، ماژول صفحه نمایش OLED، ماژول GPS NEO6M و مدار تقویتکننده ۳.۷ تا ۶ ولت تشکیل شدهاست. در اینجا، ما همچنین یک وب سرور محلی ساده برای نمایش جزئیات مکان ایجاد کردهایم. این وب سرور شامل لینکی برای بررسی مستقیم مکان در نقشه گوگل است.
ما از PCBWay در ارائه بردهای PCB برای این پروژه استفاده کردهایم. در بخشهای بعدی این مقاله، ما روند کامل طراحی، سفارش و مونتاژ بردهای PCB برای برد ردیاب مکان بر پایه IoT را با جزئیات پوشش دادهایم.
اجزا مورد نیاز برای ساخت ردیاب مکان GPS
• NodeMCU ESP8266
• ماژول NEO-6M GPS
• ماژول صفحه نمایش OLED
• IC تقویت مبدل FP6291
• 3× Resistor (10k, 100k, 48k)
• 6× Capacitor (2×0.1µf, 1×10µf, 2×20µf)
• 1× Inductor (4.7µH)
• 1× Diode (1N5388BRLG)
• 18650 Lithium Cell
• 18650 Cell Holder
• 6-Pin Push Button Switch
نمودار مدار ردیاب مکان بر پایه IoT
نمودار مدار کامل برای برد ردیاب GPS NodeMCU در زیر نشانداده شدهاست. طرح کلی با استفاده از سایت EasyEDA کشیده شده بود. این HAT شامل یک NodeMCU با ماژول NEO-6M GPS،، ماژول صفحه نمایش OLED و مدار Booster میباشد. مدار تقویت کننده در اطراف یک IC تقویت مبدل FP6291 طراحی شدهاست تا ولتاژ باتری را از 3.7 ولت به ۶ ولت افزایش دهد. این برد ردیاب مکان میتواند برای ردیابی ماشینها / دوچرخه ها / تقریبا هر چیزی استفاده شود.
FP6291 IC یک IC بالا برنده تقویتDC – DC 1 مگاهرتزاست، که عمدتا در برنامه کاربردی استفاده میشود، برای مثال با ثابت نگه داشتن ۵ ولت از باتری ۳ ولت. شما تنها به چند جز اضافی برای طراحی یک مدار تقویتکننده با این IC نیاز دارید. در اینجا، در این مدار، مدار تقویت مبدل، منبع ورودی را از طریق پایانههای باتری دریافت میکند (+ و -). سپس این ولتاژ ورودی توسط FP6291 IC پردازش میشود تا منبع پایدار ۶ ولت DC را به پین VIN of NodeMCU بدهد.
ولتاژ خروجی از این IC را می توان با استفاده از مدار تقسیم کننده پتانسیل پیکربندی کرد. فرمول محاسبه ولتاژ خروجی به صورت زیر است:
VOUT = 0.6(1+ R1/ R2)
ساختPCB برای برد ردیاب NodeMCU GPS
اکنون که نحوه کار طرحهای کلی را درک میکنیم، میتوانیم به ساخت PCB برای پروژه ساخت ردیاب خود ادامه دهیم. شما میتوانید PCB را با استفاده از هر نرمافزار انتخابی خود طراحی کنید. ما ازسایت EasyEDA برای این پروژه استفاده کردیم تا PCB را بسازیم. ما قبلا چندین بار از سایت EasyEDA استفاده کردهایم و متوجه شدهایم که استفاده از آن در مقایسه با دیگر سازندگان PCB بسیار راحت تر است. آنها همچنین یک سرویس منبع یابی جز ارائه میدهند که در آن موجودی زیادی از اجزای الکترونیکی دارند و کاربران میتوانند اجزای مورد نیاز خود برای ساخت ردیاب را همراه با سفارش PCB سفارش دهند.
در حین طراحی مدارها و PCB ها، میتوانید مدار خود را نیز بسازید و PCB را بصورت عمومی طراحیکنید تا کاربران دیگر بتوانند آنها را کپی یا ویرایش کنند و از کار شما بهره ببرند. ما همچنین این فایل طراحی PCB توسط NodeMCU GPS و فایل GERBER را عمومی کردهایم.
دانلود فایل PCB
حالا که طرح ما آماده است، زمان آن رسیده که آنها را با استفاده از فایل Gerber بسازیم. بدست آوردن PCB بسیار آسان است. به سادگی مراحل زیر را دنبال کنید.
مرحله ۱: اگر این اولین باری است که این کار را می کنید، به https://www.pcbway.com/ بروید و ثبتنام کنید. سپس، در تب PCB Prototype، ابعاد PCB، تعداد لایهها و تعداد PCB مورد نیاز خود را وارد کنید.
مرحله ۲: با کلیک بر روی دکمه “Quote Now” ادامه دهید. شما به صفحهای برده خواهید شد که در آن برای تنظیم چند پارامتر اضافی در صورت نیاز مانند ماده مورد استفاده، فاصله خط و غیره، اما معمولا، مقادیر پیشفرض خوب عمل میکنند.
مرحله ۳: مرحله نهایی آپلود فایل Gerber و اقدام به پرداخت است. برای اطمینان از درست بودن فرآیند، PCBWAY تایید میکند که آیا فایل Gerber شما قبل از ادامه پرداخت معتبر است یا نه. به این ترتیب، شما میتوانید مطمئن شوید که PCB شما به صورت گروهی ساخته شده است و در اختیار شما قرار خواهد گرفت.
مونتاژ PCB ردیاب مکان NodeMCU
پس از چند روز، ما PCB را در یک بسته مرتب دریافت کردیم و کیفیت PCB مثل همیشه خوب بود. لایه بالایی و لایه پایینی برد در زیر نشانداده شدهاند.
پس از اطمینان از اینکه نشانه ها درست هستند، با PCB ادامه دادم. همانطور که در تصویر زیر نشانداده شدهاست، به نظر میرسد برد کاملا لحیم شده است:
برنامهنویسی NodeMCU برای به دست آوردن دادههای GPS
برنامه کامل را می توان در پایان صفحه یافت، توضیح آن به شرح زیر است. اطمینان حاصل کنید که قبل از رفتن به کد مورد نظر، کتابخانههای مربوط به ماژول GPS و صفحه نمایش OLED را نصب کردهاید. برای آموزش برنامه نویسی ربات ها میتوانید از کلاس های آموزش رباتیک چالیک استفاده کنید.
مانند همیشه، ما برنامه را با اضافه کردن کتابخانههای مورد نیاز آغاز میکنیم. در اینجا، از کتابخانهAdafruit _ SSD1306 h برای صفحه نمایش OLED استفاده میشود، و کتابخانه ++TinyGPSو SoftwareSerial برای ارتباط GPS استفاده میشود.
#include <TinyGPS++.h> #include <SoftwareSerial.h> #include <ESP8266WiFi.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h>
سپس عرض و ارتفاع OLED را تعریف کنید. در پروژه ساخت ردیاب ، ما از یک صفحه نمایش 64 × 128 SPI OLED استفاده میکنیم. شما میتوانید متغیرهای ارتفاع SCREEN _ WIDTH و SCREEN _ HEIGHT را با توجه به صفحه نمایش خود تغییر دهید.
#define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64
سپس، یک نمونه صفحه نمایش Adafruit با عرض و ارتفاع تعریفشده قبلی با پروتکل ارتباطی I2C ایجاد کنید.
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
در داخل تابع ()setup، نمایشگر سریال را آغاز کنید و همچنین سریال نرمافزاری را به عنوان “ss” برای ارتباط با ماژول GPS و صفحه نمایش OLED با تابع ()begin راهاندازی کنید.
void setup() { Serial.begin(115200); ss.begin(9600); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); } if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); } }
حال، در داخل تابع ()loop، ما از کتابخانه TinyGPS برای استخراج دادههای عرض جغرافیایی، طول جغرافیایی، تاریخ و زمان از رشته استفاده میکنیم و مقادیر را به ترتیب در متغیرهای “date_str”, “time_ str”,” lat-str”, “lng-str” ذخیره میکنیم. کتابخانه TinyGPS یک تابع داخلی برای به دست آوردن دادههای مورد نیاز از رشته NMEA دارد. کد مشابه به شرح زیر است:
if (gps.encode(ss.read())) { if (gps.location.isValid()) { latitude = gps.location.lat(); lat_str = String(latitude , 6); longitude = gps.location.lng(); lng_str = String(longitude , 6); } if (gps.date.isValid()) { date_str = ""; date = gps.date.day(); month = gps.date.month(); year = gps.date.year(); if (date < 10) date_str = '0'; date_str += String(date); date_str += " / "; ……………………………………….. ………………………………………..
زمانی که یک client متصل میشود، وب سرور نیاز به ارسال پاسخ به client دارد. در اینجا، تمام کد HTML در متغیری به نام “s” تعبیه شدهاست. سپس این متغیر با استفاده از (s)client.print چاپ میشود تا تمام کد HTML تعبیهشده را به صفحه وب ارسال کند. مقادیر عرض جغرافیایی، طول جغرافیایی، تاریخ و زمان به محض دریافت دادهها از ماژول GPS به روز رسانی میشوند.
String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n <!DOCTYPE html> <html> <head> <title>Location Tracking with NodeMCU</title> <style>"; s += "a:link {background-color: YELLOW;text-decoration: none;}"; s += "table, th, td {border: 1px solid black;} </style> </head> <body> <h1 style="; s += "font-size:300%;"; s += " ALIGN=CENTER> Locatoin Tracking with NodeMCU</h1>"; s += "<p ALIGN=CENTER font-size:150%;"""; s += "> <b>Location Details</b></p> <table ALIGN=CENTER style="; s += "width:50%"; s += "> <tr> <th>Latitude</th>"; s += "<td ALIGN=CENTER >"; s += lat_str; ………………………………….. …………………………………..
کارکرد ردیاب NodeMCU GPS
هنگامی که سختافزار و برنامه آماده شدند، کد را در برد NodeMCU آپلود کنید و به بخش راه اندازی توان برسانید. اگر LED روی ماژول GPS چشمک بزند (ممکن است چند دقیقه طول بکشد)، این بدان معنی است که ماژول به دنبال یک اتصال ماهوارهای برای گرفتن مختصات است، اگر ماژول GPS را به منطقه باز نبرید. در نمایشگر سریال میتوانید آدرس IP محلی NodeMCU خود را ببینید. حال به مرورگر بروید و آدرس IP NodeMCU را تایپ کرده و ENTER را فشار دهید. شما میتوانید مکان، تاریخ، و زمان نمایشدادهشده در زیر را ببینید:
زمانی که بر روی “Click here” کلیک کنید، این مکان در نقشه گوگل مانند زیر باز خواهد شد:
امیدوارم این آموزش را فهمیده باشید و از ساخت چیزی مفید با آن لذت ببرید. اگر تردیدی دارید، میتوانید آنها را در بخش نظرات زیر بنویسید.
کد
#include <TinyGPS++.h> #include <SoftwareSerial.h> #include <ESP8266WiFi.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); TinyGPSPlus gps; // The TinyGPS++ object SoftwareSerial ss(2, 0); // The serial connection to the GPS device const char* ssid = "Galaxy-M20"; const char* password = "ac312124"; float latitude , longitude; int year , month , date, hour , minute , second; String date_str , time_str , lat_str , lng_str; int pm; //int numreadings = 10; String latarray[20]; String lngarray[20]; //String current_latarray[10], current_lngarray[10], previous_latarray[10], previous_lngarray[10] ; unsigned int i = 0; const unsigned long Interval = 13000; unsigned long previousTime = 0; WiFiServer server(80); void setup() { Serial.begin(115200); ss.begin(9600); delay(2000); // Pause for 2 seconds Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); server.begin(); Serial.println("Server started"); // Print the IP address Serial.println(WiFi.localIP()); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); for(;;); } } void loop() { unsigned long currentTime = millis(); display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); while (ss.available() > 0) if (gps.encode(ss.read())) { if (currentTime - previousTime >= Interval) { if (gps.location.isValid()) { //Serial.print("Getting Data"); latitude = gps.location.lat(); lat_str = String(latitude , 6); longitude = gps.location.lng(); lng_str = String(longitude , 6); latarray[i] = lat_str; lngarray[i]= lng_str; i++; Serial.print(i); if (i>=20) // { i=0; //reset to beginning of array, so you don't try to save readings outside of the bounds of the array // } Serial.println("Latitude:"); Serial.println(latarray[i]); Serial.println("Longitude:"); Serial.println(lngarray[i]); Serial.println(); display.setCursor(0, 20); display.println("Lat:"); display.setCursor(27, 20); display.println(lat_str); display.setCursor(0, 40); display.println("Lng:"); display.setCursor(27, 40); display.println(lng_str); display.display(); } previousTime = currentTime; } //} if (gps.date.isValid()) { //Serial.print("Getting Time"); date_str = ""; date = gps.date.day(); month = gps.date.month(); year = gps.date.year(); if (date < 10) date_str = '0'; date_str += String(date); date_str += " / "; if (month < 10) date_str += '0'; date_str += String(month); date_str += " / "; if (year < 10) date_str += '0'; date_str += String(year); } if (gps.time.isValid()) { time_str = ""; hour = gps.time.hour(); minute = gps.time.minute(); second = gps.time.second(); minute = (minute + 30); if (minute > 59) { minute = minute - 60; hour = hour + 1; } hour = (hour + 5) ; if (hour > 23) hour = hour - 24; if (hour >= 12) pm = 1; else pm = 0; hour = hour % 12; if (hour < 10) time_str = '0'; time_str += String(hour); time_str += " : "; if (minute < 10) time_str += '0'; time_str += String(minute); time_str += " : "; if (second < 10) time_str += '0'; time_str += String(second); if (pm == 1) time_str += " PM "; else time_str += " AM "; } } // Check if a client has connected WiFiClient client = server.available(); if (!client) { return; } // Prepare the response String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n <!DOCTYPE html> <html> <head> <title>Location Tracking with NodeMCU</title> <style>"; s += "a:link {background-color: YELLOW;text-decoration: none;}"; s += "table, th, td {border: 1px solid black;} </style> </head> <body> <h1 style="; s += "font-size:300%;"; s += " ALIGN=CENTER> Locatoin Tracking with NodeMCU</h1>"; s += "<p ALIGN=CENTER style=""font-size:150%;"""; s += "> <b>Location Details</b></p> <table ALIGN=CENTER style="; s += "width:50%"; s += "> <tr> <th>Latitude</th>"; s += "<td ALIGN=CENTER >"; s += lat_str; s += "</td> </tr> <tr> <th>Longitude</th> <td ALIGN=CENTER >"; s += lng_str; s += "</td> </tr> <tr> <th>Date</th> <td ALIGN=CENTER >"; s += date_str; s += "</td></tr> <tr> <th>Time</th> <td ALIGN=CENTER >"; s += time_str; s += "</td> </tr> </table> "; if (gps.location.isValid()) { // s += "<p align=center><a style=""color:RED;font-size:125%;"" href=""http://maps.google.com/maps?&z=15&mrt=yp&t=k&q="; s += "<p align=center><a style=""color:RED;font-size:125%;"" href=""https://www.google.com/maps/dir/"; //https://www.google.com/maps/dir/26.8172985,75.8286322/26.8181889,75.8309...@26.8189438,75.8281702,17z/data=!3m1!4b1!4m2!4m1!3e0 for (int j=0; j<20; j++) { s += latarray[j]; s += ","; s += lngarray[j]; if (j<10) s += "/"; } s += """ target=""_top"">Click here!</a> To check the location in Google maps.</p>"; } s += "</body> </html> \n"; client.print(s); delay(200); }
3 دیدگاه دربارهٔ «ساخت ردیاب برای ماشین»
سلام لطفا فایل Gerber را دردسترس قرار بدید من الان برای خرید pcb به اون فایل نیاز دارم
سلام گویا در هنگام نوشته شدن این مطلب این فایل قرار داده نشده لطفا کمی شکیبا باشید تا فایل قراربگیره اگر فایل موجود نبود باید PCB این پروژه طراحی بشه، ممنون از توجه شما
لینک دانلود این فایل قرار گرفت ممنون از شکیبایی شما