Archivo de la etiqueta: Arduino

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

Entradas y salidas analógicas. PWM

Una señal eléctrica analógica es aquella en la que los valores de la tensión o voltaje varían constantemente y pueden tomar cualquier valor. En el caso de la corriente alterna, la señal analógica incrementa su valor con signo eléctrico positivo (+) durante medio ciclo y disminuye a continuación con signo eléctrico negativo (–) en el medio ciclo siguiente.

Un sistema de control (como un microcontrolador) no tiene capacidad alguna para trabajar con señales analógicas, de modo que necesita convertir las señales analógicas en señales digitales para poder trabajar con ellas.

La señal digital obtenida de una analógica tiene dos propiedades fundamentales:

En el caso de un arduino Uno, el valor de 0 voltios analógico es expresado en digital como B0000000000 (0) y el valor de 5V analógico es expresado en digital como B1111111111 (1023). Por lo tanto todo valor analógico intermedio es expresado con un valor entre 0 y 1023, es decir, sumo 1 en binario cada 4,883 mV.

Arduino Uno tiene una resolución de 10 bits, es decir, unos valores entre 0 y 1023.

Arduino Due tiene una resolución de 12 bits, es decir, unos valores entre 0 y 4095.

Diferencia entre señales analógicas y digitales:

Entradas 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:

Salidas Analógicas. PWM

Como hemos dicho 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.

Algunos pines digitales pueden usarse como salidas analógicas PWM:

Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines digitales. Arduino Uno no posee salidas analógicas puras, sin embargo el Arduino Due sí tiene salidas analógicas puras mediante dos DAC. El arduino due, posee dos salidas analógicas puras mediante dos conversores digital a analógico. Estos pines pueden usarse para crear salidas de audio usando la librería correspondiente.

La función para hacer una salida PWM en un pin es:

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)

Diferentes valores de una señal PWM:

En este ejemplo se ve cómo simular con PWM una onda sinusoidal analógica.

En Arduino la frecuencia de PWM es de 500Hz. Pero es un valor que puede modificarse en caso que lo necesitemos.

En la actualidad existen muchos circuitos integrados en los que se implementa la modulación PWM, por ejemplo para lograr circuitos funcionales que puedan controlar fuentes conmutadas, controles de motores, controles de elementos termoeléctricos, choppers para sensores en ambientes ruidosos y algunas otras aplicaciones.

Definición de PWM en la web de Arduino: http://arduino.cc/en/Tutorial/PWM

Para ampliar un poco más de información sobre PWM ver: http://rufianenlared.com/que-es-pwm/

Función Tone()

No confundir PWM con la función tone() que es utilizada para generar una onda cuadrada de ciclo de trabajo 50% y frecuencia variable, con el fin de emitir sonidos audibles, modificando la frecuencia.

Más información de tone() en: https://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation

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

Uso del Puerto Serie en Arduino

Código ASCII

La comunicación a través de cualquier puerto serie es en código binario y se mandan en grupos de 8 bits (byte). Puesto que el humano entiende caracteres alfanuméricos, codificamos los caracteres en binario según el código ASCII.

Práctica: Generar con Arduino una tabla de caracteres y sus valores ASCII en decimal, hexadecimal, octal y binario. http://arduino.cc/en/Tutorial/ASCIITable

Caracteres ASCII: http://es.wikipedia.org/wiki/ASCII y http://www.asciitable.com/

Fijaros en el carácter ÿ y recordad cuál es su valor en binario.

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio12-ASCII

Otro ejemplo: http://diymakers.es/usando-el-puerto-serie-del-arduino/

Leer Números por Puerto Serie

Ver, entender y ejecutar este ejemplo https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio10-LeerStringSerie donde cada vez que reinicio Arduino espero a que se introduzca una cadena de caracteres y luego la muestro por pantalla. Con la opción DEBUG = 1, se muestra paso a paso cómo lee del puerto serie Arduino.

Basándonos en este ejemplo hacer una nueva versión donde me pide un número al iniciar Arduino y lo paso por el puerto serie. Luego multiplicar por 15 ese número y sacar por el puerto serie el resultado. En caso que lo introducido no sea un número sacar por pantalla el error.

Lo que hacemos es coger una cadena de texto que representa un número y lo convertimos a un número para poder operar con él. Esto lo aplicaremos en varios ejemplos para manejar por ejemplo la luminosidad de un led con un valor que paso por el puerto serie.

Recordar que es necesario usar la función toInt(): http://arduino.cc/en/Reference/StringToInt

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio13-LeerNumeroSerie

Coche Fantástico Serial

Sobre el ejemplo del coche fantástico mejorado https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio09-CocheFantasticoMejorado, modificar el código para que el valor de la velocidad del efecto de los leds se pase por puerto serie y Arduino lo recoja y lo modifique para cambiar la velocidad a la que lucen los leds.

Esquema de conexión:

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio14-CocheFantasticoSerial

Chat Serie

Para comunicar dos arduinos por el puerto serie y ver por pantalla lo que escribe desde el Arduino remoto, necesitamos dos puertos serie en cada uno de los Arduinos, uno para comunicar Arduino con el monitor serie (HW Serial) y otro para comunicar con el otro Arduino (SW Serial).

Hacer un programa que comunique por puerto serie un arduino UNO (usar la librería software serial) con otro Arduino UNO y saque por pantalla (puerto serie HW del USB) lo recibido por el puerto serie SW y mande por el puerto serie SW todo aquello que mandes desde el terminal. Es decir, hacer un chat punto a punto entre dos Arduinos.

Esquema de conexión:

Funciones y librerías a usar:

Preguntas:

  • Leer el código de la librería Softwareserial ¿Que tamaño de buffer tiene?. La librería está en la ruta “C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries”

Solución: https://github.com/jecrespo/aprendiendoarduino-Curso_Arduino_2017/tree/master/Ejercicio15-ChatSerie

Chat Serie Avanzado

Hacer una versión mejorada del anterior chat, de forma que al escribir en el monitor serie la cadena “repite”, Arduino pregunte cuantas veces y mandar por el chat serie la cadena “repite” tantas veces como se haya indicado. En este caso la estrategia es diferente, en lugar de leer un carácter del buffer en cada loop, en este caso hay que leer todo el buffer en el mismo loop para analizar lo que he recibido. Otra estrategia sería leer en cada loop línea por línea.

Comprobar las luces de Tx, Rx cada vez que se manda o recibe datos. Se podría hacer lo mismo con unos LEDs en los pines 10 y 11, encendiendo los leds cada vez que hagamos un write() o un read() en el puerto serie software y veríamos si se están mandando datos o no por la comunicación serie entre los dos Arduinos.

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio22-ChatSerieMejorado