Czytaj książkę: «Aprender Arduino, prototipado y programación avanzada con 100 ejercicios»

Czcionka:

SAQUE EL MÁXIMO RENDIMIENTO A ESTE MANUAL CON EL

KIT

Aprender Arduino, prototipado y programación avanzada con 100 ejercicios prácticos

·Código ISBN de referencia: 9788426727176

·Disponible en www.marcombo.com (se recomienda realizar la búsqueda con el código ISBN)

·Componentes del KIT Aprender Arduino, prototipado y programación avanzada con 100 ejercicios prácticos:

Arduino UNO

Adaptador Jack pila

Atemga328p

Cables cocodrilo

Cables protoboard macho-hembra

Cables protoboard macho-macho

Condensador 1000 µF

Condensador 0,1 µF y 25 V

Condensador 0,33 µF y 25 V

Condensador 100 µF y 25 V

Condensador 22 pF

Conversor de nivel lógico

Diodo 1N4007

Entrada analógica ADS1115

Expansor GPIO PCF8574

Interruptor protoboard

Led amarillo

Led verde

Memoria EEPROM AT24C25

Multímetro

Multiplexor CD74HC4067

Oscilador 16 Mhz

Pila 9 V

Potenciómetro

Power supply breadboard

Programador ftdi

Protoboard

Pulsadores

Registro de desplazamiento 74HC164

Regulador lm7805

Resistencia 1000

Resistencia 10000

Resistencia 1 MΩ

Resistencia 330

Resistencia 470

Resistencia 4700 Ω

Salida analógica MCP4725

> ¿Quiere conseguir una base sólida de Arduino y electrónica?

Si necesita iniciarse en la electrónica y la programación para adentrarse en Arduino desde cero, le interesará el libro escrito por el mismo autor:


Aprender Arduino, electrónica y programación con 100 ejercicios prácticos

ISBN: 9788426726483

Puede sacar el máximo provecho a este otro libro de Rubén con el KIT Aprender Arduino, electrónica y programación con 100 ejercicios prácticos (ISBN: 9788426727169), disponible en www.marcombo.com. Se recomienda realizar la búsqueda con el código ISBN.

·Componentes del KIT Aprender Arduino, electrónica y programación con 100 ejercicios prácticos:

Arduino UNO

Adaptador Jack pila

AND (74HC08)

Buzzer EL0503

Cables cocodrilo

Cables protoboard macho-hembra

Cables protoboard macho-macho

DHT11

Display 7 segmentos

DS18B20+

Joystick

LCD

LDR

Led amarillo

Led RGB

Led verde

Multímetro

NAND (74HC132)

NOR (74HC02)

NOT (74HC04)

OR (74HC32)

Pila 9 V

Pila rtc

Potenciómetro

Protoboard

Pulsadores

Resistencia 1000

Resistencia 10000

Resistencia 330

Resistencia 470

Resistencia 4700 Ω

Sensor llama

Sensor PIR

Teclado matricial

Transistor 2n2222 XNOR

(74HC266)

XOR (74HC86)

También puede conseguir en www.marcombo.com el PACK Aprender Arduino, electrónica y programación con 100 ejercicios prácticos (ISBN: 9788426727039) que incluye:

> Libro Aprender Arduino, electrónica y programación con 100 ejercicios prácticos

> KIT Aprender Arduino, electrónica y programación con 100 ejercicios prácticos

> ¿Desea un kit completo para empezar desde cero y alcanzar un nivel alto?

Consiga el KIT DE ARDUINO Y ELECTRÓNICA (ISBN: 9788426727022) en www.marcombo.com Se recomienda realizar la búsqueda con el código ISBN.

·Componentes del KIT de Arduino y electrónica:

Arduino UNO

Adaptador Jack pila

AND (74HC08)

Atemga328p

Buzzer EL0503

Cables cocodrilo

Cables protoboard macho-hembra

Cables protoboard macho-macho

Condensador 1000 µF

Condensador 0,1 µF y 25 V

Condensador 0,33 µF y 25 V

Condensador 100 µF y 25 V

Condensador 22 pF

Conversor de nivel lógico

DHT11

Diodo 1N4007

Display 7 segmentos

DS18B20+

Entrada analógica ADS1115

Expansor GPIO PCF8574

Interruptor protoboard

Joystick

LCD

LDR

Led amarillo

Led RGB

Led verde

Memoria EEPROM AT24C256

Multímetro

Multiplexor CD74HC4067

NAND (74HC132)

NOR (74HC02)

NOT (74HC04)

OR (74HC32)

Oscilador 16 Mhz

Pila 9 V

Pila rtc

Potenciómetro

Power supply breadboard

Programador ftdi

Protoboard

Pulsadores

Registro de desplazamiento

74HC164 Regulador lm7805

Resistencia 1000

Resistencia 10000

Resistencia 1 MΩ

Resistencia 330

Resistencia 470

Resistencia 4700 Ω

Salida analógica MCP4725

Sensor llama

Sensor PIR

Teclado matricial

Transistor 2n2222

XNOR (74HC266)

XOR (74HC86)

