Archivo de la categoría: Arduino

Y aquí no acaba el curso…

Recordad que el curso sigue en: http://www.aprendiendoarduino.com/

Y también en las redes sociales:

Todas las novedades sobre Arduino, futuros eventos, cursos, etc… mediante correo electrónico.

Lista de correo: http://list.aprendiendoarduino.com/mailman/listinfo/aprendiendoarduino.com.noticias

También cualquier consulta me puedes encontrar en el eMail de contacto: aprendiendoarduino@gmail.com

Arduino Web Server

Web Server

Crear un servidor web sencillo que saque por el puerto serie y también devuelva al navegador que le ha llamado la petición http recibida.

Luego añadir el valor leído en la entrada analógica A0.

Avanzado: Modificar el ejercicio anterior y leer solo la línea de la petición, esto es útil cuando hay que analizar el http request y que Arduino devuelva una cosa u otra en función de la petición que llegue. Quitar comentarios en el bucle que lee los caracteres recibidos y ver lo que ocurre. Fijarse que el tiempo de bucle en este caso es más rápido y esto tiene ventajas.

Tutorial webserver: http://playground.arduino.cc/Code/WebServerST

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio39-EthernetServer_DHCP

Otro ejemplo similar muy bien explicado: https://wngeek.wordpress.com/2013/07/24/185/

Al igual que hemos hecho un web server podríamos implementar un telnet server escuchando por el puerto 23. Ejemplos:

Web Embebida con Arduino. Botón enciende Led.

Crea una web embebida en Arduino con un botón que al pulsarlo desde el navegador encienda un led y al volver a pulsarlo apague un led.

Al recibir un get Arduino muestra una web para encender o apagar el led en función del estado del led.

Cuando pulso el botón de la web, el navegador manda un post con la instrucción de encender o apagar el led, Arduino la ejecuta y devuelve la web actualizada con el estado del Led.

Esquema de conexión:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio40-Boton_Mejorado_DHCP

Código de la web mostrada:

 
<!DOCTYPE html>
<html>
<body>
  <p>LED APAGADO</p>
  <form action="" method="post">
    <input type="submit" value="Enciende Led" />
  </form>
</body>
</html>

Esta web manda un post request sin parámetros cada vez que pulsas el botón del formulario.

NOTA: Aquí además de programar Arduino, se usan conceptos de HTML

Otro tutorial similar: http://diymakers.es/crear-servidor-web-con-arduino/

Otro ejemplo: http://miarduinounotieneunblog.blogspot.com.es/2016/03/control-de-un-led-desde-un-servidor-web.html

Webserver con Ajax

Crear una web embebida que controle el encendido y apagado de un led tanto manualmente pulsando un botón como automáticamente al sobrepasar un umbral que pasamos a Arduino como parámetro mediante la web con una entrada numérica. Podría asemejarse a un termostato donde la entrada es una sonda de temperatura y su valor lo comparo con la temperatura que le paso como parámetro.

La web mostrará el estado de varias entradas analógicas, un botón para encender manualmente el led y una entrada numérica para enviar el dato del umbral.

NOTA: aquí se usa programación en javascript para ajax.

Ajax es una técnica muy eficaz para estos casos porque para mostrar los datos actualizados dinámicamente no es necesario cargar la web completamente, sino que sólo manda los datos que se actualizan en la web que son unos pocos bytes.

Mediante Ajax podemos actualizar los datos de la web embebida en Arduino sin necesidad de cargar toda la web, sino solo mandando los datos actualizados, economizando los datos mandados a través de la red y ocupando menos tiempo en el loop de arduino.

Ajax:

Esquema de conexión (para el led usamos el builtin led en el pin 13):

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio41-Ajax_DHCP

Web que devuelve Arduino: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/blob/master/Ejercicio41-Ajax_DHCP/web.html

Web Embebida en Linux

Otra técnica para tener una web embebida en Arduino es usar los Arduino Yun o Tian que tiene un procesador MIPS con un linux embebido y usar un servidor web linux para servir las páginas. Luego mediante las librerías bridge o ciao se puede comunicar el microntrolador de Arduino con el procesador MIPS.

En este caso la web está en un servidor web del sistema operativo openWRT basado en linux y al interactuar con él la librería bridge se encarga de comunicar internamente linux con el microcontrolador del Arduino Yun.

Ejemplo para controlar los leds de un neopixel mediante una web en un Arduino Yun: https://github.com/jecrespo/NeoPixel

Neopixel: https://www.adafruit.com/category/168

Control del coche: https://github.com/jecrespo/Coche_AprendiendoArduino

Arduino Web Client

