2020-09-30

Electronica Practica Aplicada

con la ayuda de Arduino.

Introducción.

En gran cantidad de dispositivos actuales se puede encontrar un contador electrónico, son innumerables los elementos que incorporan algún tipo de contador electrónico. Del mismo modo hay en libros o artículos de electrónica o en la misma red, donde se describen contadores, sencillos o más complejos, pero todos diseñados con el mismo fin, contar unos eventos que se producen con cierta regularidad, aunque a veces no tanto.

El contador.

En unos de mis viejos artículos se describe un contador de dos dígitos capaz de mostrar registros desde 00 a 99 mediante circuitos integrados estándar. Estoy refiriéndome al artículo contador de 00 a 99, en aquel caso se trataba de un contador realizado mediante circuitos integrados de tipo comercial de la serie CMOS 4000 (serie cuatro mil). Sin embargo en esta ocasión, aprovechando las posibilidades que nos ofrecen los microcontroladores y en concreto Arduino, trataré de describir cómo realizar uno de estos contadores de eventos. El detector de entrada, puede ser cualquier sensor y de cualquier forma, lo importante es que, entregue una señal digital adecuada, para su lectura.

En principio vamos a implementar mediante una rutina un sistema antirrebote debouncing en inglés que sea fiable. Dos pulsadores para proporcionar los pulsos que vamos a contar, uno para incrementar y el otro para decrementar la cuenta. Por lo tanto, nos serviremos de una variable val para leer si se presiona el pulsador y otra variable val2 para comparar con la lectura anterior. De esta forma podemos saber si ha cambiado el estado de la entrada. Una variable botonStado que guarde el estado del pulsador y la variable buttonCounter que guarde el número de pulsaciones. Con estas variables, vamos a crear un código que lleve la cuenta a medida que ésta cambie y la muestre en el monitor serie de Arduino, así, siempre habrá constancia de las pulsaciones que se han producido.

Vamos a empezar por escribir el listado del código que sea capaz de contar y mostrar la cuenta desde 0 hasta 99, este tope se puede modificar a gusto del usuario. De esta forma abordaremos los pasos poco a poco de manera que podamos resolverlos con seguridad para no abandonar por que los problemas nos abrumen.

En primer lugar declaramos las variables:

int switchPin = 8; // switch se conecta al pin 8 
int ledPin = 2;    // el LED se conecta al pin 2 
int val; // variable para lectura del estado del pin 
int val2; // variable para leer el estado delayed/debounced 
int botonStado; // variable para mantener el estado del botón 
int buttonCounter =0 ; // contador para el número de pulsos de botón

Ahora, vamos a configurar el setup() donde estableceremos los pines de entrada y la comunicación serie para presentar los resultados en el monitor serie, veamos:

