ENC28J60 Ethernet beste Library

Ich habe mir überlegt ein Ethernetboard wie dieses hier zu holen:
http://www.ebay.de/itm/ENC28J60-Ethernet-LAN-Network-Module-For-Arduino-51-AVR-LPC-STM32-/170900783614?pt=LH_DefaultDomain_0&hash=item27ca7b01fe
Da diese Chips meines Wisssens nach nicht mit der Standard Library funktionieren (oder doch? Bitte klärt mich auf) suche ich eine gute Library die schon gut ausgereift ist.
Es sollte hauptsächlich in der Lage sein via telnet eine Email zu senden. Ich habe viele gefunden weiß aber nicht welche ich benutzen sollte.
Wer benutzt vielleicht sogar so ein Board und hat Erfahrung damit ?

Für Deinen Einsatzzweck würde ich von einem ENC28J60 abraten. Bisher kenne ich keine Lib, die TCP vernünftig umsetzt. Vor allem wenn es um einen TCP-Stream mit mehreren Paketen geht. Die Libs die ich kenne, können eine TCP-Verbindung aufbauen, ein Paket senden und gut. Beim Empfangen ebenso. Das klappt z.B. bei HTTP recht gut, solange nicht mehr Daten transportiert werden (egal in welche Richtung), als in ein Paket passen. Bei einer default MTU von 1500 sind das knapp 1.4KB. Mehrere Pakete erhöhen die Komplexität, da plötzlich Sequenznummern und ähnliches eine Rolle spielen.
Da Du aber SMTP (Mail senden) spechen willst, müssen immer mehrere Pakete übertragen werden, da SMTP eine Art "Frage-Antwort" Spiel zwischen Client und Server ist. Wenn Du eh in Hongkong bestellen willst, pack lieber noch 4 Euro drauf und nimm ein Shield mit W5100 Chip. Dort bildet der Chip die Protokolle TCP und UDP intern ab und Du kannst Dich auf die darüber liegenden Protokollschichten (siehe Wikipedia) kümmern.
Außerdem hast Du dann mit der Arduino IDE immer eine aktuelle Ethernet-Lib, die zur IDE passt, da sie Bestandteil davon ist.
Ein weiterer Vorteil ist, das Du mehr Speicher auf dem Arduino zur Verfügung hast, da die W5100 Lib deutlich Resourcen schonender ist, als die ENC28J60 Lib.
Mario.

Ok, dann wird es so ein Shield. Ich habe den Code schon am Computer mit telnet ausprobiert.
Wieso kann ich keine Email an mich bzw. an andere Server senden. Es geht nur mit 2 unterschiedlichen Emailadressen beim gleichen Server.
Was ist los?

legotechnicus:
Wieso kann ich keine Email an mich bzw. an andere Server senden. Es geht nur mit 2 unterschiedlichen Emailadressen beim gleichen Server.
Was ist los?

Wie sieht die Kommunikations zwischen Server und Client aus?
Authentifikation?

In Deutschland sind schon seit Jahren fast alle Mailserver bei Providern auf irgendeine Form von User-Authentifikation umgestellt und versenden Mail an fremde Mailserver nur dann, wenn sich der User als Kunde des Providers authentifiziert hat.

Also ich benutze telnet und gmail:

telnet gmail-smtp-in.l.google.com 25
220
HELO
250
MAIL FROM: MEINEMAIL@gmail.com
250
RCPT TO: <empfänger@web.de>
hier kommt die Fehlermeldung:
550-5.1.1
Meine Empfängeradresse würde nicht exsistiern
Bei einer anderen Adresse (@online.de)kommt :
451-4.3.0 Multiple destination domains is unsupported

Brauch ich einen anderen Befehl?

Auch Gmail liefert nicht einfach jede abgelieferte Email an andere Server aus, sonst wäre es in der SPAM-Flut schon längst versunken. Mit SMTP-Auth könnte es gehen, habe es aber selbst noch nicht ausprobiert. Evtl. musst Du dazu aber den Port 587 nehmen, da häufig nur dort authentisierte Verbindungen entgegengenommen werden.

legotechnicus:
Brauch ich einen anderen Befehl?

Du brauchst eine Authentifikation, vielleicht hilft Dir dieser Thread weiter, da ist sogar ein kompletter Arduino-Sketch dabei:

