Создание GPS-уведомителя о прибытии с Arduino UNO и модулем NEO-6M
Компоненты и материалы
| Arduino UNO | 1 шт. |
| GPS-модуль NEO-6M | 1 шт. |
| Светодиод (любой) | 1 шт. |
| Драйвер двигателей L293D | 1 шт. |
| Вибромотор (дисковый) | 1 шт. |
| Макетная плата | 1 шт. |
| Крона 9В | 1 шт. |
| Разъем Jack для короны 9В | 1 шт. |
| Корпус для проекта | 1 шт. |
| Перемычки | 1 набор |
Необходимые инструменты
- Паяльник
- Обкусыватель / стриппер для проводов
Программное обеспечение
- Arduino IDE
- Библиотека TinyGPS++
О проекте
Проблема и решение
Пробки — главная потеря времени в городе. Непредсказуемое время в пути заставляет терять часы в ожидании. Автор проекта, пользующийся общественным транспортом, решил использовать это время с пользой: планированием, обучением или творчеством. Родилась идея устройства, уведомляющего о приближении к пункту назначения — светодиодом или вибрацией.
Принцип работы
Устройство определяет текущие координаты через GPS, вычисляет расстояние до заданных координат цели и при входе в заданный радиус (например, 50 метров) активирует индикатор.
Подключение GPS-модуля NEO-6M
| Пин модуля | Подключение к Arduino |
|---|---|
| VCC | VIN (5В) |
| RX | TX программного Serial (пин 3) |
| TX | RX программного Serial (пин 4) |
| GND | GND |
Модуль работает от 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 и вибромотора
- Пины Enable 1, Vs, Vss L293D → 5В Arduino
- Input 1, Input 2 L293D → пины 6 и 7 Arduino
- GND L293D (обе ноги по одной стороне) → GND Arduino
- Output 1, Output 2 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)
- read_lat_lng.fzz — схема для получения координат
- destination_notifier_led.fzz — версия со светодиодом
- destination_notifier_motor.fzz — версия с вибромотором
Удачи в творчестве!
Производственный процесс
- Цифровые кости на Arduino: генератор случайных чисел с LCD-дисплеем и кнопкой
- JX Wave Generator — Генератор сигналов на Arduino с DDS AD9833 и OLED-дисплеем
- Строим Iron Man на Arduino: компоненты, сенсоры и пошаговый гайд
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Сборка функционального 3D-печатного манипулятора на Arduino: пошаговое руководство
- Подключение Arduino Mega к GPS-модулю NEO‑6M: пошаговое руководство
- DIY-контроллер увлажнителя на Arduino с реле: безопасная работа с высоким напряжением
- Модуль GPS u-blox LEA-6H 02: Интеграция с Arduino и Python
- NeoPixel Matrix Pong на Arduino Nano: неоновая игра Pong на матрице 15×10
- Своё рулевое управление (джойстик) для игр на Arduino