Go Down

Topic: Uso de Modulo ethernet ENC28J60 (email, pachube, www, twitter, etc) (Read 13263 times) previous topic - next topic

eb4cak

Hola

Como muchos sabréis un módulo ENC28J60 te permite hacer todo eso por menos de 10€, pero es difícil de usar. 
Es fácil hacerse un servidor web, pero el problema es que hay (ignoro si el otro tb) una limitación muy gorda. El tamaño de la web no puede superar al de un paquete TCP (1500 caracteres). Es un problema gordo. ¿Alguien sabe como superarlo?   
(Se de un truco, que es usar un servidor que con esos 1500 caracteres y con PHP, haga una web decente)

Por internet hay varias librerias, mi favorita es esta:
http://srmonk.blogspot.com/2010/03/simplified-ethernet-library-for-28j60.html

Esta tiene muchisimos ejemplos, con twiter, pachube y mas cosas. Solo he probado el servidor web y no te deja subir el buffer casi nada, no se por qué  (si 1500 caracteres es poco, prueba con 500):
http://blog.thiseldo.co.uk/?p=570

La librería más extendida creo que es la de nuelectronics:
http://www.nuelectronics.com/estore/index.php?main_page=project_eth

He visto mucha información, pero casi toda repetida y poco clara, he buscado aquí y he pensado en abrir otro hilo para compartir información de esté potente y barato módulo.

Algo que me gustaría y no soy capaz, es enviar email's, ¿alguien sabe si hay algún ejemplo en algún lado?

Gracias.


Sergegsx

pues por muy barato que sea yo creo que esos 12 euros los tire a la basura porque es muy dificil de programar con respecto al shield original.
para hacer servidores hay muchos ejemplo y puede que ese sea su fuerte, pero para hacer una simple llamada a una dirección web, no hay ni un solo ejemplo sencillo en la web.
mi shield esta acumulando polvo en la estanteria desde que lo recibi hace 2 o 3 semanas.

para enviar emails creo que lo mejor seria llamar a un archivo php pasandole los parametros (destinatario, mensaje, etc) y que el php se encarge de enviar el email, pero para esto hay que "llamar" a una URL y es lo que encuentro imposible de hacer con este shield.

si averiguas algo avisa please

JRodrigo

Yo estoy como Sergegsx es un poco complicado de utilizar, sobretodo la librería de nuelectronics y no hay mucha información por internet.

Para enviar email también estoy con Sergegsx ya que si buscas por interter "Php email" encontraras miles de ejemplos, y dependiendo de donde sale un email (servidor casero) los Correos como gmail o hotmail ni los van a recibir por que los consideraran spam o pishing.

Actualmente yo la estoy utilizando para hacer un robot con un router wifi, leer los datos del arduino y con variables GET moverlo, pero me esta costando, por que dependiendo de la programación se cuelga la shield :smiley-sleep: pero probare con esa librería simplificada que pones haber que tal va!

Un saludo!


Sergegsx

JRodrigo usando GET estas ordenando al robot, verdad? nada de hacer que el robot haga la llamada GET hacia afuera? es decir un web client simplificado.
es que me extraña tanto que con todos los ejemplos que hay, no haber podido encontrar en internet ni un solo ejemplo que el shield llame a una URL de internet. mi intención es pasar unos parametros a un php para que lo suba a mysql, pero no hay forma.

chiva

Los del Nanode que han sido comprados por Pachube, tienen una placa con el ENC28J60 por lo que tienen código para subir a Pachube.
Puede que os interese:
http://wiki.london.hackspace.org.uk/view/Nanode_Applications

ikaros

Aquí otro quemado con la placa esta... vaya perdida de dinero.

Yo solo la queria para hacer un simple http request, pasar por GET unos valores y ya está... pero, mierda, nada...  no he visto absolutamente ningún ejemplo.

A pedir la placa oficial.

JRodrigo

@Sergegsx yo estoy como vosotros no he encontrado nada para enviar datos a una url utilizando GET, así que me he resignado a utilizarla como host para el robot.

chiva

He estado mirando el link que he puesto justo antes y tienes dos ejemplos de pasar datos por PUT/POST
http://blog.rafaeltorrales.info/2011/10/14/nanode-and-pachube-for-the-rest-of-us/
http://blog.wickeddevice.com/?p=260

Y aquí otro que ha hecho uno de los proyectos que tenía en mente hacer en un futuro, un receptor de radio por internet, aunque también con el ENC28J60:
http://dangerousprototypes.com/2011/10/31/home-camp-nanode-internet-radio/


ikaros

Aquí he encontrado un ejemplo de como hacer un get request:

http://www.nuelectronics.com/estore/?p=14

Pero... me parece infumable. Creo que acabaré comprandome la placa basada en WIZ...

