ENC28J60 Funcionando perfectamente. ¿Cual es la limitacion?

Compañeros

He añadido un regulador en vista que el modulo me marcaba un consumo de mas de 50mA que era lo que podia suministrar la placa de mi arduino, aconsejo a cualquiera que vaya a realizar las pruebas que haga lo mismo o que emplee una alimentacion de 3v3 de otro sitio que no sea la placa de arduino si esta no lleva un regulador especifico de 3v3.

Una forma de poner el regulador para experimentar puede ser esta:

Las UNO dan hasta 150mA así que en principio con éstas no debería hacer falta, pero sí, con las antiguas si que existe el problema

150ma? No sabia esto del arduino UNO.

COMO hago para leer y escribir desde el processing ?

cada vez que quiero leer un dato del arduino tengo que refrescar la pagina wed.

como hago para solucionar esto ?

Puedes intentar dos cosas, no he probado ninguna pero te comento a ver si vale:

1.- Si empleas firefox como navegador un plugin que autorefresca la pagina web para que no te tire de la sesion, se llama RELOAD EVERY
Te dejo un enlace explicadito facil facil: Evitar el cierre de sesión. Autorefrescar automáticamente páginas web con ReloadEvery, extensión de Firefox.

2.- Este codigo se emplea para el refresco de webcam, debiera valerte pero te toca probar, si ninguno funciona... a machacar google con "autorefresco paginas web"

<html>
<head>
<META HTTP-EQUIV="pragma" CONTENT="no-cache">
<META HTTP-EQUIV="refresh" CONTENT="0">
</head>
<body>
<center>
<h2>My Web Cam</h2>
<img src="webcam.jpg" width="480" height="360">
</center>
</body>
</html>

Donde pone "img src" es la linea que muestra la imagen de la webcam, aqui tu pondrias los valores de lo que estes monitorizando en vez de este linea.

En esta otra META HTTP-EQUIV="refresh" CONTENT="0" cambias el valor de cero en "CONTENT" por valores de 2 a 5 o incluso 15, es el tiempo de refresco.

Cuentanos si le das solucion...

Un saludo.

buenas, gracias por su ayuda, me orientado un poco donde debo apuntar.

en cuanto el plugin de firefox, me lo instale pero tengo problemas para en contrar el icono .ja

-en cuanto al codigo si funciona, de hecho solo se necesita esta sola linea;
"<META HTTP-EQUIV= ""refresh"" CONTENT= ""0"">"

el problema es que no es en tiempo real, se pierde tiempo, en que la pagina hacede al servidor
y este envia los datos.
por ejemplo aqui , en la imagen de abajo, se puede apresiar de lado izquierdo
los datos que deberian ser 1 a 1, pero se puede apresiar la
perdida de tiempo.

yo quiero algo como el puerto serial, tiempo rea, no me sirve para mis propositos.

aqui el code:

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 1, 15};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 ethernet;
int i =0;
int z=0;
void setup()
{ 
  ethernet.setup(mac, ip, port);
}

void loop()
{
  z= z +1 ;
  if (ethernet.serviceRequest())
  {
    i= i+1 ;
   
    ethernet.print("<META HTTP-EQUIV= ""refresh"" CONTENT= ""0"">");
        ethernet.print("<h2>My Datos</h2>  ");
        ethernet.print(i);
         ethernet.print("                       ");
          ethernet.print(z);
       
    ethernet.respond();
  }
  delay(100);
}

Los plugins de firefox no tienen iconos estan dentro de "herramientas" - "complementos" o puedes acceder a ellos pulsando ctrl + mays + a

Lo que tu quieres no es para emplear refresco de pagina web, eso es lento, has mirado dentro de la libreria los ejemplos que hay?

Creo que este puede ser lo que buscas:

// A simple web server that always just says "Hello World"

#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 1, 15};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 e;

void setup()
{ 
  e.setup(mac, ip, port);
}

