Track ME: Prototipe Pelacak Mobil Arduino Mega 2560 dengan GPS & GPRS
Komponen dan Perlengkapan
Arduino Mega 2560
×
1
NEO 6 GPS
×
1
Adafruit SD Card Shield
×
1
Adafruit SD Card Shield
×
1
Seeedstudio gprs shield V2.0
×
1
Seeed GPRS Shield V2.0
×
1
Kabel jumper (generik)
×
1
Baterai 9V (generik)
×
1
Box
×
1
Box
×
1
Tentang Proyek Ini
Beberapa waktu lalu saya memutuskan untuk membuat pelacak Mobil/Pribadi.
Ini adalah prototip pertama saya di arah ini.
Sistem itu sendiri sangat sederhana. Hanya Arduino Mega, GPS, GPRS Shield dan Kartu SD. Ini adalah opsional tetapi saya sertakan karena saya memikirkan tantangan untuk teman-teman saya di Facebook, mereka menelepon sistem dan mendapatkan SMS dengan posisi saya atau posisi terakhir yang diketahui.
Sistem selalu mencari posisi aktual. Jika seseorang menelepon nomor kartu SIM, sistem akan mengirim SMS dengan posisi aktual dan dengan link ke google maps. Contoh:
Hugo location is now: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997
Jika GPS tidak menerima posisi apa pun, sistem akan mengirim posisi terakhir yang diketahui. Contoh:
I can not seem to find Hugo. Last time that I've saw him, was in: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997
Tanggal, waktu, posisi dan status SMS kemudian disimpan di Kartu SD.
Komponen
Saya menggunakan:
1x Arduino MEGA
1x GPRS Shield (Mungkin juga untuk menggunakan GSM shield lain yang tersedia di pasaran)
1x GPS (Saya menggunakan NEO 6, sangat populer di ebay)
1x SD Card Shield
1x 9V Battery
1x Kotak Plastik
Beberapa kabel
Menghubungkan Komponen
Karena Arduino Mega menggunakan pinout yang berbeda, beberapa rerangkaian diperlukan.
Pertama SD Card Shield, yang dirancang untuk Arduino Uno, menggunakan pin 10 hingga 13 untuk SPI, jadi agar ini dapat bekerja pada Mega, mereka perlu "dipindahkan" ke pin SPI pada MEGA.
Pin SPI Arduino UNO - Pin SPI Arduino MEGA
MOSI - 11 ke 51
MISO - 12 ke 50
SCK - 13 ke 52
SS - 10 ke 53
Pada GPRS Shield pertama perlu menyiapkan pin komunikasi ke Software Serial di J7 jumper pada shield.
Kemudian menggunakan beberapa kabel saya menghubungkan Pin 7 dan 8 di GPRS shield ke port Serial 1 (pin 18 dan 19 di Arduino Mega).
Untuk detail lebih lanjut tentang cara menghubungkan Kartu SIM di GPRS Shield, silakan lihat proyek saya lainnya di Hackster.
GPS terhubung ke port Serial 2 (pin 16 dan 17) di Arduino Mega.
Juga daya yang diperlukan untuk GPS diambil dari pin 5V dan pin GND Kartu SD.
Baterai 9V dapat dihubungkan ke pin Vin atau ke colokan daya.
Persiapan untuk menutup kotak dan pengujian lapangan.
Kode
Saya meninggalkan beberapa catatan singkat tentang kode di sini.
Saya menggunakan perpustakaan ini untuk GPRS Shield.
Diperlukan beberapa perubahan untuk menggunakan Arduino Mega:
1) Buka GSM.h dan komentar-komentarkan baris yang sesuai seperti di bawah ini misalnya untuk Arduino Mega:
//#define UNO
#define MEGA
2) Di HWSerial.h buka komentar baris untuk definisi Mega misalnya untuk Arduino Mega:
#define MEGA
Untuk GPS saya menggunakan perpustakaan ini.
Program itu sendiri berjalan dengan cara yang sangat sederhana. Setelah semua rutinitas startup (inisialisasi GPRS, GPS dan Kartu SD), GPS akan mencoba menentukan jumlah satelit yang tersedia dan titik koordinat GPS yang valid.
Jika panggilan dilakukan selama periode ini, panggilan akan ditolak secara otomatis dan tidak akan terjadi apa-apa.
Ketika GPS memiliki lokasi valid dan mendeteksi lebih dari 3 satelit (saya mengasumsikan bahwa GPS memiliki penerimaan yang baik), jika panggilan dilakukan, sistem akan mengirim SMS ke nomor panggilan dengan posisi saya. Semua data ini akan disimpan di Kartu SD.
Jika GPS memiliki kurang dari 3 satelit, tidak ada posisi valid yang dapat diambil, jadi jika panggilan dilakukan, nomor panggilan akan menerima SMS dengan posisi terakhir yang diketahui saya. Lagi semua data disimpan di Kartu SD.
Kelebihan dan Kekurangan
Karena ini adalah prototipe, ada banyak hal yang tidak bekerja dengan baik. Namun tujuannya selalu untuk memperbaiki.
Pertama baterai hanya bertahan selama satu jam!! Saya tidak menerapkan mekanisme hemat energi dalam perangkat lunak. Jadi untuk perbaikan di masa depan "Sleep Mode" adalah keharusan.
Ukuran juga ditinjau dan saya merancang papan baru sepenuhnya. Tampilan pertama adalah ini:
Silakan tulis kepada saya jika Anda menemukan kesalahan atau jika Anda memiliki saran/perbaikan atau pertanyaan.
Terima kasih telah membaca.
Hugo Gomes
Kode
Kode
KodeArduino
#include "SIM900.h" #include <SoftwareSerial.h> #include "sms.h" #include "call.h" #include <TinyGPS++.h> //To change pins for Software/Hardware Serial, use 27, 28 lines in GSM.cpp. //To use Arduino Mega please define MEGA in line 5 in GSM.h. #include <SPI.h> #include <SD.h> //Mega CS pin const int chipSelect = 53; //We have to create the classes for SMSs and calls. CallGSM call; SMSGSM sms; char number[20]; byte stat = 0; int value = 0; char value_str[5]; //GPS Variable // The TinyGPS++ object TinyGPSPlus gps; const char *googlePrefix = "https://maps.google.com/maps?q="; double Lat; double Long; int day, month, year; int hour, minute, second; int num_sat; boolean one_point_true = false; void setup() { //Serial connection. Serial.begin(9600); //GPRS connection Serial.print(F("Starting GSM...")); //Start configuration of shield with baudrate. if (gsm.begin(9600)) Serial.println(F("READY")); else Serial.println(F("IDLE")); //GPS connection Serial.println(F("Starting GPS"); //GPS com port Serial2.begin(9600); //SD Card start Serial.print(F("Initializing SD card...")); // make sure that the default chip select pin is set to // output, even if you don't use it: pinMode(53, OUTPUT); // see if the card is present and can be initialized: if (!SD.begin(chipSelect)) { Serial.println(F("Card failed, or not present"); // don't do anything more: return; } Serial.println(F("card initialized.")); } //****************************************************************************** //Main loop void loop() { Get_GPS(); // Get the position Check_call(); //See if anyone is calling }; //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // Get the position from the GPS void Get_GPS() { while (Serial2.available() > 0) if (gps.encode(Serial2.read())) num_sat = gps.satellites.value(); //Serial.println(num_sat); if (gps.location.isValid() == 1) { Lat = gps.location.lat(); Long = gps.location.lng(); if (Lat != 0 && Long != 0) one_point_true = true; } if (gps.date.isValid()) { day = gps.date.day(); month = gps.date.month(); year = gps.date.year(); } if (gps.time.isValid()) { hour = gps.time.hour(); minute = gps.time.minute(); second = gps.time.second(); } smartDelay(500); if (millis() > 5000 && gps.charsProcessed() < 10) { Serial.println(F("No GPS detected: check wiring.")); while (true); } } //****************************************************************************** // This custom version of delay() ensures that the gps object // is being "fed". static void smartDelay(unsigned long ms) { unsigned long start = millis(); do { while (Serial2.available()) gps.encode(Serial2.read()); } while (millis() - start < ms); } //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // Check to see if anyone is calling void Check_call() { //Checks status of call stat = call.CallStatusWithAuth(number, 0, 0); //If the any incoming call if (stat == CALL_INCOM_VOICE_AUTH) { delay(100); //Hang up the call. call.HangUp(); //Reject the call Send_SMS(); } } //////////////////////////////////////////////////////////////////////////////// //****************************************************************************** // Send an SMS with the current position or the last known position void Send_SMS() { int error; char Date[13]; sprintf(Date, "%02d/%02d/%04d ", day, month, year); char time1[10]; sprintf(time1, "%02d:%02d:%02d ", hour, minute, second); //Serial print GPS data /* Serial.print(Date); Serial.print(" "); Serial.print(time1); Serial.print(" "); Serial.print("Lat: "); Serial.print(Lat, 6); Serial.print(" "); Serial.print("Long: "); Serial.println(Long, 6); */ delay(100); char lat_print[10]; dtostrf(Lat, 5, 6, lat_print); char Long_print[10]; dtostrf(Long, 5, 6, Long_print); if (num_sat >= 3 && one_point_true == true) { char sms_OK[160]; sprintf(sms_OK, "Hugo location is now: Lat: %s, Log: %s. %s%s,+%s\n", lat_print, Long_print, googlePrefix, lat_print, Long_print); Serial.println(sms_OK); error = sms.SendSMS(number, sms_OK); delay(500); if (error == 0) //Check status { Serial.println(F("SMS ERROR"); } else { Serial.println(F("SMS OK"); } } else if (num_sat < 3 && one_point_true == true) { char sms_NOK[150]; sprintf(sms_NOK, "I can not seen to find Hugo. Last time that i've saw him, was in: Lat: %s, Log: %s. %s%s,+%s\n", lat_print, Long_print, googlePrefix, lat_print, Long_print); Serial.println(sms_NOK); int error = sms.SendSMS(number, sms_NOK); if (error == 0) //Check status { Serial.println(F("SMS ERROR"); } else { Serial.println(F("SMS OK"); } } else if (one_point_true == false) { Serial.println(F("No valid GPS point"); } //Save everything in the SD Card File dataFile = SD.open("datalog.txt", FILE_WRITE); // if the file is available, write to it: if (dataFile) { dataFile.print(Date); dataFile.print(" "); dataFile.print(time1); dataFile.print(" "); dataFile.print(number); dataFile.print(" "); dataFile.print(lat_print); dataFile.print(", "); dataFile.print(Long_print); dataFile.print(" "); dataFile.print(error); dataFile.println(); dataFile.close(); } // if the file isn't open, pop up an error: else { Serial.println(F("error opening datalog.txt"); } } ////////////////////////////////////////////////////////////////////////////////