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

Создание GPS-уведомителя о прибытии с Arduino UNO и модулем NEO-6M

Компоненты и материалы

Arduino UNO1 шт.
GPS-модуль NEO-6M1 шт.
Светодиод (любой)1 шт.
Драйвер двигателей L293D1 шт.
Вибромотор (дисковый)1 шт.
Макетная плата1 шт.
Крона 9В1 шт.
Разъем Jack для короны 9В1 шт.
Корпус для проекта1 шт.
Перемычки1 набор

Необходимые инструменты

Программное обеспечение

О проекте

Проблема и решение

Пробки — главная потеря времени в городе. Непредсказуемое время в пути заставляет терять часы в ожидании. Автор проекта, пользующийся общественным транспортом, решил использовать это время с пользой: планированием, обучением или творчеством. Родилась идея устройства, уведомляющего о приближении к пункту назначения — светодиодом или вибрацией.

Принцип работы

Устройство определяет текущие координаты через GPS, вычисляет расстояние до заданных координат цели и при входе в заданный радиус (например, 50 метров) активирует индикатор.

Подключение GPS-модуля NEO-6M

Пин модуляПодключение к Arduino
VCCVIN (5В)
RXTX программного Serial (пин 3)
TXRX программного Serial (пин 4)
GNDGND

Модуль работает от 3–5В, скорость 9600 бод, протокол NMEA.

Почему используется драйвер L293D?

Микроконтроллер выдает слабый ток. L293D усиливает сигнал для управления вибромотором (или другим исполнительным механизмом).

Библиотека TinyGPS++

Упрощает парсинг NMEA-данных. Дает доступ к: широте, долготе, дате, времени, скорости, курсу, высоте, количеству спутников, HDOP.

Этап 1: Получение координат цели

Загрузите скетч Read_Lat_Lng.ino, откройте монитор порта (9600 бод). Дождитесь фиксации спутников (мигает светодиод на модуле). Запишите широту и долготу цели.

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
void setup() {
  Serial.begin(9600);
  ss.begin(GPSBaud);
}
void loop() {
  while (ss.available() > 0) {
    gps.encode(ss.read());
    if (gps.location.isUpdated()) {
      Serial.print("Latitude= ");
      Serial.print(gps.location.lat(), 6);
      Serial.print(" Longitude= ");
      Serial.println(gps.location.lng(), 6);
    }
  }
}

Этап 2: Уведомитель через светодиод

Схема: светодиод на пине 13 (встроенный) или внешний через резистор 220 Ом. В коде задаются координаты цели (Dest_LAT, Dest_LON) и порог срабатывания (0.05 км = 50 м).

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0;
int ledPin = 13;
void setup() {
  Serial.begin(115200);
  ss.begin(GPSBaud);
  pinMode(ledPin, OUTPUT);
}
void loop() {
  while (ss.available() > 0) gps.encode(ss.read());
  if (gps.location.isUpdated()) {
    Serial.print(F(" Lat="));
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(" Long="));
    Serial.println(gps.location.lng(), 6);
  }
  else if (millis() - last > 5000) {
    if (gps.location.isValid()) {
      static const double Dest_LAT = 18.786254, Dest_LON = 73.880798; // ЗАМЕНИТЕ НА СВОИ
      double distanceToDest = TinyGPSPlus::distanceBetween(
        gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
      Serial.print(F("Distance to Destination ="));
      Serial.print(distanceToDest / 1000, 6);
      if (distanceToDest / 1000 < 0.05) digitalWrite(ledPin, HIGH);
      else digitalWrite(ledPin, LOW);
    }
    if (gps.charsProcessed() < 10) Serial.println(F("WARNING: No GPS data. Check wiring."));
    last = millis();
  }
}

Этап 3: Финальная версия с вибромотором

Для автономной работы всё помещается в корпус: Arduino, GPS, L293D, вибромотор, питание от короны 9В.

Подключение L293D и вибромотора

Код для вибромотора (Destination_notifier_motor.ino)

#include <TinyGPS++.h>
#include <SoftwareSerial.h>
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 9600;
TinyGPSPlus gps;
SoftwareSerial ss(RXPin, TXPin);
unsigned long last = 0;
int motorpin1 = 6;
int motorpin2 = 7;
void setup() {
  Serial.begin(115200);
  ss.begin(GPSBaud);
  pinMode(motorpin1, OUTPUT);
  pinMode(motorpin2, OUTPUT);
}
void loop() {
  while (ss.available() > 0) gps.encode(ss.read());
  if (gps.location.isUpdated()) {
    Serial.print(F(" Lat="));
    Serial.print(gps.location.lat(), 6);
    Serial.print(F(" Long="));
    Serial.println(gps.location.lng(), 6);
  }
  else if (millis() - last > 5000) {
    if (gps.location.isValid()) {
      static const double Dest_LAT = 18.786254, Dest_LON = 73.880798; // ЗАМЕНИТЕ
      double distanceToDest = TinyGPSPlus::distanceBetween(
        gps.location.lat(), gps.location.lng(), Dest_LAT, Dest_LON);
      Serial.print(F("Distance to Destination ="));
      Serial.print(distanceToDest / 1000, 6);
      if (distanceToDest / 1000 < 0.05) {
        digitalWrite(motorpin1, LOW);
        digitalWrite(motorpin2, HIGH); // Вибрация ВКЛ
      } else {
        digitalWrite(motorpin1, HIGH);
        digitalWrite(motorpin2, HIGH); // Вибрация ВЫКЛ (тормоз)
      }
    }
    if (gps.charsProcessed() < 10) Serial.println(F("WARNING: No GPS data. Check wiring."));
    last = millis();
  }
}

Схемы (Fritzing)

Удачи в творчестве!

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

  1. Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
  2. JX Wave Generator — Генератор сигналов на Arduino с DDS AD9833 и OLED-дисплеем
  3. Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
  4. Find Me: Умный поисковик вещей на Arduino и Bluetooth
  5. Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
  6. Подключение Arduino Mega к GPS-модулю NEO‑6M: пошаговое руководство
  7. DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
  8. Модуль GPS u-blox LEA-6H 02: Интеграция с Arduino и Python
  9. NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
  10. Своё рулевое управление (джойстик) для игр на Arduino