Kitabı oku: «Taller de Arduino. Experimentando con Arduino MKR 1010», sayfa 5

Yazı tipi:

3.2.1 Funcionamiento de los interruptores, pulsadores y potenciómetros

El diodo led. Es un componente muy común, infinitamente útil, que convierte en luz la intensidad eléctrica que circula por él. Los ledes vienen en diferentes formas, tamaños y colores. La conexión de un led en un circuito está “polarizada”, es decir, la corriente puede entrar y salir del mismo en una sola dirección. Entra por el lado de la patilla llamada ánodo (positivo) y sale por la patilla denominada cátodo (negativo). No puede circular en sentido contrario. Para identificar cuáles son las patillas descritas, eche un vistazo a la figura 3.6.

Al añadir un led a un proyecto se deben tener en cuenta los valores de voltaje y corriente. Por ejemplo, los ledes rojos comunes requieren alrededor de 1.7 a 5 voltios de tensión entre ánodo y cátodo y una corriente mínima de 20 mA para encenderse normalmente. En el extremo contrario del valor máximo de corriente, todo diodo led tiene que llevar asociado en serie una resistencia para limitar la corriente que pase por él (figura 3.7). Sin esta resistencia, el diodo led podría quemarse. Por ello, el problema que se presenta es calcular la resistencia adecuada para su led. Esto es algo muy sencillo, y se aplicará la ley de Ohm:


donde:

R es la resistencia limitadora;

VCC es la tensión de alimentación (valor de la batería);

Vf es la caída típica de voltaje en el led, e

If es la corriente típica que debe pasar para que se encienda el led.

Por ejemplo, tiene una alimentación de 9 V y desea poner un diodo led rojo con Vf = 1.2 voltios e If = 20 mA. Su resistencia limitadora R será de 390 ohmios. Aunque este valor siempre es estimativo, ya que si escoge un valor comercial de la resistencia un poco más bajo, no pasará nada, circulará una corriente más alta y el led se encenderá un poco más. Claro está, sin pasarse demasiado, porque si elige por “avaricia de luminosidad” una resistencia muy baja que permita una intensidad muy alta (por encima de los 100 mA), destruiría el led.

El interruptor, como su nombre indica, es un dispositivo que permite o no el paso de corriente eléctrica. En el mercado existen muchos tipos. Los que utilizará para insertarlos en la protoboard son los llamados de tipo DIP (dual in-line package).

En las figuras 3.8 y 3.9 se observan un conjunto de interruptores de tipo DIP con dos posiciones de funcionamiento: ON/OFF.

El pulsador. Los pulsadores son de diversas formas y tamaño y se encuentran en todo tipo de dispositivos, aunque principalmente en aparatos eléctricos y electrónicos. En general, los pulsadores se activan al presionarlos con un dedo. Permiten el flujo de corriente mientras son accionados. Consta del botón pulsador, una lámina conductora que establece contacto con los dos terminales al oprimir el botón y un muelle que hace recobrar a la lámina su posición primitiva al cesar la presión sobre el pulsador. Cuando ya no se presiona sobre él, vuelve a su posición de reposo. Puede ser un contacto normalmente abierto en reposo NA (NO en inglés: normally open), o con un contacto normalmente cerrado en reposo NC.

El tipo de pulsadores que usará con Arduino son los de tipo mini, tal como se aprecia en la figura 3.10. Llevan cuatro contactos unidos dos a dos, de tal manera que cuando pulsa, se establece conexión eléctrica entre un lado y otro del pulsador.

El potenciómetro. La mayoría de la gente no lo sabe, pero la mayoría utiliza un potenciómetro casi todos los días. Puede encontrarlos en los automóviles, equipos de música, interruptores de luz y muchos otros dispositivos. Sin ellos, tendría serias dificultades para accionar la mayoría de los aparatos electrónicos. Sin embargo, ¿qué son exactamente los potenciómetros y qué funciones tienen? Los potenciómetros (figura 3.11) son resistencias que constan de tres terminales (A, B, C). Estas resistencias tienen divisores de tensión (circuitos lineales) que proporcionan una salida de tensión (terminal B), que es menor que el voltaje de entrada. Los potenciómetros proporcionan transiciones suaves de los niveles de tensión y pueden ser rotativos o lineales. Uno de los principales usos de los potenciómetros son las perillas de control de audio. Al girar el dial del potenciómetro hacia un lado o el otro, controla el volumen del dispositivo de audio. Se pueden encontrar otros potenciómetros en las perillas de audio de los graves, los agudos y las perillas de las pistas que permiten seleccionar el grado de frecuencias altas y bajas. Los productores de un estudio tienen docenas de potenciómetros en su equipo de sonido para conseguir el sonido adecuado y el equilibrio en una grabación.

