LINKDUINO: Linksys + Arduino + Excel-Telnet

.


 
Veremos como conectar este magnifico router junto a Arduino. Hasta ahora, siempre habia utilizado este router para crear redes WDS ó como repetidor universal.


 Repetidor externo gracias a WRT54GL en una caja con IP65: apto para alimentación 220v ó con batería 12v
.



La ventaja de este router, es la de disponer de linux en su interior y ésto ha creado una gran comunidad, la cual ha desarrollado nuevos firmwares, que añaden multitud de ventajas respecto al original. Haciendo que este router de consumo no tenga nada que envidiar a equipos profesionales.
Uno de ellos es DD-WRT (http://www.dd-wrt.com)

Buscando por la red información, encontré multitud de proyectos que lo usaban, llamandome la atención el poder usar el puerto serie del micro (Broadcom BCM5352).Véase: http://ahorcandoeltiempo.blogspot.com/search/label/Arduino

Existe un libro de cómo hackearlo:

No hace falta explicar aquí como se debe cambiar el software ó el pin-out del puerto serie, ya que existe multitud de información en la red, pero sólamente recalcar el hecho de tener primero que instalar la version mini ó micro de firmware, antes que cualquier otra. La salida serie del router Linksys es 3v3 y la del arduino es 5v...CUIDADO!!




WRT 54 GL v1.1 + Arduino


Una vez con el firmware instalado, nos podemos conectar al shell del router mediante telnet ó ssh. Para ello podemos usar el putty. El usuario y contraseña por defecto una vez instalado el dd-wrt es: User:root y Password:admin.

Ahora, abrimos dos sesiones de telnet del router (Rx y Tx):
+ En la primera, sacaremos toda la información del puerto serie al shell. Para ello usaremos:
cat < /dev/cua/1 
+ En la segunda, enviaremos las cadenas de texto que queramos al puerto serie.
echo cadenaaenviar > /dev/cua/1


En el ejemplo que he realizado, en la parte Arduino se programa un simple prótocolo serie, en el que al recibir una pequeña trama, encienda ó apague un led. Las ordenes serán S1F ó S0F.
Veamos un diagrama de flujo del programa:



Por supuesto que podría mejorarse, pero vamos paso a paso... Ya que no se contempla rutinas de salida cuando se reciben carácteres no esperados ó por exceso de tiempo, checksum,...


Aquí adjunto el programa de arduino:


Code:
//Mini protocolo serie
//Igor Real

int luz1= 13;
int el1;
int estado=0;
byte dato_recibido;

void setup() {
   pinMode(luz1, OUTPUT);
   pinMode(12, OUTPUT);
   digitalWrite(12,LOW);
   Serial.begin(9600);
}

void loop()
{
  //trama a recibir --> S1F o S0F
  //S inicio
  //1 ENCENDIDO Y 0 APAGADO
  //F fin
  while (Serial.available() > 0)
  {
    //Significa que has recibido algo y lees el primer byte
    dato_recibido=Serial.read();
    if (dato_recibido=='S' && estado==0){
      estado=1;
    }
    if (((dato_recibido=='1')||(dato_recibido=='0')) && estado==1){
      estado=2;
      if (dato_recibido=='1')  el1=1;
      if (dato_recibido=='0')  el1=0;
    }
    if (dato_recibido=='F' && estado==2){
      estado=0;
      digitalWrite(luz1,el1);
      if (el1==0)  Serial.println("APAGADO");
      if (el1==1)  Serial.println("ENCENDIDO");
    }
    
  }
}


 


En mi montaje, el led va unido entre el pin 12 (cátodo) y 13 (ánodo).



A continuación, veremos una captura de pantalla de los dos shell abiertos contra el router. En la superior vemos los que nos contesta Arduino, y en la inferior le enviamos las ordenes.


(click para ampliar)


Y sólo nos queda ver el video funcionando.... Curioso en la electrónica, que todo se resume en  encender/apagar leds de diferentes formas....je,je,je







Ahora, por la parte de PC, nos queda hacer una aplicación un poco más vistosa. Ya que no es muy profesional usar el putty y trabajar en modo comandos...

Veamos como darle conectividad mediante Excel, lo cual nos añade un potencial grandísimo.
1) Para poder conectarnos a telnet con Excel, nos podemos descargar la libreria COM gratuita Ostrosoft Winsock Component => http://www.ostrosoft.com/oswinsck.asp
2) Seguir las instrucciones de la web para registar la libreria.
3) ¡¡ Ya podemos utilizar el control en Excel !! Para ello sólamente tenemos que añadir nuestro nuevo control mediante la barra de herramientas "Cuadro de controles" y en "Más controles..." buscamos Winsock Component.

Por ejemplo, podríamos hacer algo asi:



En la hoja dispongo de:
- Celdas de configuración de la IP del router, usuario y password del mismo.
- Botones (4) que corresponden a establecer conexión, cerrar conexión, encender led y apagar led.
- Cuadro de texto dónde adjunto info recibida de la conexión establecida.

En la imagen se puede ver el resultado tras establecer una conexión y haber encendido/apagado 3 veces el led.

Veamos el código de Excel:

Code:
Private Sub CommandButton1_Click()
    
    TextBox1.Text = ""
    Winsock1.RemoteHost = Range("B2").Text
    Winsock1.Protocol = sckTCPProtocol
    Winsock1.Connect
End Sub
Private Sub CommandButton2_Click()
    Winsock1.SendData "echo S1F > /dev/cua/1" & vbCrLf
