Главная » Arduino
Призовой фонд
на октябрь 2021 г.
1. Рюкзак Mean Well
Компэл
2. Инвертор авто Mean Well 150 Ватт
Компэл
3. Термос MeanWell
Компэл
4. 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А)
Набор 4WD Kit Bluetooth iMAX B6 - зарядное для Lion, LiPo, LiFe, Pb, NiCd и NiMH аккумуляторов
вверх