ساخت سیستم ردیاب خودرو پیامکی کم مصرف (به همراه ویدیو عملکرد)

ردیاب جی‌پی‌اس یکی از ساده‌ترین و جالب‌ترین پروژه‌ها در زمینه الکترونیک است. داستان از اینجا شروع شد که برای یکی از پروژه‌هایمان نیاز به ردیابی موقعیت خودرو داشتیم، بنابراین شروع به جستجوی مدارها و ماژول ها در اینترنت کردیم و از فهمیدن این موضوع بسیار متعجب شدیم. که تعداد کمی ماژول وجود داشت که بتواند همزمان GSM و GPS را داشته باشد.

 علاوه بر این، اکثر پروژه‌های موجود مبتنی بر ماژول‌های SIM900L و NEO6M هستند که برای پروژه‌های همه‌منظوره خوب هستند، اما ما برای کاربرد پروژه خود به چیزی فشرده تر نیاز داشتیم. راه حل این مشکل یک ماژول A9G GSM/GPS است که می تواند هم GSM و هم GPS را در یک ماژول کوچک جمع و جور انجام دهد. بنابراین، در این آموزش، ما تصمیم گرفتیم تا به مشخصات فنی این ماژول بپردازیم و تمام ویژگی های آن را نشان دهیم. همچنین،  یک سیستم ردیاب خودرو پیامکی خواهیم ساخت که می‌تواند موقعیت دستگاه را با یک پیام کوتاه حاوی تمام داده‌های موقعیت مکانی GPS برای شما ارسال کند.

ویژگی های ماژول A9G

ماژول برد مبتنی بر A9G دارای ویژگی های مختلفی است، اکثر ویژگی هایی که این ماژول ارائه می دهد در واقع بر اساس خود تراشه A9G است، اما ویژگی های دیگری نیز وجود دارد که به طور خاص این برد ماژول ارائه می دهد و در این بخش از مقاله به همه آن ویژگی ها خواهیم پرداخت.

ماژول A9G

ساخت سیستم ردیاب خودرو پیامکی کم مصرف (به همراه ویدیو عملکرد)

A9G یک ماژول چهار بانده کامل GSM/GPRS+GPS بر اساس تراشه RDA8955 است. طراحی کم حجم این ماژول یک راه حل مقرون به صرفه برای برنامه های مدرن مبتنی بر اینترنت اشیا ارائه می دهد. مانند هر ماژول GPRS دیگری، این ماژول همچنین دارای قابلیت تماس و پیامک است. به غیر از آن، این ماژول دارای یک حالت کم مصرف با حداقل جریان خواب 2 میلی آمپر است، همچنین امکان به روز رسانی سیستم عامل را از طریق پورت UART ارائه می دهد.

ویژگی های برد راه انداز ماژول A9G

ساخت سیستم ردیاب خودرو پیامکی کم مصرف (به همراه ویدیو عملکرد)

همانطور که از توضیحات بالا می توانید بخوانید، ماژول A9G دارای تعداد زیادی ویژگی است، اما برخی از ویژگی های مهم وجود دارد که که بهتر بود به همراه ماژول ارائه میشد، بنابراین برای از بین بردن این کاستی ها، برد راه انداز این ماژول ارائه شده که شامل ویژگی های مهمی میباشد.

در این برد یک کانکتور باتری اضافه شده تا بتوانید برد را از باتری تغذیه کنید، و روی برد یک مدار شارژر باتری وجود دارد که اگر برق از طریق USB یا پین 5 ولت و GND وارد شود باتری را شارژ می کند. همچنین در قسمت پشتی برد، یک جای سیم کارت و یک جای کارت SD وجود دارد تا بتوانید داده های GPS را روی یک ماژول کارت SD ذخیره کنید.

اجزای مورد نیاز برای سیستم ردیاب خودرو پیامکی آردوینو

برای ساخت یک سیستم ردیاب خودرو پیامکی آردوینو مبتنی بر A9G، به قطعات زیادی نیاز ندارید. برای ساخت این ردیاب جی پی اس آردوینو فقط به چند جزء نیاز دارید.

ساخت سیستم ردیاب خودرو پیامکی کم مصرف (به همراه ویدیو عملکرد)
  • آردوینو پرو مینی
  • تبدیل FTDI USB به سریال.
  • ماژول A9G GSM/GPS
  • نگهدارنده باتری
  • باتری لیتیومی 18650
  • برد هزار سوراخ
  • سیم جامپر
  • پین هدر مادگی
  • باکس برای محفظه

