sábado, 25 de agosto de 2012

Dado Electrónico

Dado electrónico con Arduino UNO.

Categoría: 1. Programación y electrónica.

En este ejercicio se construye un circuito electrónico con un display de siete segmentos con ánodo común. Las terminales (a, b, c, d, e, f y g) se conectaron a las I/O (2, 3, 4, 5, 6, 7 y 8) respectivamente. En la I/O número 9 se conectó un botón pulsador conectando un extremo al polo positivo (+5V), el otro extremo a una resistencia de 10K conectada a la terminal GND (tierra) de la tarjeta Arduino UNO. Los valores del uno al seis se despliegan simultáneamente en el display LED y en el monitor serial del ambiente Arduino. El monitor serial muestra además el estado de la entrada digital, el botón pulsador. Los números del uno al seis se despliegan 50 veces rápidamente (50 ms HIGH y 15 ms LOW). Durante esta etapa se aprieta el botón pulsador y el número seleccionado queda guardado en la variable optn. Al terminar el despliegue de la serie de números, el display LED muestra el número seleccionado (destellando 15 veces, 250 ms HIGH y 15 ms LOW) cuando se apretó el botón pulsador.

 
Figura 1. Display de LED, botón pulsador y placa Arduino UNO.

En el desarrollo del proyecto se comenzó con una primera versión del programa completo, aunque este no funcionaba correctamente pero sí era compilado. Después se construyó el circuito electrónico y se reinició la escritura del código. Primero haciendo encender y apagar cada uno de los segmentos del display y corrigiendo cualquier error en el hardware. Una vez que el hardware funcionó, se codificaron las funciones para generar los números (uno al seis). A continuación se estableció la comunicación con el monitor serial y la entrada digital a través del botón pulsador. Por último se desarrollaron dos fracciones de código, uno con la instrucción for, para seleccionar el valor a través del botón pulsador asociado a la asignación del valor para la variable optn y otra con la instrucción switch/case, para desplegar el valor seleccionado por la pulsación del botón.
Aunque el código que se presenta adelante es bastante extenso, es posible quitar partes que no intervienen directamente con el funcionamiento del dado. Las funciones para desplegar los números se repiten, cambiando únicamente los valores de la instrucción delay();. Como ejercicio, se puede quitar un juego de estos números colocando como argumentos de las funciones, las duraciones para la instrucción mencionada.

El código desarrollado para el proyecto es el siguiente:

/*
Un display LED de 7 segmentos despliega rápidamente números
del uno al seis. Se detiene cuando se presiona un botón
pulsador, mostrando el valor en forma estática.
Al pulsar nuevamente el botón pulsador vuelve a comenzar el
despliegue de números del uno al seis
Se utiliza la instrucción switch / case
*/

int a=2;
int b=3;
int c=4;
int d=5;
int e=6;
int f=7;
int g=8;
int pulsador=9;

void setup ()  {
  Serial.begin(9600);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(pulsador, INPUT);  }


void loop ()  {
  digitalWrite(a, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  delay(75);

  digitalWrite(b, HIGH);
  delay(250);
  digitalWrite(b, LOW);
  delay(75);

  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(c, LOW);
  delay(75);

  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(d, LOW);
  delay(75);

  digitalWrite(e, HIGH);
  delay(250);
  digitalWrite(e, LOW);
  delay(75);

  digitalWrite(f, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  delay(75);

  digitalWrite(g, HIGH);
  delay(250);
  digitalWrite(g, LOW);
  delay(75);

  digitalWrite(a, HIGH);
  delay(200);
  digitalWrite(b, HIGH);
  delay(200);
  digitalWrite(c, HIGH);
  delay(200);
  digitalWrite(d, HIGH);
  delay(200);
  digitalWrite(e, HIGH);
  delay(200);
  digitalWrite(f, HIGH);
  delay(200);
  digitalWrite(g, HIGH);
  delay(200);

  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);

  int optn =0;

for (int i=0; i<50; i++)  {
  Uno();
  int valUno= digitalRead(pulsador);
  Serial.print(" 1 ");
  Serial.println(valUno);
  if (valUno == 1)  {
    optn =1;  }

  Dos();
  int valDos= digitalRead(pulsador);
  Serial.print(" 2 ");
  Serial.println(valDos);
  if (valDos == 1)  {
    optn =2;  }

  Tres();
  int valTres= digitalRead(pulsador);
  Serial.print(" 3 ");
  Serial.println(valTres);
  if (valTres == 1)  {
    optn =3;  }

  Cuatro();
  int valCuatro= digitalRead(pulsador);
  Serial.print(" 4 ");
  Serial.println(valCuatro);
  if (valCuatro == 1)  {
    optn =4;  }

  Cinco();
  int valCinco= digitalRead(pulsador);
  Serial.print(" 5 ");
  Serial.println(valCinco);
  if (valCinco == 1)  {
    optn =5;  }

  Seis();
  int valSeis= digitalRead(pulsador);
  Serial.print(" 6 ");
  Serial.println(valSeis);
  if (valSeis == 1)  {
    optn =6;  }  }

Serial.print("el valor de optn es: ");
Serial.println(optn);

switch (optn)  {
  case 1:  {
    UnoDisplay();
    break;  }
  case 2:  {
    DosDisplay();
    break;  }
  case 3:  {
    TresDisplay();
    break;  }
  case 4:  {
    CuatroDisplay();
    break;  }
  case 5:  {
    CincoDisplay();
    break;  }
  case 6:  {
    SeisDisplay();
    break;  }
  default:
    break;  }  }

void Uno ()  {
  digitalWrite(f, HIGH);
  digitalWrite(e, HIGH);
  delay(50);
  digitalWrite(f, LOW);
  digitalWrite(e, LOW);
  delay(15);  }

void Dos ()  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Tres ()  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Cuatro ()  {
  digitalWrite(f, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  delay(50);
  digitalWrite(f, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  delay(15);  }

void Cinco ()  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }

void Seis ()  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(c, HIGH);
  delay(50);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  digitalWrite(c, LOW);
  delay(15);  }

void UnoDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(f, HIGH);
  digitalWrite(e, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  digitalWrite(e, LOW);
  delay(15);  }  }

void DosDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void TresDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void CuatroDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(f, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(f, LOW);
  digitalWrite(b, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  delay(15);  }  }

void CincoDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  delay(15);  }  }

void SeisDisplay ()  {
  for (int i=0; i<15; i++)  {
  digitalWrite(a, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(c, HIGH);
  delay(250);
  digitalWrite(a, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(e, LOW);
  digitalWrite(d, LOW);
  digitalWrite(c, LOW);
  delay(15);  }  }


Como se comentó al inicio, el desarrollo del proyecto se hizo mediante avances parciales hasta completar las funciones que se habían contemplado en el programa inicial. Con la diferencia de que el formato final funcionó correctamente.
El proyecto y el código correspondiente fueron desarrollados por Miguel Angel Orduña Bustamante en el año 2012. Saludos.






No hay comentarios:

Publicar un comentario