void loop()
{
  if (e.serviceRequest())
  {
    e.print("<H1>Analog Values</H1>
<table>");
    e.print("<tr><th>Input</th><th>Value</th></tr>");
    for (int i = 0; i < 6; i++)
    {
      e.print("<tr><td>"); e.print(i); e.print("</td><td>"); e.print(analogRead(i)); e.print("</td></tr>");
    }
    e.print("</table>");
    e.respond();
  }
  delay(100);
}

Obviamente, cambiandolo a tu gusto.

Mira a ver...

Yo buscare tambien algo de info sobre envio de datos por http mas rapido.

Un saludo


Esta es mi placa. La pegatina que está pegada sobre el conector de la tarjeta es la misma, lo único que cambia es 09/48 por 12/08 que es la que tiene pegada sobre el conector de mi placa. Por lo demás es igual.

En el chip de mi placa es: ENC28J60-I/SO 1145164 y el fabricantes es microchip

Pues nada amigos, he instalado la placa y no va. Windows no detecta ningún dispositivo de red, es decir, no detecta nada conectado al puerto ethernet y después de intentar con varias librerías no consigo echar a andar la tarjeta.

Usé la librería ETHER_28J60 y cuando intento ejecutar el ejemplo HelloWorld me da el siguiente error al compilar.

HelloWorld.cpp:4:25: error: ETHER_28J60.h: No such file or directory
HelloWorld.pde:-1: error: 'ETHER_28J60' does not name a type
HelloWorld.cpp: In function 'void setup()':
HelloWorld.pde:-1: error: 'ethernet' was not declared in this scope
HelloWorld.cpp: In function 'void loop()':
HelloWorld.pde:-1: error: 'ethernet' was not declared in this scope

Mi arduino es el duemilanove y la alimentación es de 3,3v conectado directamente al arduino.

Probé con otras librerías, ya que he mirado en por lo menos una docena de web, he probado todo lo probable y como mucho conseguí con una librería que se encendiesen las luces de la clabija del cable de red. Las luces parpadean 3 veces y se apagan y windows en ningún momento detecta nada conectado al puerto ethernet.

Espero que alguien me eche una mano con esto, por que llevo ya bastante tiempo dedicado a echar a andar la placa y no hay manera.

EDITO: Al principio lo conecté a 5v en vez de a 3,3 y se calentaba mucho, supongo que se habrá quemado. La cosa es que aún así, con una librería cuando arranca el arduino las luces del conector ethernet parpadean y con otras librerías no, con lo cual, si se a quemado, al menos hace algo.

Pues la cosa podría no ser muy grave. Lo primero de todo te dice: "HelloWorld.cpp:4:25: error: ETHER_28J60.h: No such file or directory". Vamos, que no encuentra la librería que estás probando, la ETHER_28J60.h. O no la has instalado o la has puesto en un directorio que no es el de las librerías de Arduino. El resto de errores son provocados por no tener esa librería instalada.

Aprovecho que se ha subido este tema. Al final yo también adquirí un módulo ENC28J60 y lo hice funcionar. Yo he utilizado la librería EtherCard.h. Sin embargo os comento una limitación que he visto y es que ninguna de las librerías para este módulo que hay por la red (al menos no he sabido encontrar ninguna) permite la comunicación UDP.

Cheyenne:
Aprovecho que se ha subido este tema. Al final yo también adquirí un módulo ENC28J60 y lo hice funcionar. Yo he utilizado la librería EtherCard.h. Sin embargo os comento una limitación que he visto y es que ninguna de las librerías para este módulo que hay por la red (al menos no he sabido encontrar ninguna) permite la comunicación UDP.

1º ¿Solo funciona a 3,3v?
2º Cuando conectas el enc28j60 con el cable de red, windows detecta algo?, me refiero a que si la detección de la tarjeta por windows es automática, evidentemente si la tarjeta está alimentada o para que windows detecte algo, es necesario dar con el controlador adecuado.

Cheyenne:
Aprovecho que se ha subido este tema. Al final yo también adquirí un módulo ENC28J60 y lo hice funcionar. Yo he utilizado la librería EtherCard.h. Sin embargo os comento una limitación que he visto y es que ninguna de las librerías para este módulo que hay por la red (al menos no he sabido encontrar ninguna) permite la comunicación UDP.

SI LO soporta, bajate esta libreria.http://kmtronic.com/dino-internet-ethernet-io-board-ping-example.html

aqui, mi code-

#include "EtherShield.h"

uint8_t mymac[6] = {0xCF,0x70,0x7C,0xE4,0x8A,0xB8};
uint8_t myip[4] = {192,168,1,25};
uint16_t MYWWWPORT = 80;

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

char reply[]="Realized";


static uint8_t udp_length;
static float udp_buffer[50];

EtherShield es=EtherShield();

uint16_t plen, dat_p;

///----------------------------------------------------------
void setup(){
 
  
 
  Serial.begin(9600);
  es.ES_enc28j60Init(mymac);
  es.ES_init_ip_arp_udp_tcp(mymac,myip, MYWWWPORT);

} // end setup
///----------------------------------------------------------
String readString;
float n;
char c;
void loop(){
 
    // read packet, handle ping and wait for a tcp packet:
    dat_p=es.ES_packetloop_icmp_tcp(buf,es.ES_enc28j60PacketReceive(BUFFER_SIZE, buf));
    
    if (buf[IP_PROTO_P]==IP_PROTO_UDP_V){
      
       udp_length=buf[39]-8; // calculate UDP data lenght
       
       for (int i = 0; i < udp_length; i++)
        {
           c = buf[42+i];
          readString += c;
          // Serial.println(udp_length);
        
      
        }
        
        char carray[readString.length()+1];
       
	//readString.toCharArray(carray, sizeof(carray));
         readString.toCharArray(carray, sizeof(carray));
       n = atof(carray);
     //  udp_buffer[0]= n;
        Serial.print("   ");
       Serial.println(carray);
       Serial.println(n);
       es.ES_make_udp_reply_from_request(buf,carray,sizeof(carray),12345);
       readString="";
       
      
       
       buf[IP_PROTO_P]=0;
    }    
    
} // end loop

Para Processing 1.5 o te bajas este programita del aautor.http://www.kmtronic.com/software/DINo/UDP_Example/KMTronic%20DINo%204%20Relay%20UDP%20Test%20Software.zip

import hypermedia.net.*;
 
 UDP udp;  // define the UDP object
 
 
 void setup() {
 udp = new UDP( this, 12345 );  // create a new datagram connection on port 6000
 //udp.log( true );         // <-- printout the connection activity
 udp.listen( true );           // and wait for incoming message  
 }
 
 void draw()
 {
 }
 
 void keyPressed() {
 String ip       = "192.168.1.25"; // the remote IP address
 int port        = 12345;        // the destination port
 
 float f=1.9;
 String s2 = Float.toString(f); //version 2
 
 udp.send(s2, ip, port );   // the message to send
 
 }
 
 void receive( byte[] data ) {          // <-- default handler
 //void receive( byte[] data, String ip, int port ) {   // <-- extended handler
 
 for(int i=0; i < data.length; i++)
 print(char(data[i]));  
 println();  
 }

.................................
el problema que me tiene en vela, es que siempre actua el envio como un estimulo-repuesta.
es decir, que siempre que se quiera enviar un paquete udp desde el arduino se debe hacer un ping (o enviar un paquete)al "Server Arduino".
yo quiero que actue de forma independiente, como si seria un puerto serial, envio y resivo si ninguna condicion .espero que se me alla
entendido.
Si alguien tiene a solucion se lo agradeceria

Gracias Omnimusha, lo probaré. Lo que sí es cierto es que parece más sencillo con la librería original del IDE para el W5100. Además la sensación es que el protocolo UDP es más sencillo pero no debe utilizarlo mucha gente y por eso nadie ha debido de implementarlo de forma sencilla, como bien dices para su manejo como si fuera un puerto serie, para el ENC28J60. Si no se puede hacer de otra manera creo que es poco útil que Arduino sólo pueda enviar un UDP si previamente recibe un PING.

El cable de red tiene que ser cruzado o directo???. Yo conecto el arduino al PC por el puerto ethernet, pero lo único que consigo es que las luces parpadeen y nada más. Windows tampoco detecta que esté conectado.

En principio si lo conectas a un router o switch tiene que ser paralelo y si lo conectas a un ordenador tiene que ser cruzado aunque algunos ordenadores lo detectan y puedes conectarlo tanto en paralelo como en cruzado.

Conecté el arduino a mi router con un cable ethernet y funciona. La pregunta es, si quiero que se pueda acceder al arduino desde Internet como lo hago. Es decir, yo cuando en mi navegador escribo 192.168.1.25 me sale la página que genera el arduino, pero si quiero acceder a la página del arduino desde Internet, por ejemplo en otro lugar fuera de mi red domestica como lo hago?

Sería la IP que tengo en Internet más un puerto por ejemplo 98.34.123.123:5000 ?

Correcto, pero tienes que redireccionar el puerto 5000 en el router.

98.34.123.123:5000

Aqui viene un ejemplo

Hola,
desde Internet depende: si tienes IP fija, abres un puerto en el router y entras tal como planteas. Pero la mayoría de la gente no tenemos IP fija, la IP cambia cada vez que nos conectamos a Internet. En este último caso se necesitan los servicios de algun proveedor de Dynamic DNS, mejor si es gratuito.

Buena apreciación de nuestro amigo @curro92