IMPORTANTE: Para los ejercicio con conexión Ethernet es imprescindible poner en la MAC del Arduino en los dos últimos dígitos el número del kit. En todos los sketchs hay que sustituir YY por el número de kit.

Para las prácticas la IP de los Arduinos se asignará dinámicamente por DHCP, en este caso ya nos asigna también el servidor DNS y por lo tanto podemos usar nombres de páginas web.

Conexión a una Web con Arduino

Crear un cliente ethernet que se conecte varias webs y escriba por consola los datos recogidos. También guarde los datos recibidos en un string. Probar a conectar a varias páginas web y usa el servicio DNS poniendo la url en lugar de la IP.

Webs:

Tutorial: webclient con ejemplo de métodos get y post: http://playground.arduino.cc/Code/WebClient

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio35-EthernetClient_DHCP

API AEMET

AEMET API: http://www.aemet.es/es/datos_abiertos/catalogo (open data)

Tiempo en logroño: http://www.aemet.es/xml/municipios/localidad_26089.xml

Nueva API aemet: https://opendata.aemet.es/centrodedescargas/inicio

Ejemplos para desarrolladores: https://opendata.aemet.es/centrodedescargas/ejemProgramas

Avanzado: Obtener la temperatura en logroño actualizada por el display LCD sin necesidad de un sensor de temperatura.

Open data:

Un poco de información:

Ver https://es.wikipedia.org/wiki/ELIZA

POST vs GET con Arduino

Mandar por método GET y método POST dos valores, el número de Arduino y un mensaje. Estas peticiones se hacen a las funciones PHP GET_Request.php y POST_Request.php, que están en la ruta “www.aprendiendoarduino.com/servicios/aprendiendoarduino/”.

Es servidor responderá con los datos enviados y un “OK” al final que servirá al Arduino para saber que se han recibido correctamente los datos.

Solución GET: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio36-GET_Request

Código en el servidor:

 
<?php
if(isset($_GET["arduino"]) && isset($_GET["mensaje"])){
	$arduino = $_GET["arduino"];
	$mensaje = $_GET["mensaje"];
}
else {
	die("error en el envio de parametros");
}
 
echo ("<h4>Hola Arduino numero $arduino!!</h4>");
echo ("He recibido el mensaje: \"$mensaje\" mediante GET");
echo ("OK")
?>

Solución: POST: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio37-POST_Request

Código en el servidor:

 
<?php
if(isset($_POST["arduino"]) && isset($_POST["mensaje"])){
	$arduino = $_POST["arduino"];
	$mensaje = $_POST["mensaje"];
}
else {
	die("error en el envio de parametros");
}
 
echo ("<h4>Hola Arduino numero $arduino!!</h4>");
echo ("He recibido el mensaje: \"$mensaje\" mediante POST");
echo ("OK")
?>

NOTA: podéis usar estos códigos como snippets para otras aplicaciones.

NTP básico

Montar un Arduino para que recoja y mantenga la fecha y hora de un servidor NTP y así teniendo un Arduino conectado a Internet no siendo necesario usar un RTC para mantener la fecha y hora en Arduino.

Network Time Protocol (NTP) es un protocolo de Internet para sincronizar los relojes de los sistemas informáticos a través del enrutamiento de paquetes en redes con latencia variable. NTP utiliza UDP como su capa de transporte, usando el puerto 123. Está diseñado para resistir los efectos de la latencia variable.

Servidores NTP: http://www.pool.ntp.org/es/use.html

Este es un ejemplo de cliente web, pero UDP en lugar de TCP.

Conceptos a manejar:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio38-NTP_DHCP

Librería Ethernet

La librería Ethernet es la usada para manejar el Ethernet Shield que es un shield que implementa la pila de protocolos TCP/IP y luego dentro de la programación de Arduino se implementan los protocolos en la capa de aplicación. La librería se usa entre otras cosas para mandar por Ethernet el protocolo programado en Arduino.

Para manejar el Ethernet Shield deberemos conocer todos los métodos que nos ofrece la librería Ethernet y así poder usarla.

Reference de librería Ethernet: http://arduino.cc/en/Reference/Ethernet

La librería ethernet se compone de 5 clases, cada una con sus métodos

Ethernet Class

Inicializa la librería ethernet y las configuraciones de red.

  • begin() – Inicializa la librería Ethernet (Constructor)
  • localIP() – Obtiene la dirección IP. Útil al usar DHCP
  • maintain() – Solicita una renovación al servidor DHCP

IPAddress Class

Trabaja con IPs locales y remotas. Facilita el trabajo con direcciones IPs.

Server Class

