Archivo de la etiqueta: Entradas Digitales

Manejo Arduino Básico

La estructura básica de un sketch de Arduino es bastante simple y se compone de al menos dos partes. Estas dos partes son obligatorios y encierran bloques que contienen declaraciones, estamentos o instrucciones.

setup() es la parte encargada de recoger la configuración y loop() es la que contiene el programa que se ejecuta cíclicamente (de ahí el término loop –bucle-). Ambas funciones son necesarias para que el programa trabaje.

La función de configuración (setup) debe contener la inicialización de los elementos y esta función sólo se ejecuta una vez justo después de hacer el reset y no se vuelve a ejecutar hasta que no haya otro reset. Es la primera función a ejecutar en el programa y se utiliza para configurar, inicializar variables, comenzar a usar librerías, etc…

La función bucle (loop) contiene el código que se ejecutará continuamente (lectura de entradas, activación de salidas, etc). Esta función es el núcleo de todos los programas de Arduino y se usa para el control activo de la placa. La función loop se ejecuta justo después de setup.

La estructura del sketch está definida en el siguiente enlace: http://arduino.cc/en/Tutorial/Sketch

Los componentes principales de un sketch de Arduino son:

  • Variables, son un espacio en memoria donde se almacenan datos y estos datos pueden variar.
  • Funciones, son un trozo de código que puede ser usado/llamado desde cualquier parte del sketch. A la función se le puede llamar directamente o pasarle unos parámetros, en función de cómo esté definida.
  • setup() y loop(), son dos funciones especiales que es obligatorio declarar en cualquier sketch.
  • Comentarios, fundamentales para documentar el proyecto

Se puede resumir un sketch de Arduino en los siguientes diagramas de flujo:

Para más información de como programar Arduino ver: https://aprendiendoarduino.wordpress.com/2016/10/16/programacion-arduino-2/

Cargar un Programa en Arduino

Una vez tenemos el programa hay que compilarlo y mandarlo a Arduino para que se ejecute de forma infinita.

Pasos a seguir:

  • Abrir la aplicación Arduino
  • Abrir el sketch que queremos cargar

  • Leer el programar y entender lo que está haciendo
  • Seleccionar la placa y el puerto adecuado

  • Cargar el programa pulsando el botón “subir”. El programa se compila y luego se verá parpadeando los leds Tx y Rx de Arduino, indicando que se está cargando el fichero binario (.hex) en la flash del Arduino. Cuando aparezca el mensaje “subido” habremos acabado.
  • Un momento después el programa se está ejecutando el Arduino

Cuando cargamos un programa en Arduino, estamos usando el bootloader de Arduino, que es un pequeño programa cargado en el microcontrolador que permite subir el código sin usar hardware adicional. El bootloader está activo unos segundos cuando se resetea la placa, después comienza el programa que tenga cargado el Arduino en su memoria Flash. El led integrado en la placa (pin 13) parpadea cuando el bootloader se ejecuta.

Entradas y Salidas Digitales en Arduino

En arduino los pines digitales se describen y tienen la propiedades siguientes:  http://arduino.cc/en/Tutorial/DigitalPins

En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:

En la imagen siguiente se muestra el estado por defecto de una I/O digital en un microcontrolador de Arduino. Se ha simplificado con interruptores la compleja electrónica que hay dentro. Por defecto los digital I/O pins están configurados como inputs en un estado de alta impedancia (equivalente a una resistencia de 100 Mohms en frente del pin), es decir, SW3 a ON y no hace falta llamar a la función pinMode() aunque es recomendable para aclarar el código.

  • PinMode(x, INPUT) –> SW3 = ON (resto a OFF). Los valores leídos serán aleatorios si el pin de Arduino está al aire. El pin está en un estado de alta impedancia (resistencia de 100 Mohms).
  • PinMode(x,INPUT_PULLUP) –> SW3 = ON & SW4 = ON (resto a OFF). Los valores leídos sin nada conectado al pin es HIGH. La Resistencia R1 tiene un valor dependiendo del microcontrolador, pero tiene un valor entre 20kOhm y 150kOhm.
  • PinMode(x, OUTPUT) & digitalWrite(x,HIGH) –> SW2 = ON & SW1 = +5V (resto a OFF). Estado de baja impedancia, no hay resistencia interna y es necesario poner una resistencia adecuada a la salida el pin para no superar los 40mA (source) máximos admitidos
  • PinMode(x, OUTPUT) & digitalWrite(x,LOW) –> SW2 = ON & SW1 = GND (resto a OFF). Estado de baja impedancia, no hay resistencia interna y es necesario poner una adecuada para no superar los 40mA (sink) máximos admitidos

