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();
   }
}

miércoles, 25 de enero de 2012

Arduino con puente-H para controlar un motor de DC

Un puente-H es un circuito integrado que provee al usuario la facilidad de controlar muchos dispositivos como relays, motores...
Para conectar un puente-H con un Arduino basta sólo con conectar 2 pines digitales al puente-H y darle alimentación al mismo, y obviamente conectar el dispositivo a controlar. Debido a que el puente-H permite invertir polaridad de sus salidas, podemos usar esta características para controlar el sentido de giro del motor.
Asumiremos un motor de 5v, y alimentaremos todo el sistema por la salida de 5v del Arduino.

void setup(){
  //pines 6 y 7 como salida a puente-H
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
}

void loop(){
  /*
    ambos pines deben estar en estados diferentes
    para que gire el motor en un sentido, si invertimos
    el estado de los pines, invertimos el sentido de giro
    del motor,
    si ambos estan en HIGH o LOW no se activará el motor
  */
  digitalWrite(6, HIGH);
  digitalWrite(7, LOW);
  delay(1000);
  digitalWrite(6, LOW);
  digitalWrite(7, HIGH);
  delay(1000);
}