Go Down

Topic: arduino ethernet shield non pinga e non si connette. (Read 2569 times) previous topic - next topic

esapode688

salve a tutti.  sto sperimentando l'ethernet shield su un arduino uno per controllare dei led tramite touch osc.

il codice che uso è questo

Code: [Select]
#include <SPI.h>
#include <Ethernet.h>
#include <ArdOSC.h>


byte myMac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x83, 0x24 };
byte myIp[]  = { 192, 168, 1, 11};
byte gateway[]={ 192,168,1,1};
byte subnet[]={ 255,255,255,0};
int  serverPort  = 8000;
int destPort=9000;
int ledPin =  6;

int flag=0;

OSCServer server;
OSCClient client;

void setup(){
 
Serial.begin(9600);

Ethernet.begin(myMac ,myIp, gateway, subnet);
server.begin(serverPort);

//set callback function & oscaddress
server.addCallback("/ard/aaa",&func1);

pinMode(ledPin, OUTPUT); 

}
 
void loop(){
  //Serial.println("uga sugaa ");
  if(server.aviableCheck()>0){
     Serial.println("alive! ");
  }
 
}


void func1(OSCMessage *_mes){
  int value = _mes->getArgInt32(0);
  if(value!=1) return;
 
  //create new osc message
  OSCMessage newMes;
 
  //set destination ip address & port no
  newMes.setAddress(_mes->getIpAddress(),destPort);
  newMes.beginMessage("/ard/aaa");
 
  if(flag==1){
    flag=0;
    digitalWrite(ledPin, LOW);
  }
  else{
    flag=1;
    digitalWrite(ledPin, HIGH);
  }
  newMes.addArgInt32(flag);
 
  //send osc message
  client.send(&newMes);
 
}




il mac address è quello scritto sotto l'ethernet shield.
l'arduino è connessa con un cavo ethernet a un piccolo access point HAME configurato in questo modo:  Ip: 192.168.1.1   sub: 255.255.255.0

se mi connetto in wifi dal pc o da cellulare e provo a pingare uno di questi ottengo risposta.

se provo a pingare l'ethernet shield ottengo timeout   oppure  Host is down.

non riesco a capire perchè non funziona;   eppure le luci link e 100 m sono accese fisse ...


k_apo

Stando a quello che hai scritto, il tuo codice per inizializzare l'interfaccia ethernet è:
Code: [Select]
//..
Ethernet.begin(myMac ,myIp, gateway, subnet);
//..


Mentre secondo la guida [1] la funzione begin è:

Code: [Select]
Ethernet.begin(mac, ip, dns, gateway, subnet);

In sostanza l'indirizzo che tu passi come gateway viene in realtà identificato come dns e la mask invece come gateway.

Ciao

[1] http://arduino.cc/en/Reference/EthernetBegin

PaoloP


Stando a quello che hai scritto, il tuo codice per inizializzare l'interfaccia ethernet è:
Code: [Select]
//..
Ethernet.begin(myMac ,myIp, gateway, subnet);
//..


Mentre secondo la guida [1] la funzione begin è:

Code: [Select]
Ethernet.begin(mac, ip, dns, gateway, subnet);

In sostanza l'indirizzo che tu passi come gateway viene in realtà identificato come dns e la mask invece come gateway.

Ciao

[1] http://arduino.cc/en/Reference/EthernetBegin


No, K_apo.
La libreria Ethernet, come alcune altre, prevede l'overloading delle funzioni ovvero la possibilità di avere più funzioni con lo stesso nome ma con diversi parametri in ingresso.
In questo caso
Code: [Select]
//..
Ethernet.begin(myMac ,myIp, gateway, subnet);
//..

passandogli 4 parametri essi vengono associati come mac, ip, gateway e subnet. Il dns è impostato per default uguale al gateway.
Se tu passassi 5 parametri allora il compilatore andrebbe a scegliere tra tutte le funzioni Ethernet.begin a disposizione quella che accetta 5 parametri in ingresso e userebbe quest'altra
Code: [Select]
Ethernet.begin(mac, ip, dns, gateway, subnet);
quindi l'ordine dei parametri viene rispettato e non c'è possibilità che si passi il gateway come netmask.

Poi se vai a leggerti il codice della libreria noterai che lo sviluppatore ha usato un trucco... ma questo lo lascio approfondire a voi.

k_apo

#3
Oct 01, 2012, 10:52 am Last Edit: Oct 01, 2012, 11:03 am by k_apo Reason: 1

No, K_apo.
La libreria Ethernet, come alcune altre, prevede l'overloading delle funzioni ovvero la possibilità di avere più funzioni con lo stesso nome ma con diversi parametri in ingresso.


Giusto per chiarire il punto non è una critica a PaoloP.
So benissimo che cosa è l'overload di funzioni, quello che mi chiedo però è dove hai visto questa cosa? Leggendo la guida ufficiale [1] c'è scritto:

Quote
Syntax
Ethernet.begin(mac);
Ethernet.begin(mac, ip);
Ethernet.begin(mac, ip, dns);
Ethernet.begin(mac, ip, dns, gateway);
Ethernet.begin(mac, ip, dns, gateway, subnet);


quindi la versione con quattro parametri come fa a prendere il terzo parametro come gateway? Questo ovviamente solo guardando la pagina del manuale, poi ovviamente il mistero si chiarisce quando si va a vedere il codice (ultima versione scaricata dal repository con git):

Code: [Select]
int begin(uint8_t *mac_address);
 void begin(uint8_t *mac_address, IPAddress local_ip);
 void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server);
 void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway);
 void begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet);


Code: [Select]
void EthernetClass::begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dns_server, IPAddress gateway)
{
 IPAddress subnet(255, 255, 255, 0);
 begin(mac_address, local_ip, dns_server, gateway, subnet);
}


Quindi come può essere che con la versione a 4 parametri mi prenda mac , ip, gateway e subnet?

Ciao.

[1] http://arduino.cc/en/Reference/EthernetBegin

PaoloP

Io mi baso sempre sul codice delle librerie e non sulle guide. Però questa volta ho preso un abbaglio.
Giustamente come da te riportato, l'inizializzazione della scheda con quattro paramenti prevede mac, ip, dns e gateway. Mentre la netmask è imposta di default.
A questo punto esapode688 dovrebbe modificare il codice di inizializzazione e passare tutti i 5 parametri per essere sicuro di inizializzarla correttamente.
Code: [Select]
Ethernet.begin(myMac ,myIp, gateway, gateway, subnet);
in questo modo replica l'indirizzo del gateway anche come dns e imposta correttamente la maschera di sotto-rete.

Go Up