Los potenciómetros también se encuentran habitualmente en los reguladores de intensidad de las luces. Los reguladores de intensidad operan de forma lineal, pero trabajan de la misma forma que los potenciómetros del tipo circular o a perilla.

Cuando una persona ajusta un potenciómetro afecta la corriente que está tomando parte en la iluminación y, por lo tanto, puede hacer que las luces se atenúen o sean más brillantes, de acuerdo con la cantidad de electricidad que deje llegar a la bombilla. En los proyectos con Arduino utilizará un tipo de potenciómetro denominado trimmer que es adecuado para los montajes en la protoboard.

En esta primera práctica se va a simular el juego de luces del famoso coche fantástico de la serie de televisión que se hizo popular en los años ochenta.

El algoritmo que implementará es el que se muestra en la figura 3.12.

Se trata de apagar y encender ledes con esperas de tiempo intercaladas para producir un efecto de movimiento de la luz que recorre estos diodos.

Ahora va a construir el circuito (figura 3.13). Le recomiendo que primero lo realice con el software Fritzing. Es una buena forma de aprender a documentar proyectos y, sobre todo, impactar a los amigos con una excelente presentación.

En cuanto al hardware, necesitará:

* Cinco diodos led

* Cinco resistencias de 220 W

* Una protoboard

* Cablecitos de conexión

* Un Arduino MKR 1010 y un cable USB

Conecte los cinco diodos led a los pines digitales (1 al 5) a través de las cinco resistencias limitadoras. Examine el sketch que debe escribir, guardar y subir a Arduino para comprobar su funcionamiento.

Práctica 3.1 Empezar a programar. El coche fantástico



En este programa aparecen tres funciones que hacen todo el trabajo. Las estudiamos con detalle a continuación. ¡Prepárese porque empieza a programar!

pinMode (pin, mode). Esta instrucción es utilizada en la parte de configuración setup() y sirve para configurar el modo de trabajo de un pin, pudiendo ser el parámetro mode como INPUT (entrada) u OUTPUT (salida). Los terminales de Arduino, por defecto, están configurados como entradas; por lo tanto, no es necesario definirlos en el caso de que vayan a trabajar como entradas. Los pines configurados como entrada quedan, bajo el punto de vista eléctrico, como entradas en estado de alta impedancia.

Estos pines tienen a nivel interno una resistencia de 20 kΩ a la que se puede acceder mediante software. A estas resistencias se accede de la siguiente manera:


Las resistencias internas normalmente se utilizan para conectar las entradas a interruptores. En el ejemplo anterior no se trata de convertir un pin en salida, es simplemente un método para activar las resistencias interiores. Los pines configurados como OUTPUT (salida) se dice que están en un estado de baja impedancia y pueden proporcionar 40 mA de corriente a otros dispositivos. Esta corriente es suficiente para alimentar un diodo led, pero no es lo suficientemente grande para alimentar cargas de mayor consumo como relés, solenoides o motores.

digitalWrite(pin,mode). Envía al pin definido previamente como OUTPUT el valor HIGH o LOW (poniendo en 1 o 0 la salida). Por ejemplo:


delay(milisegundos). Detiene la ejecución del programa la cantidad de tiempo en milisegundos que se indica en la propia función, de tal manera que 1000 equivale a 1 segundo.

delay(2000); // espera 2 segundos

Cuando reviso el sketch anterior me doy cuenta que tanto el algoritmo como el programa propiamente dicho tienen partes que se repiten continuamente y, aunque utilice la opción “Copiar y pegar” dentro del IDE, la verdad es que no es muy flexible. Por ello voy a cambiar un par de cosas.

Primero introduciré una variable de tipo “int” para poder variar el tiempo de espera en la función delay(ms). Después reemplazaré el código principal por otro más corto que use la potencia de la estructura “for” que vio anteriormente. A esto, los programadores experimentados lo llaman optimizar el código.

Práctica 3.2 Optimizar el código


El primero de los bucles “for” repetirá el código dentro de las llaves siempre y cuando la condición sea verdadera. En este caso se ha utilizado una variable de tipo entero a que comienza con el valor 1. Cada vez que se ejecuta el código, se le sumará 1 a dicha variable. El bucle continuará de esta manera mientras que “a” sea menor de 6. Una vez que sea igual o mayor que 6 se sale del bucle for y vuelve al principio de la estructura void loop(), es decir, vuelve a iniciarse otro bucle for desde el principio. El segundo bucle for inicializa la variable a con el valor 5 que es el penúltimo led. Ahora se va reduciendo esta variable hasta llegar al valor 1 que se corresponde con el primer led. De esta manera invierte la secuencia de encendido. Puede probar otros valores de la variable a para comprobar si he cometido una errata de código.

Además, dentro de la función delay(ms); se ha introducido una variable de tipo entero d que permite cambiar de manera sencilla el intervalo de espera.

Práctica 3.3 Encendido de un led con un pulsador

El propósito de esta práctica es encender un led mediante un pulsador. El led permanecerá prendido durante 2 segundos tras los cuales se apagará hasta que vuelva a presionar el pulsador.

El algoritmo, por otra parte, muy simple, es el que se muestra en la figura 3.14.

En cuanto al hardware, necesitará:

* Un diodo led

* Una resistencia de 220 Ω

* Una resistencia de 10 kΩ

* Un pulsador tipo mini

* Una protoboard

* Cablecitos de conexión

* Un Arduino MKR y un cable USB

Conectará el pulsador al pin digital 6 a través de una resistencia de 10 kΩ. Esta resistencia se lleva por el otro terminal a 5 voltios. El diodo led se conecta al pin 12 a través de una resistencia de 220 Ω. En la figura 3.15 se observa el circuito diseñado con Fritzing.

Las resistencias pull up y pull down no son más que resistencias dispuestas en una configuración determinada. Dicha configuración (figura 3.16) determina si la resistencia es de pull up o pull down. Este tipo de configuración establece un estado lógico a la entrada de un circuito lógico cuando dicho circuito está en reposo, siendo para pull up un estado lógico alto y para pull down, bajo. De esta forma, se evita falsos estados producidos por ruido eléctrico si dejara una entrada con un valor indeterminado.

En la configuración pull up, cuando el pulsador está en reposo, Vout será prácticamente Vcc, pudiéndose considerar como nivel lógico alto. Ahora bien, cuando se pulsa S1, se deriva toda la corriente a masa, por tanto, Vout será 0. Esto mismo ocurre con la configuración pull down, pero a la inversa. Cuando el circuito está en reposo, la caída de tensión en R1 es prácticamente 0 que es la misma tensión de Vout. En ese momento tendremos un nivel lógico bajo. Al pulsar S1, la caída de tensión en R1 ahora será Vcc, Vout será un nivel lógico alto. Generalmente, se suele usar un valor de 10 kΩ para estas resistencias.

A continuación se examina el sketch que debe escribir, guardar y subir a Arduino para comprobar su funcionamiento, encendiendo un led durante dos segundos con un pulsador.



La dinámica del programa es simple. Se comprueba continuamente el estado del pulsador cuyo estado en reposo produce un 0 en el pin de entrada 6 de Arduino MKR 1010. Si no activa el pulsador se comprueba el “if” de forma indefinida. En cuanto pulse, el estado de la patilla 6 cambia a voltaje positivo y entonces se ejecutan las acciones que van comprendidas entre llaves, es decir, el encendido del led, la espera de 2 segundos y el apagado del diodo. Tras esto, vuelve al principio del void loop(), ejecutando de nuevo la comprobación del pulsador con la estructura “if”.

Descubrirá algunas cosas nuevas:

#define. Es un comando del lenguaje C muy útil que permite al programador dar un nombre a un valor constante antes de que se compile el programa. Las constantes definidas en Arduino no aumentan el tamaño que el programa ocupa en el chip. El compilador reemplaza las referencias a estas constantes con el valor definido en tiempo de compilación. Básicamente utilizará #define para etiquetar los pines digitales y, de esta manera, cada vez que en el programa se haga referencia a esa etiqueta se apuntará a su valor. Por ejemplo, en nuestro sketch cada vez que utiliza la palabra led hace referencia al pin 12 de Arduino.

digitalRead(pin). Lee el valor de un pin (definido como digital) dando un resultado HIGH (alto) o LOW (bajo) y pudiendo depositar este valor en una variable. Por ejemplo:

valor = digitalRead(4);

En esta sentencia se lee el estado del pin 4 y se deposita su estado alto o bajo en la variable valor, que se supone que se ha definido previamente como de tipo booleano o entero. Evidentemente, esto es útil para evaluar el estado abierto o cerrado de un pulsador o interruptor. Por ello, cuando en el sketch anterior tiene la expresión: “if (digitalRead(BUTTON) == HIGH)” lo que está haciendo es evaluar si el pin 6 definido con el nombre BUTTON está HIGH o LOW. Es decir, se comprueba el estado del pulsador y, en función de su estado, ejecuta o no lo que está dentro de las llaves del if.

Práctica 3.4 Control de dos semáforos

Imagine un túnel estrecho donde sería imposible circular a la vez en ambos sentidos. Desde luego necesitaría un sistema de regulación para que no entraran dos vehículos al mismo tiempo en sentido contrario. En uno de los extremos del túnel, al que llamará “ENTRADA DEL TÚNEL” tiene un semáforo, “SEMÁFORO 1”, que dará acceso al mismo, mientras que en otro extremo tiene “SALIDA DEL TÚNEL”, donde, a su vez, dispone de un segundo semáforo, “SEMÁFORO 2”, que permanecerá en estado contrario al primero para los vehículos que quieran regresar y no hacer coincidir el tráfico en ambos sentidos (figura 3.17).

Va a resolver el diseño considerando la sincronización de los dos semáforos: el de entrada al túnel y el de salida. De usted depende que no se encuentren dos coches en medio del mismo, ya que, como se observan en las fotos, el túnel solo tiene un carril. Para simular los dos semáforos utilizará 6 diodos led: 2 de color rojo, 2 de color verde y 2 de color amarillo (a falta del color ámbar) (figura 3.18). Observe el diagrama de flujo (figura 3.19) en el que se observan cómo se cumple la secuencia típica de un cruce de semáforos normal. Mientras que un semáforo está en rojo, el otro está en verde, y viceversa. Los cambios de un color a otro se producen tras una espera determinada, que, en este caso, supone de varios segundos. El tiempo de cambio de cada semáforo puede establecerlo en 2 minutos, ya que por esta carretera no existe demasiado tráfico. En cuanto al hardware, necesitará:

* 6 diodos led de varios colores

* 6 resistencias de 220 Ω

* Una protoboard

* Cablecitos de conexión

* Un Arduino y un cable USB

Un vistazo al esquema de semáforos siguiente le permitirá entender mejor el diagrama de flujo anterior y el listado de programa que se muestra.





Ahora tiene un nuevo concepto que es el de función. Como se expusoanteriormente, una función es un trozo de código que se va a utilizar varias vecesdentro del mismo programa. Una función es, por tanto, un bloque de código que tiene un nombre y un conjunto de sentencias. Las funciones se declaran asociadas a un tipo de valor: type. Este valor será el que devolverá la función, por ejemplo int se utilizará cuando la función devuelva un dato numérico de tipo entero. Si la función no devuelve ningún valor, entonces se colocará delante la palabra void, que significa “función vacía”. Después de declarar el tipo de dato que devuelve la función se debe escribir el nombre de la función y entre paréntesis se pondrán, si es necesario, los parámetros que se deben pasar a la función para que se ejecute. Su formato específico es el siguiente:


En el ejemplo anterior se expresan dos funciones diferenciadas: la función semaforo_1() y la función semaforo_2(). Son de tipo void porque no devuelven nada; solo ejecutan una serie de acciones para gobernar las luces de las que consta cada semáforo. Además, como ve, se han definido antes de la estructura loop().

Imagine que está en un supermercado esperando turno en una larga cola. Normalmente tendría un contador de turnos que sería visible desde cualquier zona del local. Si quisiera fabricar un contador similar con Arduino sería bastante sencillo.

El programa que va a crear va a simular uno de esos contadores. Deberá mostrar en nuestro monitor serie el número de veces que un pulsador ha sido presionado. Además, hará un proceso que, de acuerdo al número de pulsaciones, encienda o apague un led. Para hacerse una idea le muestro el esquema en la figura 3.20, donde he conectado el pulsador al pin digital 6 a través de una resistencia pull up de 10 kΩ.

En cuanto al hardware, necesitará:

* 1 diodo led de cualquier color.

* 1 resistencia1 de 220 Ω

* 1 pulsador tipo mini

* Una protoboard

* Cablecitos de conexión

* Un Arduino y un cable USB

Práctica 3.5 Contador de pulsaciones



En el código ha creado la variable Turno que se incrementará a medida que se presiona el pulsador “Turno++”, pero también ha establecido un rango de números para el contador que va de 1 a 10. Si desea incrementar ese rango solo debe editar la siguiente línea:

if (Turno > 10) Turno = 1;

Además, ha añadido un led que parpadeará una vez con cada cambio de turno.

El resultado en su monitor serie es el siguiente (figura 3.21):

Como novedad en este sketch, dispone de dos nuevas funciones relacionadas con la trasmisión serie entre Arduino y PC, y también se juega con los if anidados.

3.2.2 Memoria FlashStorage

¿Sabe que su Arduino MKR tiene una memoria no volátil? Es decir, tiene una memoria en la cual no se borran ni se pierden datos cuando deja de alimentarlo, por lo que podría usarla para almacenar y más tarde recuperar información importante: recuperar la configuraciones, tales como calibraciones de sensores (una vez calibrado un sensor no es necesario volver a hacerlo puesto que los límites están guardados en la Flash), contadores de tiempo de uso, de modo que cuando Arduino MKR deje de estar alimentado no pierda la cuenta de tiempo de funcionamiento, etc.

En Arduino UNO tenía una memoria EEPROM que era realmente fácil de programar. El MKR carece de esta memoria, pero eso no es un problema ya que puede usar la memoria Flash para el mismo uso y disfrute.

La memoria Flash, debido a sus propiedades, generalmente se usa para almacenar el código del firmware, pero también se puede usar para almacenar los datos del usuario. Tiene una cantidad limitada de ciclos de escritura. La memoria Flash típica puede realizar aproximadamente 10 000 ciclos de escritura en el mismo bloque Flash antes de comenzar a “desgastarse” y comenzar a perder la capacidad de retener datos.

Así que cuidado: el uso incorrecto de esta biblioteca puede destruir rápida y permanentemente la memoria flash de su micro, en particular, debe evitar llamar a la función write() con demasiada frecuencia y asegurarse de que durante toda la vida del micro el número de llamadas a la escritura se mantiene muy por debajo del límite anterior de 10 000 (es una buena regla general tener en cuenta ese número incluso si el fabricante del micro garantiza un mayor número de ciclos).

No recomiendo utilizar la memoria Flash si su micro proporciona una EEPROM. Casi siempre es mejor usar la EEPROM porque es un tipo de memoria diseñada con el propósito específico de almacenar datos del usuario (tiene una vida útil más larga, número de ciclos de escritura, etc.). Pero en ausencia de una EEPROM, puede usar esta biblioteca para usar una parte de la memoria Flash como alternativa a la EEPROM. Sin embargo, siempre debe tener en cuenta sus límites.

Puede almacenar datos complejos declarando una estructura con más campos y crear un objeto FlashStorage para almacenar toda la estructura. Es una información que no se borra, aunque desconecte su placa de la alimentación o la reinicie. Pero el contenido memorizado sí se borrará cada vez que se carga un nuevo sketch.

Para usar la memoria Flash en sus proyectos es necesario disponer de la biblioteca FlashStorage (figura 3.22). Esta tiene como objetivo proporcionar una forma conveniente de almacenar y recuperar datos del usuario utilizando la memoria Flash no volátil de los microcontroladores.

Para esta práctica se retomará el contador de supermercado. Va a implementarle una función de recuperación en el caso que se vaya la corriente y quiera seguir el turno donde lo dejó.

Ücretsiz ön izlemeyi tamamladınız.

Türler ve etiketler

Yaş sınırı:
0+
Hacim:
671 s. 670 illüstrasyon
ISBN:
9788426732354
Yayıncı:
Telif hakkı:
Bookwire
İndirme biçimi: