Arduino + Ethernet Shield R3

Utilizzo Arduino Uno da diverso tempo con buoni risultati; ora mi voglio mettere in rete ... e qui iniziano i problemi!

Utilizzo: Arduino Uno R3, Ethernet Shield R3, connessione al Pc mediante cavo USB, connessione alla rete mediante switch.
Ho caricato questo programmino (trovato in rete) per verificare la connessione all'indirizzo da me impostato:

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,15,66 };

EthernetServer ArduinoServer(80);
  void setup() {
  Ethernet.begin(mac, ip);
  ArduinoServer.begin();   
}

void loop(){
}

eseguendo il ping da sistema, ottengo una risposta corretta.

Primo problema: Se al mac del programma sostituisco quello riportato sulla scheda ethernet, (0X90, 0XA2, OXDA, OX0E, 0X0C, 0X2E) il ping non funziona!

Seconda Fase:
Ho caricato il programma di esempio della libreria WebServer.ino, sostituendo indirizzo ip con quello della mia rete e mandandolo in esecuzione sulla serial oppengo questo messaggio:
-> server is at 255.255.255.255

Pensavo che il problema risiedesse nella submask ed ho provato anche a sostituire

EthernetServer server(80);

con

EthernetServer server (mac, ip, gateway, subnet);

ma nulla da fare!

Poichè utilizzo l'antivirus Avast (mi sembra che utilizza la porta 80), ho provato a cambiare la porta con 8080, 8888, ...

Cosa altro posso fare per verificare dove è il problema?

Mi sembra strano questo ip 192,168,15,66 quel 15 non mi convince, sicuro che non sia 1, hai verificato l'ip della tua scheda di rete del pc?
che sistema op usi?

Pablos perché non ti convince ? L'insieme di indirizzi tra 192.168.0.0 e 192.168.255.255 è assegnato ad uso "privato" quindi qualunque 192.168.15.X può essere benissimo un suo indirizzo interno ... :wink:

Giusta comunque l'indicazione di verificare con l'IP del PC per controlare di stare utilizzando la stessa classe di indirizzi ...

Guglielmo

Premetto che non ho ancora usato lo shield Ethernet, ma conosco in teoria come funziona la rete.

Ogni nodo della rete possiede un indirizzo hardware dato dal MAC: nella maggior parte dei casi l'indirizzo MAC è su firmware e quindi non modificabile. mentre sullo shield questo è personalizzabile.

Va da se che l'indirizzo MAC deve essere diverso da quello degli altri nodi presenti sulla rete.

Nel tuo caso ci sono tre nodi: quello della scheda del PC, quello del router (che probabilmente funge anche da switch) e quello dello shield.

Seguendo questo ragionamento non ha senso imporre che il MAC dello shield sia uguale a quello della scheda sul PC.

Ma esiste un meccanismo più semplice per individuare un nodo della rete: l'IP address.

In particolare, come ti hanno già detto, per le reti private locali (LAN) si possono usare tutti gli indirizzi tipo 192.168.X.Y, avendo cura di dichiarare una subnet mask 255.255.255.0 e di indicare per il gateway l'indirizzo IP del router.

Naturalmente tutti i nodi della stessa rete LAN devono avere un indirizzo IP diverso, ad esempio:
PC **192.168.1.**1
Router **192.168.1.**0
Shield **192.168.1.**2

cyberhs:
...
Seguendo questo ragionamento non ha senso imporre che il MAC dello shield sia uguale a quello della scheda sul PC.
...

Cyberhs, non credo intenda questo, lui dice "Se al mac del programma sostituisco quello riportato sulla scheda ethernet" ovvero dovrebbe intendere quello che è stampato sullo shied ethernet di Arduino (adesivo di carta con il MAC address) ... non quello della scheda del PC :wink:

Guglielmo

... ecco ... quello che si trova sul retro dello shield :wink:

Guglielmo

perché non ti convince ? L'insieme di indirizzi tra 192.168.0.0 e 192.168.255.255 è assegnato ad uso "privato" quindi qualunque 192.168.15.X può essere benissimo un suo indirizzo interno ...

Non mi convince per i seguenti fattori:
Quelli non sono ip di default, i router forniscono un dhcp automatico di norma 192.168.0.xxx o 192.168.1.xxx e per default vengono configurati con mask 255.255.255.0.
Il fatto che ci sia un 15 vuol dire che

  1. si è configurato la rete a mano, ma perchè mettere un 15 quando qualsiasi cosa vai a collegare devi entrare nel setup e riconfigurarlo
  2. il suo pc si trova in una rete aziendale piuttosto grande
  3. quel numero lo ha messo a caso
  • il fatto che non abbia specificato di aver controllato gli i ip gatway della sua rete mi fa pensare che non lo abbia mai guardato.
  • Le prove che ha fatto non mi danno l'idea di uno esperto in rete :smiley: (senza offese)
  • il fatto che il ping funziona non significa che la famiglia ip rientri nel gruppo (questo dovrebbe saperlo)
  • non è preciso nelle descrizioni