Entradas y Salidas Analógicas en Arduino

Los microcontroladores de Arduino contienen en la placa un conversor analógico a digital de 6 canales. El conversor tiene una resolución de 10 bits, devolviendo enteros entre 0 y 1023. Los pines analógicos de Arduino también tienen todas las funcionalidades de los pines digitales. Por lo tanto, si necesitamos más pines digitales podemos usar los pines analógicos. La nomenclatura para los pines analógicos es A0, A1, etc…

En arduino los pines analógicos se definen y tienen las propiedades siguientes: http://arduino.cc/en/Tutorial/AnalogInputPins

En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:

Otras funciones interesantes con entradas/salidas analóicas:

PWM

Arduino Uno tiene entradas analógicas que gracias a los conversores analógico digital puede entender ese valor el microcontrolador, pero no tiene salidas analógicas puras y para solucionar esto, usa la técnica de PWM.

Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines digitales. Arduino Uno no posee salidas analógicas puras.

La modulación por ancho de pulsos (también conocida como PWM, siglas en inglés de pulse-width modulation) de una señal o fuente de energía es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la cantidad de energía que se envía a una carga.

El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con el período. duty cycle = (tiempo que la salida está a uno o HIGH)/ (periodo de la función)

En Arduino la frecuencia de PWM es de 500Hz. Pero es un valor que puede modificarse en caso que lo necesitemos. Definición de PWM en la web de Arduino: http://arduino.cc/en/Tutorial/PWM

Ejemplos Entradas y Salidas Analógicas

Entradas y Salidas Analógicas

Leer el voltaje a la salida de un potenciómetro y sacarlo por consola. Conectar el potenciómetro en la entrada analógica A0, leer su valor e iluminar el LED en función del valor leído de forma proporcional mediante una salida analógica PWM.

Sacar por el serial plotter los valores de la entrada analógica, el valor en voltios y el valor aplicado al PWM.

Los valores de la lectura de la entrada analógica van de 0 para 0V hasta 1023 para 5V.

Los valores de la salida PWM van desde 0 para 0V hasta 255 para 5V.

Esquema de conexión:

Tutoriales:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio19-Analog

Smoothing

Usando el mismo esquema del ejercicio anterior, leer la 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 led usando el valor medio de las últimas 10 lecturas (pin PWM).

Ver los datos por el Serial Plotter.

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

Resultado:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio20-Smoothing

Hacer una versión con más transición de forma que si cambia la media (outputValue) respecto del valor anterior aplicado, hacer una transición de 5 en 5 valores. Ver como en este caso el tiempo de loop aumenta por esta transición

Solución: poner a 1 MAS_TRANSICION en https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio20-Smoothing

Ejercicio propuesto: Hacer una versión del coche fantástico pero haciendo que haya un led encendido al 100% y los de al lado al 50% y los siguientes al 25%.

Generar Tonos

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. En el caso de tone la señal siempre tiene un duty cycle del 50%.

Esquema de conexión:

Tutoriales:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio21-tone

Hacer sonar la 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/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio22-Musica_StarWars

Grillo Digital

Proyecto de grillo digital: https://blog.arduino.cc/2016/08/02/the-most-incessant-and-annoying-arduino-project-ever/

Se usa la librería Volume para controlar el volumen de la función tone(): https://github.com/connornishijima/arduino-volume1

Código: https://github.com/connornishijima/arduino-volume1/tree/master/examples/volume_crickeduino_prank

Ejemplos Entradas y Salidas Digitales

Input Pullup

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.

Imprimir por pantalla el tiempo de loop, que nos servirá para analizar la importancia de este tiempo en el comportamiento del programa.

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

