Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS

Компоненты и расходники

Arduino Mega 2560 × 1
GPS-модуль NEO-6M × 1
SD-карта Shield (Adafruit) × 1
GPRS Shield V2.0 (Seeedstudio) × 1
Перемычки × 1
Крона 9V × 1
Корпус (пластиковый бокс) × 1

О проекте

Решил построить трекер для автомобиля/личного использования. Это первый прототип в этом направлении.

Система проста: Arduino Mega, GPS, GPRS Shield, SD-карта (опционально, для логирования и челленджа друзьям в Facebook — звонят на номер SIM и получают SMS с координатами).

Система постоянно ищет актуальную позицию. При входящем звонке на номер SIM-карты отправляется SMS с текущими координатами и ссылкой на Google Maps. Пример:

Hugo location is now: Lat: 54.315010, Log: 10.130997. https://maps.google.com/maps?q=54.315010,+10.130997

Если GPS не имеет фикса, отправляется последняя известная позиция:

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

Дата, время, позиция и статус SMS записываются на SD-карту.

Компоненты

Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS

Подключение компонентов

Arduino Mega имеет другую распиновку SPI, поэтому SD-шилд (расчитанный на Uno) требует переподключения:

Arduino UNO SPIArduino MEGA SPI
MOSI — 11→ 51
MISO — 12→ 50
SCK — 13→ 52
SS — 10→ 53
Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS

GPRS Shield: переключить джампер J7 на Software Serial. Соединить пины 7 и 8шилда с Serial1 Mega (пины 18 — TX, 19 — RX).

Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS
Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS

GPS подключается к Serial2 (пины 16 — TX, 17 — RX). Питание GPS берётся с 5V и GND SD-шилда.

Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS

Батарея 9V на Vin или джек питания.

Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS
Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS
Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS
Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS

Код — заметки

Логика работы: после инициализации (GPRS, GPS, SD) GPS ищет спутники и валидные координаты. Звонки в этот период отклоняются. При валидной позиции и ≥3 спутниках — отправляется SMS с текущими координатами. При <3 спутниках — последняя известная позиция. Все данные логируются на SD.

Плюсы и минусы прототипа

Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS

Пишите, если найдёте ошибки или есть идеи по улучшению.

Hugo Gomes

Код

#include "SIM900.h"
#include <SoftwareSerial.h>
#include "sms.h"
#include "call.h"
#include <TinyGPS++.h>
// Для Mega: в GSM.cpp строки 27-28 менять пины Software/Hardware Serial
// В GSM.h: #define MEGA
#include <SPI.h>
#include <SD.h>

const int chipSelect = 53; // Mega CS pin
CallGSM call;
SMSGSM sms;
char number[20];
byte stat = 0;
int value = 0;
char value_str[5];

TinyGPSPlus gps;
const char *googlePrefix = "https://maps.google.com/maps?q=";
double Lat, Long;
int day, month, year, hour, minute, second;
int num_sat;
boolean one_point_true = false;

void setup() {
  Serial.begin(9600);
  Serial.print(F("Starting GSM..."));
  if (gsm.begin(9600)) Serial.println(F("READY"));
  else Serial.println(F("IDLE"));

  Serial.println(F("Starting GPS"));
  Serial2.begin(9600); // GPS на Serial2

  Serial.print(F("Initializing SD card..."));
  pinMode(53, OUTPUT);
  if (!SD.begin(chipSelect)) {
    Serial.println(F("Card failed, or not present"));
    return;
  }
  Serial.println(F("card initialized."));
}

void loop() {
  Get_GPS();
  Check_call();
}

// Получение позиции от GPS
void Get_GPS() {
  while (Serial2.available() > 0)
    if (gps.encode(Serial2.read()))
      num_sat = gps.satellites.value();

  if (gps.location.isValid()) {
    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);
  }
}

// Умная задержка, кормящая GPS парсер
static void smartDelay(unsigned long ms) {
  unsigned long start = millis();
  do {
    while (Serial2.available()) gps.encode(Serial2.read());
  } while (millis() - start < ms);
}

// Проверка входящего вызова
void Check_call() {
  stat = call.CallStatusWithAuth(number, 0, 0);
  if (stat == CALL_INCOM_VOICE_AUTH) {
    delay(100);
    call.HangUp(); // сбрасываем вызов
    Send_SMS();
  }
}

// Отправка SMS с позицией
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);
  delay(100);

  char lat_print[10], Long_print[10];
  dtostrf(Lat, 5, 6, lat_print);
  dtostrf(Long, 5, 6, Long_print);

  if (num_sat >= 3 && one_point_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);
    Serial.println(error ? F("SMS OK") : F("SMS ERROR"));
  } else if (num_sat < 3 && one_point_true) {
    char sms_NOK[150];
    sprintf(sms_NOK, "I can not seem 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);
    error = sms.SendSMS(number, sms_NOK);
    Serial.println(error ? F("SMS OK") : F("SMS ERROR"));
  } else {
    Serial.println(F("No valid GPS point"));
  }

  // Лог на SD
  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  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();
  } else {
    Serial.println(F("error opening datalog.txt"));
  }
}

Схемы

Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS Track ME: прототип автомобильного трекера на Arduino Mega 2560 с GPS и GPRS

Производственный процесс

  1. Создание умного робота с Bridge Shield — интеграция Raspberry Pi и Arduino
  2. Веб-управляемая DMX-система освещения: Arduino Mega как мастер-контроллер
  3. Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
  4. UnifiedWater v1: полный набор датчиков качества воды на Arduino MKR GSM
  5. HSV Clock: Яркие, настраиваемые часы для энтузиастов Arduino
  6. Продвинутый робот-снегоочиститель для эффективной зимней уборки
  7. Переносная система голосования с GSM-связью
  8. DIY аркадная игра Whac-A-Mole (кнопочная версия) — проект на Arduino
  9. Модерн-джукебокс: Raspberry Pi + Arduino, LED-визиализация музыки, 3D-корпус
  10. DIY Arduino Smartwatch: самодельные умные часы в стиле Apple Watch