Crea un servidor que puede mandar y recibir datos de los clientes conectados.

  • Server() – Constructor de la clase server. No se usa directamente
  • EthernetServer() – Crea un servidor que escucha por las conexiones entrantes del puerto definido.
  • begin() – Le dice al servidor que comience a escuchar.
  • available() – Devuelve el cliente que está conectado al servidor y tiene datos disponibles a leer.
  • write() – Escribe datos a todos los clientes conectados al servidor.
  • print() – Escribe datos a todos los clientes conectados al servidor.
  • println() – Escribe datos a todos los cliente conectados al servidor seguido de una nueva línea.

NOTA: Cuando se crea un servidor con la clase server, dejo un puerto escuchando peticiones por ese puerto. En el caso que entre una nueva petición, esta queda en el buffer. Cuando el buffer tiene datos, llamo a la función server.available() que devuelve un cliente (de la clase client) que está conectado al servidor y está disponible para leer.

Client Class

Crea un cliente que se conecta a un servidor y puede mandar y recibir datos.

  • Client – Constructor de la clase client. No se usa directamente
  • EthernetClient() – Crea un cliente que se conecta a una determinada IP y puerto
  • if (EthernetClient) – Indica si el cliente Ethernet está preparado
  • connected() – Devuelve si el cliente está o no conectado
  • connect() – Conecta a una IP y puerto especificado. Soporta DNS lookup. Devuelve unos códigos en función del éxito o fallo de la conexión.
  • write() – Escribe datos al servidor al que está conectado.
  • print() – Escribe datos al servidor al que está conectado
  • println() – Escribe datos al servidor al que está conectado, seguido de una nueva línea
  • available() – Devuelve el número de bytes disponibles para leer.
  • read() – Lee el siguiente byte recibido desde el servidor.
  • flush() – Borrar todos los bytes que han sido escritos en el cliente pero no leidos
  • stop() – Desconecta el cliente del servidor

EthernetUDP Class

Habilita el envío y recepción de mensajes UDP.

  • begin() – Inicializar la librería UDP
  • read() – Lee datos UDP
  • write() – Escribe datos UDP a la conexión remota.
  • beginPacket() – Comienza una conexión para escribir paquetes UDP
  • endPacket() – Finaliza una conexión UDP después de escribir
  • parsePacket() – Comprueba la presencia de un paquete UDP
  • available() – Devuelve el nº de bytes disponible para leer en el buffer
  • stop() – Desconecta del servidor
  • remoteIP() – Obtiene la IP de la conexión remota
  • remotePort() – Obtiene el puerto de la conexión remota

Más información sobre el protocolo UDP: http://es.wikipedia.org/wiki/User_Datagram_Protocol

Arduino nos ofrece varios ejemplos para comprender el uso de la librería:

Snippets para ethernet: http://playground.arduino.cc/Main/SketchList#ethernetShield

Librería Ethernet2

Para usar la nueva Arduino Ethernet Shield 2 con el W5500, es necesaria la librería Ethernet 2: https://www.arduino.cc/en/Reference/Ethernet

El uso de esta librería es similar a la de Ethernet y los métodos son los mismos. Por lo tanto un sketch para Ethernet funciona con ethernet2 simplemente cambiando la llamada a la librería correcta, es decir, poner #include <Ethernet2.h> en lugar de #include <Ethernet.h>

Esta librería hay que usarla para el Arduino Ethernet Shield 2, Arduino Leonardo Ethernet y cualquier otra placa o shield con chip W5500.

Por otra parte el propio fabricante de los chips ethernet Wiznet ha liberado una librería para sus dispositivos: https://github.com/Wiznet/WIZ_Ethernet_Library y adafruit también ha desarrollado una librería ethernet 2: https://github.com/adafruit/Ethernet2

Protocolo HTTP

Hypertext Transfer Protocol o HTTP (en español protocolo de transferencia de hipertexto) es el protocolo de comunicación que permite las transferencias de información en la WWW. Se trata de un protocolo de capa 7 de aplicación.

En arduino con la librería ethernet solo trabajamos con la capa de aplicación, todas las otras capas de la pila TCP/IP ya están implementadas por Hardware, ya sea con la ethernet shield o el módulo WiFi correspondiente. Aunque si queremos realizar algunas funciones de capas inferiores, podemos hacerlo con los comandos adecuados comunicándonos con el chip ethernet o wifi via SPI.

Veamos algunos protocolos de la capa de aplicación que serán los que tengamos que implementar en nuestro arduino directamente o usando la librería adecuada:

HTTP es un protocolo muy importante puesto que es el que se va a usar para comunicar Arduino con cualquier elemento de la WWW o de una intranet. En el IoT es uno de los protocolos más usados y sobre todo si queremos obtener o mandar datos a servidores o usar las APIs que nos ofrecen algunos servicios para obtención de información, por ejemplo, para obtener el tiempo meteorológico de la AEMET https://opendata.aemet.es/centrodedescargas/inicio y con esos datos que Arduino actúe de una forma u otra.

