jueves, 26 de octubre de 2017

Contador ascendente descendente de un dígito con Arduino

Contador ascendente-descendente de un dígito con Arduino

Tecnología Robótica

Dr. Héctor Darío Aguirre Arvizu
17-10-24

Explorando el manejo del Sistema Arduino, he encontrado esta aplicación, que de hecho me dejaron como tarea en un curso de robótica para ingenieros.

Tarea: Elaborar un circuito con un display de 7 segmentos para que cuente de 0 a 9 y de regreso. Es decir, hacer un circuito contador ascendente-descendente de un dígito.

Disponemos de un display de 7 segmentos 5611B. Nos vamos a la hoja de datos (ver la liga) y descubrimos que es un display de ánodo común, es decir, el común de los 7 LEDs que conforman el display tienen conectada la terminal positiva, la cual debe ir al positivo del circuito.
Display de 7 segmentos de un dígito.
A continuación vemos el diagrama de disposición de los diferentes segmentos del display, notando cómo cada LED es marcado con las sucesivas letras a, b, c, d, e, f y g. A la derecha vemos, en la parte inferior, que los  diodos que componen el display tienen el positivo en común y cada uno de los cátodos tendrá que conectarse a un negativo para que encienda. Para hacer que no encienda se coloca un voltaje positivo (+5). Cuando tenemos un diodo polarizado con el mismo valor de voltaje en sus extremos no conduce y, por ello, no se prende. Cuando se polariza directamente entonces el LED enciende.
Disposición de los diferentes LEDs de un display de 7 segmentos, y conexión de los mismos
en cátodo común (para el tipo 5611Ax) y ánodo común (para el 5611Bx).

A continuación se muestra el diagrama de conexión entre el Arduino y el display. Está elaborado con un programa llamado Fritzing.
Diagrama electrónico
La versión de Fritzing que usé no cuenta en su librería con el display tal y como se acomodan las terminales en el display de verdad. Se ha tratado de imitar lo más posible la forma de conexión en el siguiente diagrama de conexiones:
Diagrama de conexiones
Anexo (17-11-07):
Pude conseguir el display de 7 segmentos en una librería de Fritzing y rehice el diagrama esquemático como a continuación se muestra:
Display de 7 segmentos vertical
Nota: Por lo menos la versión de Fritzing que manejo tiene un problema ya que aunque uno hace el esquema de modo correcto a como corresponden las terminales reales, a la hora de pasar al diagrama electrónico conecta terminales inadecuadas. A la inversa es lo mismo, si uno hace el diagrama correcto al ir al esquema ya hizo otra conexión diferente.
Por lo anterior, anexo unas fotografías de cómo quedó el circuito armado:
Circuito para controlar un display de 7 segmentos con Arduino 01
Circuito para controlar un display de 7 segmentos con Arduino 02
Circuito para controlar un display de 7 segmentos con Arduino 03
El programa utilizado para el control del display es muy sencillo, aunque demasiado repetitivo, ya que, de momento, no utiliza grandes recursos de programación y está utilizándose como programa didáctico inicial. A continuación se muestra el programa (intencionalmente se colocó en letras pequeñas, sólo cópialo a tu programa Arduino, pero revisa la gramática del programa para evitar malos funcionamientos):

//Contador ascendente-descendente con display de 7 segmentos con ánodo común
//Dr. Héctor Darío Aguirre Arvizu
//2017-10-22
// las terminales 5 y 8 del display 5611BH son el punto común que en este caso se conecta a positivo (+5V)

const int p = 13; //asigna el pin 13 el encendido del punto decimal al inicio del programa; parpadea con el diodo del circuito
const int a = 12; // a partir de 12 hacia abajo asignamos los pines para los diferentes segmentos;
const int b = 11; // los colocamos como enteros asignados a un pin;
const int c = 10; // Ello permite no confundir a qué segmento (a, b, c, etc.) se le dará voltaje
const int d = 9;
const int e = 8;
const int f = 7;
const int g = 6;
const int x = 1000; // asignamos un valor fijo para que cada dígito prenda un segundo

void setup() {

  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}

void loop() {

    //Cero
  digitalWrite(a, LOW); //Al ser un display de ánodo común cada segmento debe estar en bajo para encender
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH); // cuando están en alto permanecen apagados
  delay(x);

    //Uno
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  delay(x);

    //Dos
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  delay(x);

    //Tres
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  delay(x);

    //Cuatro
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

   //Cinco
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

    //Seis
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

    //Siete
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  delay(x);

    //Ocho
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

    //Nueve
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

    //Ocho
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

   //Siete
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  delay(x);

    //Seis
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

    //Cinco
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

    //Cuatro
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  delay(x);

    //Tres
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  delay(x);

    //Dos
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  delay(x);

    //Uno
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  delay(x);

}

Hasta aquí el programa

Aquí podrás ver el video descriptivo y cómo funciona el circuito:


Esperamos te guste y lo armes.

Dr. Héctor Darío Aguirre Arvizu
D. R. 2017 Darío Aguirre

No hay comentarios:

Publicar un comentario