LusoRobótica - Robótica em Português
Robótica => Projectos de robótica => Projectos em desenvolvimento => Tópico iniciado por: OxyGen em 13 de Maio de 2010, 18:16
-
Boas a todos...
O meu projecto de hoje tinha o objectivo de implementar um contador de 2 dígitos usando 2 displays de 7 segmentos.
Eis o meu material:
- Condensador 100nF
- CI 74HC138N - Descodificador/multiplexer
- 2 displays 7 Segmentos
- 2 Transistores VN2222L
Para aumentar a rentabilidade das linhas do Arduino usei o multiplexer... para facilitar liguei o Y0 e o Y7 pois têm a combinação mais fácil.
Como o multiplexer tem as saídas negadas tive de as ligar ao ground dos displays, ou seja os displays só funcionam quando Y0 e Y7 estão a zero.
Esquema eléctrico não coloco aqui porque também não fiz nenhum... Fiz tudo de cabeça lol...
Problema: Apenas imprime em um display de cada vez. Ajudem a melhorar o código!
Vídeo: (Conta até 99)
Double Display Count (http://www.youtube.com/watch?v=EXkimTdz1JY#)
Código:
int Selects = 13; // A B C Selects
int EnAB = 12; // Enables G2A G2B
int G1 = 11; // Enable G1
// Pinos para os displays 10,9,8,7,6,5,4,3
unsigned int cont = 0;
// Pinos
int todos[]={10,9,8,7,6,5,4,3};
void setup()
{
pinMode(Selects,OUTPUT);
pinMode(EnAB,OUTPUT);
pinMode(G1,OUTPUT);
for(int i=0; i<sizeof(todos);i++)
{
pinMode(todos[i],OUTPUT);
}
}
void loop() // Melhorar este loop para que imprima um valor constante enquanto o contador nao mudar
{
lesssig(cont);
delay(500);
moresig(cont);
delay(500);
if(cont<99)
cont++;
else
cont=0;
}
void lesssig(unsigned int num)
{
// Escrita no display menos significativo
unsigned int right;
unsigned int conv;
right = num%10;
switch(right)
{
case 0:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(10,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(7,LOW);
digitalWrite(3,LOW);
break;
}
case 1:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(7,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
digitalWrite(3,LOW);
break;
}
case 2:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
digitalWrite(7,LOW);
digitalWrite(4,LOW);
digitalWrite(8,LOW);
break;
}
case 3:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(7,LOW);
digitalWrite(4,LOW);
digitalWrite(10,LOW);
break;
}
case 4:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(4,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(7,LOW);
digitalWrite(5,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
break;
}
case 5:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(10,LOW);
break;
}
case 6:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(10,HIGH);
break;
}
case 7:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(7,LOW);
digitalWrite(4,LOW);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
break;
}
case 8:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,HIGH);
digitalWrite(10,HIGH);
break;
}
case 9:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,HIGH);
digitalWrite(10,LOW);
break;
}
default:
{
digitalWrite(Selects,LOW);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(7,HIGH);
}
}
}
void moresig(unsigned int num)
{
// Escrita no display mais significativo
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
unsigned int left;
unsigned int div;
div=cont/10;
switch(div)
{
case 0:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(10,HIGH);
digitalWrite(4,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(7,LOW);
digitalWrite(3,LOW);
break;
}
case 1:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
digitalWrite(7,LOW);
digitalWrite(5,LOW);
digitalWrite(4,LOW);
digitalWrite(3,LOW);
break;
}
case 2:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(10,HIGH);
digitalWrite(9,HIGH);
digitalWrite(7,LOW);
digitalWrite(4,LOW);
digitalWrite(8,LOW);
break;
}
case 3:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(7,LOW);
digitalWrite(4,LOW);
digitalWrite(10,LOW);
break;
}
case 4:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(4,HIGH);
digitalWrite(6,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(7,LOW);
digitalWrite(5,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
break;
}
case 5:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(10,LOW);
break;
}
case 6:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,LOW);
digitalWrite(10,HIGH);
break;
}
case 7:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(6,HIGH);
digitalWrite(8,HIGH);
digitalWrite(7,LOW);
digitalWrite(4,LOW);
digitalWrite(3,LOW);
digitalWrite(10,LOW);
digitalWrite(9,LOW);
break;
}
case 8:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,HIGH);
digitalWrite(10,HIGH);
break;
}
case 9:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(5,HIGH);
digitalWrite(4,HIGH);
digitalWrite(3,HIGH);
digitalWrite(8,HIGH);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);
digitalWrite(7,LOW);
digitalWrite(6,HIGH);
digitalWrite(10,LOW);
break;
}
default:
{
digitalWrite(Selects,HIGH);
digitalWrite(EnAB,LOW);
digitalWrite(G1,HIGH);
digitalWrite(7,HIGH);
}
}
}
-
Retira os delays entre os lesssing e o moresig, estás a fazer multiplexing por software, logo com um delay de meio segundo é normal que seja tão lento que consegues ver que só está um display acesso de cada vez, retira o delay, assim os dois displays são actualizados muito mais vezes por segundo e assim parecem que estão os dois ligados ao mesmo tempo
-
Aí é que está... estou a fazer um multiplexing por hadware... tenho la o HC138 como multiplexer... se retirar os delays entre as 2 funções não vejo os numeros a passar... so vejo oitos... fica tudo muito rápido xD...
-
Porque tu estás a controlar a mulplexagem no enorme ciclo de cases e não fora deles, podias tornar o teu código muito mais pequeno se metesses os numeros num array.
-
tenho um ciclo de cases para cada display... entao como é que posso controlar fora do ciclo de cases?
-
Então e se mudares a velocidade entre a mudança de cada display?
-
pois... mas isso não iria funcionar... o ideal seria incrementar o contador a cada segundo. ora isso mesmo... vou usar os timers...
-
Tipo...
Em vez de alternares entre os 2 displays em 500 ms 2 cada um, tenta alternar em 100ms cada um e inicia um contador até 10 para mudar de número.
Quem diz 100ms, diz 10ms e contas até 100. O efeito é muito melhor.
-
vou experimentar e logo digo...
-
Como já foi dito, o problema parece-me estar na frequência com que os displays alternam... se alterares o tempo com que eles alternam não irás interferir na contagem.
Como deves saber, quando temos + de um display a funcionar, eles parecem estar sempre ligados, mas na verdade não estão. Apenas trabalha um de cada x.. só tens de aumentar esta velocidade até que baralhe o nosso cérebro :p
Depois actualiza a situação
-
Como ja tinha partido para outro projecto vou montar tudo novamente amanha e vou tentar aplicar cada uma das soluções apresentadas... Em relação ao último post, eu sei que os displays funcionam um de cada vez... Testei o tempo limite de intervalo até que os nossos olhos não vissem mesmo as transições: com 60 ms já não se vêm as transiçoes.... com 100 ms dá dores de cabeça só de olhar... xD