Der Sketch sendet allerdings per ungefragtem Pipelining die Kommandos viel zu schnell hintereinander, so dass manche Mailserver wie z.B. der von AOL darauf allergisch reagieren. Normal mußt Du nach jedem an den Mailserver abgesetzten Kommando die Rückantwort des Mailservers abwarten, bevor das nächste Kommando gesendet wird. Bei vielen Mailservern wie z.B. denen von 1&1 funktioniert der Sketch trotzdem, und bei vielen anderen wie AOL reicht ein delay an passender Stelle.

Danke dann habe ich nur noch eins.
Brauche ich eine bestimte Library oder kann ich die normale aus der IDE nutzen.
Im Internet finde ich nichts dazu.

legotechnicus:
Danke dann habe ich nur noch eins.
Brauche ich eine bestimte Library oder kann ich die normale aus der IDE nutzen.

Ethernet und SPI sind Standard-Libraries, die zur Arduino-Software bereits dazugehören und daher nicht extra installiert werden müssen.

legotechnicus:
Im Internet finde ich nichts dazu.

Mein Internet listet die Arduino Standard-Libraries auf dieser Seite auf:
http://arduino.cc/en/Reference/Libraries

mkl0815:
Für Deinen Einsatzzweck würde ich von einem ENC28J60 abraten. Bisher kenne ich keine Lib, die TCP vernünftig umsetzt. Vor allem wenn es um einen TCP-Stream mit mehreren Paketen geht.