Sergegsx

Yo ya he comprado un wiz de china, y el otro de pisapapeles

netrunnercl

Estimados,

Me encontre este hilo revisando las referencias de mi blog.

Comparto con ustedes algo de la frustracion de la libreria Ethershield, la documentacion son los comentarios del programador en los ejemplos, pero de ahi a tirar la el chip porque no hace lo que quieres lo encuentro un poco exagerado.

No soy programador, pero con un poco de tiempo y preguntandole a amigos por alli y por alla, he podido avanzar de a poco en comprender como funciona la libreria

Para hacer get pueden encontrar un ejemplo aqui: http://blog.rafaeltorrales.info/2011/11/07/nanode-ethershield-obtaining-your-external-ip-addres/

Aqui tambien les dejo la primera parte de un mini tuto para empezar con la libreria:
http://blog.rafaeltorrales.info/2011/11/03/nanode-and-ethershield-library-overview-part-1/


Bueno ahi va mi aporto espero que les sirva de algo

Sergegsx

parece muy interesante, pero una prueba rapida me ha dado este error.

Code: [Select]
sketch_nov11a.cpp: In function 'void browserresult_callback(uint8_t, uint16_t)':
sketch_nov11a:45: error: 'Serial' was not declared in this scope
sketch_nov11a:46: error: 'DEC' was not declared in this scope
sketch_nov11a:55: error: 'strncmp' was not declared in this scope
sketch_nov11a:72: error: 'boolean' was not declared in this scope
sketch_nov11a:72: error: expected `;' before 'eop'
sketch_nov11a:73: error: 'eop' was not declared in this scope
sketch_nov11a.cpp: In function 'void setup()':
sketch_nov11a:105: error: 'Serial' was not declared in this scope
sketch_nov11a:120: error: 'HEX' was not declared in this scope
sketch_nov11a.cpp: In function 'void printIP(uint8_t*)':
sketch_nov11a:139: error: 'Serial' was not declared in this scope
sketch_nov11a:139: error: 'DEC' was not declared in this scope
sketch_nov11a.cpp: In function 'void loop()':
sketch_nov11a:153: error: 'millis' was not declared in this scope
sketch_nov11a:155: error: 'boolean' was not declared in this scope
sketch_nov11a:155: error: expected `;' before 'gotIp'
sketch_nov11a:161: error: 'Serial' was not declared in this scope
sketch_nov11a:186: error: 'Serial' was not declared in this scope
sketch_nov11a:212: error: 'Serial' was not declared in this scope
sketch_nov11a:216: error: 'NULL' was not declared in this scope


Si a alguien le funciona que avise, intentae probar en otro momento

ikaros

Yo por el momento paso de perder el tiempo con este cacharro...


Por cierto, sabéis si la placa WIZ interfiere con el típico LCD (smartie creo que es)... Me gustaría hacer una estación meteorológica autónoma.

cristianmercado19


Pero... me parece infumable. Creo que acabaré comprandome la placa basada en WIZ...


100% de acuerdo


Yo ya he comprado un wiz de china, y el otro de pisapapeles