> Para más información sobre los kits y las condiciones de envío, entre en www.marcombo.com o envíe un correo a info@marcombo.com

Aprender
Arduino, prototipado y programación avanzada

con 100 ejercicios prácticos

Acceda a www.marcombo.info para descargar gratis el contenido adicional complemento imprescindible de este libro

Código:APARDUINO2

Aprender
Arduino, prototipado y programación avanzada

con 100 ejercicios prácticos


Aprender Arduino, prototipado y programación avanzada con 100 ejercicios prácticos

© 2019 Rubén Beiroa Mosquera

Primera edición, 2019

© 2019 MARCOMBO, S.A.

www.marcombo.com

Diseño de la cubierta: ArteMio

Maquetación: ArteMio

Correctoras: Mónica Muñoz Marinero y Laura Seoane Sánchez Majano

Directora de producción: Ma Rosa Castillo Hidalgo

Director de colección: Pablo Martínez Izurzu

«Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra sólo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra».

eISBN: 978-84-267-2740-4

Presentación
APRENDER ARDUINO, PROTOTIPADO Y PROGRAMACIÓN AVANZADA CON 100 EJERCICIOS PRÁCTICOS

Los 100 capítulos que contiene este libro tratan las problemáticas que cualquier desarrollador o maker se encuentra al realizar sus proyectos más complejos.

A partir de casos prácticos, se abordan temas como el filtrado de señales, la comunicación I2C y SPI (presentes en muchos de los módulos o sensores compatibles con Arduino), la creación de una librería, el diseño del hardware de un Arduino para poder adaptarlo y la programación de interfaz de control, entre otros.

A QUIÉN VA DIRIGIDO

A todo desarrollador o maker que tenga unos conocimientos mínimos sobre Arduino, electrónica y programación, y quiera entender la arquitectura y programación de las comunicaciones presentes en cualquier Arduino.

También está dirigido a todo profesional que requiera integrar Arduino en proyectos complejos y necesite comunicarse con sensores o módulos de los que carezca de ejemplos.

LA FORMA DE APRENDER

Nuestra experiencia en el ámbito de la enseñanza nos ha llevado a diseñar este tipo de manual, en el que cada una de las funciones se ejercita mediante la realización de un ejercicio práctico. Dicho ejercicio se halla explicado paso a paso y pulsación a pulsación, a fin de no dejar ninguna duda en su proceso de ejecución. Además, lo hemos ilustrado con imágenes descriptivas de los pasos más importantes o de los resultados que deberían obtenerse y con recuadros IMPORTANTE que ofrecen información complementaria sobre los temas tratados en los ejercicios.

LOS ARCHIVOS NECESARIOS

En la parte inferior de la primera página del libro encontrará el código de acceso que le permitirá acceder de forma gratuita a los contenidos adicionales del libro en www.marcombo.info.

Cómo leer los libros “Aprender…”


A mis padres, por su apoyo, y a la editorial Marcombo, por su confianza.

Índice

001La electrónica no es ideal

002Introducción a los condensadores

003Propiedades de un condensador

004Gestión de tiempo: millis() y micros()

005Descarga de un condensador

006Debounce (I)

007Debounce (II)

008De PWM a señal analógica con filtro paso bajo

009Interrupciones

010Interrupciones por evento

011Interrupciones por tiempo. Parpadeo de un led

012Interrupciones por tiempo. Timer2 y 3

013Interrupción del puerto serie

014Comunicación serie Serial.flush, Serial.availableForWrite

015Comunicación serie Serial.end, Serial.setTimeout

016Comunicación serie Serial.parseInt

017Comunicación serie Serial.parseFloat, Serial.readBytes

018Comunicación serie(V) Serial.readBytesUntil, Serial.readString

019Comunicación serie (VI) Serial.readStringUntil, Serial.find

020Comunicación I2C. Introducción

021Comunicación I2C. Wire.begin

022Comunicación I2C. Comunicación del maestro al esclavo

023Comunicación I2C. Controlar al esclavo con un maestro

024Comunicación I2C. Comunicación esclavo maestro

025SPI Introducción

026SPI en Arduino

027Comunicación SPI. Comunicación maestro esclavo

028Comunicación SPI. Comunicación esclavo maestro

029Memoria EEPROM. EEPROM.read

030Memoria EEPROM (I). EEPROM.write

031Memoria EEPROM (II). EEPROM.put, EEPROM.get

032Memoria EEPROM. Almacenar datos correctamente

033Memoria EEPROM. Alargar la vida útil

034Sensor de temperatura interno

035Arduino modo Sleep. Librería LowPower

036Arduino modo Sleep. IdleWakePeriodic

037Arduino modo Sleep. PowerDownExternalInterrupt

038Watchdog

039Simulador Tinkercad. Crear cuenta, interfaz

040Simulador Tinkercad. Montar el primer circuito

041Simulador Tinkercad. Programación

042Simulador Tinkercad. Opciones avanzadas

043Debugger. FiILE, LINE, FUNTION, DATE, TIME

044Debugger. Funciones de depuración

045Crear librerías. Archivo .h

