Genuino micro con ecn28j60 è possibile??

Ciao a tutti, non riesco a far andare il modulo ecn28j60 con la mio genuino micro, ho fatto svariate prove ma niente non riesco neanche a pingarlo, qualche dritta??
Di seguito vi metto il codice che sto utilizzando

#include <SPI.h>
#include <EtherCard.h>

static byte mymac[] = {0xDA,0xDB,0xDC,0x01,0x02,0x03}; //definizione dei parametri base per la connessione alla rete
static byte myip[] = {192,168,0,25};
static byte gwip[] = {192,168,0,1};
static byte dnsip[] = {132,332,81,9};
static byte netmask[] = {255,255,255,0};

byte Ethernet::buffer[700];
const int ledPin = 2;
boolean ledStatus;

//char *on = "ON";
//char *off = "OFF";
//char *tot = "bello";
char *statusLabel;
char *buttonLabel;


void setup () {

  Serial.begin(9600);
  Serial.println("Controllo Luci");
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
  Serial.println( "Failed to access Ethernet controller"); //avviso via seriale di eventuali errori (solo per debug)
  ether.staticSetup(myip, gwip); //configurazione IP statico (no DHCP) e IP del gateway
  ether.hisport = 80; // porta default HTTP

  Serial.println();

  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  ledStatus = false;
}

void loop() {

  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);

  if(pos) {

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.println("Received ON command");
      ledStatus = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.println("Received OFF command");
      ledStatus = false;
    }

    /*if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
    }*/

    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
    "<html><head><title>Controllo Luci</title></head>"
    "<body>Stato Luci: $S "
    "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
    "</body></html>"
    ), statusLabel, buttonLabel, buttonLabel);
    ether.httpServerReply(bfill.position());
  }
}

il mio dubbio è che la libreria non sia adeguata al microcontrollore ATmega32u4.
ma poi ci sono due cose che proprio nn mi capacito perché non stampa nemmeno sul serial monitor la frase Controllo Luci, non capisco, e poi perché quando verifico lo sketch mi da erorre sulla stringa dove dichiaro le variabili char (per quello le ho messe come commento e anche la parte di programma che le utilizzava)
Vi ringrazio anticipatamente per l’attenzione :slight_smile: :slight_smile: :slight_smile:

Certo che funziona! Come hai fatto le connessioni? Nota che [u]sul Micro i segnali del bus SPI non si trovano sui pin 10/11/12/13[/u], bensì sono unicamente accessibili tramite il connettore ICSP, per cui devi collegare l'ENC lì.

Per i char, prova a metterci const davanti.

Ok posso dire di avercela fatta diciamo.
Oltre che sbagliare i collegamenti sbagliavo anche lo sketch, cosa importantissima per far andare una board con ATmega32u4 come nel mio caso, era dichiarare la variabile #define CS_PIN 17, per poter sapere che il pin ss (nel listato dichiarato come cs) era il 17 ho dovuto andare a prendere il file pins_arduino.h nella cartella dedicata alla board leonardo vabbè bordello…
Di seguito vi posto un’immagine della breadboard creata con fritzing per i collegamenti fra la micro ell’enc28j60

Vi metto sotto lo sketch finale che sto utilizzando (devo ancora migliorare la grafica dell’on off), fa in modo dia accendere e spegnere un led posto sul pin 5

#include <EtherCard.h>
#define CS_PIN 17
 
// ethernet interface mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip[] = { 192,168,0,25 };
// gateway ip address
static byte gwip[] = { 192,168,0,1 };
static byte dnsip[] = {111,92,22,1};
static byte netmask[] = {255,255,255,0};  
 
byte Ethernet::buffer[300];   // a very small tcp/ip buffer is enough here

//const int ledPin = 2;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;

void setup () {
  
  Serial.begin(57600);
  //Serial.println("*** Arduino in LAN - ElettroEasy ***\n\n");
   
  if (ether.begin(sizeof Ethernet::buffer, mymac,CS_PIN)) 
    Serial.println( "Impossibile accedere al controller Ethernet.");
 
  //ether.staticSetup(myip, gwip);
  if (!ether.staticSetup(myip, gwip, dnsip, netmask )) 
    Serial.println("Impossibile assegnare l'indirizzo"); /*
  
  pinMode(5, OUTPUT);
  digitalWrite(5, LOW);
  ledStatus = false;
  
}

void loop () {
  
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);

  if(pos) {
    
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.println("Received ON command");
      ledStatus = true;
    }
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.println("Received OFF command");
      ledStatus = false;
    }
    if(ledStatus) {
      digitalWrite(5, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(5, LOW);
      statusLabel = off;
      buttonLabel = on;
    }

    BufferFiller bfill = ether.tcpOffset();/*
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n"
                      "<html><body><h1>Fanculooo</h1></body></html>"));*/

    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "</body></html>"      
      ), statusLabel, buttonLabel, buttonLabel);

    ether.httpServerReply(bfill.position());
  }

   
}

