Archivo de la categoría: Práctica

Ejemplos Prácticos

Cronómetro para Charlas

Cronómetro que indica mediante leds los minutos transcurridos y señala mediante colores el tiempo de cada parte programada según sea programada.

Código: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Otros/Neopixel_contador

Hardware usado:

Monitorización de Temperatura

Visualización en tiempo real de datos de temperatura en diversos lugares:

Hardware usado:

Envío de mensajes y SMSs en Tiempo Real

Enviar desde Arduino mensajes a una plataforma de visualización de mensajes en tiempo real. Arduino comunica alertas, estados, etc… que sea programado.

Enviar esos mismos mensajes por SMS a un móvil de forma que arduino deja un mensaje pendiente de enviar en la plataforma y otro Arduino remoto se encarga de revisar mensajes pendientes y los envía por SMS.

Hardware usado:

Obtención de datos agroclimáticos (Open Data)

En este ejemplo se van a obtener los datos agroclimáticos ofrecidos por el Servicio de Información Agroclimática de La Rioja (SIAR) para la toma de decisiones locales con un Arduino en función de esos datos. De esta forma podría, por ejemplo, podría programar riegos en un cultivo mediante la apertura de válvulas o puesta en marcha de bombas de regadío sin necesidad de instalar mis propios sensores. Estos además del ahorro económico, supone poder crear un sistema más sencillo y que consuma menos energía al no tener que alimentar los sensores, algo importante en sistemas instalados en el campo donde no hay acceso a la red eléctrica. Por otra se trata de datos de calidad ya validados.

Estos datos también se pueden combinar con los datos locales obtenidos por los sensores de Arduino, ya sea localmente o una una base de datos propia.

Más información sobre los datos publicados: https://seminariomirianandres.unirioja.es//wp-content/uploads/2016/12/si_ma_20161220.pdf

Web del servicio http://apisiar.larioja.org/help. Este servicio se encuentra aún en pruebas y para usarlo es necesario estar registrado.

Características de los datos:

  • Datos cada media hora. 21 parámetros
  • Parámetros climáticos: Tª; HR; Viento; Radiación; Lluvia; Tª suelo; Humectación
  • Datos en tiempo real. Comunicación remota vía GPRS
  • Datos diarios, mensuales

Código: https://github.com/jecrespo/apisiar_arduino

Hardware usado:

De la misma forma podrían obtenerse datos meteorológicos de AEMET (Agencia Estatal de Meteorología).

Datos abiertos AEMET: http://www.aemet.es/es/datos_abiertos

Instrucciones: https://opendata.aemet.es/centrodedescargas/inicio, es necesario solicitar una API KEY y esta tiene una caducidad de 90 días.

Ejemplo en HTTP:

GET /opendata/api/valores/climatologicos/inventarioestaciones/estaciones/?api_key=jyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJqbW9udGVyb2dAYWVtZXQuZXMiLCJqdGkiOiI3NDRiYmVhMy02NDEyLTQxYWMtYmYzOC01MjhlZWJlM2FhMWEiLCJleHAiOjE0NzUwNTg3ODcsImlzcyI6IkFFTUVUIiwiaWF0IjoxNDc0NjI2Nzg3LCJ1c2VySWQiOiI3NDRiYmVhMy02NDEyLTQxYWMtYmYzOC01MjhlZWJlM2FhMWEiLCJyb2xlIjoiIn0.xh3LstTlsP9h5cxz3TLmYF4uJwhOKzA0B6-vH8lPGGw HTTP/1.1
Host: opendata.aemet.es
Cache-Control: no-cache

Códigos de municipio: http://www.ine.es/daco/daco42/codmun/codmunmapa.htm

Documentación: https://opendata.aemet.es/dist/index.html

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