046Crear librerías. Archivo .cpp

047Arduino Web Editor

048Diseño y fabricación de un Arduino

049Hardware Arduino

050Hardware de alimentación. Análisis

051Hardware de alimentación. Diodo y regulador de tensión

052Hardware de alimentación. Montaje en protoboard

053Hardware de alimentación. USB y alimentación externa

054ATmega328. Señal de reloj

055ATmega328. Reset

056ATmega16U2

057Grabar gestor de arranque

058Arduino protoboard. Programador

059De la protoboard al PCB. Un poco de teoría

060De la protoboard al PCB. Herramientas

061Conceptos generales de una PCB

062Encapsulados

063PCB. Huella, pads, pistas

064Consideraciones de diseño Fritzing, barra de menú

065Diseño PCB. Fritzing, primeros pasos

066Diseño PCB. Montar los primeros componentes

067Diseño PCB. Hardware de alimentación

068Diseño PCB. Alimentación, reset, reloj ATmega328P

069Diseño final PCB

070Fabricación PCB Opciones

071Fabricación PCB y ensamblado

072Fabricar mi propia shield para Arduino

073Diseñar y fabricar un dispositivo basado en Arduino

074Multiplexores, Demultiplexores

075CD74HC4067 como multiplexor

076CD74HC4067 como demultiplexor

077Registro de desplazamiento. Teoría

078Registro de desplazamiento. 74HC164

079PCF8574. Teoría

080PCF8574. Ampliar salidas digitales

081PCF8574. Ampliar entradas digitales

082Ampliar entradas analógicas con ADS1115

083Salida analógica con MCP4725

084Amplia la memoria EEPROM con AT24C256

085Processing

086Conectar Processing con Arduino

087Parpadeo de led con Processing

088Ratón Processing

089Teclado Processing

090Monitorización de datos por consola

091Interfaz gráfica de usuario(GUI) con Processing

092Processing Text Field

093Processing button

094Processing checkbox

095Processing slider

096Processing knob

097Processing toggle

098Processing GUI(I)

099Processing GUI(II)

100Processing GUI(III)

001
La electrónica no es ideal

•Cuando trabajamos con un componente electrónico, ya sea una resistencia, un led o los propios cables, tenemos que partir de la premisa de que no son ideales.

•Esto significa que, cuando utilizamos una resistencia de 1 kΩ, su valor real no es ese. Y ¿cuál es? Cada fabricante vende resistencias con una tolerancia.

•La tolerancia es el valor que nos dice cuánto puede variar el valor de una resistencia de lo esperado; es decir, cuál puede ser su valor máximo y mínimo, que suele expresarse en porcentaje.

•De tal modo que, si comparamos una resistencia de 1 kΩ con una tolerancia del 2 %, su valor real oscila entre 1020 y 980 Ω; por lo tanto, siempre será importante medir el valor de la resistencia con un multímetro.

•Este hecho que ocurre con las resistencias se puede extender al resto de la electrónica y, como la base de la electrónica son las señales eléctricas, estas también tendrán sus «tolerancias».

•Esto nos lleva a realizar un pequeño caso de demostración: montamos un simple circuito en donde conectaremos un pulsador y un Arduino .

•Con el siguiente programa , contabilizaremos el número de pulsaciones.

•Si pulsamos muy rápido, veremos cómo el contador alcanza un valor superior al número de pulsaciones reales; este fenómeno se conoce como «efecto rebote».

•Esto se produce por el mecanismo del pulsador ; es un elemento mecánico que consta de una lámina de metal que hace contacto con sus patillas. Al pulsar la unión entre la lámina de metal y las patillas, sufre una serie de vibraciones o rebotes.

•Estos rebotes repercuten en la señal .

•El Arduino considerará estos rebotes como pulsaciones y es por eso que el contador no refleja el número real de pulsaciones que hemos efectuado.

•Pero este fenómeno tiene una solución tanto por software como por hardware lo que nos llevará en los próximos capítulos a estudiar los condensadores.

•La solución a este fenómeno se conoce como pulsador antirebore (Debounce):

•Debounce por hardware

•Debounce por software





002
Introducción a los condensadores

Un condensador es un componente electrónico ampliamente usado; para empezar a entender lo que es un condensador, podemos compararlo con una pila o batería ya que, como veremos, es capaz de almacenar carga eléctrica. Se fabrican diferentes tecnologías de condensadores que se diferencian, básicamente, por el tipo de material:

•A lo largo de este capítulo y de los siguientes nos centraremos en el estudio de los condensadores electrolíticos.

•Estos condensadores tienen polaridad, por lo que hay que tener especial cuidado a la hora de realizar las conexiones.

•Los condensadores electrolíticos disponen de dos patillas, una más larga que la otra y que, si revisamos el encapsulado, veremos una franja, por lo general, de un color gris en el lado de la patilla corta.

•En el caso de los condensadores electrolíticos, el símil con una pila es muy aproximado ya que, al igual que esta, dispone de dos polos (patillas).

•La patilla larga representa el polo positivo y la corta, el negativo; por lo tanto, debemos respetar su polaridad.

•Si un condensador se encuentra sometido a una diferencia de tensión, iniciará un proceso de carga hasta que iguale el valor de la tensión a la que se encuentre sometido.

Con el siguiente caso práctico, comprobaremos el funcionamiento de un condensador:

1Conectamos el condensador de 1000 μF y 25 V y una resistencia de 330 Ω en serie y a 5 V .

2Al cabo de un instante el condensador se habrá cargado hasta alcanzar los 5 V, podemos hacer una comprobación con un multímetro.

3Ahora conectamos el condensador y la resistencia a un diodo led .

4Veremos cómo rápidamente el led empezará encendido y, según se vaya descargando el condensador, el led se irá apagando.

5Si esto se produce muy rápido, podemos cargar el condensador con una pila de 9 V, para que el led no se apague tan rápido.

Con este simple caso, hemos comprobado el funcionamiento de un condensador, es un componente simple pero con el que conseguiremos realizar circuitos complejos.

La importancia de un condensador viene en sus características de carga y descarga. Con los condensadores, podemos realizar filtros para, por ejemplo, eliminar los rebotes de una señal, pero, para eso, debemos profundizar más en su estudio y lo haremos a lo largo de los siguientes capítulos. Aun así, ya tenemos conceptos que podemos analizar:

•La unidad de los condensadores son los faradios (F); en el caso anterior, 0,001 F.

•Todos los condensadores soportan una tensión máxima; en el caso anterior era de 25 V.

•Como existen diferentes condensadores, cada uno de ellos tiene su propia representación (en el caso del electrolítico, es la siguiente ).





003
Propiedades de un condensador

La capacidad es una propiedad de los condensadores, que nos indica la cantidad de carga eléctrica que pueden almacenar, que dependerá de la tensión de carga.

La fórmula que define un condensador es la siguiente:

•Q = C * V

•Q -> carga (culombios)

•C -> capacidad (faradios)

•V -> voltios

De la expresión anterior deducimos que la carga que almacena un condensador dependerá de la capacidad de este por la tensión de carga; por lo tanto, en el capítulo anterior que teníamos un condensador de 1000 μF a una tensión de carga de 5 V, la carga que almacena es de 0,005 culombios.

•Un culombio es la cantidad de carga transportada por segundo (1 C = 1 A * s), y a su vez 1 C = 6,24 * 10 ^ 18 electrones.

Hasta aquí hemos estudiado el comportamiento básico del condensador, así que pasemos a analizar sus características de carga y descarga.

Cuando un condensador se carga o descarga, no lo hace de forma lineal. Si tuviéramos que hacer una gráfica que represente este proceso, se mostraría una gráfica en forma de curva; para entender este fenómeno, será necesario un ejemplo de la carga de un condensador:

1. Conectamos una resistencia de 1 kΩ en serie con un condensador de 1000 μF al pin A0 (valdría cualquier otro pin).

2.Una vez activemos la salida, el condensador se empezará a cargar: la intensidad inicial a la que lo haga será la intensidad máxima. A medida que se vaya cargando, irá disminuyendo .

3.Esta intensidad se puede calcular por la ley de Ohm, V = R * I -> I = V / R -> I = 5 / 1000 = 5 mA.

4.Este efecto es debido a la conexión en serie entre la resistencia y el condensador. Inicialmente, la tensión del condensador será 0 V, por lo tanto, la diferencia de tensión en la resistencia es de 5 V, lo que haría que la intensidad fuese de 5 mA .

5.El condensador se irá cargando por el flujo de intensidad, al igual que un vaso cuando abrimos un grifo y se va llenando de agua.

6.Supongamos que el condensador acaba de llegar a los 2,5 V, pues resulta que, si analizamos el circuito , la resistencia ya no tiene una caída de tensión de 5 V sino de 2,5 V, por lo tanto, la intensidad será de I = 2,5 / 1000 = 2,5 mA.

7.Esto se producirá a lo largo de la carga del condensador. Entonces, ¿cómo podemos saber en qué momento se cargará el condensador? Existe una fórmula matemática que nos dice que el condensador llegará al 63,2 % de la carga en un tiempo tau (t).

t = R * C

8.La unidades con las que debemos trabajar en la ecuación anterior son Ω y F, para que el resultado sea en segundos.

9.El tiempo final para el cual el condensador estará cargado totalmente será 5 * t.

Vamos a realizar un caso práctico para comprobar estas leyes, pero, para ello, tenemos que ampliar nuestro lenguaje de programación.





004
Gestión de tiempo: millis() y micros()

El lenguaje de programación, aparte de las instrucciones ya conocidas como <<delay()>> y <<delayMicrosenconds()>>, dispone de otras para la gestión de tiempo.

•millis()

•Esta instrucción no necesita parámetros y nos devuelve el tiempo que lleva encendido el Arduino; este tiempo viene expresado en milisegundos.

•Nos devuelve un valor tipo unsigned long, lo que quiere decir que el valor devuelto varía entre 0 y 4.294.967.295.

•Si hacemos la operación: 4.294.967.295 / (1000 * 60 * 60 * 24), el resultado aproximado será de 50 días.

•Por lo tanto, esta instrucción al cabo de 50 días se resetea (su valor interno) y vuelve a contar desde cero.

•micros()

•Esta instrucción no necesita parámetros y nos devuelve el tiempo que lleva encendido el Arduino; este tiempo viene expresado en microsegundos.

•Nos devuelve un valor de tipo unsigned long, lo que quiere decir que el valor devuelto varía entre 0 y 4.294.967.295.

•Si hacemos la operación: 4.294.967.295 / (1000000 * 60) el resultado aproximado será de 70 minutos.

•Por lo tanto, esta instrucción al cabo de 70 minutos se resetea (su valor interno) y vuelve a contar desde cero.

Nos ayudaremos de las instrucciones anteriores para comprobar las reglas que fijan el comportamiento de un condensador en el proceso de carga; de lo que se trata es de comprobar el tiempo que tarda el condensador en alcanzar los valores clave, que son los de la carga al 63,2 % y al 100 %.

1.Para medir los tiempos, es necesario muestrear el valor del condensador; esto se hará con la entrada A1 .

2.Según las ecuaciones vistas en el capítulo anterior y utilizando los mismos valores de resistencia y condensador, este alcanza el 63,2 % de la carga en 1 segundo y el 100 % en 5 segundos.

3.En el programa pondremos una pequeña tolerancia, de 0,05 V (10); por eso se considera que, cuando el condensador alcanza 4,95 (1013), se ha cargado totalmente y, con 0,05 V, está totalmente descargado.

4.El valor del 63,2 % de la carga lo alcanza cuando llega a un valor de tensión de 3,16 V cuyo valor de lectura equivale a 646.

5.Cuando visualizamos el resultado, vemos que se aproxima al resultado esperado y las pequeñas desviaciones que encontramos son normales.



005
Descarga de un condensador

En el capítulo anterior estudiamos cómo se comportaba un condensador en el proceso de carga y, en este capítulo, estudiaremos el proceso de descarga. Un condensador, cuando se descarga, se comporta del mismo modo que cuando se carga, es decir, se cumplen las mismas leyes y utilizaremos las mismas ecuaciones matemáticas, pero, antes de ver esto, tenemos una ecuación más compleja que las vistas anteriormente con la cual podemos obtener el valor de carga del condensador para cada instante o, lo que es lo mismo, saber en qué momento alcanzará un determinado valor de tensión.

Como el proceso de descarga de un condensador es similar al de carga, rigen las mismas ecuaciones, pero definirán un comportamiento inverso:

•Seguimos manteniendo el margen de tolerancia (0,05 - 4,95 V).

•El condensador tardará R * C segundos en descargarse un 63,2 % de su carga o, lo que es lo mismo que se descarga hasta el 36,8 %.

•Ese 36,8 % supone que el condensador tiene una carga de 1,84 V, que, si lo traducimos a la lectura de un Arduino, es un valor de 376.

•Teniendo esto en cuenta, cargamos el siguiente programa y analizaremos los resultados.

A vista de los resultados, podemos comprobar que el comportamiento del condensador, cuando se carga y cuando se descarga, es el mismo y se rige por los mismos principios. Con este capítulo, ya hemos visto el funcionamiento básico de un condensador.

En el siguiente capítulo veremos un uso práctico de un condensador, el cual nos va a permitir solucionar el problema que tenemos con los rebotes de las señales ya que, como los condensadores tienen un proceso no lineal de carga y descarga, aprovecharemos eso para diseñar un circuito que filtre estos rebotes. Los condensadores tienen diversas aplicaciones, como pueden ser:

•Baterías

•Filtros

•Energía solar

•Memorias

•Osciladores

•Compensación del factor de potencia

•…

Si analizamos el hardware del Arduino UNO , encontramos varios condensadores que se utilizan en la etapa de potencia; para evitar que la alimentación se corte bruscamente, se utilizan condensadores.




006
Debounce (I)

El término debounce significa rebotar en inglés y es el problema con el que partimos en este libro: la eliminación de los rebotes en una señal; para ello, tenemos dos posibles soluciones: por hardware o por software. Cada una tendrá sus ventajas e inconvenientes que, en función de las circunstancias, nos hará decantarnos por uno u otra.

Empecemos por la solución por hardware; como ya sabemos, tenemos varias opciones a la hora de conectar un pulsador: Pull-Up y Pull-Down. Solución antirrebote pulsador Pull-Down:

1.Conectamos el siguiente circuito .

2.El circuito estará formado por dos resistencias en serie y un condensador en paralelo con una de ellas .

3.Es importante el valor de cada componente y el criterio de conexión.

4.Si dejamos a un lado el condensador, vemos que lo que tenemos es un divisor de tensión con dos resistencias; en el primer tomo, ya vimos cómo solucionar este tipo de circuito.

5.Atendiendo a los valores de las resistencias, en el momento en el que se pulse el botón en la primera resistencia, la caída de tensión será de 1,24 V y, en la segunda 3,76 V.

6.Si recordamos los umbrales de tensión para los niveles lógicos de estado alto (> 60% de la tensión de trabajo 3 V) y estado bajo(<30 % de la tensión de trabajo 1,5 V), podemos estar seguros de que, como el condensador se encuentra en paralelo con la segunda resistencia y se cargue hasta los 3,75 V, la lectura de esta entrada será a nivel alto.

7.Por lo tanto como al condensador le llevará un tiempo cargarse eliminará de la señal los rebotes que produce el pulsador.

8.En el momento en el que dejemos de pulsar, el condensador se empezará a descargar por la segunda resistencia hasta alcanzar los 0 V.

9.Con este circuito montado, podemos cargar el siguiente programa y comprobar que el contador ahora sí contará adecuadamente el número de pulsaciones.

10. Lo que sí que podemos apreciar es que, si pulsamos muy rápido, no se llegarán a contabilizar todas las pulsaciones: eso es por el tamaño del circuito RC, que hemos diseñado para filtrar las pulsaciones entre las que no ha transcurrido un tiempo demasiado elevado.

11. Si, en la práctica, vemos que su funcionamiento no se ajusta a las características del sistema, no tenemos más que rediseñar el circuito RC.

12. En nuestro caso, los pulsadores que se suelen utilizar en las protoboards suelen tener unos rebotes de unos 150 ms de duración; con el circuito que hemos realizado, debería ser suficiente como para eliminar esos rebotes.

13. En caso de rediseñar el circuito para que la respuesta del filtro sea más rápida o más lenta, se tiene que mantener la relación entre las resistencias que forman el divisor de tensión.




007
Debounce (II)

En el caso del pulsador Pull-Up, debemos hacer una serie de cambios en el circuito: primero en relación con las resistencias y, en segundo lugar, mover el condensador, tal y como se ve en el esquema .

•Como el comportamiento del pulsador Pull-Up es inverso al Pull-Down, tanto el circuito como el programa se «invertirán».

•En este caso , cuando no se pulsa el botón, la tensión de lectura será de 5 V y, en el momento en el que se pulse, bajará hasta 1,24 V ya que el condensador se quedaría conectado en paralelo con la segunda resistencia.

Vistas las soluciones por hardware, pasemos a la solución por software. La solución por software consistirá en medir el tiempo que transcurre entre diferentes flancos de subida (ya que se utilizará un pulsador Pull-Up) despreciando las que, por tiempo, se puedan considerar un rebote.

1.Conectamos un circuito con un pulsador Pull-Up .

2.Con este programa , primero comprobamos si hay un flanco de subida, de ser así, comprobamos si, al menos, han transcurrido 150 ms desde el último flanco; de ser así, se contabiliza como pulsación y, en caso contrario, no se tendrá en cuenta.

3.En el caso de que el pulsador fuese Pull-Down, solo habría que controlar flancos de bajada.

Conclusiones:

•La solución por hardware simplifica la programación, pero implicaría la conexión de más componentes.

•Por otro lado, la solución por software consume más recursos de programa, pero es más fácil de adaptar a cada posible caso ya que, simplemente, se cambia un valor en el programa.

•Posiblemente la solución por software, en este caso, resulte más conveniente.






008
De PWM a señal analógica con filtro paso bajo

Otro uso que podemos darle a un condensador es convertir una señal PWM en una señal analógica. Con una señal PWM, podemos regular infinidad de procesos, pero habrá ciertos casos en los que no será adecuado utilizar una señal PWM:

•A la hora de regular componentes cuya tensión de trabajo sea inferior a 5V .

•Cuando sea necesario disponer de un nivel de tensión constante diferente a 3,3 o 5V.

•Para general señales que serán leídas por entradas analógicas.

Para estos casos, podemos utilizar un filtro de paso bajo para modular la señal PWM y convertirla en una salida analógica. Existen diferentes tipos de filtros que, en resumen, se diferencian por el rango de frecuencias con el que trabajan. Para el caso que nos atañe, basta con decir que el filtro de paso bajo será el adecuado para este tipo de aplicación, ya que no es objeto del libro profundizar en este tema.

1.Conectamos una resistencia de 4,7 kΩ y un condensador de 10 μF(35 V) en serie .

2.Este circuito se conectará a una salida PWM.

3.La señal analógica la obtendremos del polo positivo del condensador, así que lo conectamos a una entrada analógica para comprobar que realmente se genera una salida analógica.

4.Por último, conectamos un potenciómetro, el cual se utilizará como valor de consigna y se comparará si se consigue el mismo nivel de tensión en el filtro que en la salida del potenciómetro.

5.Programamos el Arduino para que genere una salida PWM proporcional al valor del potenciómetro y muestre los valores tanto del potenciómetro como del filtro, para así poder compararlos.

6.Con ayuda de la herramienta Serial Plotter, podemos graficar los valores .

Conclusiones:

•Si analizamos la gráfica, encontramos que la señal analógica (azul) se asemeja a la entrada analógica (roja). Resulta normal que la señal no sea exactamente igual, ya que hay que tener en cuenta que el condensador está continuamente cargándose y descargándose.

