• Autor de la entrada:
  • Categoría de la entrada:Arduino

AppInventor y Arduino Ethernet ¡¡¡Qué gran descubrimiento!!! Si alguna vez has pensado en controlar una placa Arduino conectada a Internet y a través de una aplicación creada en App Inventor, pues bienvenido, vamos a por ello.

En esta ocasión trataremos de controlar el encendido y apagado de un LED conectado a Arduino. Las órdenes las enviaremos desde una aplicación en nuestro smartphone.

Antes de meternos en harina hay que conocer, al menos el concepto, de petición HTTP, puesto que esto es lo que hacemos una y otra vez para comunicarnos con nuestro Ethernet Shield.

Si bien es cierto que podríamos usar otro tipo de peticiones, estamos acostumbrados a, por ejemplo, usar un enlace creado con la etiqueta a con href en HTML para dar «ordenes» a nuestro Arduino. La información que pasamos dentro del href=»» se convertirá en parte de la petición HTTP que nuestro navegador mandará a la placa cuando se hace clic en el enlace.

Get es un método de petición HTTP que trata, en principio, solo de recuperar datos. Es decir, es una forma de decirle a un servidor web que datos queremos que nos envié. Sin embargo, nosotros podemos usarlo par enviar información en la propia petición. Podemos introducir las ordenes que queremos que siga Arduino.

Para crear la petición, lo primero será formar la cadena de caracteres que la conformarán.  La estructura de una petición GET suele ser algo como:

GET /index.html HTTP/1.1 HOST: www.host.com

Si no lo conoces, no te preocupes de momento, pero si quieres seguir aprendiendo en el futuro sobre este tema, sería bueno que investigaras un poco sobre HTTP, GET, POST, TCP y UDP.

En cualquier caso, volvemos a nuestro objetivo, que nos estamos perdiendo. ¿Cómo realizamos una petición GET desde AppInventor? Para realizar esto vamos a usar un módulo denominado Web que lo encontraremos dentro de la categoría de connectivity. Usarlo con este propósito es bien sencillo, solo tendremos que configurar la URL a la cual queremos conectar y luego lanzar la petición contra el servidor, que en este caso es Arduino.

Puedes ver como se crea la aplicación en el vídeo que hay un poco más abajo. Si quieres puedes descargar el .apk de la aplicación tal cual la uso en el vídeo en el siguiente enlace.

Descargar APK
Descargar APK

Código para Arduino

En relación al código de Arduino que usamos para combinar AppInventor y Arduino Ethernet, es el mismo de un tutorial anterior en el que controlamos un relé con Arduino y la ethernet shield, solo tiene una modificación, y es que en lugar de usar el puerto 81, para ese tutorial vamos a usar el 80.

El código prepara a Arduino para recibir peticiones HTTP mediante método GET y analizar estas buscando las instrucciones para encender o apagar el LED.

Si el microcontrolador encuentra el texto «?ONa» en la petición HTTP encenderá LED activando la salida digital correspondiente.

Si al analizar la petición encuentra el texto «?OFFa» entonces apagará el LED.

Para realizar el análisis y encontrar las instrucciones en la petición GET usamos el método .indexOf(). Si quieres aprender más sobre cómo usar el método indexOf puedes visitar el tutorial que hicimos al respecto.

/*

Ejemplo sobre uso de libreria ethernet
para controlar un rele desde página web.

*/

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

//Ponemos la dirección MAC e IP que queremos que use nuestro Arduino para conectarse al Router
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

String readString;

//Definimos que el puerto HTTP sera el 81
EthernetServer server2(80);

//Variables de control
int rele = 7;

void setup()
{
//Iniciar la conexión de red y serie
Ethernet.begin(mac, ip);
server2.begin();
Serial.begin(9600);
pinMode(rele,OUTPUT);
}

void loop()
{

// Esperamos que venga algún cliente web al puerto 81
EthernetClient cliente = server2.available();
if (cliente) {
boolean currentLineIsBlank = true;
while (cliente.connected()) {
if (cliente.available()) {
char c = cliente.read();
if (readString.length() < 100) {
//Almacenar caracteres en un string
readString += c;
}
//Si ha terminado la petición del cliente
if (c == 'n') {
if(readString.indexOf("?ONa") >0)
{
digitalWrite(rele,HIGH);
}
else if(readString.indexOf("?OFFa") >0)
{
digitalWrite(rele,LOW);
}
//Enviamos la cabecera web
cliente.println("HTTP/1.1 200 OK");
cliente.println("Content-Type: text/html");
cliente.println();

//Mostrqamos la web de control
cliente.println("<center> <h2>Bienvenido al control de reles</h2> ");
cliente.println("<br> Clic en los enlace para encender o apagar:");
cliente.println("<br> <a href='./?ONa'>Encender</a> - <a href='./?OFFa'>Apagar</a>");
cliente.println(" </center>");
cliente.println("<br />");

break;
}

}
}
// Darle un respiro al navegador web para recibir los datos
delay(1);
//Limpiar String para proxima etición HTTP
readString="";
//Cerrar conexión
cliente.stop();
}
}

Puedes ver el vídeo para aprender más acerca de la técnica de comunicar la aplicación móvil con Arduino por medio de la ethernet shield.




AppInventor y Arduino Ethernet

Enrique Gómez

Ingeniero Electrónico Industrial y Automático, amante de la comunicación audiovisual y de la divulgación ingenieril y científica. Friki de Star Wars, cuenta más de lo que parece. Puedes saber más sobre mi y sobre mis trabajos en www.enriquegomez.me