miércoles, 1 de febrero de 2012

Controlar vía telnet un Arduino + Ethernet Shield

Controlar un arduino mediante una conexión telnet, es extremadamente sencillo, sólo requerimos añadirle un Ethernet Shield, y algún dispositivo que se comunique a éste mediante una conexión de red alámbrica o inalámbrica.
Una conexión telnet se lleva a cabo en el puerto 23, por lo tanto debemos configurar a nuestro módulo ethernet a que escuche en dicho puerto. Todo Ethernet Shield posee su propio identificador MAC, se encuentra pegado en el reverso del Shield. 
Controlaremos 3 leds mediante el uso de 3 comandos simples enviados a través de una conexión telnet. En mi caso, la dirección IP asignada por mi access point al módulo ethernet es 192.168.0.105. Podemos verificar la dirección asignada al módulo accediendo a la configuración del access point. Para comunicarnos con el módulo mediante algún dispositivo sólo necesitamos saber la dirección IP y el puerto, cómo usaremos Telnet, usaremos el puerto 23. La dirección IP varía de acuerdo al access point que usemos.
En Windows podemos usar HyperTerminal para conectarnos a la dirección IP asignada al módulo ethernet o UTFTeraTerm. En Mac podemos abrir la terminal y escribir "telnet dirección puerto", en mi caso "telnet 192.168.0.105 23". Si usamos un teléfono o dispositivo Android podemos usar la aplicación Socket Widget, y entablar una conexión con el módulo.




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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x88, 0x44 }; //se encuentra pegado en una etiqueta al reverso del ethernet shield
/* Si usamos DHCP ya no requerimos establecer  ip, gateway y subnet*/
//IPAddress ip(192, 168, 0, 105);
//IPAddress gateway(192,168,0, 1);
//IPAddress subnet(255, 255, 255, 0);

//el puerto usado para telnet es el 23
EthernetServer server(23);
boolean estadoled1 = false, estadoled2 = false, estadoled3 = false;

void setup() {
  
  //inicializamos pines para controlar leds
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  
  //inicializar modulo ethernet
  //Ethernet.begin(mac, ip, gateway, subnet);
  /* Podemos inicializar el módulo Ethernet sin ip, gateway
   y subnet, porque a partir de la versión 1.0 de Arduino
    ya se soporta DHCP */

  Ethernet.begin(mac);
  //esperamos clientes
  server.begin();

 /* Imprimimos la dirección IP local y
     esperamos un tiempo para que el módulo obtenga ip dinámico,
      así ya sabemos exactamente dónde queremos comunicarnos */

   delay(1000);
   Serial.begin(9600);
   Serial.print("Mi dirección IP: ");
   for (byte i = 0; i < 4; i++) {
     Serial.print(Ethernet.localIP()[i], DEC);
     Serial.print(".");
   }
   Serial.println();
}

void loop() {
  //nos mantenemos esperando un cliente nuevo
  EthernetClient cliente = server.available();
  
  //si hay un cliente, se imprime mensaje hasta recibir información de él
  if (cliente) {
    cliente.println("Conectado a TELNET ARDUINO");
    while (cliente.connected()) {
          //leemos
          char data = cliente.read();
          //prendemos/apagamos leds
          switch(data){
            case '1':
              digitalWrite(5, estadoled1);
              cliente.print("led1 ");
              cliente.println(estadoled1 ? "prendido" : "apagado");
              //si se vuelve a mandar el char '1' invertimos la operacion anterior
              estadoled1 = !estadoled1;
              break;
            case '2':
              digitalWrite(6, estadoled2);
              cliente.print("led2 ");
              cliente.println(estadoled2 ? "prendido" : "apagado");
              estadoled2 = !estadoled2;
              break;
            case '3':
              digitalWrite(7, estadoled3);
              cliente.print("led3 ");
              cliente.println(estadoled3 ? "prendido" : "apagado");
              estadoled3 = !estadoled3;
              break;
            default:
              break;
         }
       }
     }
     
     //nos aseguramos de tener una conexión cerrada
     cliente.stop();
   }
}

2 comentarios:

  1. Hola amigo, trate de compilar tu codigo y me arroja estos errores, podrias ayudarme?


    sketch_may28a.cpp:8:1: error: 'IPAddress' does not name a type
    sketch_may28a.cpp:9:1: error: 'IPAddress' does not name a type
    sketch_may28a.cpp:10:1: error: 'IPAddress' does not name a type
    sketch_may28a.cpp:13:1: error: 'EthernetServer' does not name a type
    sketch_may28a.cpp: In function 'void setup()':
    sketch_may28a.cpp:25:23: error: 'ip' was not declared in this scope
    sketch_may28a.cpp:25:27: error: 'gateway' was not declared in this scope
    sketch_may28a.cpp:25:36: error: 'subnet' was not declared in this scope
    sketch_may28a.cpp:27:3: error: 'server' was not declared in this scope
    sketch_may28a.cpp: In function 'void loop()':
    sketch_may28a.cpp:32:3: error: 'EthernetClient' was not declared in this scope
    sketch_may28a.cpp:32:18: error: expected ';' before 'cliente'
    sketch_may28a.cpp:35:7: error: 'cliente' was not declared in this scope

    ResponderEliminar
  2. aparentemente tu versión de arduino no está actualizada, te sugiero visites www.arduino.cc y actualices a la más reciente.
    Si sigues teniendo problemas, con mucho gusto te echo la mano
    Saludos!

    ResponderEliminar