Archivo de la categoría: Práctica

Programación Arduino

Hagamos unos ejemplos de programación con Arduino para practicar los conceptos aprendidos.

Regular intensidad de un LED

Leer un voltaje analógico desde un potenciometro y sacarlo por consola. Conectar un potenciómetro en la entrada analógica A0, leer su valor e iluminar el LED en función del valor leído.

Tutoriales:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio11-Analog

Smoothing: Modificar el ejercicio anterior para leer una entrada analógica llegada de un potenciómetro y sacar por el puerto serie la media de los últimas 10 lecturas. Luego hacer una transición más suave al escribir en el puerto analógico.

Tutorial: https://www.arduino.cc/en/Tutorial/Smoothing

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio12-Smoothing

Sonidos con Arduino

Para generar sonidos con Arduino debemos debemos usar un buzzer o piezo. Si conectamos un piezo con una señal digital, vibran a una frecuencia sigue bastante fielmente la variación eléctrica con que los excita, y si vibran a la frecuencia audible, oiremos el sonido que producen.

Para generar vibraciones podemos usar la función tone() que genera notas en el espectro audible. Tone() genera una onda cuadrada de una frecuencia específica y con un 50% de duty cycle en el pin especificado. La duración del tono puede ser especificado o en caso contrario continúa hasta llamar a la función noTone().

Para más información:

NOTA: no confundir tone con PWM. PWM tiene una frecuencia fija de 500Hz, por lo que entre línea verde y verde hay siempre 2ms.

Esquema de conexión:

Tutoriales:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio10-tone

Música Star Wars: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio51-Musica_StarWars

Aviso de Temperatura Alta

Partiendo del sketch https://www.arduino.cc/en/Tutorial/ifStatementConditional modificarlo para simular un envío de un mensaje mediante Serial.println() cada vez que haya una alarma cuando se supere el umbral (Temperatura) y otro mensaje cada vez recupere la alarma cuando vuelva a estar por debajo del umbral y la temperatura sea correcta.

Diagrama de flujo:

ejercicio52

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio52-Detectar_Alarma

Histeresis: Comprobar el efecto del programa cuando estamos justo en el umbral donde tendremos continuas alarmas y recuperaciones. Para solucionar esto añadir histéresis.

Diagrama de flujo:

ejercicio52_histeresis

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio52-Detectar_Alarma_Histeresis

Elementos HW del curso

Conocer el HW que vamos a usar en el curso. Cada alumno tiene su propio kit con el número de kit. Recordad este número porque se usará durante las prácticas.

Arduino UNO

Arduino UNO: https://www.arduino.cc/en/Main/ArduinoBoardUno

Arduino Ethernet Shield

Ethernet Shield: https://www.arduino.cc/en/Main/ArduinoEthernetShield

Arduino Starter Kit

Documentación Arduino Starter Kit: http://arduino.cc/en/Main/ArduinoStarterKit

Componentes:

Actualmente hay un Arduino Basic Kit https://www.arduino.cc/en/Main/ArduinoBasicKit que da acceso a project ignite https://projectignite.autodesk.com/shop/product/arduino-basic-kit/?pageTitle=Shop

Con este kit hay 15 proyectos muy interesantes propuestos:

  • GET TO KNOW YOUR TOOLS an introduction to the basics
  • SPACESHIP INTERFACE design the control panel for your starship
  • LOVE-O-METER measure how hot-blooded you are
  • COLOR MIXING LAMP produce any color with a lamp that uses light as an input
  • MOOD CUE clue people in to how you’re doing
  • LIGHT THEREMIN create a musical instrument you play by waving your hands
  • KEYBOARD INSTRUMENT play music and make some noise with this keyboard
  • DIGITAL HOURGLASS a light-up hourglass that can stop you from working too much
  • MOTORIZED PINWHEEL a colored wheel that will make your head spin
  • ZOETROPE create a mechanical animation you can play forward or reverse
  • CRYSTAL BALL a mystical tour to answer all your tough questions
  • KNOCK LOCK tap out the secret code to open the door
  • TOUCHY-FEEL LAMP a lamp that responds to your touch
  • TWEAK THE ARDUINO LOGO control your personal computer from your Arduino
  • HACKING BUTTONS create a master control for all your devices!

En esta lista de youtube hay varios video tutoriales de los proyecto propuestos por el Arduino Starter Kit: https://www.youtube.com/playlist?list=PLT6rF_I5kknPf2qlVFlvH47qHvqvzkknd

Otros módulos

Cómo leer un datasheet: http://rufianenlared.com/como-leer-datasheet/

Ejercicio: Medir valor de un Condensador

