NTP/SNTP сервер на arduino nano + EthernetShield ENC28J60 + DS1307 + Ublox NEO-6M GPS

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

часы такие: http://www.ebay.com/itm/Shield-Arduino-I2C-RTC-DS1307-AT24C32-Real-Time-...

гпс такой: http://www.ebay.com/itm/Ublox-NEO-6M-GPS-Module-Aircraft-Flight-Controll...

пока что они едут сюда...

возможно ли поднять сервер ntp/sntp/ntpd на ардуино?

что почитать можно?

алгоритм примерно такой:

раз в сутки или в неделю(опытным путем будет доведено до необходимого интервала) считываем инфу с гпс, сравниваем с часами, если спешат/отстают, то правим....

ну и есстественно, при запросе из сети - даем ответ.

 

заранее благодарен.

sav13
sav13 аватар
Offline
Зарегистрирован: 17.06.2013

Серый_Ветер пишет:

что почитать можно?

https://github.com/jystic/ntp-arduino

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

а на нано заведется этот код? не маловато памяти будет?

кстати....

ethernet шильдик похож на такой(цена, правда, ниже на 5-6 баксов уже у продавца): New ENC28J60 Ethernet LAN Network Module For Arduino SPI AVR PIC LPC STM32

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

подкажите,как сетевой шильдик подключить к нано?

достаточно 10,11,12,13 ноги по шине данных и vin на +5 и gnd на gnd?

а не всю колодку подключать.

 

std
Offline
Зарегистрирован: 05.01.2012

Да, достаточно. Если D10 нужен то вроде даже есть библиотека для enc28j60, которая позволяет переназначить на другой выход.

MaksMS
Offline
Зарегистрирован: 11.03.2013

ENC28J60 подключать надо к 3.3в ,а не к 5в !!

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

 

MaksMS пишет:

ENC28J60 подключать надо к 3.3в ,а не к 5в !!

сам ENC28J60 - 3х вольтовый, я в курсе.

но модуль по спецификации 5ти вольтовый. 

шильдик по питанию имеет ams1117 - стабилизатор на 3,3.

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

такс, проблемы с gps.

если напрямую слушать gps шильдик:

то все отлично:









$GPGGA,135109.00,5457.87475,N,02030.29953,E,1,08,0.98,10.1,M,29.2,M,,*6C
$GPGSA,A,3,15,17,25,24,12,14,04,02,,,,,1.75,0.98,1.45*03
$GPGSV,3,1,10,02,10,138,34,04,23,102,31,12,63,260,33,14,32,307,31*70
$GPGSV,3,2,10,15,08,191,26,17,31,051,27,24,70,165,13,25,24,260,31*7B
$GPGSV,3,3,10,32,06,353,14,39,27,174,32*73
$GPGLL,5457.87475,N,02030.29953,E,135109.00,A,A*69
$GPRMC,135110.00,A,5457.87465,N,02030.29949,E,0.034,,170514,,,A*73
$GPVTG,,T,,M,0.034,N,0.062,K,A*20
$GPGGA,135110.00,5457.87465,N,02030.29949,E,1,08,0.98,10.2,M,29.2,M,,*6D
$GPGSA,A,3,15,17,25,24,12,14,04,02,,,,,1.75,0.98,1.45*03
$GPGSV,3,1,10,02,10,138,35,04,23,102,31,12,63,260,36,14,32,307,31*74
$GPGSV,3,2,10,15,08,191,27,17,31,051,28,24,70,165,21,25,24,260,31*74
$GPGSV,3,3,10,32,06,353,12,39,27,174,32*75
$GPGLL,5457.87465,N,02030.29949,E,135110.00,A,A*6B
$GPRMC,135111.00,A,5457.87459,N,02030.29943,E,0.050,,170514,,,A*75
$GPVTG,,T,,M,0.050,N,0.093,K,A*2C
$GPGGA,135111.00,5457.87459,N,02030.29943,E,1,08,0.98,10.1,M,29.2,M,,*6A
$GPGSA,A,3,15,17,25,24,12,14,04,02,,,,,1.75,0.98,1.45*03
$GPGSV,3,1,10,02,10,138,35,04,23,102,30,12,63,260,36,14,32,307,30*74
$GPGSV,3,2,10,15,08,191,28,17,31,051,28,24,70,165,22,25,24,260,30*79
$GPGSV,3,3,10,32,06,353,11,39,27,174,32*76
$GPGLL,5457.87459,N,02030.29943,E,135111.00,A,A*6F
$GPRMC,135112.00,A,5457.87448,N,02030.29938,E,0.047,,170514,,,A*7C
$GPVTG,,T,,M,0.047,N,0.087,K,A*2F

если использовать примеры(test_wiht_gps_device) из tinygps





#include <SoftwareSerial.h>

#include <TinyGPS.h>

/* This sample code demonstrates the normal use of a TinyGPS object.
   It requires the use of SoftwareSerial, and assumes that you have a
   4800-baud serial GPS device hooked up on pins 4(rx) and 3(tx).
*/

TinyGPS gps;
SoftwareSerial ss(8, 9);

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);
  
  Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println();
  Serial.println("Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum");
  Serial.println("          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail");
  Serial.println("-------------------------------------------------------------------------------------------------------------------------------------");

  ss.begin(9600);
}