Nun, das hat sich jetzt geändert:
Die von mir geschriebene UIPEthernet-library (GitHub - ntruchsess/arduino_uip: UIPEthernet: A plugin-replacement of the stock Arduino Ethernet library for ENC28J60 shields and breakout boards. Full support for persistent (streaming) TCP-connections and UDP (Client and Server each), ARP, ICMP, DHCP and DNS. Build around Adam Dunkels uIP Stack. Further developed version can be found on https://github.com/UIPEthernet/UIPEthernet) implementiert die von der Ethernet-library bekannten EthernetClient, EthernetServer und EthernetUDP Interfaces inklusive persistenten TCP-Verbindungen, DHCP, DNS und allem was dazu gehört. Der Speicherverbrauch ist moderat, da die Library alle empfangenen Packete im Speicher des ENC28J60 zwischenlagert um kontinuierlich streamen zu können. Sie verbraucht zwischen 200-400 Bytes RAM, je nach Anzahl offener Verbindungen, der Flash Speicherbedarf ist sicher größer als beim WIZ5100, da der code unvermeidlicherweise umfangreicher als der der Standard Ethernet-library ist. Mehr als 16kb Flash sollte der Arduino unbedingt haben, also alles mit ATmega328 aufwärts.
Die Standard-Ethernet-library Beispiele laufen damit ohne weitere Änderung, indem man das include von 'Ethernet.h' auf 'UIPEthernet.h' ändert (und das include von 'Spi.h' entfernt).

Gruß,

Norbert

Ich habe mal einen Sketch nach der Anweisung

Die Standard-Ethernet-library Beispiele laufen damit ohne weitere Änderung, indem man das include von 'Ethernet.h' auf 'UIPEthernet.h' ändert (und das include von 'Spi.h' entfernt).

umgearbeitet. Respekt, lief auf Anhieb. Mein Shield habe ich bis heute nie ans laufen bekommen und lag nur dumm in der Ecke 'rum. Aber nun....

Speicherverbrauch:
Mit WIZ5100-Shield: 15.734 Bytes
Mit ENC28J60-Shield: 27.306 Bytes

Da ist bei einem Uno schnell die Luft 'raus. Trotzdem: Gute Arbeit geleistet. Danke!
Gruß
Eberhard

eberduino:
Speicherverbrauch:
Mit WIZ5100-Shield: 15.734 Bytes
Mit ENC28J60-Shield: 27.306 Bytes

ja, ist leider so. Der WIZ5100 macht ja tcp, arp, icmp und udp in Hardware. Beim ENC28J60 kommt der ganze µIP-code, der das in Software macht, dazu.

Wenn man kein udp (und auch kein dhcp oder dns) braucht, kann man den Flash-speicherbedarf um fast 5kb senken, indem man in der uip-conf.h das define für UIP_CONF_UDP auf 0 setzt. Die nötigen Changes, damit das sauber compiliert, habe ich gerade in den dev-branch committed.

Die Checksummenprüfung und icmp wegzulassen würde ca. 600bytes sparen, das reißt es nicht raus. (Ist aktuell auch nicht konfigurierbar).

Gruß,

Norbert

Wow, *thumbs up!!". Das ist eine ordentliche Leistung. Damit können die ENC28J60 endlich deutlich sinnvoller eingesetzt werden.
Bisher haben die alten Libs ja TCP zu einer Art UDP 2.0 degradiert :slight_smile:

Vielen Dank für diese Arbeit.

Mario.

hallo,

ich habe gerade versucht die UIP library (tolle Arbeit übrigens) mit einem LC Soft Studio Modul zum Laufen zu bringen (z.B. die Beispielprogramme). Leider klappt das nicht. Auf demselben setup laufen ohne Hardwareänderung die Beispiele für die Ethercard ohne Probleme.
Hat das schon jemand einmal gesehen ? woran könnte es liegen ? Welche Pins nutzt die UIP Library ?

Gruss

s

in der Enc28J60Network.h sind bisher nur defines für Uno und Mega 2560 enthalten. Füge da bitte die passenden Werte für Dein Board ein.

Du kannst mir dann gerne auf Github einen Pull-request oder per email einen Patch schicken (addresse im Readme der library und in den copyright-notizen im Sourcecode) um das zu übernehmen.

viel Erfolg :slight_smile:

  • Norbert

P.S. Google sagt mir gerade, dass das gar kein Shield ist, sondern sowieso über Kabel verbunden wird. Also wohl nix mit in die Library aufnehmen, es sei denn, dass Du einen anderen Arduino als Uno oder Mega 2560 benutzt...

danke,

das Modul entspricht dem oben im thread. Ich habe einmal in der Ethercard library nachgeschaut: dort ist das CS auf pin 8, in Deinen auf 10, alle anderen 3 pins entsprechen denen in Deinen h Files (11,12,13). Ich habe den pin geändert und die Beispiele klappen nach wie vor nicht. Gibt es sonst noch einen hardware abhängigen Teil verändert wurde ?

s

nein, hardwaremäßig gibt's sonst nichts, der Chip hängt ja nur an diesen SPI-pins. Ich habe selber so ein Modul (ich weiß nicht, ob es wirklch das gleiche ist, aber es sieht jedenfalls genauso aus, wie das, was mir Google dazu ausgespuckt hat) zum Testen benutzt und bei mir funktionierts.

Man kann verschiedene Debug-level in der UIPEthernet.h anstellen und dann auf der seriellen Schnittstelle schauen, ob die Kommunikation mit dem Modul denn überhaupt was tut.

  • Norbert

Hallo,

danke für die Hinweise.

Ich hatte das Modul auf ein selbstgestricktes Shield mit der Pinbelegung der Ethercard gesteckt, d.h. CS=8, ansonsten 11,12,13 wie auch in der UIPlib. Wie schon gesagt klappte es nicht, in Enc28j60Network.h den CS auf Pin 8 zu setzen, um die Library zu nutzen. Ich habe dann den Pin 8 auf Pin 10 gelegt (verbunden), um die in der Library per Standard vorgegebene Pinkonfiguration zu nutzen - und die Originalversion der Library genutzt. Es klappte anstandslos.

Mir scheint, dass irgendwo in der Library der zusätzlich noch Pin 10 postuliert wird. Eine Änderung von CS 10 auf 8 in Enc28j60Network.h hat keinen (bzw. nur begrenzten) Effekt.

Gruss

s

danke für den Hinweis, dann werde ich das mal mit anderen Pins durchtesten... das kriege ich schon raus, wenn da in Bezug auf CS noch irgendwo der Wurm drin ist.

  • Norbert

Hi,

habe auch versucht die Library für mein Projekt zu verwenden.
Die einzelnen Demo-Programme funktionieren soweit problemlos - klasse Arbeit, erleichtert
die Verwendung des ENC28J60 mit dem Arduino doch sehr. Danke!

Wenn ich alllerdings mein fertiges Programm mit der Library erweitern will bekomme ich
den seltsammen Effekt, dass der Controller ständig einen Reset ausführt.

Mein Programm selbst steuert ein LCD-Display mit Touchfunktion an (MI0283QT)
Das Display ist über I2C angebunden. Es funktioniert alleine problemlos.
Ich wollte nun das Programm um Ethernet-Funktionen
erweitern. Über SPI (MISO, MOSI, CLK, CS) ist ein Ethernet-Modul mit dem ENC28J60-Chip
angeschlossen. Beide Hardwareteile alleine funktionieren (Display oder Ethernet).

Wenn ich allerdings versuche das Display über I2C und Ethernet über SPI anzusprechen
führt der Controller innerhalb der Setup-Routine einen Reset durch.

Ich hab den Fehler eingegrenzt und konnte feststellen, dass die Probleme dann auftreten wenn
ich den client definiere also:

EthernetClient client;

Vielleicht sollte ich noch sagen, dass ich aus Mangel an Speicher UDP deaktiviert habe, so wie
Norbert es hier beschrieben hat (in der uip-conf.h das define für UIP_CONF_UDP auf 0 setzen).

Sind Probleme bekannt, bei gleichzeitiger Nutzung von SPI und I2C ?

Was macht eigentlich EthernetClient client; so großartiges, dass
danach mein Code nicht mehr läuft?

Hier vielleicht noch zur Info die setup-Routine:
(Der komplette Code ist sehr viel Holz - wenn es jemand interessiert gerne mehr)

void setup(){

  uint16_t x=0, y=0;
  
  Serial.begin(9600);
  
  //init Wire lib
  Wire.begin();
  delay(100);
  //get firmware version
  Serial.print("version: ");
  send_i2c(CMD_VERSION);
  Wire.requestFrom(I2C_ADDR, 4); //request 4 bytes
  if (Wire.available())
    Serial.println("Wire available!");
  else
  {
    Serial.println("Wire not available!");  
    send_i2c(CMD_VERSION);
    Wire.requestFrom(I2C_ADDR, 4); //request 4 bytes
  }
  while(Wire.available())
  { 
//    Serial.println("Wire available!");
    char c = Wire.read();
    if (c == 0) 
    {
        Serial.print(".");     
        Wire.begin();
        delay(100);
        send_i2c(CMD_VERSION);
        Wire.requestFrom(I2C_ADDR, 4); //request 4 bytes
        
    }
    Serial.print(c);
  }
  Serial.println("");

  //get features
  Serial.print("features: ");
  send_i2c(CMD_FEATURES);
  Wire.requestFrom(I2C_ADDR, 1); //request 1 bytes
  while(Wire.available())
  { 
    char c = Wire.read();
    if(c & FEATURE_LCD){ Serial.print("LCD "); }
    if(c & FEATURE_TP) { Serial.print("TP ");  }
    if(c & FEATURE_ENC){ Serial.print("ENC "); }
    if(c & FEATURE_NAV){ Serial.print("NAV "); }
    if(c & FEATURE_LDR){ Serial.print("LDR "); }
  }
  Serial.println("");

  //get width and height
  Serial.print("width/height: ");
  send_i2c(CMD_LCD_WIDTH);
  Wire.requestFrom(I2C_ADDR, 2); //request 2 bytes
  if(Wire.available())
  { 
    x  = Wire.read()<<8;
    x |= Wire.read()<<0;
  }
  Serial.print(x, DEC);
  Serial.print("/");
  send_i2c(CMD_LCD_HEIGHT);
  Wire.requestFrom(I2C_ADDR, 2); //request 2 bytes
  if(Wire.available())
  { 
    y  = Wire.read()<<8;
    y |= Wire.read()<<0;
  }
  Serial.print(y, DEC);
  Serial.println("");

  //backlight
  Serial.println("backlight...");
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(CMD_LCD_LED);
  Wire.write(50); //0...100
  Wire.endTransmission(true);

  //clear screen
  Serial.println("clear...");
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(CMD_LCD_CLEARBG);
  Wire.endTransmission(true);

  Serial.println("...end");
 
  radio();  // Maske auf LCD zeichnen
   
  
  //enable touchpanel
  Wire.beginTransmission(I2C_ADDR);
  Wire.write(CMD_CTRL);
  Wire.write(CMD_CTRL_FEATURES);
  Wire.write(FEATURE_TP);
  Wire.endTransmission();

  // init ethernet

  Ethernet.begin(mymac, myip);
 
}

Wenn ich das Programm kompiliere und zum ATMEGA 328 sende bekomme ich im seriellen log:

0.04
LCD TP LDR
width/height: 320/240
backlight…
clear…
…end

0.04
LCD TP LDR
width/height: 320/240
backlight…
clear…
…end

0.04
LCD TP LDR
width/height: 320/240
backlight…
clear…
…end

usw. ständig ca. alle 200 ms diese 6 Zeilen, so als ob alle 200ms jemand reset drückt ??!

Hat jemand eine Idee wo ich suchen könnte??