problema con arduino uno e scheda ethernet enc28j60

Salve a tutti,

sono nuovo del forum e mi stò appassionando a questo mondo, è un pò che uso arduino prendendo spunto da altri sketch e modificandoli per imparare un pò a programmare visto che per adesso sono
molto inesperto, adesso mi trovo davanti a più di un problema, ho collegato la scheda di rete ad arduino ma anche dopo aver caricato la libreria EtherCard e trovandola correttamente al suo posto nell’elenco delle librerie quando carico uno sketch che richiama questa libreria nel programma il nome della libreria non cambia colore come con le altre librerie presenti nell’Ide di arduino ma resta in grigio e questo no so se sia un problema, poi io la scheda ethernet la collego direttamente al pc (un notebook con xp) tramite un cavo di rete e la configurazione della porta è impostata per ottenere automaticamente un indirizzo ip, questo e corretto?

Grazie a tutti per gli eventuali aiuti.

Il fatto che il nome della libreria e delle sue funzioni non cambi colore e del tutto ininfluente ... dipende solo dal fatto che l'autore NON avrà incluso il file "keywords.txt" (... che serve appunto a colorare le varie cose).

Quello che invece NON puoi fare è collegare la scheda direttamente alla porta del PC con un cavo di rete ... ... i cavi di rete sono polarizzati e ci sono un sacco di cose che dovresti verificare ... tipo: chi fa da DHCP server, se la porta del PC è in grado di fare automaticamente il crossing del cavo, ecc. ecc. Insomma, al 99% non ti funziona. :roll_eyes:

Collega la scheda Ethernet ad un HUB o ad una delle porte del router. ;)

Guglielmo

Gazie per le dritte, se io collego arduino al pc tramite un HUB (penso che sia quella scheda che uso per collegare più dispositivi alla rete) l’impostazione della porta rimane sempre"ottieni automaticamente l’indirizzo ip" per vedere l’arduino oppure devo impostare l’imdirizzo ip io?

Normalmente in una rete "casalinga" il router fa anche da DHCP server (... che è quello che si occupa di assegnare l'IP ai vari devices che si connettono).

Verifica come è impostato il tuo PC ... se è impostato per ottenere il suo IP dalla rete e non è impostato fisso, significa che hai un DHCP server attivo in rete (... ripeto, probabilmente il tuo router) e quindi ... imposti allo stesso modo la scheda Ethernet. Altrimenti ... nessuno ti vieta di assegnare tutto manualmente in modo fisso, purché tu scelga un IP che nessun'altra macchina sta usando e che nessun'altra macchina userà mai e che, ovviamente, sia nel range della tua rete ;)

Guglielmo

io ho usato questo per provare ma non sono sicuro che le librerie siano adatte per la mia scheda, il
monitor seriale restitisce 0.0.0.0 i collegamenti gli ho fatti così:

D2 su INT
D8 su CS
D11 su SI
D12 su SO
D13 su SCK
RESET su RESET

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00,0x46, 0xE6 }; // MAC Address
IPAddress ip(192,168,100,25); // Indirizzo IP

EthernetServer ArduinoServer(80); // creazione oggetto EthernetServer

void setup()
{
  Serial.begin(9600);// inizializza la porta seriale a 9600

 Ethernet.begin(mac, ip); // Inizializzo il chip della scheda ethernet
 ArduinoServer.begin();  //Inizializzo il server in ascolto sulla porta 80
}

void loop()
{
delay(2000); // non faccio nulla di particolare
Serial.println(Ethernet.localIP());
}

La libreria Ethernet di Arduino è fatta per il Wiznet W5100 ... per il tuo ENC28J60 devi usare una libreria fatta per quel chip, come quella che trovi QUI .

Ti consiglio la lettura di una serie di articoli/tutorials che trovi a partire da QUI ;)

Guglielmo

Grazie,

