jueves, 13 de junio de 2013

PROGRAMANDO UN 7 SEGMENTOS DE 4 BIT

OBJETIVOS
  • Crear un programa shell que realice un contador de 1 digito mediante gpio de la librería WiringPi.
  • Crear un programa en C que es un contador de 4 dígitos mediante la librería WiringPi.
CONSTRUCCIÓN DEL CIRCUITO
La pantalla sobre la que se ha trabajado posee 4 dígitos y se programa sobre 12 pines, 6 en la parte superior y 6 en la inferior.
De los 12 pines, 7 sirven para programar cada uno de los segmentos, otro sirve para controlar los :, que serán cátodos (-)  y 4 pines para cada uno de los dos dígitos, que serán ánodos (+).
La información facilitada por el fabricante es la siguiente
Cada uno de los pines de empleados para los dígitos es positivo, sobre ellos habrá que utilizar resistencias de 220 o 330 Ω y el resto de los pines son negativos. Para identificar si un pin es dígito o sirve para controlar un segmento, utilizaremos la corriente continua de 3.3v, conectaremos una resistencia al pin candidato a dígito y probaremos en varios pines con la conexión a tierra, si se ilumina algún segmento es dígito y podremos identificar de qué digito se trata y que segmento está asociado al otro pin, si no se ilumina nada después de haber probado varios pines habrá que buscar otro candidato a dígito.



La numeración de los pines va en la parte inferior de 1 a 6 y en la parte superior de 12 a 7.
12 D1 11 A 10 F 9 D2 8 D3 7 B
1 E 2 D 3 : 4 C 5 G 6 D4
A los pines positivos se les han asociado los pines MOSI, MISO, CE0 y CE1, insertando una resistencia de 330 Ω en cada uno de ellos. Para los siete segmentos a, b, c, d, e, f, g se han utilizado los pines programables 17, 18, 4, 22 ,23 ,24 , 25.
Para que se ilumine un segmento de un dígito, el pin asociado al digito deberá estar a 1 y el pin asociado al segmento deberá valer 0, así se consigue que fluya la corriente. En ambos casos se configurarán como pines de salida o output.
El resultado final del circuito ha sido
Programa contador7segmentos.sh
#!/bin/bash
#################################################################
##                                                             ##
## contador7segmentos.sh                                       ##
##                                                             ##
## Este script sirve para realizar un contador de 7            ##
## segmentos de 1 digito                                       ##
##                                                             ##
## Autor: M.Alvarez (miguelwarez@gmail.com) 2013               ##
## Más ejemplos en http://rpiplus.sourceforge.net              ##
##                                                             ##
## License GPLv3 http://www.gnu.org/licenses/gpl-3.0.html      ##
##                                                             ##
## Para ejecutar hay que ser root (sudo su) y escribir         ##
## ./contador7segmentos.sh                                     ##
##                                                             ##
#################################################################
#la función limpia la salida del display de 7 segmentos
function limpia() {
      #la pantalla display controla los cuatro digitos con los
      #pines 9 10 8 7
      for I in 9 10 8 7
      do
            gpio -g mode $I out
            gpio -g write $I 0
      done
      #los pines asociados a los segmentos son los que se muestran
      #el 17 al segmento a, 18 al b,...
      for I in 17 18 4 22 23 24 25
      do
            gpio -g mode $I out
            gpio -g write $I 1
      done
}
#la función recibe como argumento la letra, por ejemplo,para mostrar 0
#indicamos representa 1 1 1 1 1 1 1 0 0 y ya va mostrando o no cada uno function representa() {
      for I in 17 18 4 22 23 24 25
      do
            if [ $1 -eq 0 ]
            then
                  gpio -g write $I 1
            else
                  gpio -g write $I 0
            fi
            shift
      done
}
           # a b c d e f g p
 DIGITOS[0]="1 1 1 1 1 1 0 0"
 DIGITOS[1]="0 1 1 0 0 0 0 0"
 DIGITOS[2]="1 1 0 1 1 0 1 0"
 DIGITOS[3]="1 1 1 1 0 0 1 0"
 DIGITOS[4]="0 1 1 0 0 1 1 0"
 DIGITOS[5]="1 0 1 1 0 1 1 0"
 DIGITOS[6]="1 0 1 1 1 1 1 0"
 DIGITOS[7]="1 1 1 0 0 0 0 0"
 DIGITOS[8]="1 1 1 1 1 1 1 0"
 DIGITOS[9]="1 1 1 1 0 1 1 0"
DIGITOS[10]="1 1 1 0 1 1 1 0"
DIGITOS[11]="0 0 1 1 1 1 1 0"
DIGITOS[12]="1 0 0 1 1 1 0 0"
DIGITOS[13]="0 1 1 1 1 0 1 0"
DIGITOS[14]="1 0 0 1 1 1 1 0"
DIGITOS[15]="1 0 0 0 1 1 1 0"
DIGITOS[16]="0 0 0 0 0 0 0 0"
#limpiamos la salida por pantalla
limpia
#habilitamos el digito y lo ponemos en modo salida
gpio -g mode 7 out
gpio -g write 7 1
echo "Contador Hexadecimal"
#hacemos el contador recorriendo el vector de digitos
I=0
while [ $I -le 16 ]
do
      CONT=$I
      representa ${DIGITOS[$I]}
      sleep 1
      I=`expr $CONT + 1`
done
#desconectamos el pin
gpio -g write 7 0
Programa contador7segmentos.c
/****************************************************************
**                                                             **
** contador7segmentos.c                                        **
**                                                             **
** Este programa sirve para realizar un contador de 7          **
** segmentos de 4 digitos                                      **
**                                                             **
** Autor: M.Alvarez (miguelwarez@gmail.com) 2013               **
** Más ejemplos en http://rpiplus.sourceforge.net              **
**                                                             **
** License GPLv3 http://www.gnu.org/licenses/gpl-3.0.html      **
**                                                             **
** Para compilar:                                              **
** gcc -o contador7segmentos contador7segmentos.c -l wiringPi  **
**                                                             **
** Para ejecutar:                                              **
** sudo ./contador7segmentos                                   **
**                                                             **
****************************************************************/
#include <wiringPi.h>
#include <stdio.h>
#define MISO 9
#define MOSI 10
#define CE0 8
#define CE1 7
/* Pines utilizados para definir los segmentos a,b,...
 *   --a--
 *   |     |
 *   f     b
 *   |     |
 *   --g--
 *   |     |
 *   e     c
 *   |     |
 *   --d--  p
*/
static int GPIO[]={17,18,4,22,23,24,25};
//Pines asociados a cada pin, en la misma posición en la que
//se muestran
static int POS[]={CE0,MOSI,MISO,CE1};
void ponValorNegado(int pin,int valor){
      pinMode(pin,OUTPUT);
      digitalWrite(pin,!valor);
}
void limpia(){
      int i;
      for(i=0;i<4;i++)
            ponValorNegado(POS[i],HIGH);
      for(i=0;i<8;i++)
            ponValorNegado(GPIO[i],LOW);
}
static const int digitos[]=
{
// a  b  c  d  e  f  g  p    Segments
   1, 1, 1, 1, 1, 1, 0, 0,   // 0
   0, 1, 1, 0, 0, 0, 0, 0,   // 1
   1, 1, 0, 1, 1, 0, 1, 0,   // 2
   1, 1, 1, 1, 0, 0, 1, 0,   // 3
   0, 1, 1, 0, 0, 1, 1, 0,   // 4
   1, 0, 1, 1, 0, 1, 1, 0,   // 5
   1, 0, 1, 1, 1, 1, 1, 0,   // 6
   1, 1, 1, 0, 0, 0, 0, 0,   // 7
   1, 1, 1, 1, 1, 1, 1, 0,   // 8
   1, 1, 1, 1, 0, 1, 1, 0,   // 9
   1, 1, 1, 0, 1, 1, 1, 0,   // A
   0, 0, 1, 1, 1, 1, 1, 0,   // b
   1, 0, 0, 1, 1, 1, 0, 0,   // C
   0, 1, 1, 1, 1, 0, 1, 0,   // d
   1, 0, 0, 1, 1, 1, 1, 0,   // E
   1, 0, 0, 0, 1, 1, 1, 0,   // F
   0, 0, 0, 0, 0, 0, 0, 0,   // blank
} ;void representa(int valor){
      int i;
      for(i=0;i<7;i++){
            ponValorNegado(GPIO[i],digitos[8*valor+i]);
      }
}
void caracterPin(char a, int pin){
      if(a>='a')
            representa(10 + a -'a');
      else
            representa(a-'0');
}
void pinta(int pin, int num, int tiempo){
      ponValorNegado(pin,LOW);
      representa(num);
      delayMicroseconds(tiempo);
      ponValorNegado(pin,HIGH);
}
main(){
      int i,j,k,l,cien=100;
      if (wiringPiSetupGpio() == -1){
            perror("Error de inicializacion\n");
            exit (1) ;
      }
      limpia();
      for(;;){
       for(i=0;i<10;i++)
        for(j=0;j<10;j++)
        for(k=0;k<10;k++)
          for(l=0;l<100;l++){
            pinta(POS[0],i,5000);
            pinta(POS[1],j,5000);
            pinta(POS[2],k,5000);
            pinta(POS[3],l/10,5000);
         }
      }
}

1 comentario:

  1. no pude hacerlo correr, eria un poco mas practico que especificaras el uso de la libreria wiringpi y su intalacion asi como la ejecucion del programa, gracias buen tutorial

    ResponderEliminar