Ver: https://www.arduino.cc/en/Tutorial/CapacitanceMeter

Esquema de conexión:

¡ATENCIÓN! Poner un condensador de 100uF y asegurarse de poner correctamente la polaridad. Símbolo – (patilla corta) a masa.

La resistencia R tiene un valor de 10Kohms

Explicación del sketch:

  • Configurar el pin de descarga a INPUT (alta impedancia de modo que no pueda descargar el condensador). Pin 11.
  • Registre el tiempo de inicio con millis ()
  • Establecer el pin de carga en OUTPUT y ponerlo a HIGH. Pin 13.
  • Compruebe la tensión repetidamente en un bucle hasta que llegue a 63.2% de la tensión total.
  • Después de cargar, restar el tiempo actual de la hora de inicio para averiguar cuánto tiempo le costó al condensador para cargar.
  • Dividir el Tiempo en segundos por la resistencia de carga en ohmios para encontrar la Capacitancia.
  • Imprimir por serial el valor con serial.print
  • Descargue el condensador. Para hacer esto:
    • Establezca el pin de carga en la entrada
    • Configurar el de descarga en OUTPUT y haga que sea LOW
    • Leer el voltaje para asegurarse de que el condensador está completamente descargado
    • Loop y hacerlo de nuevo

Para asegurarse que el condensador está descargado, asegurarse de quitar alimentación cuando lo indique el sketch por pantalla.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio57-Medidor_Condensadores

Uso de Motores

Motores DC

Ejercicio 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.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio54-MotorDC_Basico

Ejercicio Avanzado 1. 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 uso el pin enable del L293D en lugar de los dos pines de control.

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

Montaje:

ejercicio21_bb

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio21-MotorDC_1

Ejercicio Motor Shield: Uso del Arduino Motor Shield para controlar la dirección de giro un motor DC. En este caso es necesario alimentar Arduino con una fuente de alimentación o mediante una batería, puesto que con la energía de USB no es posible mover el motor. También es posible alimentar Arduino por USB y alimentar independientemente el shield a través de las bornas marcadas con + y -. El voltaje debe ser el correspondiente al que use el motor DC.

Tutorial: https://www.arduino.cc/en/Tutorial/DueMotorShieldDC

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio47-Motor_Shield

Servo

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

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

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio55-Servo/Knob

Ejercicio: 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.

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

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio55-Servo/Sweep

Ejercicio avanzado: controlar la posición del servo como en el ejercicio Knob pero en lugar de hacerlo con un potenciómetro, hacerlo desde el puerto serie mandando el ángulo al que debe ir.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio55-Servo/Knob_Serial

Contador de pulsos

NOTA: para todas estas prácticas, usamos un botón conectado al pin digital 2 configurado como INPUT_PULLUP. En este caso al leer el pin 2 digitalRead(2) me devuelve 1 cuando no está pulsado el botón (abierto) y me devuelve 0 cuando está pulsado el botón (cerrado)

Práctica: Usar la resistencia interna de pull up de Arduino para detectar la pulsación de un botón (leer estado de una entrada digital) y encender el led 13 (integrado en placa) cuando tenga pulsado el botón y apagarlo cuando lo libere. Adicionalmente sacar por el monitor serie el estado de pulsación del botón con un 1 o un 0, de esta forma abriendo el Serial Plotter es posible ver la señal que recibe Arduino.

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

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio08-pullup

NOTA: Ver efecto de la diferencia del tiempo de loop cuando pulso o no pulso el botón debido a el Serial.println que se ejecuta al pulsar el botón. Ver ejercicio https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio08-pullup_tiempo

NOTA: Si el tiempo de loop es muy largo podemos perder pulsaciones rápidas.

Práctica: Modificar el ejemplo anterior pero en lugar de mantener pulsado el botón para encender el led, con una pulsación enciende y con otra apaga el led. Ahora el led ponerlo en el pin 10 en lugar del 13. Detectar flancos para encender y apagar.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio08-pullup_interruptor

Práctica: Modificar el ejemplo anterior para contar el número de veces que se pulsa un botón detectando flancos ascendentes o descendentes y sacarlo por el monitor serie. Adicionalmente encender o apagar el led cada vez que haya 4 pulsaciones del botón.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio09-cuentapulsos

Solución a los rebotes

Práctica: Añadir una solución a los rebotes. Los rebotes son las falsas pulsaciones que se producen al hacer falsos contactos en el interruptor.

Más información https://www.arduino.cc/en/Tutorial/Debounce

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio08-pullup_interruptor_rebote

