|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
clownfish Član
Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 764 Aktiv.: 3.43 Kraj: Povir / Ljubljana
|
Objavljeno: Čet Jun 12, 2014 10:35 pm Naslov sporočila: Arduino Mega ter Ethernet in branje NTP |
|
|
Imam tale Arduino Mega z Ethernet shield-om.
Zadevo že nekaj časa testiram in deluje zadovoljivo.
Sedaj pa se mi je pojavila malce čudna težava.
V sketch-u za branje NTP čas iz interneta zadeva deluje če Arduino pridobi lokalni IP preko DHCP serverja.
Če pa v kodi zamenjam DHCP del z linijo z fiksnim IP-jem potem več ne dobim NTP časa iz interneta. Preprosto ne gre. Zanimivo WEB interface v obeh primerih deluje brez problemov.
Ima kdo kakšen namig ali idejo ??
Sem pa menjal že tako mac kot lokalni IP ampak ne pomaga.
Edino kar še nisem preizkusil je, da zadevo odnesem in priključim na drugo lokalno omrežje.
Koda: |
// skupni del
byte mac[] = { 0xA5, 0x11, 0xC1, 0xD8, 0x1E, 0x2F };
#define LOCAL_IP 192,168,8,177 //change this to a local fixed ip address
IPAddress ip(LOCAL_IP);
// Primer uporabe fiksnega IP-ja
Ethernet.begin(mac,ip);
// Oziroma pridobivanje IP preko DHCP serverja
// DHCP part - assign IP form DHCP server
// Ethernet shield and NTP setup
int i = 0;
int DHCP = 0;
DHCP = Ethernet.begin(mac);
//Try to get dhcp settings 30 times before giving up
while( DHCP == 0 && i < 30){
delay(1000);
DHCP = Ethernet.begin(mac);
i++;
Serial.print("DHCP try: ");
Serial.println(i);
}
if(!DHCP){
Serial.println("DHCP FAILED");
for(;;); //Infinite loop because DHCP Failed
}
Serial.println("DHCP Success");
Serial.print("IP number assigned by DHCP is ");
Serial.println(Ethernet.localIP());
|
Prilagam še celoten sketch - pobran iz interneta
Koda: |
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <Time.h>
/* ******** Ethernet Card Settings ******** */
// Set this to your Ethernet Card Mac Address
// byte mac[] = { 0xA5, 0x11, 0xC1, 0xD8, 0x1E, 0x2F };
byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
/* ******** NTP Server Settings ******** */
/* us.pool.ntp.org NTP server
(Set to your time server of choice) */
// IPAddress timeServer(64, 99, 80, 30); //NE dela
// IPAddress timeServer(193,193,193,107); //DELA :)
// IPAddress timeServer(212,235,187,82); //DELA :)
IPAddress timeServer(132,163,4,101); //DELA :)
// IPAddress timeServer(213,161,18,102); //DELA :)
// IPAddress timeServer(46,54,225,12); //DELA :)
// IPAddress timeServer(46,54,225,12); //DELA :)
/* Set this to the offset (in seconds) to your local time
This example is GMT - 6 */
// const long timeZoneOffset = -21600L;
const long timeZoneOffset = 7200L;
/* Syncs to NTP server every 15 seconds for testing,
set to 1 hour or more to be reasonable */
unsigned int ntpSyncTime = 15;
/* ALTER THESE VARIABLES AT YOUR OWN RISK */
// local port to listen for UDP packets
unsigned int localPort = 8888;
// NTP time stamp is in the first 48 bytes of the message
const int NTP_PACKET_SIZE= 48;
// Buffer to hold incoming and outgoing packets
byte packetBuffer[NTP_PACKET_SIZE];
// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
// Keeps track of how long ago we updated the NTP server
unsigned long ntpLastUpdate = 0;
// Check last time clock displayed (Not in Production)
time_t prevDisplay = 0;
#define LOCAL_IP 192,168,8,177 //change this to a local fixed ip address
//#define LOCAL_IP 192,168,8,231 //change this to a local fixed ip address
IPAddress ip(LOCAL_IP);
void setup() {
Serial.begin(38400);
Serial.println("VKLOP NTP test 1");
Ethernet.begin(mac,ip);
/*
// DHCP part - assign IP form DHCP server
// Ethernet shield and NTP setup
int i = 0;
int DHCP = 0;
DHCP = Ethernet.begin(mac);
//Try to get dhcp settings 30 times before giving up
while( DHCP == 0 && i < 30){
delay(1000);
DHCP = Ethernet.begin(mac);
i++;
Serial.print("DHCP try: ");
Serial.println(i);
}
if(!DHCP){
Serial.println("DHCP FAILED");
for(;;); //Infinite loop because DHCP Failed
}
Serial.println("DHCP Success");
Serial.print("IP number assigned by DHCP is ");
Serial.println(Ethernet.localIP());
*/
//Try to get the date and time
int trys=0;
while(!getTimeAndDate() && trys<10) {
trys++;
Serial.print("Trys = "); //DS
Serial.println(trys); //DS
}
}
// Do not alter this function, it is used by the system
int getTimeAndDate() {
int flag=0;
Udp.begin(localPort);
// sendNTPpacket(timeServer);
memset(packetBuffer, 0, NTP_PACKET_SIZE);
packetBuffer[0] = 0b11100011;
packetBuffer[1] = 0;
packetBuffer[2] = 6;
packetBuffer[3] = 0xEC;
packetBuffer[12] = 49;
packetBuffer[13] = 0x4E;
packetBuffer[14] = 49;
packetBuffer[15] = 52;
Udp.beginPacket(timeServer, 123);
Udp.write(packetBuffer,NTP_PACKET_SIZE);
Udp.endPacket();
delay(1000);
if (Udp.parsePacket()){
Udp.read(packetBuffer,NTP_PACKET_SIZE); // read the packet into the buffer
unsigned long highWord, lowWord, epoch;
highWord = word(packetBuffer[40], packetBuffer[41]);
lowWord = word(packetBuffer[42], packetBuffer[43]);
epoch = highWord << 16 | lowWord;
epoch = epoch - 2208988800 + timeZoneOffset;
flag=1;
setTime(epoch);
ntpLastUpdate = now();
Serial.print("NTP time = ");
clockDisplay();
while(1);
}
return flag;
}
// Clock display of the time and date (Basic)
void clockDisplay(){
Serial.print(hour());
printDigits(minute());
printDigits(second());
Serial.print(" ");
Serial.print(day());
Serial.print(" ");
Serial.print(month());
Serial.print(" ");
Serial.print(year());
Serial.println();
}
// Utility function for clock display: prints preceding colon and leading 0
void printDigits(int digits){
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
// This is where all the magic happens...
void loop() {
// Update the time via NTP server as often as the time you set at the top
if(now()-ntpLastUpdate > ntpSyncTime) {
int trys=0;
while(!getTimeAndDate() && trys<10){
trys++;
Serial.print("Trys = "); //DS
Serial.println(trys); //DS
}
if(trys<10){
Serial.println("ntp server update success");
}
else{
Serial.println("ntp server update failed");
}
// getTimeAndDate();
}
// Display the time if it has changed by more than a second.
if( now() != prevDisplay){
prevDisplay = now();
clockDisplay();
}
}
|
|
|
Nazaj na vrh |
|
|
eddie Član
Pridružen-a: Sre 10 Dec 2003 21:02 Prispevkov: 706 Aktiv.: 3.17 Kraj: Severna primorska
|
Objavljeno: Pet Jun 13, 2014 6:59 am Naslov sporočila: |
|
|
Po DHCP-ju verjetno dobiš tudi IP Gatewaya, ki te spušča na internet. Ali ga v primeru ročne konfiguracije kje definiraš?
Brez gatewaya na internet in do NTP strežnika pomoje neboš prišel.
PS: Gateway je IP tvojega routerja za internet. |
|
Nazaj na vrh |
|
|
clownfish Član
Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 764 Aktiv.: 3.43 Kraj: Povir / Ljubljana
|
Objavljeno: Pet Jun 13, 2014 9:10 am Naslov sporočila: |
|
|
eddie je napisal/a: |
Po DHCP-ju verjetno dobiš tudi IP Gatewaya, ki te spušča na internet. |
Verjetno res..
Citiram: |
Ali ga v primeru ročne konfiguracije kje definiraš?
Brez gatewaya na internet in do NTP strežnika pomoje neboš prišel.
PS: Gateway je IP tvojega routerja za internet. |
To vem, samo kako in kje to določim?
Kot gledam tale sketch tega nima definiranega?
Sam sem bolj razmišljal v smeri, da aplikacija kliče NTP server preko negovega IP-ja vseeno da to deluje nekako avtomatsko in da ne potrebuješ navesti IP od gateway-a'
namig? |
|
Nazaj na vrh |
|
|
forest70 Član
Pridružen-a: Ned 20 Jul 2008 1:00 Prispevkov: 588 Aktiv.: 3.06 Kraj: Koper
|
Objavljeno: Pet Jun 13, 2014 9:43 am Naslov sporočila: |
|
|
To bo rešilo tvoje probleme
Citiram: |
// add if needed by your router or gateway
byte dns_server[] = { 192, 168, 1, 2 }; // The address of your DNS server
byte gateway[] = { 192, 168, 1, 254 }; // your gateway address
And change the first line in setup to include the gateway address in the startup values for Ethernet:
Ethernet.begin(mac, ip, dns_server, gateway);
|
|
|
Nazaj na vrh |
|
|
mobwap Član
Pridružen-a: Sre 14 Mar 2012 9:42 Prispevkov: 326 Aktiv.: 2.21 Kraj: Doma
|
Objavljeno: Pet Jun 13, 2014 9:51 am Naslov sporočila: |
|
|
Ethernet Library dokumentacija.
Glede na topologijo omrežij, ethernet knjižnica prevzame prehod in DNS glede na ročno nastavljen IP in zamenja zadnji oktet z 1 (192.168.1.123 - arduino IP = prehod in DNS 192.168.1.1)
Prehod in DNS lahko nastaviš tudi ročno
Koda: |
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192, 168, 1, 123 };
byte dns[] = { 192, 168, 1, 1 };
byte prehod[] = { 192, 168, 1, 1 };
void setup()
{
Ethernet.begin(mac, ip, dns, prehod);
}
|
Glede na to da DHCP deluje, si poglej nastavitve tvojega omrežja na routerju. Lahko da imaš nastavljen DHCP avtoritativno in router ne dovoli povezav iz IP naslovov, ki niso dodeljene s strani DHCP strežnika.
Ali pa imaš nastavljen DNS in Gateway na kaj drugega kot IP xxx.xxx.xxx.1 _________________ INSTALLING DEMOCRACY.... 44% DONE.
Installation failed.
404 error: form not found.
FORMING GOVERNMENT.... 23% DONE.
Formation failed. |
|
Nazaj na vrh |
|
|
clownfish Član
Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 764 Aktiv.: 3.43 Kraj: Povir / Ljubljana
|
Objavljeno: Pet Jun 13, 2014 9:54 am Naslov sporočila: |
|
|
Hvala za namig.
Srčno upam, da bo to pomagalo ker je res nenavadno da baje že precejkrat sprobana koda drugje deluje pri meni pa ne.
Javim ! |
|
Nazaj na vrh |
|
|
clownfish Član
Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 764 Aktiv.: 3.43 Kraj: Povir / Ljubljana
|
Objavljeno: Pet Jun 13, 2014 10:13 am Naslov sporočila: |
|
|
Še nekaj me zanima.
Kako določim MAC naslov tako, da bom vedel, da je ta še prost in še neuporabljen na kateri drugi napravi? |
|
Nazaj na vrh |
|
|
mirkatmir Član
Pridružen-a: Pet 25 Jul 2003 9:14 Prispevkov: 1876 Aktiv.: 8.42 Kraj: Ribnica (JN75IR)
|
Objavljeno: Pet Jun 13, 2014 10:41 am Naslov sporočila: |
|
|
Mislim, da ti za to ni treba skrbeti, ter pustiš kar tistega, ki ga imaš v sketchu, ker bo naprava delovala v tvojem lan omrežju, kjer pa nimaš nekaj miljonov naprav, da bi se podvojile. _________________ lp, Miran (Miro - S51SK) |
|
Nazaj na vrh |
|
|
clownfish Član
Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 764 Aktiv.: 3.43 Kraj: Povir / Ljubljana
|
Objavljeno: Pet Jun 13, 2014 11:18 am Naslov sporočila: |
|
|
Aha torej MAC naslov ne sme biti isti kot na drugi napravi v istem lokalnem omrežju?
Za navzven pa ni važno ?? |
|
Nazaj na vrh |
|
|
mobwap Član
Pridružen-a: Sre 14 Mar 2012 9:42 Prispevkov: 326 Aktiv.: 2.21 Kraj: Doma
|
Objavljeno: Pet Jun 13, 2014 11:59 am Naslov sporočila: |
|
|
Točno tako. _________________ INSTALLING DEMOCRACY.... 44% DONE.
Installation failed.
404 error: form not found.
FORMING GOVERNMENT.... 23% DONE.
Formation failed. |
|
Nazaj na vrh |
|
|
clownfish Član
Pridružen-a: Pet 05 Avg 2005 13:05 Prispevkov: 764 Aktiv.: 3.43 Kraj: Povir / Ljubljana
|
Objavljeno: Pet Jun 13, 2014 10:23 pm Naslov sporočila: |
|
|
Fantje...
HVALA
Komentar verjetno ni potreben? |
|
Nazaj na vrh |
|
|
bajdec Član
Pridružen-a: Čet 12 Nov 2009 19:56 Prispevkov: 287 Aktiv.: 1.63 Kraj: Zagorje ob Savi
|
Objavljeno: Sob Jun 14, 2014 10:00 pm Naslov sporočila: |
|
|
Živjo, malo si bom sposodil temo.
Na ebayu sem naročil 28j60 ethernet modul in ga povezal s arduinom na pine 10 do 13 kot sem prebral na spletu.
Sedaj mi utripa oranžna lučka na ethernet modulu, na arduino je naložen webserver primer. Arduino pa preko serijskega vmesnika sporoči, da ne dobi IPja. Ne vem kaj bi lahko bilo narobe? Slab stik ni, se pa obnaša ravno tako...
EDIT: Arduno Pro Mini, atmega 328, 5V, PL2303 za 3.3V napetost |
|
Nazaj na vrh |
|
|
dumr666 Član
Pridružen-a: Tor 31 Jan 2012 23:30 Prispevkov: 409 Aktiv.: 2.75 Kraj: Ljubljana
|
Objavljeno: Sob Jun 14, 2014 10:43 pm Naslov sporočila: |
|
|
poglej, kako imaš nastavljen rutar, da nimaš ipja nastavljenega izven območja dovoljenih ipjev na ruterju oziroma kaj podobnega. _________________ Robots will steal your job. But that's OK. |
|
Nazaj na vrh |
|
|
bajdec Član
Pridružen-a: Čet 12 Nov 2009 19:56 Prispevkov: 287 Aktiv.: 1.63 Kraj: Zagorje ob Savi
|
Objavljeno: Ned Jun 15, 2014 10:35 am Naslov sporočila: |
|
|
Na ruterju so nastavitve OK, ne deluje v nobeni konfiguraciji (statično/dinamično(DHCP)). Ruter je Enkom (amis modem) z prehodom na 192.168.1.254.
Na arduino izpiše "Server is at 0.0.0.0".
Ethernet modul je pravilno povezan na pine 10, 11, 12 in 13.
Deluje ENC28J60 s ethernet.h knjižico?
Je mogoče kakšna omejitev dolžine kabla? Trenutno imam ~30-40cm kabla med arduinom in ethernet modulom.
Mogoče potrebujem kak "napetostni" pretvornik, glede na to, da je arduino 5V, 28J60 pa 3.3V? |
|
Nazaj na vrh |
|
|
rafaellsi Član
Pridružen-a: Ned 11 Sep 2011 18:54 Prispevkov: 478 Aktiv.: 3.11 Kraj: Radovljica
|
Objavljeno: Ned Jun 15, 2014 12:18 pm Naslov sporočila: |
|
|
Verjetno bi bilo bolje poiskusiti s kako knjižnjico namenejeno za ENC28J60 vmesnik. ... recimo tole |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 74 dni
Powered by phpBB © 2001, 2005 phpBB Group
|