Archivo de la categoría: Práctica

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

Uso Ethernet Shield

IP Dinámica con Arduino. DHCP

Configurar Arduino con el ethernet shield de forma que coja la IP dinámicamente por DHCP y lo muestre por pantalla.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio32-DHCP

IP Fija con Arduino

Configurar Arduino con el ethernet shield de forma que le asignamos una IP fija con la siguiente configuración:

  • IP: 192.168.6.1YY. Siendo YY el número = 30 + número del kit. Por ejemplo para el kit 4 la IP es la 192.168.6.134 y para el kit 16 la IP es es 192.168.6.146.
  • Subnent: 255.255.255.0
  • Gateway: 192.168.6.1
  • DNS: 8.8.8.8

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio33-Configurar_IP

Grabar Datos en Tarjeta SD

El Ethernet shield tiene disponible una ranura para tarjetas microSD. Arduino es capaz de leer y escribir en la tarjeta microSD mediante la librería SD: https://www.arduino.cc/en/Reference/SD

Leer la documentación de la librería SD y entender qué hace cada una de las clases y sus métodos.

Insertar una tarjeta microSD y hacer un programa que grabe los datos de temperatura en un archivo llamado temp_log.csv cada 5 segundos. Los datos a guardar son: segundos desde inicio con la función millis() y la temperatura del sensor TMP36.

Opcionalmente crear un menú con 3 opciones:

  • 1 – Muestra el último dato guardado en la SD
  • 2 – Vuelca el contenido del fichero temp_log.csv por consola
  • 3 – Borra el contenido del fichero

Esquema de conexión:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio34-SD_Datalogger

Uso de Motores con Arduino

Motor DC Básico

Mover un motor DC variando la velocidad y sentido mediante un potenciómetro.

Basado en http://diymakers.es/control-velocidad-y-sentido-de-motor-dc/

Esquema de conexión.

Señales mandadas desde Arduino:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio25-MotorDC_Basico

Ver las señales reales con un osciloscopio en los pines 9 y 10 y en la alimentación del motor.

Motor DC Avanzado

Mover un motor DC de 9V usando un integrado L293D (Quadruple Half-H driver). Para controlar la velocidad del motor se usará un potenciómetro conectado al pin A0. Además se usarán dos botones, uno conectado al pin digital 4 para controlar el sentido de giro del motor y otro conectado al pin digital 5 que controlará el encendido y apagado del motor. Con cada pulsación encendemos y apagamos el motor o usamos una dirección de giro u otra con el otro botón.

NOTA: en este caso para controlar la velocidad del motor se usa el pin enable del L293D en lugar de los dos pines de control y envía una señal PWM proporcional al valor leído del potenciómetro.

Datasheet: https://www.arduino.cc/documents/datasheets/H-bridge_motor_driver.PDF

Montaje:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio26-MotorDC_Avanzado

Mover Servo

Controlar la posición de un servo con un potenciómetro.

Esquema de conexión:

Esquemático:

Tutorial: http://arduino.cc/en/Tutorial/Knob

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio27-Servo

Barrido con Servo

Programar un barrido continuo del 0 a 180º en un servo. Activar y desactivar el barrido con una pulsación de un botón. p.e. activación de un limpiaparabrisas. Hacer tres velocidades de barrido, cada pulsación sube de velocidad y la cuarta lo para.

Tutorial: http://arduino.cc/en/Tutorial/Sweep

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio28-Barrido_Servo

Servo Serial

Controlar la posición del servo como en el ejercicio “Mover servo” pero en lugar de hacerlo con un potenciómetro, hacerlo desde el puerto serie mandando el ángulo al que debe ir. Desde el monitor serie pregunta la posición y se manda un valor entre 0 y 180.

De la misma forma que controlamos desde el puerto serie, se puede extender a controlar el servo desde una aplicación en un ordenador o desde una página web.

Esquema de conexión:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio29-Servo_Serial

Mover un Servo con un Acelerómetro

Una IMU (Inertial Measurement Unit) es un dispositivo capaz de medir la fuerza (aceleración) y la velocidad. Generalmente consta de un Acelerómetro y un Giroscopio. Por lo tanto una IMU no mide ángulos, por lo menos no directamente, requiere algunos cálculos.

Un dispositivo I2C muy interesante es el MPU-6050 que nos sirve para probar e introducirnos en el mundo de los giroscopios y acelerómetros.

Para esta práctica vamos a utilizar una Breakout board bastante típica llamada GY-521, que incluye la IMU MPU-6050 y un regulador de tensión, con lo que podemos alimentar a tanto 3.3V como a 5V.

El siguiente diagrama muestra la orientación de los ejes de sensibilidad y la polaridad de rotación.

El acelerómetro mide la aceleración. La aceleración puede expresarse en 3 ejes: X, Y y Z, las tres dimensiones del espacio. Por ejemplo, si mueves la IMU hacia arriba, el eje Z marcará un cierto valor. Si es hacia delante, marcará el eje X, etc. La gravedad de la Tierra tiene una aceleración de aprox. 9.8 m/s², perpendicular al suelo como es lógico. Así pues, la IMU también detecta la aceleración de la gravedad terrestre. Gracias a la gravedad terrestre se pueden usar las lecturas del acelerómetro para saber cuál es el ángulo de inclinación respecto al eje X o eje Y.