HTTP define la sintaxis y la semántica que utilizan los elementos de software de la arquitectura web (clientes, servidores, proxies) para comunicarse. Es un protocolo orientado a transacciones y sigue el esquema petición-respuesta entre un cliente y un servidor. Al cliente que efectúa la petición (un navegador web) se lo conoce como “user agent” (agente del usuario). A la información transmitida se la llama recurso y se la identifica mediante un localizador uniforme de recursos (URL).

HTTP es un protocolo sin estado, es decir, que no guarda ninguna información sobre conexiones anteriores. El desarrollo de aplicaciones web necesita frecuentemente mantener estado. Para esto se usan las cookies, que es información que un servidor puede almacenar en el sistema cliente. Esto le permite a las aplicaciones web instituir la noción de “sesión”, y también permite rastrear usuarios ya que las cookies pueden guardarse en el cliente por tiempo indeterminado.

Una transacción HTTP está formada por un encabezado seguido, opcionalmente, por una línea en blanco y algún dato. El encabezado especificará cosas como la acción requerida del servidor, o el tipo de dato retornado, o el código de estado. El uso de campos de encabezados enviados en las transacciones HTTP le dan gran flexibilidad al protocolo. Estos campos permiten que se envíe información descriptiva en la transacción, permitiendo así la autenticación, cifrado e identificación de usuario. Ejemplos de encabezados: HTTP_ACCEPT y HTTP_USER_AGENT.

Más información sobre HTTP:

Para intercambio de archivos por HTTP usamos MIME: http://es.wikipedia.org/wiki/Multipurpose_Internet_Mail_Extensions

Líneas de encabezado o headers, son muy importantes y dan información adicional de la conexión y el comportamiento puede cambiar en función de ellas: http://powercps.readthedocs.io/zh_CN/latest/sdk/http-headers.en/

Interesante HTTP quick guide:https://www.tutorialspoint.com/http/http_quick_guide.htm

Métodos de petición

Lo más importante para comunicar arduino por HTTP con otros dispositivos, ya sean servidores, ordenadores, otros Arduinos, etc… es conocer los métodos GET y POST del protocolo HTTP. HTTP define 8 métodos que indica la acción que desea que se efectúe sobre el recurso identificado. Lo que este recurso representa, si los datos pre-existentes o datos que se generan de forma dinámica, depende de la aplicación del servidor. A menudo, el recurso corresponde a un archivo o la salida de un ejecutable que residen en el servidor.

GET

GET: Pide una representación del recurso especificado. Por seguridad no debería ser usado por aplicaciones que causen efectos ya que transmite información a través de la URI agregando parámetros a la URL. La petición puede ser simple, es decir en una línea o compuesta de la manera que muestra el ejemplo.

Ejemplo simple:

GET /images/logo.png HTTP/1.1 obtiene un recurso llamado logo.png

Ejemplo con parámetros:

GET /index.php?page=main&lang=es HTTP/1.1

POST

POST: Envía los datos para que sean procesados por el recurso identificado. Los datos se incluirán en el cuerpo de la petición. Esto puede resultar en la creación de un nuevo recurso o de las actualizaciones de los recursos existentes o ambas cosas.

Los otros métodos de HTTP:

Más información:

Entender los métodos get y post:

Un explicación muy buena de HTTP también se puede encontrar en:  http://www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html

HTTP request

Un cliente HTTP debe formar una petición HTTP (request) al servidor de una forma determinada para que sea entendida por el servidor. Cuando Arduino trabaja como cliente hay que programar esta petición correctamente, sino el servidor nos mandará un mensaje de error.

Formación de un HTTP request, esta petición habrá que programar en Arduino:

Trama en HTTP, fijaros en el uso de cr (retorno de carro – carriage return – ASCII 13) y lf (line feed – nueva linea – ASCII 10): http://www1.ju.edu.jo/ecourse/abusufah/cpe532_Spr06/notes/BookOnLine/HTTP%20Request%20Message.htm

Y cuando usar GET o POST?: http://www.w3.org/2001/tag/doc/whenToUseGet.html#checklist

HTTP response

Después de recibir e interpretar el servidor un HTTP request, el servidor debe responder con un mensaje de respuesta:

Para cumplir con el protocolo HTTP, arduino debe implementar estas respuestas cuando lo uso como servidor web, como devolución a un request mandado por un cliente como puede ser un browser o navegador. De esta forma puedo implementar en Arduino una web embebida.

Por lo tanto Arduino podemos programarlo para comportarse como cliente, como servidor o como ambos.

Veamos esto gráficamente: