martes, 19 de enero de 2010

Primer proyecto

Saludos a todos, esta es mi primera entrada en este blog y me gustaria presentaros mi primer trabajo con arduino. Este consiste en un contador ascendente de 0 a 9 representado en un display de 7 segmentos. Sin utilizar un 7447 para decodificar de BCD a 7-segmentos.

Si utilizasemos un 7447 solo necesitariamos usar 4 salidas digitales, en cambio si realizamos la decodificación en el arduino necesitaremos ocupar 7 u 8 salidas (dependiendo si queremos usar el led de la coma). Claro esta, que si queremos diseñar un contador con un solo display ambas opciones nos sirven, pero mas adelante en una aplicación mas compleja nos interesaria tener mas salidas libres, ya que sino ocupamos 8 salidas de las 11 disponibles. Empezemos con la receta.

INGREDIENTES:

Arduino .
8 resistencias de 1kOhm.
display de 7 segmentos (Cátodo común).

MANOS A LA OBRA:

El montaje no es demasiado complicado, pero es importante no liarse con el patillaje del display, mi recomendación es que probeis pata a pata que led se ilumina. Y establezcais vuestro propio esquema.

Primero es conectar el cátodo a la GND de la placa. Después hay que conectar los ánodos a las salidas digitales de la placa intercalando en serie las resistencias de 1kOhm.

Ahora toca programarlo, os adjunto el código bajo mi parámetros de montaje, raro seria que coincidiese como lo habeis montado vosotros. Tendriaís que modificar los valores de las constantes al principio del código.

/*
Contador de 7-segmentos
POR Loperz Hates
*/

const int a = 4;
const int b = 3;
const int c = 2;
const int d = 8;
const int e = 10;
const int f = 6;
const int g = 9;
const int h = 5;


// The setup() method runs once, when the sketch starts

void setup() {
// initialize the digital pin as an output:
pinMode(a, OUTPUT);
pinMode(b, OUTPUT);
pinMode(c, OUTPUT);
pinMode(d, OUTPUT);
pinMode(e, OUTPUT);
pinMode(f, OUTPUT);
pinMode(g, OUTPUT);
pinMode(h, OUTPUT);
}
void Representar(int valor){
switch(valor){
case 0:

digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;

case 1:
digitalWrite(c, HIGH);
digitalWrite(f, HIGH);
break;

case 2:
digitalWrite(a, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(g, HIGH);
break;

case 3:
digitalWrite(a, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;

case 4:
digitalWrite(b, HIGH);
digitalWrite(d, HIGH);
digitalWrite(c, HIGH);
digitalWrite(f, HIGH);
break;

case 5:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(d, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;

case 6:
digitalWrite(b, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;

case 7:
digitalWrite(a, HIGH);
digitalWrite(c, HIGH);
digitalWrite(f, HIGH);
break;

case 8:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(e, HIGH);
digitalWrite(f, HIGH);
digitalWrite(g, HIGH);
break;

case 9:
digitalWrite(a, HIGH);
digitalWrite(b, HIGH);
digitalWrite(c, HIGH);
digitalWrite(d, HIGH);
digitalWrite(f, HIGH);
break;

default:
digitalWrite(h, HIGH);
break;
}
}
void LimpiarDisplay(){
digitalWrite(a, LOW);
digitalWrite(b, LOW);
digitalWrite(c, LOW);
digitalWrite(d, LOW);
digitalWrite(e, LOW);
digitalWrite(f, LOW);
digitalWrite(g, LOW);
}

void loop(){
for(int i=0;i<=9;i++){ LimpiarDisplay(); Representar(i); delay(500); } }
Consta de los procedimientos:
  • setup() Inicializa los pines que vamos a utilizar como de salida.
  • Representar(int valor) Recibe un entero y lo representa en el display.
  • Limpiardisplay() Apaga todos los leds para representar el siguiente dato.
  • loop() Contiene el contador de 0 a 9.
Bueno os dejo una foto de la pinta que tiene el montaje. Hasta otra :-D




3 comentarios:

  1. ola a todos, amigo el proyecto me parece chevere,interesante, sabes quisiera saber como hacer funcionar 6 display con 6 salidas digitales del arduino, quisiera crearme un reloj digital, el cual me de horas, minutos y segundos, te lo agradeceria mucho si me dieras alguna idea, bye cuidense

    ResponderEliminar
  2. Saludos amigo,

    Tal y como se describe aquí no se podría porque el número salidas de Arduino es insuficiente. Para ello tendríamos que recurrir a integrados 7447, en concreto 6, uno por cada display.

    Cada uno necesita 4 bits para representar un valor entre 0 y 15, total necesitaríamos 24 salidas que siguen siendo muchas, Arduino tiene 12.

    Si nos damos cuenta, los valores de las decenas de las horas, minutos y segundos nunca supera el valor 6 por lo que para esos display 3 bits serian necesarios.

    Resumiendo, el valor mínimo de salidas necesarias para manejar los 6 display sería de 21. Muchas mas de 12. Habría que recurrir a circuitería externa que manejase los acarreos para resolver este problema. Quizas en algún momento cree una entrada dandote una solución.

    Gracias por tu participación.

    ResponderEliminar
  3. una consulta, quiero hacer un contador descendente de 60 segundos, con boton de partida y ressett, me puedes dar una mano? servicom@vtr.net (Miguel Flores)

    ResponderEliminar