Esquema de conexión:

Diagrama eléctrico:

Resultado:

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

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio16-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.

NOTA: Si el tiempo de loop es muy largo podemos perder pulsaciones rápidas. Probar a poner un delay.

Interruptor

Con la base del 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. Para hacer esto debemos detectar flancos para encender y apagar.

Esquema de conexión:

Resultado:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio17-pullup_interruptor

Contador de pulsos

Usar Arduino para contar pulsaciones de un pulsador. 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.

NOTA: comprobar los rebotes y pensar cómo eliminarlos.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio18-cuentapulsos

Entradas y salidas Digitales

Una señal digital es un tipo de señal generada por algún tipo de fenómeno electromagnético en que cada signo que codifica el contenido de la misma puede ser analizado en término de algunas magnitudes que representan valores discretos, en lugar de valores dentro de un cierto rango. Por ejemplo, el interruptor de la luz sólo puede tomar dos valores o estados: abierto o cerrado, o la misma lámpara: encendida o apagada.

Más información:

Los sistemas digitales, como por ejemplo un microcontrolador, usan la lógica de dos estados representados por dos niveles de tensión eléctrica, uno alto, H y otro bajo, L (de High y Low, respectivamente, en inglés). Por abstracción, dichos estados se sustituyen por ceros y unos, lo que facilita la aplicación de la lógica y la aritmética binaria. Si el nivel alto se representa por 1 y el bajo por 0, se habla de lógica positiva y en caso contrario de lógica negativa.

Cabe mencionar que, además de los niveles, en una señal digital están las transiciones de alto a bajo y de bajo a alto, denominadas flanco de bajada y de subida, respectivamente. En una señal digital, se denomina flanco a la transición del nivel bajo al alto (flanco de subida) o del nivel alto al bajo (flanco de bajada).

Características de las Señales Digitales

Flanco vs Pulso

Periodo, ancho de pulso, flancos

Tipos de señales digitales

  • Discreta: puede tomar un conjunto de valores
  • Binaria: Encendido (1) – Apagado (0)

Tecnologías de construcción

Arduino trabaja con tecnología TTL (transistor-transistor logic): http://es.wikipedia.org/wiki/Tecnolog%C3%ADa_TTL

Características

  • Su tensión de alimentación característica se halla comprendida entre los 4,75V y los 5,25V. Normalmente TTL trabaja con 5V.
  • Los niveles lógicos vienen definidos por el rango de tensión comprendida entre 0,0V y 0,8V para el estado L (bajo) y los 2,4V y Vcc para el estado H (alto).
  • La velocidad de transmisión entre los estados lógicos es su mejor base, si bien esta característica le hace aumentar su consumo siendo su mayor enemigo. Motivo por el cual han aparecido diferentes versiones de TTL como FAST, LS, S, etc y últimamente los CMOS: HC, HCT y HCTLS. En algunos casos puede alcanzar poco más de los 250 MHz.
  • Las señales de salida TTL se degradan rápidamente si no se transmiten a través de circuitos adicionales de transmisión (no pueden viajar más de 2 m por cable sin graves pérdidas).

Tecnología CMOS: https://es.wikipedia.org/wiki/Semiconductor_complementario_de_%C3%B3xido_met%C3%A1lico

Comparación TTL y CMOS: http://digital.ni.com/public.nsf/allkb/2D038D3AE1C35011862565A8005C5C63

Los nuevos arduinos basados en procesadores ARM de 32 bits, usan tecnología TTL a 3.3V

Entradas y Salidas Digitales en Arduino

En arduino los pines digitales se describen y tienen la propiedades siguientes:  http://arduino.cc/en/Tutorial/DigitalPins

En arduino para tratar las entradas y salidas digitales usamos las siguientes funciones:

