logo-site-sefid
Search
Close this search box.
Untitled-24

ساخت ردیاب برای ماشین

ساخت ردیاب مکان GPS بر پایه IOT با استفاده از ماژول NodeMCU و  Save GPS  –  GPS  مختصات و دید بر روی نقشه های گوگل

01-ردیاب -مکان-GPS-بر-پایه-IOT

در این آموزش 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

03-ساخت-PCB-برای-ردیاب-مکان-GPS

حالا که طرح ما آماده است، زمان آن رسیده که آن‌ها را با استفاده از فایل Gerber بسازیم. بدست آوردن PCB بسیار آسان است. به سادگی مراحل زیر را دنبال کنید.
مرحله ۱: اگر این اولین باری است که این کار را می کنید، به https://www.pcbway.com/ بروید و ثبت‌نام کنید. سپس، در تب PCB Prototype، ابعاد PCB، تعداد لایه‌ها و تعداد PCB مورد نیاز خود را وارد کنید.

04-ساخت-PCB-برای-برد-ردیاب-مکان-GPS

مرحله ۲: با کلیک بر روی دکمه “Quote Now” ادامه دهید. شما به صفحه‌ای برده خواهید شد که در آن برای تنظیم چند پارامتر اضافی در صورت نیاز مانند ماده مورد استفاده، فاصله خط و غیره، اما معمولا، مقادیر پیش‌فرض خوب عمل می‌کنند.

05-ساخت-PCB-برای برد-ردیاب-مکان-GPS

مرحله ۳: مرحله نهایی آپلود فایل Gerber و اقدام به پرداخت است. برای اطمینان از درست بودن فرآیند، PCBWAY تایید می‌کند که آیا فایل Gerber شما قبل از ادامه پرداخت معتبر است یا نه. به این ترتیب، شما می‌توانید مطمئن شوید که PCB شما به صورت گروهی ساخته شده است و در اختیار شما قرار خواهد گرفت.

06-ساخت-PCB-برای-برد-ردیاب-مکان-GPS

مونتاژ PCB ردیاب مکان NodeMCU

پس از چند روز، ما PCB را در یک بسته مرتب دریافت کردیم و کیفیت PCB مثل همیشه خوب بود. لایه بالایی و لایه پایینی برد در زیر نشان‌داده شده‌اند.

07-مونتاز-PCB-ردیاب-مکان

پس از اطمینان از اینکه نشانه ها  درست هستند، با PCB ادامه دادم. همانطور که در تصویر زیر نشان‌داده شده‌است، به نظر می‌رسد برد کاملا لحیم شده است:

08-مونتاژ-PCB-ردیاب-مکان

09-مونتاژ-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

10-کارکرد-ردیاب-GPS

هنگامی که سخت‌افزار و برنامه آماده شدند، کد را در برد NodeMCU آپلود کنید و به بخش راه اندازی توان برسانید. اگر LED روی ماژول GPS چشمک بزند (‏ممکن است چند دقیقه طول بکشد)‏، این بدان معنی است که ماژول به دنبال یک اتصال ماهواره‌ای برای گرفتن مختصات است، اگر ماژول GPS را به منطقه باز نبرید. در نمایشگر سریال می‌توانید آدرس IP محلی NodeMCU خود را ببینید. حال به مرورگر بروید و آدرس IP NodeMCU را تایپ کرده و ENTER را فشار دهید. شما می‌توانید مکان، تاریخ، و زمان نمایش‌داده‌شده در زیر را ببینید:

11-کارکرد-ردیاب-GPS


زمانی که بر روی “Click here” کلیک کنید، این مکان در نقشه گوگل مانند زیر باز خواهد شد:

12-کارکرد-ردیاب-GPS

امیدوارم این آموزش را فهمیده باشید و از ساخت چیزی مفید با آن لذت ببرید. اگر تردیدی دارید، می‌توانید آن‌ها را در بخش نظرات زیر بنویسید.

کد

#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);  
 }

 

 

رضا قنبری
متخصص آموزش رباتیک

رضا قنبری هستم متخصص آموزش رباتیک با بیش از 10 سال سابقه فعالیت در ایران

این مطلب را به اشتراک بگذارید

دسته بندی نشده

ماژول سنسور مجاورت نوری

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

ماژول کاهنده

ماژول كاهنده قبل از خواندن مقاله ماژول كاهنده بهتر است در نظر داشته باشید مقالاتی که با عنوان ماژول در سایت قرار گرفته اند از

3 دیدگاه دربارهٔ «ساخت ردیاب برای ماشین»

  1. بهاره محمدی

    سلام لطفا فایل Gerber را دردسترس قرار بدید من الان برای خرید pcb به اون فایل نیاز دارم

    1. سلام گویا در هنگام نوشته شدن این مطلب این فایل قرار داده نشده لطفا کمی شکیبا باشید تا فایل قراربگیره اگر فایل موجود نبود باید PCB این پروژه طراحی بشه، ممنون از توجه شما

دیدگاه‌ خود را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *