В данной статье речь пойдет о подключении GPS приемника EB-500 к плате Arduino UNO. Сам приемник прост в подключении и относительно недорог.
Для подключения мы будем использовать UART, схема подключения показана на рисунке.
Подключение осуществляется по трем проводам:
1) +3.3В - питание модуля;
2) TXD - передача данных от модуля к плате Arduino;
3) GND - "земля", общий провод.
На фото показано собранный макет устройства и модель платы.
TXD (EB_RX0) подключается к Digital2 платы Arduino.
Если подключить TXD подключить к выводу Digital 1 непрошитой платы, то можно увидеть необработанные данные, приходящие от приемника.
Но наша задача состоит в получении уже готовых данных, таких как: долгота/широта, точность, время, дата, скорость, направление движения, высота над уровнем моря. Можно пойти двумя путями получения этих данных: самостоятельно разобрать получаемые строки, но это требует написания своего алгоритма, поэтому не будем изобретать велосипед, и воспользуемся готовой библиотекой TinyGPS. Построим в консоли табличку.
Получаем эту табличку, используя следующий код:
#include "SoftwareSerial.h" #include "TinyGPS.h" TinyGPS gps; SoftwareSerial ssGPS(2, 3); static void smartdelay(unsigned long ms); static void print_float(float val, float invalid, int len, int prec); static void print_int(unsigned long val, unsigned long invalid, int len); static void print_date(TinyGPS &gps); static void print_str(const char *str, int len); void setup() { Serial.begin(9600); /*----------------------------------------------------------*/ //Sats - количество найденных спутников //HDOP - горизонтальная точность //Latitude - широта в градусах //Longitude - долгота в градусах //Date - дата //Time - времы UTC(-4 часа от Московского) //Alt - высота над уровнем моря (в метрах) //Course - путевой угол (направление скорости) в градусах. Значение 0 - север, 90 — восток, 180 — юг, 270 — запад. //Speed - скорость(км/ч) /*----------------------------------------------------------*/ Serial.println("Sats HDOP Latitude Longitude Date Time Alt Course Speed"); Serial.println("------------------------------------------------------------------------"); ssGPS.begin(9600); } void loop() { float flat, flon; unsigned long date, time; print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5); //Количество спутников print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5); //Горизонтальная точность gps.f_get_position(&flat, &flon); print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6); //Широта print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6); //Долгота print_date(gps); //Дата/Время по UTC print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2); //Высота над уровнем моря print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2); //Путевой угол print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2); //Скорость Serial.println(); smartdelay(1000); } static void smartdelay(unsigned long ms) { unsigned long start = millis(); do { while (ssGPS.available()) gps.encode(ssGPS.read()); } while (millis() - start < ms); } static void print_float(float val, float invalid, int len, int prec) { if (val == invalid) { while (len-- > 1) Serial.print('*'); Serial.print(' '); } else { Serial.print(val, prec); int vi = abs((int)val); int flen = prec + (val < 0.0 ? 2 : 1); // . and - flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; for (int i=flen; i 0) sz[len-1] = ' '; Serial.print(sz); smartdelay(0); } static void print_date(TinyGPS &gps) { int year; byte month, day, hour, minute, second, hundredths; unsigned long age; gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age); if (age == TinyGPS::GPS_INVALID_AGE) Serial.print("********** ******** "); else { char sz[32]; sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ", month, day, year, hour, minute, second); Serial.print(sz); } smartdelay(0); } static void print_str(const char *str, int len) { int slen = strlen(str); for (int i=0; i
Что мы в итоге получаем: при подключении устройства к питанию мы получаем табличку со звездочками:
до тех пор, пока не найдутся спутники, и светодиод не начнет мигать, тогда мы увидим следующее:
Вот и все. Данные пошли, теперь их можно использовать по своему усмотрению, например подключить дисплей, вывести на него скорость и использовать как спидометр. Или подключить SD-карту и сделать GPS - логгер.
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот |
---|---|---|---|---|---|---|
D1 | GPS приемник | EB-500 | 1 | Поиск в магазине Отрон | ||
С1, С2, С4 | Конденсатор | 0.1 мкФ | 3 | Поиск в магазине Отрон | ||
R1 | Резистор | 470 Ом | 1 | Поиск в магазине Отрон | ||
VD1 | Светодиод | 1 | Поиск в магазине Отрон | |||
X1 | Разъем | SMA | 1 | Поиск в магазине Отрон | ||
X2 | Разъем | PLS-3 | 1 | Поиск в магазине Отрон | ||
Скачать список элементов (PDF)
Прикрепленные файлы:
- Arduino_GPS.rar (23 Кб)
Комментарии (2) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]