En la imagen siguiente se muestra el estado por defecto de una I/O digital en un microcontrolador de Arduino. Se ha simplificado con interruptores la compleja electrónica que hay dentro. Por defecto los digital I/O pins están configurados como inputs en un estado de alta impedancia (equivalente a una resistencia de 100 Mohms en frente del pin), es decir, SW3 a ON y no hace falta llamar a la función pinMode() aunque es recomendable para aclarar el código.

  • PinMode(x, INPUT) –> SW3 = ON (resto a OFF). Los valores leídos serán aleatorios si el pin de Arduino está al aire. El pin está en un estado de alta impedancia (resistencia de 100 Mohms).
  • PinMode(x,INPUT_PULLUP) –> SW3 = ON & SW4 = ON (resto a OFF). Los valores leídos sin nada conectado al pin es HIGH. La Resistencia R1 tiene un valor dependiendo del microcontrolador, pero tiene un valor entre 20kOhm y 150kOhm.
  • PinMode(x, OUTPUT) & digitalWrite(x,HIGH) –> SW2 = ON & SW1 = +5V (resto a OFF). Estado de baja impedancia, no hay resistencia interna y es necesario poner una resistencia adecuada a la salida el pin para no superar los 40mA (source) máximos admitidos
  • PinMode(x, OUTPUT) & digitalWrite(x,LOW) –> SW2 = ON & SW1 = GND (resto a OFF). Estado de baja impedancia, no hay resistencia interna y es necesario poner una adecuada para no superar los 40mA (sink) máximos admitidos

Más información sobre pullup resistors: https://learn.sparkfun.com/tutorials/pull-up-resistors

En el caso que el pin esté configurado como OUTPUT, hay diferencia entre sink (recogida de corriente) y source (fuente de corriente) de un pin digital configurado como salida.

En el primer caso para encender el LED debo poner digitalWrite() a HIGH y en el segundo a LOW

    

En el caso que el pin de entrada esté configurado como INPUT. Cuando el botón no está pulsado, en el primer caso leo digitalRead() un valor HIGH y en el segundo LOW y cuando pulso el botón, en el primer caso leo digitalRead() un valor LOW y en el segundo HIGH. Como véis, dependiendo de la configuración de lo conectado cambia lo leído. Estas configuraciones se denominan resistencias de pull up y resistencia de pull down respectivamente.

En el caso que el pin de entrada configurado como INPUT_PULLUP. Si el botón no está pulsado leo HIGH (no se producen lecturas aleatorias con el pin al aire) y cuando pulso el botón leo LOW. Esta es la mejor forma de leer entradas digitales sin necesidad de poner elementos externos a Arduino.

Más información sobre como usar las internal pullups: https://www.baldengineer.com/arduino-pull-ups.html

Ejemplos Prácticos Arduino

Digital Read Serial

Monitorizar el estado de un botón (pulsado/no pulsado) con Arduino y mostrarlo por el monitor serie.

Revisar el código del programa DigitalReadSerial de los ejemplos en Basis. Cargar y ejecutar en Arduino.

Esquema de conexión:

Explicación completa de la práctica: http://arduino.cc/en/Tutorial/DigitalReadSerial

Código: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio04-DigitalReadSerial

Comprobar desde el monitor serie como detecta Arduino las pulsaciones del pulsador.

Hacer la misma comprobación desde el Serial Plotter.

Quitar la resistencia ¿Que valores lee si dejo al aire la entrada digital 2?

Aumentar el tiempo de delay y ver cómo se modifica el comportamiento al pulsar el botón. Comprobar el efecto de los rebotes (bounce) y como se soluciona (debounce).

Encender Led al detectar pulsación

Ahora hacer que al detectar una pulsación del botón se encienda y al soltar el botón se apague. Imprimir por puerto serie cuando apague y encienda el led.

Esquema de conexión:

Código: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio05-Led_Pulsador

Comprobar cómo afecta el escribir por el puerto serie. Si no escribo por el puerto serie aumentan los rebotes.

¿Que habría que hacer para que solo encienda y apague el led cuando cambie el estado?

Solución: http://jecrespo.github.io/PrimerosPasosArduino/

¿Que habría que hacer para encender con una pulsación y apagar con otra?

Solución: https://www.arduino.cc/en/Tutorial/StateChangeDetection

Más ejemplos

El IDE de Arduino trae muchos ejemplos que podemos ver y probar por nuestra cuenta: https://www.arduino.cc/en/Tutorial/BuiltInExamples