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);
}
}
}