estaba a punto de hacer lo mismo pero... tendría 5 pisapapeles :(

La librería de nuelectronics es una de las mas complejas que hay para ese componente, seguramente tenga muchos mas beneficios que otras y trabaje muy bien pero... necesitas mucho código para hacer un simple request.
Por otro lado, el standard de arduino es la wiz. Creo que eso suma mucho al momento de elegir la placa, elegir la compatibilidad y apostar a que a futuro la librería de wiz siga mejorándose. Creo que esto pesa mucho cuando se va a comercializar un producto (no se si es el caso... ya que la mayoría somos aficionados)

Volviendo al grano, di con una librería que en un principio me solucionaba la asignación dinámica de IP (dhcp). Luego me di cuenta que simplificaba mucho el manejo en general de la enc28j60.
link: http://blog.thiseldo.co.uk/?tag=enc28j60
última versión:  http://blog.thiseldo.co.uk/?p=504

Les dejo código de ejemplo que:
1- realiza la asignación de ip dinamicamente
2- hace un request a una página.
Tener en cuenta que se debe instalar la librería de thiseldo.

Code: [Select]

/* INIT LIBRARY REGION *******************************************************************************/
#include <EtherShield.h>

/* END LIBRARY REGION ********************************************************************************/

/* INIT VARIABLES DECLARATION REGION *****************************************************************/

// count the package received
int packageNumber = 0;

static uint8_t mymac[6] = {
  0x54,0x55,0x58,0x10,0x00,0x25};

static uint8_t myip[4] = {
  0,0,0,0 };
static uint8_t mynetmask[4] = { 
  0,0,0,0 };

static uint8_t gwip[4] = {
  0,0,0,0};

static uint8_t dnsip[4] = {
  0,0,0,0 };
static uint8_t dhcpsvrip[4] = {
  0,0,0,0 };

#define BUFFER_SIZE 750
static uint8_t buf[BUFFER_SIZE+1];

EtherShield es = EtherShield();

#define HOSTNAME "arduino.cc"
#define WEBSERVER_VHOST "arduino.cc"

// sub-path http
#define HTTPPATH "/en/Tutorial/StringAppendOperator"

static int8_t dns_state=DNS_STATE_INIT;

/* FINISH VARIABLES DECLARATION REGION ***********************************************************/

/* INIT FUNCTIONS REGION *************************************************************************/
void printNetworkSettings()
{
  // Display the results:
  Serial.print( "My IP: " );
  printIP( myip );
  Serial.println();

  Serial.print( "Netmask: " );
  printIP( mynetmask );
  Serial.println();

  Serial.print( "DNS IP: " );
  printIP( dnsip );
  Serial.println();

  Serial.print( "GW IP: " );
  printIP( gwip );
  Serial.println();

}

void printMacAddress()
{
  for( int i=0; i<6; i++ ) {
    Serial.print( mymac[i], HEX );
    Serial.print( i < 5 ? ":" : "" );
  }
  Serial.println();
}

// Output a ip address from buffer
void printIP( uint8_t *buf ) {
  for( int i = 0; i < 4; i++ ) {
    Serial.print( buf[i], DEC );
    if( i<3 )
      Serial.print( "." );
  }
}

// Is executed when a package arrives
void browserresult_callback(uint8_t statuscode,uint16_t datapos, uint16_t dataEnd)
{
  Serial.println();
  Serial.print(packageNumber);
  Serial.println(". ------- READING PACKAGE ------------------------------------- ");
  Serial.println();

  int posInit = 0;

  char* text = (char*)&buf[datapos];

  while (posInit < dataEnd)
  {
    Serial.print(text[posInit]);
    posInit++;
  }

  Serial.println();
  Serial.println(" ------ FINISH PACKAGE---------------------------------------------- ");
  Serial.println();

  packageNumber++;
}

/* FINISH FUNCTIONS *******************************************************************************/


void setup() {

  Serial.begin(9600);
  Serial.println();
  Serial.println("DHCP WEB Client test");
  Serial.println();

  Serial.println("Mac Address:");
  printMacAddress();
  Serial.println();

  // Initialise SPI interface
  Serial.println("Init SPI");
  es.ES_enc28j60SpiInit();
  Serial.println();

  // initialize enc28j60
  Serial.println("Init ENC28J60");
  es.ES_enc28j60Init(mymac);
  Serial.println();

  Serial.println("Init done");
  Serial.println();

  Serial.print( "ENC28J60 version " );
  Serial.println( es.ES_enc28j60Revision(), HEX);
  Serial.println();

  if( es.ES_enc28j60Revision() <= 0 ) {
    Serial.println( "FAILED TO ACCESS ENC28J60 (check version)");
    Serial.println( "The program was canceled.");

    while(1);    // Just loop here
  }

  Serial.println("Requesting IP Address");

  // Get IP Address details
  if( es.allocateIPAddress(buf, BUFFER_SIZE, mymac, 80, myip, mynetmask, gwip, dhcpsvrip, dnsip ) > 0 )
  {
    Serial.println("Dinamic IP address process successful"); 
    printNetworkSettings();
    Serial.println();
  }
  else {
    Serial.println("Failed to get IP address");
    Serial.println( "The program was canceled.");

    while(1);    // Just loop here
  }

}


void loop()
{
  uint16_t dat_p;
  int plen = 0;

  // Perform DNS Lookup for host name
  if( es.resolveHostname(buf, BUFFER_SIZE,(uint8_t*)WEBSERVER_VHOST ) > 0 ) {
    Serial.println("Hostname resolved");
    Serial.println();

    Serial.println("Processing Get request to:");
    Serial.print(HOSTNAME);
    Serial.println(HTTPPATH);
    Serial.println();
   
    // wait 5 sec. for checking the serial's messages
    delay(5000);
   
    es.ES_client_browse_url(PSTR(HTTPPATH), NULL, PSTR(HOSTNAME), &browserresult_callback);

    while(1) {

      // wait for a tcp packet - calling this routine powers the sending and receiving of data
      plen = es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf);
      dat_p = es.ES_packetloop_icmp_tcp(buf, plen);
    }
  }
  else {
    Serial.println("Failed to resolve hostname");
  }

}


Si alguno la tiene de pisapapeles me la manda que yo le doy mejor vida ;)
Espero les sea útil el ejemplo.

Market

Go Up