End Sub
Private Sub CommandButton3_Click()
    Winsock1.SendData "echo S0F > /dev/cua/1" & vbCrLf
End Sub

Private Sub CommandButton4_Click()
    Winsock1.CloseWinsock
End Sub

Private Sub Winsock1_OnConnect()
    Winsock1.SendData Range("B3").Text & vbCrLf
    Application.Wait Now + TimeValue("0:0:01")
    Winsock1.SendData Range("B4").Text & vbCrLf
    Application.Wait Now + TimeValue("0:0:01")
End Sub

Private Sub Winsock1_OnDataArrival(ByVal bytesTotal As Long)
    Winsock1.GetData data
    TextBox1.Text = TextBox1.Text + data
End Sub

Private Sub Winsock1_OnError(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
    MsgBox Number & ": " & Description
End Sub

 



Ahora ya tendremos de forma muy sencilla una interfaz gráfica, en que mediante los botones encendemos/apagamos nuestro led via WIFI.... no queda nada mal, ¿verdad?
(El cuadro de texto está para la depuración con la información que devuelve la conexión de telnet, no hace falta para nada)
Ya puedes darle conectividad Wireless a tus proyectos con Arduino, aprovechándote del potencial de Excel para graficar, cálculos, Visual Basic,....









Ahora, incrementamos el nivel.... GRAFICAR UN VALOR ANALÓGICO EN "TIEMPO REAL"


 TELEMETRÍA CON ARDUINO







Fotos del montaje

Mejor, si vemos un video:







Aqui tenemos una captura de pantalla de la hoja excel :









Pues ahora queda en la imaginación de cada uno el potencial que se dispone gracias a ésto... Existen en el mercado, routers compatibles con DD-WRT que disponen de USB... (ejemplo Asus WL-520GU,Linksys WRT350N y Linksys WRT600N)
Véase:
http://www.mightyohm.com/blog/2008/10/building-a-wifi-radio-part-1-introduction/
http://www.jbprojects.net/projects/wifirobot/
http://www.youtube.com/watch?v=Wp0q9eTZECk

Telemetría; Telecontrol; Alarmas; Robótica, Domótica; Apertura/Cierre de puertas,calderas, camaras frigoríficas,... a través de intranet/internet.




Puedes ver más ejemplos con este hardware, navegando por el menu izquierdo (Proyecto LINKDUINO).






Igor R.

11 comentarios:

  1. Impresionante,,,muchas gracias por compartir la información!

    ResponderEliminar
  2. Cómo se puede controlar mediante comandos ssh al linksys, en vez de un led, 4 leds (independientemente) ???

    Soy muy novato en esto....

    Gracias!!

    ResponderEliminar
  3. novecapa, la filosofía de 1 ó 4 es lo mismo. Es decir, se trata de realizar un programa en Arduino, que actue a tu antojo según los comandos que le lleguen por puerto serie.

    ResponderEliminar
  4. se puede usar tal router para conectar el arduino via TX/RX y hacer que el arduino llame a una web?
    la idea es pasa subir datos a una tabla mysql

    www.nombreweb.com/upload.php?P=2900&V=230

    upload.php ya se encarga de hacer un GET de P y de V y luego subirlo a la tabla mysql.

    si fuese posible seria una grandisima opción ya que eliminas el ethernet shield del arduino (q no es barato)

    gracias

    ResponderEliminar
  5. ok gracias !! en base a esto tendre q mirar de comprar un router de esos. lastima que no sea tipo N.

    a ver si encuentro algun tutorial de como se haria esto. yo ahora mismo hago un
    Client.print("www.paginaweb.com/upload.php?P=2900&V=230");
    y va de vicio con el ethernet shield. a ver si consigo q sea tan sencillo hacer lo mismo pero desde el router directamente.

    Gracias !!

    ResponderEliminar
  6. Hi Igor,

    Could I use something similiar to the link below to interface to pachube, I have serial sensor data from /dev/tts/1 on my WRT54GL from the arduino.

    I think I need to install Curl and use BASH but what else is required ? and is there enough room on the router in the JFFS partition ?

    Thank you for your great post and help !

    http://dereenigne.org/computers/openwrt-ddwrt/pachube-bandwidth-monitor#comment-1138

    Jean

    ResponderEliminar
  7. Hola! soy antonio

    estoy siguiendo este tutorial pero me he atorado en esta parte:

    hora, abrimos dos sesiones de telnet del router (Rx y Tx):
    + En la primera, sacaremos toda la información del puerto serie al shell. Para ello usaremos:
    cat < /dev/cua/1
    + En la segunda, enviaremos las cadenas de texto que queramos al puerto serie.
    echo cadenaaenviar > /dev/cua/1

    tEngo las dos shell abiertas ingreso los dos comandos una en cada una respectivmente pero no ocurre nada. Alguna idea?

    Otra pregunta: Entre el arduino y el Linksys existe un circuito de conversion como el MAX 232? De ante mano muchas Gracias!

    ResponderEliminar
  8. El linksys funciona a 3v3 y Arduino a 5v, por lo que pondría algo para protegerlo. Yo lo hice con una resistencia y un par de diodos.

    Que router tienes? Hay algunos que el puerto serie es tts/1

    Me imagino que estas pruebas las estas haciendo con el programa de Arduino publicado, verdad?

    Saludos

    Igor

    ResponderEliminar
  9. Estoy probando esto con un WAP54G he unido el rx y tx juntos pero no logro recibir en la consola rx lo que envio por la consola tx probe con tts y cua :( alguna idea????

    ResponderEliminar