شماتیک مدار سیستم ردیاب خودرو پیامکی GPS آردوینو مبتنی بر A9G

ساخت سیستم ردیاب خودرو پیامکی کم مصرف (به همراه ویدیو عملکرد)

شماتیک سیستم ردیاب خودرو پیامکی GPS مبتنی بر A9G ساده است. ماژول A9G از مجموعه دستورات AT پشتیبانی می کند. برای کنترل ماژول A9G فقط باید برد را با ولتاژ 5 ولت تغذیه کنید و باید پایه TX و RX آردوینو را به پایه RX و TX ماژول A9G متصل کنید. این تمام ارتباطی است که برای کار با این ماژول باید ایجاد نمایید. علاوه بر این، ما از یک باتری برای تغذیه ماژول استفاده می کنیم، بنابراین به جای منبع تغذیه از باتری در شکل شماتیک قرار داده ایم، همچنین میتوانید یک شتاب سنج برای بهبود عملکرد مدار به سیستم اضافه نمایید.

ردیاب gps اردوینو

فهرست فرمان های AT کاربردی ماژول A9G GSM/GPS

اگر برای اولین بار از ماژول A9G GSM و GPS استفاده می کنید. برای استفاده از تمام عملکردهایی که ماژول می تواند انجام دهد، باید به لیست دستورات AT مسلط باشید. برخی از دستورات کاربردی AT در زیر فهرست شده اند.

AT+CREG؟: بررسی میکنید که آیا در یک شبکه رجیستر شده است یا خیر. اگر 1 بود یعنی رجیستر شده است، در غیر این صورت مشکل دارید.

AT+CCID: اطلاعات مربوط به شماره CCID را نشان می دهد.

AT+CSQ: قدرت سیگنال GSM/GPRS را نشان می دهد.

AT+GPS = 1: GPS را روشن می کند.

AT+GPS = 0: GPS را خاموش می کند.

AT+GPSRD=1: شروع به چاپ داده های GPS روی نمایشگر سریال می کند.

AT+GPSRD=0: چاپ داده های GPS را روی نمایشگر سریال متوقف می کند.

AT+LOCATION=1: این دستور برای دریافت اطلاعات مکان از طریق سرور LBS استفاده می شود.

AT+GPSUPGRAD: پورت GPS UART را از CPU A9 آزاد میکند، سپس می توانید GPS UART را مستقیماً برای برقراری ارتباط با GPS متصل کنید.

AT+CIPSTATUS: بررسی می کند که آیا IP متصل است یا خیر.

AT+CGDCONT=1: به اینترنت متصل می شود. به عنوان مثال. AT+CGDCONT=1، “IP”، “www”.

AT+HTTPGET: از HTTPGET برای دریافت اطلاعات از سرور استفاده کنید.

AT+HTTPPOST: از روش POST برای ارسال داده ها به سرور استفاده کنید.

دستورات تماس 

ATA: به تماس ورودی پاسخ دهید.

ATD: یک شماره بگیرید. برای گرفتن یک شماره، یک شماره +ATD ارسال کنید.

ATH: برای قطع تماس ورودی یا خروجی استفاده می شود.

AT+SNFS=0: این دستور برای فعال کردن ایرفون و هدفون آنبورد استفاده می‌شود. وقتی روی 0 تنظیم شود در حالت هدفون یا گوشی است. وقتی روی 1 تنظیم شود در حالت بلندگو قرار دارد.

دستورات پیامک

AT+CMGF=1: از این دستور برای تنظیم فرمت پیام استفاده می شود اگر روی 1 تنظیم شده باشد، در قالب متن است، اگر روی 0 تنظیم شده باشد، فرمت هگز است.

AT+CMGS: این دستور برای ارسال پیام به یک شماره مشخص استفاده می شود. مثال AT+CMGS = “+919804049270”. پس از زدن اینتر به عنوان پاسخ > دریافت خواهید کرد، اکنون پیام خود را تایپ کرده و (0x1A) را برای ارسال اس ام اس با آردوینو بنویسید.

AT+CMGL: این دستور برای خواندن پیامک از حافظه ماژول استفاده می شود.

کد ردیاب gps آردوینو برای ماژول GPS GSM A9G

کد ردیاب A9G GSM/GPS با آردوینو بسیار ساده و قابل درک است، اما قبل از شروع باید کتابخانه TinyGPSPlus.h را دانلود و نصب کنیم و همچنین به کتابخانه سریال نرم افزاری نیاز خواهید داشت.

ما کد خود را با include کردن تمام کتابخانه های مورد نیاز و تعریف همه متغیرهای مورد نیاز برای کد شروع می کنیم. ابتدا کتابخانه TinyGPSPlus و کتابخانه SoftwareSerial را include میکنیم. سپس RXPin و TXPin را تعریف کردیم که ماژول A9G خود را به آن وصل کردیم. در مرحله بعد، یک متغیر از جنس رشته تعریف کرده ایم که در آن لینک دائمی نقشه گوگل را ذخیره کرده ایم.

#include <TinyGPSPlus.h>
#include <SoftwareSerial.h>
static const int RXPin = 6, TXPin = 5;
String s = "www.google.com/maps/dir/";

ما چند متغیر دیگر داریم که بعداً در کد استفاده خواهیم کرد. Interval و previousMillis در قسمتی از کد مورد استفاده قرار خواهند گرفت که در آن ما یک تابع را به طور مکرر پس از یک دوره معین فراخوانی کرده ایم. GPSBaud برای تنظیم نرخ باود پورت سریال نرم افزاری آردوینو استفاده می شود. در نهایت، متغیر data_counter را داریم، هدف ما در کد این است که 10 نقطه داده را از GPS دریافت کرده و از طریق SMS ارسال کنیم که به این منظور از این متغیر استفاده میشود.

unsigned long interval = 10000;
static const uint32_t GPSBaud = 9600;
unsigned long previousMillis = 0;
int data_counter;

بعد، یک بافر بزرگ از جنس کاراکتر داریم. بافر char باید مقادیر اعشاری طولانی را نگه دارد، بنابراین ابتدا یک بافر کاراکتری را ایجاد کرده و سپس آن را به یک اشاره گر شناور تایپ می کنیم تا زمانی که داده ها را به آن اختصاص می دهیم، به طور خودکار در متغیر ذخیره شوند.

const size_t BUFSIZE = 300;
char f_buffer[BUFSIZE];
float *f_buf = (float*)f_buffer;

در مرحله بعد، ما یک شی برای کتابخانه TinyGPSPlus و کتابخانه SoftwareSerial ایجاد کرده ایم.

TinyGPSPlus gps;// The TinyGPSPlus object
SoftwareSerial ss(RXPin, TXPin);// The serial connection to the GPS device

در مرحله بعد، ما تابع setup خود را داریم، در تابع setup، سریال سخت افزاری و سریال نرم افزار را مقداردهی اولیه می کنیم و برای شروع در پنجره نمایشگر سریال و AT را در سریال نرم افزار چاپ می کنیم که به ما پاسخ ok می دهد.

Serial.begin(9600);
ss.begin(GPSBaud); Serial.println("Starting..."); ss.println("\r"); ss.println("AT\r"); delay(10);

بعد، ما دستورات AT خود را داریم که برای فعال کردن GPS استفاده می شود. GPRS را فعال کرده و ماژول را نیز روی حالت TEXT قرار می دهیم تا داده ها را از طریق SMS به صورت متن ارسال کند. در نهایت، GPS را طوری تنظیم می کنیم که داده ها را روی پنجره نمایشگر سریال خروجی بگیرد.

ss.println("\r");
ss.println("AT+GPS=1\r");
delay(100);
ss.println("AT+CREG=2\r");
delay(6000);
//ss.print("AT+CREG?\r");
ss.println("AT+CGATT=1\r");
delay(6000);
ss.println("AT+CGDCONT=1,\"IP\",\"WWW\"\r");
delay(6000);
 // ss.println("AT+LOCATION=1\r");
ss.println("AT+CGACT=1,1\r");
delay(6000);
//Initialize ends
//Initialize GPS
ss.println("\r");
ss.println("AT+GPS=1\r");
delay(1000);
//ss.println("AT+GPSMD=1\r");   // Change to only GPS mode from GPS+BDS, set to 2 to revert to default.
ss.println("AT+GPSRD=10\r");
delay(100);
// set SMS mode to text mode
ss.println("AT+CMGF=1\r");
  delay(1000);
  //ss.println("AT+LOCATION=2\r");
}

در مرحله بعد، ما تابع حلقه خود را داریم، در تابع حلقه، تابع smartDelay (2000) را داریم که تضمین می کند علاوه بر ایجاد تاخیر داده های دریافتی از ماژول GPS در آرایه ای که با آن کار می کنیم دریافت می شود.

 smartDelay(2000);

در مرحله بعد، ما تابع بررسی وضعیت خود را داریم که اگر داده ای از UART دریافت نشود، هر 5 ثانیه یک خطا چاپ می کند.

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));

در نهایت در تابع حلقه یک تابع تایمر داریم. این تابع تایمر هر 30 ثانیه اجرا می‌شود و تابع send_gps_data() را فراخوانی می‌کند که تمام داده‌های GPS را جمع‌آوری می‌کند و وقتی 10 داده جمع‌آوری شد، داده‌ها را از طریق پیامک ارسال می‌کند.

if ((unsigned long)(currentMillis - previousMillis) >= interval) {
    send_gps_data();
    previousMillis = currentMillis;
  }

سپس تابع smartDelay را تعریف میکنیم. این تابع داده های GPS را از سریال نرم افزاری گرفته و تاخیر مورد نیاز را ایجاد میکند.

static void smartDelay(unsigned long ms) {
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

بعد، تابع send_gps_data() را داریم. این تابع داده های GPS را پردازش می کند و آن را در یک متغیر رشته ای قرار می دهد و آن متغیر رشته ای به عنوان پیام ارسال می شود.

void send_gps_data(){
  if (gps.location.lat() == 0 || gps.location.lng() == 0)  {
    Serial.println("Return Executed");
    return;
  }
  data_counter++;
  Serial.print("Latitude (deg): ");
  f_buf[data_counter] = gps.location.lat();
  Serial.println(f_buf[data_counter]);
  Serial.print("Longitude (deg): ");
  f_buf[data_counter + 1] = gps.location.lng();
  Serial.println(f_buf[data_counter + 1]);
  Serial.println(data_counter);
  Serial.println();
  s += String(gps.location.lat(), 6);
  s += ",";
  s += String(gps.location.lng(), 6);
  s += "/";
  Serial.println(s);
  if (data_counter >= 10)  {
    data_counter = 0;
    Serial.println("Sending Message");
    ss.println("AT+CMGF=1\r");
    delay(1000);
    ss.println("AT+CNMI=2,2,0,0,0\r");
    delay(1000);
    ss.print("AT+CMGS=\"+919804049270\"\r"); //Replace this with your mobile number
    delay(1000);
    ss.print(s);
    ss.write(0x1A);
    delay(1000);
    s = "www.google.com/maps/dir/";
  }
}

قسمت هایی از کد هست که نیاز به توضیح دارد. عبارت [if (gps.location.lat() == 0 || gps.location.lng() == 0)] بررسی می کند که آیا داده های دریافتی دیکد شده از gps صفر هستند یا خیر. اگر داده های دیکد شده صفر باشد، به تابع اصلی بازمیگردیم. در غیر این صورت، متغیر data_counter را افزایش می دهیم و مقادیر طول و عرض جغرافیایی را در آرایه بزرگی که قبلاً ایجاد کرده ایم قرار می دهیم. اکنون تمام داده‌هایی را که داریم به متغیر s اضافه می‌کنیم و رشته ایجاد شده را از طریق پیامک ارسال می‌کنیم.

آزمایش سیستم ردیاب خودرو پیامکی GPS مبتنی بر A9G

پس از آماده شدن سخت افزار، می توانیم کد را در آردوینو آپلود کنیم و برد را با باتری روشن کنیم و کل مدار را در جعبه قرار دهیم. پس از روشن کردن برد خواهید دید که دو LED روی برد ماژول A9G چشمک می زند. سمت چپ نشان می دهد که اتصال GSM به شبکه با موفقیت ایجاد شده، LED سمت راست نشان می دهد که ماژول می تواند داده های GPS را از ماهواره دریافت کند. حالا برای اینکه مدار ما کمی تمیز تر به نظر برسد، مدار را در جعبه ای قرار داده ایم و می توانید برد ردیاب GPS آردوینو را در تصویر زیر مشاهده کنید.

سیستم ردیاب خودرو پیامکی

بعد از روشن کردن، برد را بیرون بردیم و کمی قدم زدیم و همانطور که می بینید مختصات GPS را به صورت پیامک دریافت کردیم.

ساخت سیستم ردیاب خودرو پیامکی کم مصرف (به همراه ویدیو عملکرد)

وقتی روی پیام کلیک کردید، چیزی شبیه به آنچه در تصویر زیر می بینید، مشاهده میشود.

ساخت سیستم ردیاب خودرو پیامکی کم مصرف (به همراه ویدیو عملکرد)

و در نهایت این پروژه هم به پایان رسید. نحوه کار پروژه را در ویدیو زیر میتوانید ببینید. اگر سوالی یا ابهامی داشتید میتوانید در بخش نظرات اعلام نمایید.

کد کامل

#include <TinyGPSPlus.h>
#include <SoftwareSerial.h>

static const int RXPin = 6, TXPin = 5;
String s = "www.google.com/maps/dir/";

unsigned long interval = 10000;
static const uint32_t GPSBaud = 9600;
unsigned long previousMillis = 0;
int data_counter;

const size_t BUFSIZE = 300;
char f_buffer[BUFSIZE];
float *f_buf = (float*)f_buffer;

TinyGPSPlus gps;// The TinyGPSPlus object
SoftwareSerial ss(RXPin, TXPin);// The serial connection to the GPS device


void setup()
{
  Serial.begin(9600);
  ss.begin(GPSBaud);
  
  Serial.println("Starting...");
  ss.println("\r");
  ss.println("AT\r");
  delay(10);

  ss.println("\r");
  ss.println("AT+GPS=1\r");

  delay(100);
  ss.println("AT+CREG=2\r");
  delay(6000);

  //ss.print("AT+CREG?\r");
  ss.println("AT+CGATT=1\r");
  delay(6000);

  ss.println("AT+CGDCONT=1,\"IP\",\"WWW\"\r");
  delay(6000);

  // ss.println("AT+LOCATION=1\r");
  ss.println("AT+CGACT=1,1\r");
  delay(6000);

  //Initialize ends
  //Initialize GPS
  ss.println("\r");
  ss.println("AT+GPS=1\r");
  delay(1000);

  //ss.println("AT+GPSMD=1\r");   // Change to only GPS mode from GPS+BDS, set to 2 to revert to default.
  ss.println("AT+GPSRD=10\r");
  delay(100);

  // set SMS mode to text mode
  ss.println("AT+CMGF=1\r");
  delay(1000);

  //ss.println("AT+LOCATION=2\r");

  Serial.println("Setup Executed");
}

void loop() {
//    if (Serial.available()) {      // If anything comes in Serial (USB),
//      ss.write(Serial.read());   // read it and send it out ss (pins 0 & 1)
//    }
//  
//    if (ss.available()) {     // If anything comes in ss (pins 0 & 1)
//      Serial.write(ss.read());   // read it and send it out Serial (USB)
//    }

  smartDelay(2000);

  if (millis() > 5000 && gps.charsProcessed() < 10)
    Serial.println(F("No GPS data received: check wiring"));

  unsigned long currentMillis = millis();

  if ((unsigned long)(currentMillis - previousMillis) >= interval) {

    send_gps_data();
    previousMillis = currentMillis;
  }
}

static void smartDelay(unsigned long ms)
{
  unsigned long start = millis();
  do
  {
    while (ss.available())
      gps.encode(ss.read());
  } while (millis() - start < ms);
}

void send_gps_data()
{
  if (gps.location.lat() == 0 || gps.location.lng() == 0)
  {
    Serial.println("Return Executed");
    return;
  }

  data_counter++;

  Serial.print("Latitude (deg): ");
  f_buf[data_counter] = gps.location.lat();
  Serial.println(f_buf[data_counter]);

  Serial.print("Longitude (deg): ");
  f_buf[data_counter + 1] = gps.location.lng();
  Serial.println(f_buf[data_counter + 1]);

  Serial.println(data_counter);
  Serial.println();

  s += String(gps.location.lat(), 6);
  s += ",";
  s += String(gps.location.lng(), 6);
  s += "/";

  Serial.println(s);

  if (data_counter >= 10)
  {
    data_counter = 0;

    Serial.println("Sending Message");

    ss.println("AT+CMGF=1\r");
    delay(1000);

    ss.println("AT+CNMI=2,2,0,0,0\r");
    delay(1000);

    ss.print("AT+CMGS=\"+91xxxxxxxxxx\"\r");//Replace this with your mobile number
    delay(1000);
    ss.print(s);
    ss.write(0x1A);
    delay(1000);
    s = "www.google.com/maps/dir/";
  }
}

ویدیو

این ویدیو در یوتیوب اپلود شده است. جهت مشاهده ویدیو از ابزارهای تغییر ای پی استفاده نمایید.

منبع : https://circuitdigest.com/microcontroller-projects/a9g-based-gps-tracker-with-arduino
برای امتیاز به این نوشته کلیک کنید!
[کل: 2 میانگین: 1.5]

دیدگاهتان را بنویسید

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