Un’ultima cosa com’è che non riesco a visualizzare i messaggi nel serial monitor, fin li poco male, ma la cosa per me grave è che il tutto è poco stabile, mi capita alcune volte che magari modifico lo sketch o stacco e riattacco l’alimentazione, che non va più nulla non riesco nemmeno a pingarlo, in quel caso cerco di resettarlo un po’ di volte (anche molte) e poi va.
Mi piacerebbe sapere se c’è qualcuno che invece gli funziona molto bene per capire se è lo sketch o il modulo enc28j60 che è un po’ una merda

Sarebbe bastato scrivere SS al posto di CS_PIN ;). In questo modo, tra l'altro, il sorgente sarebbe facilmente portabile anche su altre schede.

Per quanto riguarda il monitor seriale, dato che la Micro usa una seriale CDC e alcuni "trucchi del mestiere" per scatenare il reset prima del caricamento di uno sketch, può capitare che a volte venga mappata su un nuovo device invece che su quello che si usava prima, col risultato che il serial monitor rimane vuoto.

Per il resto l'ENC è abbastanza stabile. La libreria ha un'interfaccia orribile e parecchie limitazioni, ma alla fine dei conti funziona. Se hai modo di passare ad uno shield con WIZ5x00, tuttavia, mi sento di consigliartelo.

Si di fatti ci stavo pensando mentre scrivevo, è che mi sono fatto trascinare da tutti gli esempi che leggevo. Quale sarebbe allora la soluzione per il serial monitor?? Si di fatti la libreria mi sembra, almeno per me abbastanza complessa quella ethernet.h destinata al w5100 mi sembra molto più comprensibile vorrei utilizzarla anche perché ho un paio di libri che ne parlano approfonditamente, probablimente è stato un errore prendere l'enc anche perché non sono molto skillato nell'argomento ethernet. Anche forse andando contro la filosofia di arduino non mi fanno impazzire le shield quindi preferirei acquistare dei moduli, sai qualche modulo w5100 da consigliarmi che sia compatibile con la shield.

Ci sarebbe questo modulo dell'itead, anche se lo schema elettrico non mi sembra proprio uguale https://www.itead.cc/wiki/W5100_Ethernet_Network_Module

C'è anche una libreria per l'ENC che ricalca l'interfaccia di programmazione del Wiz, ma purtroppo necessita di molte più risorse di Ethercard, col risultato che sulla Uno/Leonardo rimane poco spazio (in RAM e flash) per fare altro che non sia gestire la rete. Dipende da cosa devi fare, se il tuo sketch non è "complesso" può anche andare bene, o magari se puoi usare una Mega. A quel punto potresti seguire tranquillamente i libri che hai senza cambiare scheda.

In effetti ENC e Wiz richiedono diverse quantità di lavoro ai microcontrollori che le gestiscono: il Wiz fa molte più cose col suo hardware, ma proprio per questo è più costoso. L'ENC è più economico ma per forza di cose impegna più RAM e tempo CPU.

Per il modulo non saprei, ho un paio di Wiz ma tutti su shield, e non vedo come possano essere scomodi... Io personalmente vorrei uno shield per qualunque cosa mi trovo a dover collegare ad Arduino, e spesso me ne costruisco a partire da un Proto Shield :).

Proverò a cercare la libreria di cui parli, grazie per la info, anzi se ti ricordi mi sapresti dire come si chiama, se no nn importa la trovo io online

Sicuramente le shield sono comodissime, nn lo metto in dubbio, è che a fine progetti mi piace mettere il tutto in un case, se fosse possibile anche in standelone su una basetta fotoincisa è anche per questo che ora stavo provando l'enc con genuino micro, che è molto comodo d'altronde da poter integrare con circuiti fatti da me, spero di essermi spiegato

Piccolo aggiornamento del progetto genuino micro + ENC Purtroppo il mio genuino micro è deceduto :'( :'( :'( , stavo facendo delle prove con il programma (quindi non sul cablaggio) che all'improvviso genuino si scollega poi si ricollega e Windows mi dice che la periferica non funziona correttamente, provo a staccare tutto e riattaccare genuino al pc, ma Windows all'inizio me la vede come periferica com dopo qualche secondo si scollega, si ricollega e me la vede come una periferica usb sconosciuta, ovviamente faccio svariate prove ma niente, a quel punto completamente demoralizzato tiro fuori una vecchia leonardo fake, faccio tutti i collegamenti carico il programma e funziona ma la cosa che non mi aspettavo è che funziona molto meglio della genuino micro, non perde un ping :fearful: La prima cosa che mi viene in mente è che genuino micro non riusciva ad alimentare con i suoi 3,3 volt il modulo enc e quindi esso malfunzionava e alla lunga sotto sforzo si sia bruciata.

Veramente ho messo un link alla libreria nel post precedente, basta cliccare ;).

Mi spiace che sia morta la Micro... Francamente non mi sono mai preoccupato troppo di quanto assorba l'ENC, io lo alimento comunque esternamente.

Comunque mai capitato che perda ping!