Supongamos que la IMU esté perfectamente alineada con el suelo. Entonces, como puedes ver en la imagen, el eje Z marcará 9.8, y los otros dos ejes marcarán 0. Ahora supongamos que giramos la IMU 90 grados. Ahora es el eje X el que está perpendicular al suelo, por lo tanto marcará la aceleración de la gravedad.

Si sabemos que la gravedad es 9.8 m/s², y sabemos qué medida dan los tres ejes del acelerómetro, por trigonometría es posible calcular el ángulo de inclinación de la IMU. Una buena fórmula para calcular el ángulo es:

Dado que el ángulo se calcula a partir de la gravedad, no es posible calcular el ángulo Z (giro sobre si mismo) con esta fórmula ni con ninguna otra. Para hacerlo se necesita otro componente: el magnetómetro, que es un tipo de brújula digital. El MPU-6050 no lleva, y por tanto nunca podrá calcular con precisión el ángulo Z. Sin embargo, para la gran mayoría de aplicaciones sólo se necesitan los ejes X e Y.

Esquema de conexión IMU:

Esquema conexión servo:

Mover el servo en función del ángulo en el eje x obtenido de la IMU.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio30-Servo_IMU

Motor Paso a Paso

Mover un motor paso a paso modelo 28BYJ-48 con su adaptador basado en el chip ULN2003A.

El 28BYJ-48 tiene un paso de 5.625 grados (64 pasos por vuelta). El reductor interno tiene una relación de 1/64. Combinados, la precisión total es de 4096 pasos por vuelta, equivalente a un paso de 0.088º, que es una precisión muy elevada.

Es un motor paso a paso unipolar con las siguientes características:

  • Tensión nominal de entre 5V y 12 V.
  • 4 Fases.
  • Resistencia 50 Ω.
  • Par motor de 34 Newton / metro más o menos 0,34 Kg por cm.
  • Consumo de unos 55 mA.
  • 64 pasos por vuelta (con medios pasos).
  • Reductora de 1 / 64.

Datasheet: http://robocraft.ru/files/datasheet/28BYJ-48.pdf

Vamos a usar la secuencia de medios pasos. Con esta secuencia conseguimos una precisión de la mitad del paso. El par desarrollado varía ya que en algunos pasos activamos dos bobinas y en otras solo una, pero a la vez el giro se encuentra más “guiado”, por lo que en general ambos efectos se compensan y el funcionamiento es bueno, salvo en aplicaciones donde estemos muy al límite del par máximo.

Expresando la secuencia en forma de tabla resulta:

Medio-paso A B A’ B’
1 ON OFF OFF OFF
2 ON ON OFF OFF
3 OFF ON OFF OFF
4 OFF ON ON OFF
5 OFF OFF ON OFF
6 OFF OFF ON ON
7 OFF OFF OFF ON
8 ON OFF OFF ON

Modo de medio paso: secuencia de señal de control 8 pasos (recomendada) 5.625 grados por paso / 64 pasos por una revolución del eje del motor interno. Relación de transmisión 64. Total 64 x 64 = 4096 pasos.

Modo de paso completo: secuencia de señal de control de 4 pasos 11.25 grados por paso / 32 pasos por una revolución de la interna eje de motor. Relación de transmisión 64. Total 64 x 32 = 2048 pasos.

Esquema de conexión:

Conexiones de la placa de driver:

Ejercicio basado en http://www.prometec.net/motor-28byj-48/

Otros tutoriales:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio31-Stepper

La otra manera de programar un motor 28BYJ-48 es utilizar la librería Steper que viene incluida con el entorno de desarrollo oficial de Arduino. Esta librería nos facilita el uso de este tipo de motores y viene adaptada para motores bipolares. En este caso la librería stepper usa el modo de paso completo en lugar del medio paso. En este caso el nº de pasos por vuelta es 2048.

Llevando esta secuencia de encendido a una tabla, que posteriormente usaremos para el código, la secuencia quedaría de la siguiente forma:

Paso A B A’ B’
1 ON OFF OFF OFF
2 OFF ON OFF OFF
3 OFF OFF ON OFF
4 OFF OFF OFF ON

Código para mover el motor:

 
 
#include <Stepper.h>
#define STEPS 2048
 
Stepper stepper(STEPS, 8, 9, 10, 11);

void setup() {
  stepper.setSpeed(10);
}
 
void loop() {
  stepper.step(2048);
}

Ejemplo Sensor de Temperatura

Sensor Temperatura

Leer la sonda de temperatura TMP36 y en función de unas condiciones de temperatura encender 3 LEDS. Encender el primero al alcanzar 22 grados, el segundo a los 24 y el tercero a los 26. También que muestre por pantalla la temperatura leída por el puerto serie en Celsius si lee una C por el puerto serie o en Fahrenheit si lee una F, en cualquier otro caso que muestre el texto: “¿En que formato quieres que muestre la temperatura?”

Hacer que se pueda ver por el serial plotter la gráfica de la temperatura, imprimiendo el valor cada 5 segundos con la librería mstimer2.

Datasheet sonda: https://www.arduino.cc/en/uploads/Main/TemperatureSensor.pdf

Esquema conexión (no conectar el módulo bluetooth):

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio23-Temperatura  

Histeréis

Ver el efecto de parpadeo al no poner histéresis. Añadir una histéresis de 1 grado en cada salto de temperatura para iluminar el led.

Histeresis: https://es.wikipedia.org/wiki/Hist%C3%A9resis

Diagrama de Estados:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio24-Temperatura_Histeresis