ho provato a caricare questo sketch presente nel primo tutorial ma nella compilazione mi restituisce un sacco di errori che non capisco come risolvere, adesso proverò a cercare qualche spiegazione inerente agli errori, allego il file

#include <EtherCard.h>
static byte mymac[] = {0xDD,0xDD,0xDD,0x00,0x00,0x01};
static byte myip[] = {192,168,1,10};
byte Ethernet::buffer[700];
 
void setup () {
 
  Serial.begin(57600);
  Serial.println("PING Demo");
 
  if (ether.begin(sizeof Ethernet::buffer, mymac, 10) == 0) 
    Serial.println( "Failed to access Ethernet controller");
 
  if (!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");
}
 
void loop() {
 
  ether.packetLoop(ether.packetReceive());  
}

Ma hai scaricato ed installato [u]correttamente[/u] la nuova libreria EtherCard ? ? ?

Copia ed incolla gli errori che ti da il compilatore ...

Guglielmo

P.S. : In ogni caso, quando si usa una nuova libreria, prima di chiamare le varie funzioni/metodi ... occorre STUDIARLA e capire cosa fanno esattamente ... altrimenti cosa impari ?

Eccoli.

  This report would have more information with
  "Show verbose output during compilation"
  enabled in File > Preferences.
Arduino: 1.0.6 (Windows XP), Board: "Arduino Uno"
sketch_jan10c:4: error: 'Ethernet' has not been declared
sketch_jan10c.ino: In function 'void setup()':
sketch_jan10c:11: error: 'ether' was not declared in this scope
sketch_jan10c:11: error: 'Ethernet' has not been declared
sketch_jan10c:14: error: 'ether' was not declared in this scope
sketch_jan10c.ino: In function 'void loop()':
sketch_jan10c:20: error: 'ether' was not declared in this scope

Come ti ho scritto sopra ... prima di provare l'esempio del tutorial, hai scaricato/installato correttamente la libreria ? Hai provato gli esempi che sono a corredo della libreria e che sicuramente funzionano ? Te la sei studiata per capire come si usa ?

Guglielmo

Ad esempio … ho appena installato la libreria e compilato l’esempio “Ping” … questo :

// Ping a remote server, also uses DHCP and DNS.
// 2011-06-12 <jc@wippler.nl> http://opensource.org/licenses/mit-license.php

#include <EtherCard.h>

// ethernet interface mac address, must be unique on the LAN
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700];
static uint32_t timer;

// called when a ping comes in (replies to it are automatic)
static void gotPinged (byte* ptr) {
  ether.printIp(">>> ping from: ", ptr);
}

void setup () {
  Serial.begin(57600);
  Serial.println("\n[pings]");
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
    Serial.println(F("Failed to access Ethernet controller"));
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);

#if 1
  // use DNS to locate the IP address we want to ping
  if (!ether.dnsLookup(PSTR("www.google.com")))
    Serial.println("DNS failed");
#else
  ether.parseIp(ether.hisip, "74.125.77.99");
#endif
  ether.printIp("SRV: ", ether.hisip);
    
  // call this to report others pinging us
  ether.registerPingCallback(gotPinged);
  
  timer = -9999999; // start timing out right away
  Serial.println();
}

void loop () {
  word len = ether.packetReceive(); // go receive new packets
  word pos = ether.packetLoop(len); // respond to incoming pings
  
  // report whenever a reply to our outgoing ping comes back
  if (len > 0 && ether.packetLoopIcmpCheckReply(ether.hisip)) {
    Serial.print("  ");
    Serial.print((micros() - timer) * 0.001, 3);
    Serial.println(" ms");
  }
  
  // ping a remote server once every few seconds
  if (micros() - timer >= 5000000) {
    ether.printIp("Pinging: ", ether.hisip);
    timer = micros();
    ether.clientIcmpRequest(ether.hisip);
  }
}

… e viene compilato correttamente senza errori (Arduino IDE 1.0.6).

Guglielmo

La libreria lo scaricata scompattata rinominata come dicono di fare sul sito dove lo scaricata come EtherCard, lo copiata nella cartella libraries presente nella cartella principale di arduino e anche in quella presente in documenti, nell'ide se apro sketch nella lista librerie (che è doppia visto che vede sia quella nella cartella principale che nell'altra) la trovo.

Chiedo scusa, era presente una sottocartella ethercard-master all'interno della cartella EtherCard, sono svampito!

La libreria va installata nella cartella "libraries" che si trova nella tua "Sketchbook location" che vedi quando apri le preferenze di Arduino. Non serve metterla da nessun'altra parte (... anzi ... ti incasini solo la vita).

Guglielmo

risolto il problema della libreria ancora non riesco a collegarmi, ho trovato questo sketch sul sito, lo carico ma digitando l’ip in internet explorer non mi apre niente e a quell’indirizzo non ricevo risposta dal ping.

#include <EtherCard.h>

static byte mac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

static byte ip[] = { 192, 168, 1, 7 };

//La variabile seguente è il cosiddetto buffer tcp/ip e contiene la richiesta ricevuta dal browser
byte Ethernet::buffer[700];

#define ENC28J60_CS 10
#define LED 7

//La pagina html viene salvata nella memoria programma (PROGMEM) come un array di caratteri:
const char accendiLED[] PROGMEM =
 
"HTTP/1.0 200 OK\r\n"
 
"Content-Type: text/html\r\n"
 
"Pragma: no-cache\r\n\r\n"
 
"<html><head><title>ARDUINO - ENC28J60</title></head>"
 
"<body><center>"
 
"<h1> - Arduino in rete - </h1>"
 
"<h2> - Test led - </h2>"
 
"<a href='/on'><input type='button' value=' - ACCENDI LED - '/></a>"
 
"</body>"
 
"</center></html>";
 
 
 
const char spegniLED[] PROGMEM =
 
"HTTP/1.0 200 OK\r\n"
 
"Content-Type: text/html\r\n"
 
"Pragma: no-cache\r\n\r\n"
 
"<html><head><title>ARDUINO - ENC28J60</title></head>"
 
"<body><center>"
 
"<h1> - Arduino in rete - </h1>"
 
"<h2> - Test led - </h2>"
 
"<a href='/off'><input type='button' value=' - SPEGNI LED - '/></a>"
 
"</center></body>"
 
"</html>";
 
 
 
 
 
void setup () {
  pinMode(LED, OUTPUT);
  Serial.begin(115200);
  Serial.println("ARDUINO IN RETE");
  Serial.println(" - TEST LED - ");
  Serial.println(" ");
  
  if ( !ether.begin(sizeof Ethernet::buffer, mac, ENC28J60_CS) )
    Serial.println("ERROR: ether.begin!");
 
 
 
if ( !ether.dhcpSetup() )
 
if ( !ether.staticSetup(ip) )
 
Serial.println("ERROR: Set IP failed!");
 
 
 
ether.printIp("Ip locale: ", ether.myip);
 
ether.printIp("Netmask: ", ether.mymac);
 
ether.printIp("Gateway: ", ether.gwip);
 
ether.printIp("Dns: ", ether.dnsip);
 
 
 
}
 
 
 
void loop() {
 
 
//salviamo nella variabile pos il valore di ritorno del metodo packetLoop: questo valore indica la posizione, all'interno dei buffer di ricezione, in cui inizia la richesta del browser 
word pos = ether.packetLoop( ether.packetReceive() );

/*Memorizziamo la risposta da inviare al browser utilizzando l'oggetto BufferFiller. Questo oggetto deriva dalla classe Print e viene costrutito passando l'indirizzo tcp0ffset del buffer
ethernet da cui partire per memorizzare la risposta*/
BufferFiller bfill = ether.tcpOffset();
 

/*Se pos è maggiore di 0, significa che abbiamo ricevuto effettivamente una richiesta e possiamo stampare su seriale(buffer+pos indica proprio la posizione da cui partire ad estrarre
i dati dal buffer di ricezione*/ 
 
if (pos)
{
  Serial.println(" ");
Serial.println("<hr class=\"bbcode_rule\">");
Serial.println( (char *) Ethernet::buffer + pos );
 
Serial.println("<hr class=\"bbcode_rule\">");
 
Serial.println(" ");
 
Serial.println(" ");
 
 
/*la funzione strstr verifica se nella richiesta ricevuta è presente la sottostrina "GET /on"*/
if ( strstr( (char *) Ethernet::buffer + pos, "GET /on") )
 
{
 
 /*Accende il led*/
digitalWrite(LED, HIGH);
 
Serial.println("Led acceso!");
 
 
 /*Il metodo emit_p() ci consente di inserire dati nel buffer: in questo caso verrà visualizzara la pagina che è stata memorizzata nella memoria programma spegniLED. Utilizziamo 
 la macro PSTR() per risparmiare spazio in memoria RAM*/
bfill.emit_p(PSTR("$F"), spegniLED);

/*Inviamo la risposta al browser*/
ether.httpServerReply( bfill.position() );
 
}
 
else if ( strstr( (char *) Ethernet::buffer + pos, "GET /off") )
 
{
 
/*spengo il led*/
digitalWrite(LED, LOW);
 
Serial.println("Led spento!");
 
 
 
bfill.emit_p(PSTR("$F"), accendiLED);
 
ether.httpServerReply( bfill.position() );
 
}
 
else if ( strstr( (char *) Ethernet::buffer + pos, "GET /led") )
 
{
 
if ( (int) digitalRead(LED) )
 
{
 
bfill.emit_p(PSTR("$F"), spegniLED);
 
ether.httpServerReply( bfill.position() );
 
 
 
Serial.println("Spegni LED!");
 
}
 
else
 
{
 
bfill.emit_p(PSTR("$F"), accendiLED);
 
ether.httpServerReply( bfill.position() );
 
 
 
Serial.println("Accendi LED!");
 
}
 
}
 
}
 
 
 
}

Prima di tutto, in conformità con il REGOLAMENTO, edita il tuo post e racchiudi il codice negli appositi tag CODE (… e fai copia/incolla … senza tutto l’HTML che ci hai messo dentro), poi …

… t’ho detto di provare con gli esempi della libreria, NON con codici presi qui e li … senza capire quello che richiamano/fanno ! :roll_eyes:

Guglielmo

@chicco, ti suggerirei di leggere questa serie di tutorial in italiano specifici per la ENC28 che, come detto bene da @Guglielmo, è diversa da quella ufficiale che si basa su chip WIZ5100 http://www.lucadentella.it/category/enc28j60-arduino/page/2/

e comunque sposta il filo al CS sul 10

D2 su INT
D8 su CS
D11 su SI

#define ENC28J60_CS 10

( meglio spostare il filo che assegnare il #define ENC28J60_CS 8 )

prima cosa scusate se per la foga di voler fare creo confusione, ho provato alcuni esempi ma non riesco a capire se la connessione funziona oppure no, ho pensato che caricando uno sketch che crea una pagina HTML fosse più facile capire se riesco a comunicare oppure no richiamando qulla pagina in internet explorer ma purtroppo non carica nulla, se io carico un file dichiarando sia mac address che ip e poi uso la funzione ping richiamando quel' indirizzo non ricevo nessuna risposta sia collegato direttamente al pc che a un router.

aggiornamento, arduino comunica sia collegato direttamente al pc che attraverso un router, in entrambi i casi devo impostare un ip fisso sul pc, nei tutorial ho visto che forse c'è la possibilità di aggirare il problema, vi tengo aggiornati (più che altro perchè mi troverò sicuramente ancora molto in difficoltà), un grazie a tutti.