void setup() {
pinMode(switchPin, INPUT); // pone el pin switch como entrada
pinMode(ledPin, OUTPUT);
Serial.begin(9600); // Comunicación serie puesta a 9600bps
botonStado = digitalRead(switchPin); // lee el estado inicial

En el loop() tenemos una primera lectura del pin switchPin seguido de una segunda lectura del mismo pin, estas dos lecturas se comparan y si coinciden se considera valida la lectura, evitando así el efecto rebote o debouncing.

void loop(){
val = digitalRead(switchPin);
delay(10); // intérvalo de 10 milisegundos son una cantidad buena de tiempo
val2 = digitalRead(switchPin);
if (val == val2) { // asegurar que conseguimos 2 lecturas constantes

El resto del código está igualmente descrito y creo que no es necesario entrar en más detalle, este es el listado del código, puede copiarlo y pegarlo en su editor de texto preferido, guárdelo con el nombre contador_incremental_doble.pde u otro nombre apropiado para seguir el proyecto.

Contador incremental dos dígitos 

Este es el código para el programa contador incremental de dos dígitos.

Si ha seguido los pasos descritos hasta ahora, es de suponer que todo ha salido bien. Abra el monitor serie de Arduino y observe los cambios producidos al pulsar los pulsadores. En caso contrario, vuelva sobre sus pasos y analice donde está el error cometido, para poder seguir. Con esto, tenemos resuelta la primera parte del proyecto que habíamos planteado al principio. Qué ha observado con los resultados, ¡ah! que no funciona siempre la cuenta ¿qué puede ser?, vamos a solucionar este problema de una forma sencilla, pongamos una línea más en el código, en concreto en el setup():

void setup() {
pinMode(switchPin, INPUT); // pone el pin switch como entrada
digitalWrite(channelPinA, HIGH);// activa la resistencia de pull-up.
...

Esta simple orden activa la resistencia interna de pull-up del pin indicado, inserte esta línea en el código y compruebe que ahora si funciona bien. Observe que aunque deje presionado el pulsador el contador avanza una sola cuenta por cada pulsación y cuando llega a 99 la cuenta se inicia denuevo.

Analizando lo que hemos hecho, podemos abordar la segunda parte; la cual, deducimos que se puede considerar una copia casi idéntica del anterior código, naturalmente hay que realizar algún cambio para que sirva nuestros intereses. Veamos estos puntos a modificar.

En primer lugar, la cuenta de las pulsaciones deberá ser llevada igualmente por una variable vval que guarde las pulsaciones. Como en el caso anterior, vval2 será la variable que usaremos para evitar el rebote mecánico del pulsador.

Probemos este código, ¡ah!, pero antes hagamos los cambios. Para hacer más fácil las modificaciones, añadiremos un 2 a las variables, exceptuando val y val2, a las que antepondremos una v. Por supuesto que modificaremos el número del pin en el caso de la entrada del pulsador (switchPin2 = 9) y la salida del LED (ledPin2 = 3) que ocuparan los pines libres que siguen al anterior.

La línea que representa el contador, se bebe modificar ya que ahora el contador disminuye o sea, es regresivo. Con esto, cada presión del pulsador se identifica con la resta de un dígito sobre la cuenta anterior. Esta es la nueva forma del “contador“.

if (vval == LOW) {    // compruebe si el botón es presionado 
   buttonCounter2  -- ;   

Esta línea que sigue, tampoco es necesaria:

// if (buttonCounter2 > -10)  Serial.print("0"); //  pulsaciones

Ya que en este caso, no creo necesario anteponer un “0” al contador.

Sin embargo es conveniente prestar atención al contador ya que estamos en sentido regresivo y el signo (menos), puede causarnos algún retraso en conseguir la solución. Hay que prestar atención a la comparación, siga los pasos del código y comprenderá mejor el funcionamiento.

Este es el código del contador regresivo, lo puede y pegarlo en su editor de texto y compilarlo, para comprobar su efectividad.

Contador regresivo de dos dígitos.

Este es el código para el programa del contador regresivo de dos dígitos.

Fig. 1

Combinar los dos códigos.

Hemos logrado que los dos códigos realicen lo que teníamos previsto. Eso sí, los contadores, cuentan, cada uno en su dirección, como lo habíamos previsto. El caso es que ambos programas deben formar parte de un mismo código. Este es el reto actual ¿Cómo lo vamos a abordar?

Debe observarse que se han realizado unos pequeños cambios en cada subrutina, de modo que puedan compartir el código y cumplan con lo previsto. Se ha creado una nueva subrutina para la presentación en el monitor serie de Arduino, los resultados que se van produciendo en la medida que se generan las pulsaciones.

Esta rutina la he llamado anota(), por que eso es lo que hace. La he sacado fuera del código principal para que si al interesado no le aporta información en su aplicación, pueda prescindir de ella, eliminando las llamadas a dicha rutina y la misma.

En el listado que sigue, puede observarse lo descrito. Si está interesado en el código, para su utilización, como siempre copie y guarde con un nombre significativo, ábralo en su editor de texto preferido y compílelo con su Arduino, para cargarlo y comprobar su buen funcionamiento.

Contador arriba-abajo.

Este es el código completo para el programa de contador arriba-abajo.

Ahora, ya puede disfrutar de un doble contador de eventos. Piense usted en una aplicación para darle una utilidad, por ej. con unos pocos cambios un contador para una cancha deportiva. Es una idea.


Fig. 2

En la figura 1 se muestra el monitor serie con las cuentas. Como siempre, comentarios, criticas y sugerencias para mejorar este artículo, son bienvenidos y apreciados.