Otra forma de solucionar los rebotes por código: http://miarduinounotieneunblog.blogspot.com.es/2016/01/pulsador-antirrebote-con-contador-de.html

Solucionar rebotes por HW:

Calculadora de valores para debouncing: http://protological.com/debounce-calaculator/

Práctica avanzada: Ver el funcionamiento de la función tone() para generar notas. Tone() genera una onda cuadrada de una frecuencia específica y con un 50% de duty cycle en el pin especificado. La duración del tono puede ser especificado o en caso contrario continúa hasta llamar a la función noTone().

Solo un tono puede ser generado simultáneamente, si un tono ya se está ejecutando en otro pin, la llamada a tone() no tendrá efecto.

Para más información:

NOTA: no confundir tone con PWM. PWM tiene una frecuencia fija de 500Hz, por lo que entre línea verde y verde hay siempre 2ms.

Esquema de conexión:

Tutoriales:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio10-tone

Musica Star Wars con Arduino: http://miarduinounotieneunblog.blogspot.com.es/2016/01/banda-sonora-de-star-wars-con-un.html

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercio51-Musica_StarWars

Descarga e Instalación de Prácticas

Una vez instalado el el IDE y comprendido como está organizado y su configuración podemos instalar las prácticas que veremos en el curso y verlas en nuestro entorno de trabajo para acceder a ellas más rápidamente.

Todas las prácticas del curso y muchas más se encuentran en https://github.com/jecrespo/Aprendiendo-Arduino

Para usar las prácticas durante el curso y tenerlas disponibles en cualquier momento para cargar en Arduino o simplemente consultar el código, descargar las prácticas desde el enlace https://github.com/jecrespo/Aprendiendo-Arduino/archive/master.zip y descomprimir el archivo en el escritorio o cualquier otra carpeta.

También es posible hacerlo entrando en la página https://github.com/jecrespo/Aprendiendo-Arduino donde se encuentra todo el código relacionado con el curso:

github

Pulsar en “Clone or download”  y descargar pinchando en “Download ZIP”:

github2

Una vez descargado el fichero .zip debemos descomprimir el contenido en la carpeta donde hemos configurado la “Localización de proyecto” en las preferencias del IDE.

Una vez descomprimido el contenido en la carpeta de proyectos que por defecto es C:\Users\nombre_usuario\Documentos\Arduino, vamos a poder ver todas las prácticas y acceder a ellas desde el IDE de Arduino en el menú Archivo → Proyecto → Aprendiendo-Arduino.

acceso prácticas

NOTA: En caso de hacer esta operación con el IDE de Arduino abierto, deberemos reiniciar el IDE para poder ver las prácticas dentro de los proyectos.

Que es git y github

Cuando buscas en internet cualquier cosa sobre programación, software libre o Arduino es muy probable que acabemos en la página de https://github.com/ donde podemos acceder al código fuente.

Cuando trabajamos con Arduino es importante que conozcamos que es github y conocer un poco qué es y cómo hacer ciertas operaciones sencillas con esta web. Para conseguir software y ver el código, no es necesario crearse una cuenta, sólo es necesario cuando vamos a subir nuestro propio código.

GitHub es una plataforma de desarrollo colaborativo para alojar proyectos utilizando el sistema de control de versiones Git. El código se almacena de forma pública, aunque también se puede hacer de forma privada, creando una cuenta de pago.

Git es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente.

Git es uno de los sistemas de control de versiones más populares entre los desarrolladores. Y parte culpa de su popularidad la tiene GitHub, un excelente servicio de alojamiento de repositorios de software con este sistema, que lejos de quedarse en esta funcionalidad, ofrece hoy en día un conjunto de características muy útiles para el trabajo en equipo.

Github es el servicio elegido por proyectos de software libre como jQuery, reddit, Sparkle, curl, Ruby on Rails, node.js, ClickToFlash, Erlang/OTP, CakePHP, Redis, y otros muchos. Además, algunas de las grandes empresas de Internet, como Facebook, alojan ahí sus desarrollos públicos, tales como el SDK, librerías, ejemplos, etc.

GitHub aloja tu repositorio de código y te brinda herramientas muy útiles para el trabajo en equipo, dentro de un proyecto. Además de eso, puedes contribuir a mejorar el software de los demás. Para poder alcanzar esta meta, GitHub provee de funcionalidades para hacer un fork y solicitar pulls.

Realizar un fork es simplemente clonar un repositorio ajeno (genera una copia en tu cuenta), para eliminar algún bug, modificar cosas de él o hacer tu propia versión partiendo un software libre. Una vez realizadas tus modificaciones puedes enviar un pull al dueño del proyecto. Éste podrá analizar los cambios que has realizado fácilmente, y si considera interesante tu contribución, adjuntarlo con el repositorio original.

En github podemos encontrar el código fuente original del ordenador de guía del módulo lunar del apollo 11: https://github.com/chrislgarry/Apollo-11

También podemos encontrar el código fuente de software libre que usamos a diario como el servidor web apache: https://github.com/apache/httpd y por supuesto el del IDE de Arduino https://github.com/arduino/Arduino

Y también grandes compañías como Google o Microsoft publican parte de su código en github: https://github.com/google y https://github.com/Microsoft

Otro ejemplo para el que usaremos github con Arduino es para conseguir las librerías de Arduino que nos sirven para manejar algunos dispositivos o nos facilitan la programación. Los distribuidores de hardware como https://www.sparkfun.com/ tienen su repositorio https://github.com/sparkfun donde podemos descargar las librerías para manejar el hardware que les compramos.

Más información de github en:

Más información de git:

Proyecto – Envio Mensajes Arduino y Visualización en Tiempo Real

Enunciado

Crear un sistema para mandar mensajes en tiempo real a un servidor, podría simular un sistema de alertas de varios dispositivos remotos conectados a un servicio en la nube de visualización de alertas de dispositivos remotos.

Arduino solicita en el setup() un nombre y un mensaje que escribimos en el puerto serie y lo manda a un servidor. Desde el servidor vemos los mensajes en tiempo real. Por ejemplo serviría para enviar alarmas a un sistema de monitorización cuando Arduino detecta un evento (pulsar un botón, abrir una puerta, etc…).

El servidor que recoge los mensajes está en www.aprendiendoarduino.com o el la IP de la Raspberry Pi instalada en el aula.

Visualizar los mensajes: http://www.aprendiendoarduino.com/servicios/ o IP Raspberry Pi.

mensajes

NOTAS:

  • El código de la solución tiene 3 errores, encontrarlos y corregirlos
  • Arduino manda una petición GET a la ruta /servicios/grabaMensajes.php?nombre=pedro&mensaje=hola

Solución

Proyecto – Grabar datos de temperatura (Datalogger)

Enunciado

Hacer un datalogger de los datos de temperatura leídos por un Arduino y grabarlos en una Raspberry Pi que tenga un servidor LAMP instalado. Se grabarán en una tabla de una BBDD MySQL los datos de temperatura que mande Arduino cada 5 segundos. También se grabarán en un servidor público cada 30 segundos, en este caso en www.aprendiendoarduino.com.

Este ejercicio consiste en programar un Arduino que manda datos a un servidor mediante request GET HTTP. Los datos que mandará Arduino son la temperatura leída por el sensor de temperatura cada 5 segundos y el número de arduino con el formato: “arduino=5&temperatura=21.8”. Estos datos son recogidos por un script php (el que es llamado por el HTTP request de Arduino) que se encarga de grabarlos en la base de datos correspondiente.

Usamos Push: Arduino se comunica con el servidor para mandarle los datos http://www.tweaking4all.com/hardware/arduino/arduino-ethernet-data-push/

Información y referencias usadas

Para poder usar una Raspberry Pi en este ejercicio, necesitamos instalar un servidor LAMP, tutoriales de como hacerlo:

También podemos instalar Postfix en Raspberry Pi como servidor SMTP para mandar correos desde nuestro Arduino al ocurrir un evento como por ejemplo superar un umbral de temperatura:

NOTAS:

  • En el ejemplo se usa una IP fija, pero se usará IPs dinámicas asignadas por DHCP.
  • La MAC de cada Arduino debe ser diferente, usaremos la MAC “0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xYY”, donde YY es el número del kit de Arduino
  • En la llama a grabar datos en la línea “/grabaDatos.php?arduino=YY&temperatura=” donde YY es en número de kit de Arduino.
  • Poner la IP correcta de la Raspberry Pi

Código para DHCP:

#include <SPI.h>

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xYY };

EthernetClient client;

void setup() {

 // start the serial library:

 Serial.begin(9600);

 // start the Ethernet connection:

 if (Ethernet.begin(mac) == 0) {

   Serial.println(“Failed to configure Ethernet using DHCP”);

   // no point in carrying on, so do nothing forevermore:

   for(;;)

     ;

 }

 // print your local IP address:

 Serial.println(Ethernet.localIP());

}

Github: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Otros/DHCP_Arduino

Esquema de Conexión

Solución

BBDD pública: https://qvm602.aprendiendoarduino.com/

Gráficas: http://www.aprendiendoarduino.com/servicios/graficas.htm