Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Подключение GPS приемника EB500 к Arduino UNO

В данной статье речь пойдет о подключении 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-5001 Поиск в магазине ОтронВ блокнот
С1, С2, С4 Конденсатор0.1 мкФ3 Поиск в магазине ОтронВ блокнот
R1 Резистор
470 Ом
1 Поиск в магазине ОтронВ блокнот
VD1 Светодиод1 Поиск в магазине ОтронВ блокнот
X1 РазъемSMA1 Поиск в магазине ОтронВ блокнот
X2 РазъемPLS-31 Поиск в магазине ОтронВ блокнот
Добавить все

Скачать список элементов (PDF)

Прикрепленные файлы:

Теги:

Опубликована: 0 0
Я собрал 0 1
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 4.8 Проголосовало: 1 чел.

Комментарии (2) | Я собрал (0) | Подписаться

0
CRImier #
А почему третий сверху контакт микросхемы и нижние две площадки корпуса разъёма антенны не соединены? Просто интересно, ведь обе эти точки заземлены.
Ответить
0

[Автор]
Rough #
Это просто глюк Altium, надо было прописать соединение отверстий с полигоном под углом 45 градусов, но на работоспособность схемы это не влияет.
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическое сопротивление?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Модуль измерения тока на ACS712 (30А)
Модуль измерения тока на ACS712 (30А)
Arduino UNO Ветрогенератор
вверх