NTP/SNTP сервер на arduino nano + EthernetShield ENC28J60 + DS1307 + Ublox NEO-6M GPS
- Войдите на сайт для отправки комментариев
Чт, 03/04/2014 - 22:02
часы такие: 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 на ардуино?
что почитать можно?
алгоритм примерно такой:
раз в сутки или в неделю(опытным путем будет доведено до необходимого интервала) считываем инфу с гпс, сравниваем с часами, если спешат/отстают, то правим....
ну и есстественно, при запросе из сети - даем ответ.
заранее благодарен.
что почитать можно?
https://github.com/jystic/ntp-arduino
а на нано заведется этот код? не маловато памяти будет?
кстати....
ethernet шильдик похож на такой(цена, правда, ниже на 5-6 баксов уже у продавца): New ENC28J60 Ethernet LAN Network Module For Arduino SPI AVR PIC LPC STM32
подкажите,как сетевой шильдик подключить к нано?
достаточно 10,11,12,13 ноги по шине данных и vin на +5 и gnd на gnd?
а не всю колодку подключать.
Да, достаточно. Если D10 нужен то вроде даже есть библиотека для enc28j60, которая позволяет переназначить на другой выход.
ENC28J60 подключать надо к 3.3в ,а не к 5в !!
ENC28J60 подключать надо к 3.3в ,а не к 5в !!
сам ENC28J60 - 3х вольтовый, я в курсе.
но модуль по спецификации 5ти вольтовый.
шильдик по питанию имеет ams1117 - стабилизатор на 3,3.
такс, проблемы с gps.
если напрямую слушать gps шильдик:
то все отлично:
если использовать примеры(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); }а на выходе чушь:
p.s. а пример из второй ссылки в чем компилировать и как потом залить в ардуино?
а то ide ардуины выкидывает добрую сотню ошибок на проект ntp
почитал, посмотрел...
cmake там..
пара вопросов:
1. вроде все либы закинул куда надо, а все равно ошибку выдает...
2. как скомпилируется, как скинуть в дуину файл?
в общем, разобрался с гпс. Просто надо было примеров парочку разобрать да понять, что и как...
остается вопрос, как исходники в cmake скомпилировать... ошибку выдает(((
подскажите, как вывести данные из тинигпс в езернет?
if (ethernet.serviceRequest()) { ethernet.print("<H1>Hello World</H1>"); ethernet.print(TinyGPS::library_version()); ethernet.respond(); }