•Esta señal que acabamos de graficar tiene factores importantes que definen su comportamiento, el tiempo de respuesta (lo que tarda en alcanzar el valor de consigna) y el rizado (esa oscilación que apreciamos en la gráfica). Estos factores están relacionados ya que, si queremos reducir el rizado, aumentará el tiempo de respuesta y viceversa.

•También es importante el dimensionamiento del filtro, para lo cual podemos buscar calculadoras online que nos permitan afinar el diseño.

•La aplicación que se le puede dar a esta solución no sería efectiva si pretendemos conectar una carga, ya que esto influye en el comportamiento del filtro; para ello, lo adecuado sería utilizar, además del filtro, un amplificador operacional.




009
Interrupciones

Las interrupciones son un tipo de «mecanismo» que interrumpe la ejecución normal de un programa para atender un evento. Los eventos que puede atender un Arduino son:

•Evento por señal (evento externo)

•Tiempo

•Comunicación

Las interrupciones son similares a una función; la diferencia estriba en que las funciones que hemos programado tenían que ser «llamadas» desde una parte del programa. Una interrupción no es más que una función que se ejecutará, no por ser «llamada», sino porque se configura para que, ante un evento se ejecute.

El primer tipo de interrupciones que estudiaremos son las interrupciones ante un evento externo. Estas interrupciones están pensadas para dar una respuesta rápida ante un evento crítico o relevante.

Como se mencionaba al principio, las interrupciones son funciones que se ejecutan por haber sido previamente configuradas; por lo tanto, es por donde tenemos que empezar.

1.Este tipo de interrupciones necesitan configurar tres parámetros:

•El pin en donde se puede producir el evento.

•El nombre de la función que se ha de ejecutar si ocurre el evento.

•El tipo de evento que ha de ocurrir.

2.Por ejemplo, un evento crítico puede ser una parada de emergencia. Para que se ejecute una interrupción por evento externo, tenemos que tener una señal que nos indique que ha ocurrido algo, como es lógico, esa señal se ha de conectar a uno de los pines del Arduino, con lo que tenemos que indicar por programación en qué pin está conectada esa señal.

3.Como lo que, al fin y al cabo, lo que se va a ejecutar es una función, será necesario indicar el nombre de la función que se ha de ejecutar.

4.El último parámetro es el tipo de evento, cuando recibimos una señal tenemos que saber que comportamiento de esta nos indica que hay que atender a un evento: señal a nivel alto, a nivel bajo, flanco de subida…

5.La instrucción <<attachInterrupt(,,)>> permite programar interrupciones por evento externo; necesita los tres parámetros que se han mencionado en el primer punto (siguiendo el mismo orden).

Antes de continuar, hay que revisar ciertas peculiaridades de este tipo de interrupciones:

•No se pueden atender eventos en todos los pines: en el caso del Arduino UNO, disponemos de dos pines que pueden atender eventos por interrupción y son los pines 2 y 3 que en el parámetro correspondiente de la función anterior, se configurarán como 0 y 1, respectivamente.

•El nombre de la función que programamos tiene que respetar las mismas reglas que cualquier otra función.

•Tenemos una serie de palabras reservadas para indicar el tipo de interrupción:

•LOW: si configuramos la interrupción con este parámetro, se ejecutará la función cuando el pin reciba una señal a nivel bajo.

•CHANGE: si configuramos la interrupción con este parámetro, se ejecutará la función cuando el pin cambie de estado, tanto si es de 0 a 5 voltios (flanco de subida) como de 5 a 0 voltios (flanco de bajada).

•RISING: si configuramos la interrupción con este parámetro, se ejecutará la función cuando el pin cambie de 0 a 5 voltios (flanco de subida).

•FALLING: si configuramos la interrupción con este parámetro, se ejecutará la función cuando el pin cambie de 5 a 0 voltios (flanco de bajada).

•HIGH: si configuramos la interrupción con este parámetro, se ejecutará la función cuando el pin reciba una señal a nivel alto. No obstante, el Arduino UNO no dispone de este tipo de evento.

La programación de este tipo de interrupciones es fácil de probar: con el siguiente montaje , programaremos el Arduino para que, cada vez que haya una pulsación, se contabilice y se muestre el valor total de pulsaciones por el monitor serie .



010
Interrupciones por evento

Si, como en el caso del capítulo anterior, utilizamos variables que pueden ser modificadas dentro de la interrupción, estas deben tener una declaración especial, que no es más que empezar por la palabra reservada <<volatile>> y, a continuación, el tipo de variable, el nombre de esta y, si fuese necesario, se le asigna un valor .

En el caso del anterior, también tenemos que tener presente que se pueden dar rebotes en la señal, por lo que tenemos que solucionarlo por hardware o software , tal y como hemos visto en capítulos anteriores.

Las interrupciones están pensadas para dar una respuesta rápida, en ellas se deben programar unas pocas líneas o, en todo caso, que el tiempo de ejecución sea corto. Es más, dentro de una interrupción no funcionan los delay; como decía, el código que se programe se ha de ejecutar rápidamente.

Disponemos de más instrucciones para trabajar con este tipo de interrupciones:

•noInterrupts() desactiva cualquier interrupción del programa.

•Interrupts() para los casos en los que se han deshabilitado las interrupciones con la instrucción anterior y queremos que se vuelvan a activar.

•detachInterrupt() desactiva la interrupción indicada: detachInterrupt ( interrupción )

•detachInterrupt (digitalPinToInterrupt (pin));

•detachInterrupt (pin) (solo Arduino DUE y CERO).

Lo que tenemos que tener presente es que, si se ejecuta una interrupción, el programa «saltará» desde la línea de código en donde se encuentre, ejecutará las líneas de código que haya dentro de la función de la interrupción y volverá a la línea del programa desde donde ha saltado y continuará con la ejecución normal del programa.

¿Qué ocurre si se da la circunstancia de que dos interrupciones suceden al mismo tiempo? Primero se debe decir que ese caso no es muy habitual, pero, dada esa circunstancia, existe lo que se conoce como «prioridades»; esto quiere decir que hay interrupciones que son más prioritarias que otras, por lo que se iría atendiendo los eventos de las más prioritarias para dejar para el final las menos prioritarias.

Cada Arduino (en concreto, cada MCU) tiene su propia lista de prioridades. De hecho, la interrupción más prioritaria es la que atiende al reseteo de Arduino; esa es la más prioritaria de todas.

También cabe mencionar que cada Arduino tiene más o menos pines, que permiten la programación de más o menos interrupciones que otros; puede llegar a ser una condición importante para decantarrnos entre un Arduino u otro ya que, si tenemos que atender a varios eventos críticos, lo recomendable es buscar un Arduino que, por hardware, permita programar todos esos eventos como interrupciones:

•Uno, Nano, Mini o basados en el MCU 328 tienen 2 interrupciones, pines: 2, 3.

•Micro, Leonardo o basados en el MCU 32u4 tienen 5 interrupciones, pines:0, 1, 2, 3, 7.

•UNO WiFi y DUE tienen interrupciones para todos sus pines.

•Mega, Mega2560 y MegaADK tienen 6 interrupciones, pines: 2, 3, 18, 19, 20, 21.



011
Interrupciones por tiempo Parpadeo de un led

En cuanto a la gestión de tiempo, ya hemos trabajo con las instrucciones delay, delayMicroseconds, millis y micros.

Las interrupciones por tiempo vienen a sustituir a un delay o a un delayMicrosenconds; como ya es sabido, estas instrucciones lo que hacen es detener la ejecución de un programa durante un tiempo determinado: hasta ahora era la única forma que teníamos de ejecutar tareas temporales.

El inconveniente de esta solución es que no se puede ejecutar otra tarea y, para muchas aplicaciones, será necesario la ejecución de tareas temporales pero también atender a otras tareas; pues bien, con las interrupciones temporales, conseguimos esto mismo.

Al igual que ocurría con las interrupciones por señal, tenemos una función que se va a ejecutar sin ser llamada desde otra línea del programa y que, en este caso, lo hará cada cierto tiempo. El <<mecanismo>> que utiliza este tipo de interrupciones son los Timers; estos mecanismos son capaces de llevar el contaje de tiempo y podemos trabajar con ellos gracias a las diferentes librerías de las que disponemos.

Cada Arduino tiene un determinado número de Timers; en concreto, el Arduino UNO tiene tres Timers. En este capítulo haremos un caso práctico utilizando el Timer 1 así que vayamos al gestor de librerías e instalemos la librería correspondiente :

•La instrucción <<Timer1.attachInterrupt()>> define la función que se tiene que ejecutar.

•Con la instrucción <<Timer1.initialize()>>, definimos cada cuánto tiempo se ejecuta la función del punto anterior. El tiempo se mide en microsegundos.

•Con estas instrucciones ya podemos hacer, por ejemplo, que un led parpadee cada segundo sin necesidad de bloquear el programa .

Otras instrucciones de la librería TimerOne:

•<<Timer1.setPeriod(microseconds)>> establece un nuevo tiempo de interrupción.

•<<Timer1.start()>> arranca la interrupción con el nuevo tiempo.

•<<Timer1.stop()>> detiene la temporización.

•<<Timer1.restart()>> reinicia el temporizador.

•<<Timer1.pwm(pin, duty)>> configura las PWM asociadas a este Timer.

•<<Timer1.setPwmDuty(pin, duty)>> establece un nuevo tiempo para las señales PWM.

•<<Timer1.disablePwm(pin)>> deshabilita la PWM.

•<<Timer1.detachInterrupt()>> deshabilita la interrupción.

No para todos los Timers tenemos las mismas instrucciones, ya que usamos diferentes librerías para trabajar con ellos y también existen diferencias entre ellos.

Con un buen uso de este tipo de interrupciones, conseguiremos mejorar el rendimiento de nuestros programas.




Darmowy fragment się skończył.

Gatunki i tagi

Ograniczenie wiekowe:
0+
Data wydania na Litres:
11 marca 2025
Objętość:
388 str. 415 ilustracji
ISBN:
9788426727404
Wydawca:
Właściciel praw:
Bookwire
Format pobierania:

Podobne książki