Senza descrivere tutta sta pappardella la domanda più logica e il primo passo era
hai verificato l'ip della tua scheda di rete del pc?

poi tutto può essere :smiley:

ciao

pablos:
...
poi tutto può essere :smiley:
...

:grin: XD :grin: XD :grin: XD ... OK ... m'hai convinto !

Guglielmo

Hai ragione Guglielmo: ero stato portato fuori strada dalla parola "scheda" che voleva essere "shield".

Allora mi correggo: anche lo shield Arduino possiede su firmware l'indirizzo MAC e, ovviamente, non è modificabile.

Primo problema: Se al mac del programma sostituisco quello riportato sulla scheda ethernet, (0X90, 0XA2, OXDA, OX0E, 0X0C, 0X2E) il ping non funziona!

qui mi sembra di vedere delle O invece che degli 0, le X maiuscole sinceramente non so se funziona lo stesso, mai provato ....

Prova con

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0x0C, 0x2E };

Grazie a tutti per il vostro intersssamentoe e scusate la latitanza.. ho avuto altri problemi.

Sì sono un novello in fatto di reti e per questo che ho chiedo il vostro aiuto.
Il 15 nel indirizzo ip l'ho duplicato da quello del gatway che mi ha installato il provider.
L'indirizzo mac non contiene O (lettera) ma solo 0 (numero) ed ho visto in altri listati che la X può essere sia maiuscola che minuscola.

Ed ora veniamo alle novità prodotte durante gli ultimi esperimenti.
... magicamente tutto si è messo a funzionare... ma non chiedetemi come ho fatto.

Forse il tutto non funzionava perchè avevo inserito una SD e non avevo inizializzato le porte di comunicazione:

  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);

ora il programma seguente ...

//Librerie impiegate per il progetto
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
//Creao un array di byte per specificare il mac address
//byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0x0C, 0x2E };

//creo un array di byte per specificare l'indirizzo ip
byte ip[] = {192, 168, 15, 123};

char Data_RX;
int conta;

//creao un oggetto server che rimane in ascolto sulla porta
//specificata
EthernetServer ArduinoServer(80);

char htmlClear[] = "<head><META HTTP-EQUIV='refresh' CONTENT='5; /'></head>";
int analogIn0 = 0;

void setup()
{
  
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  pinMode(4, OUTPUT);
  digitalWrite(4, LOW);

  //inizializza lo shield con il mac e l'ip  
  Ethernet.begin(mac, ip);
  //inizializza l'oggetto server
  ArduinoServer.begin();
  
  Serial.begin(9600);
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  conta=0;

}

void loop()
{

    EthernetClient pc_client = ArduinoServer.available();

    //controllo se pc_client è true
    if (pc_client)
    {
        //controllo continuamente che il client sia connesso
        while (pc_client.connected())
        {
            //Controllo se ci sono byte disponibili per la lettura
            if (pc_client.available())
            {
                //leggo i byte disponibili
                //provenienti dal client
                Data_RX = pc_client.read();
                
                Serial.print(Data_RX);

                //Attendo che tutti i byte siano letti
                //quando Data_RX contiene il carattere
                //di nuova line capisco tutti i byte sono
                //stati letti
                if (Data_RX == '\n')
                {
                  
                    //campiono il valore di tensione analogia
                    //in ingresso sul pin0 ella borad Arduino UNO
                    analogIn0 = analogRead(0);
                    
                    //Invio la risposta al client
                    //invio lo status code
                    pc_client.println("HTTP/1.1 200 OK");
                    //imposto il data type
                    pc_client.println("Content-Type: text/html");
                    pc_client.println();
                    //invio codice html
                    pc_client.print("<html><body>");
                    
                    
                    pc_client.print(htmlClear);
                    
                    pc_client.print("<p>Valore analogico letto dal pin 0 = ");
                    //inserisco nella pagina html il valore acquisito dal pin analogico
                    pc_client.print(analogIn0);
                    pc_client.print("</p>"); 
                    pc_client.print("<p>Contatore = "); pc_client.print(++conta);
                    pc_client.print("</p>"); 
                    pc_client.print("<p>Memoria     = "); pc_client.print(FreeRam());
                    pc_client.print("</p></body></html>");
                    
                    //aspetto 1 ms affinche la risposta giunga al browser del client
                    delay(1);
                    //esco dal ciclo while una volta completato l'invio della risposta
                    break;                    
                    
                }
            }
        }
        //chiudo la connessione
        pc_client.stop();
    }
}

... mi risponde sul browsaer in modo corretto:

Valore analogico letto dal pin 0 = 270

Contatore = 48

Memoria = 811

anche mac è quello rilevato dall'etichetta sullo Shield.

Rimango in ascolto di qualche vostro parere sulle considerazioni che ho fatto.