void loop()
{
  float flat, flon;
  unsigned long age, date, time, chars = 0;
  unsigned short sentences = 0, failed = 0;
  static const double LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
  
  print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
  print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
  gps.f_get_position(&flat, &flon, &age);
  print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6);
  print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6);
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  print_date(gps);
  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);
  print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
  print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
  print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
  print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);

  gps.stats(&chars, &sentences, &failed);
  print_int(chars, 0xFFFFFFFF, 6);
  print_int(sentences, 0xFFFFFFFF, 10);
  print_int(failed, 0xFFFFFFFF, 9);
  Serial.println();
  
  smartdelay(1000);
}

static void smartdelay(unsigned long ms)
{
  unsigned long start = millis();
  do 
  {
    while (ss.available())
      gps.encode(ss.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<len; ++i)
      Serial.print(' ');
  }
  smartdelay(0);
}

static void print_int(unsigned long val, unsigned long invalid, int len)
{
  char sz[32];
  if (val == invalid)
    strcpy(sz, "*******");
  else
    sprintf(sz, "%ld", val);
  sz[len] = 0;
  for (int i=strlen(sz); i<len; ++i)
    sz[i] = ' ';
  if (len > 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);
  }
  print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
  smartdelay(0);
}

static void print_str(const char *str, int len)
{
  int slen = strlen(str);
  for (int i=0; i<len; ++i)
    Serial.print(i<slen ? str[i] : ' ');
  smartdelay(0);
}

в консоли есть ответ на тесты:





Testing TinyGPS library v. 13
by Mikal Hart

Sats HDOP Latitude  Longitude  Fix  Date       Time     Date Alt    Course Speed Card  Distance Course Card  Chars Sentences Checksum
          (deg)     (deg)      Age                      Age  (m)    --- from GPS ----  ---- to London  ----  RX    RX        Fail
-------------------------------------------------------------------------------------------------------------------------------------
**** **** ********* ********** **** ********** ******** **** ****** ****** ***** ***   *******  ****** ***   126   0         1
7    117  54.964611 20.505020  359  05/17/2014 14:11:30 391  4.50   0.00   0.09  N     1420     262.83 W     542   2         4
7    117  54.964611 20.505020  436  05/17/2014 14:11:31 466  4.50   0.00   0.33  N     1420     262.83 W     959   4         8
7    117  54.964611 20.505020  508  05/17/2014 14:11:32 539  4.60   0.00   0.78  N     1420     262.83 W     1376  6         12
7    117  54.964614 20.505020  579  05/17/2014 14:11:33 611  4.60   0.00   1.06  N     1420     262.83 W     1792  8         15
7    117  54.964614 20.505020  655  05/17/2014 14:11:34 686  4.70   0.00   0.06  N     1420     262.83 W     2208  10        18
7    117  54.964614 20.505022  728  05/17/2014 14:11:35 759  4.80   0.00   0.22  N     1420     262.83 W     2624  12        22
7    117  54.964614 20.505022  285  05/17/2014 14:11:37 316  4.90   0.00   0.04  N     1420     262.83 W     3437  15        30
7    117  54.964618 20.505022  360  05/17/2014 14:11:38 392  4.90   0.00   0.28  N     1420     262.83 W     3853  17        33
7    117  54.964618 20.505023  436  05/17/2014 14:11:39 466  4.90   0.00   0.52  N     1420     262.83 W     4269  19        37

а беру пример





#include "TinyGPS.h"
#include <SoftwareSerial.h>
#define rxPin 9
#define txPin 8
boolean t=true;

SoftwareSerial mySerial =  SoftwareSerial(rxPin, txPin);

TinyGPS gps;
float flat, flon;
unsigned long fix_age;

void setup()                   
{
      
  mySerial.begin(9600);
  Serial.begin(9600);
  delay(500);
}

void loop()                     
{
  
gps.f_get_position(&flat, &flon, &fix_age);

  Serial.print("Data from GPS: ");
  Serial.println((char)mySerial.read());
  Serial.print("Latitude: ");
  Serial.println(flat);
  Serial.println();
          delay(1000);

}

а на выходе чушь:





Data from GPS: $
Latitude: 1000.00

Data from GPS: G
Latitude: 1000.00

Data from GPS: P
Latitude: 1000.00

Data from GPS: R
Latitude: 1000.00

Data from GPS: M
Latitude: 1000.00

Data from GPS: C
Latitude: 1000.00

Data from GPS: ,
Latitude: 1000.00

p.s. а пример из второй ссылки в чем компилировать и как потом залить в ардуино?

а то ide ардуины выкидывает добрую сотню ошибок на проект ntp

 

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

почитал, посмотрел...

cmake там..

пара вопросов:

1. вроде все либы закинул куда надо, а все равно ошибку выдает...

2. как скомпилируется, как скинуть в дуину файл?

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

в общем, разобрался с гпс. Просто надо было примеров парочку разобрать да понять, что и как...

 

остается вопрос, как исходники в cmake скомпилировать... ошибку выдает(((

Серый_Ветер
Серый_Ветер аватар
Offline
Зарегистрирован: 03.04.2014

подскажите, как вывести данные из тинигпс в езернет?

делаю так:

  if (ethernet.serviceRequest())
  {
    ethernet.print("<H1>Hello World</H1>");
    ethernet.print(TinyGPS::library_version());
    ethernet.respond();
  }

 

из всего перечисленного из keywords.txt в проекте tinigps работает только TinyGPS::library_version, на остальное ругается компилятор.