LusoRobótica - Robótica em Português
Sistemas específicos => Arduino / AVR => Tópico iniciado por: almamater em 24 de Fevereiro de 2011, 11:57
-
Olá!
Há uns tempos fiz um display de temperatura com 2 displays de segmentos e usei para isso a informação do Ricardo Dias: http://ricardo-dias.com/pt-pt/node/103 (http://ricardo-dias.com/pt-pt/node/103) e funcionou na perfeição.
Neste momento achei piada a uns Displays de segmentos e comprei, mas não sei se vou conseguir usar o mesmo código.
Os displays são estes:
Dual Digit Numeric Display (Common Cathode) (http://iteadstudio.com/store/index.php?main_page=product_info&cPath=35_39&products_id=284)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg14.imageshack.us%2Fimg14%2F6659%2F4digit2.th.jpg&hash=b1c2a531b5dd32f96feb417a6a0eb61ce47cbc66) (http://img14.imageshack.us/i/4digit2.jpg/)
e
Four Digit Numeric Display (Common Cathode) (http://iteadstudio.com/store/index.php?main_page=product_info&cPath=35_39&products_id=205)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg818.imageshack.us%2Fimg818%2F218%2F2digit2.th.jpg&hash=eae887e83b65344f3b0f6a81f63ab4a0f2294bd5) (http://img818.imageshack.us/i/2digit2.jpg/)
No de 4 digitos, os 8 pinos estão partilhados entre os 4 digitos, como fazer para acender o 2º em vez do 1º por exemplo? basta usar um único 74HC595 ? ou não posso fazer desta forma..?
-
Não consigo ver as imagens...
Mas neste caso, com 4 pins no display consegues ter 16 combinações, ou seja, cada pin não corresponde a um segmento do display mas cada combinação desses 4 pins corresponde a um numero... (claro que acima do 9 não vem o 10, mas sim uma letra normalmente)
-
Ah... agora já vejo as imagens! :P
Tinha percebido que tinhas dito 4 pins.. mas disseste 4 displays!
Então neste caso tens na mesma os 8 pins, mas ligados entre os displays.. ou seja: por exemplo, os 4 segmentos A dos displays estão "shuntados"
Para podermos colocar numeros diferentes em cada um tens da fazer varrimento pelos 4... ou seja, acendes um display (colocas o cátodo desse display à massa e os restantes a Vcc) e metes lá o numero que queres, depois acendes o outro (cátodo deste à massa e os outros todos a Vcc), e por aí fora. Tens de fazer este varrimento rápido, de modo que não se perceba que os displays tão sempre a acender e a apagar... normalmente podes usar uma freq de 50Hz que já fica bem..
Podes também baixar o valor da resistência a colocar em cada pin de cada segmento, pois como vai estar menos tempo ligado, precisa de mais corrente, senão podes não ver nada...
Fiz-me entender?
-
Tou a perceber a ideia.. então mas a nível de ligações tenho de usar 1 só 74HC595 ? a minha confusão é como fazer acender 1 displays e apagar os outros..
P.S.: ah não tinha lido o resto do teu post.. vou ler
-
Sim, utilizas só um 74hc595
Imagina que queres meter la o numero 1234 nos quatros displays
ligas o catodo do display1 a GND, e utilizas o 74hc595 como utilizavas dantes e colocas la o numero 1
Depois, colocas o cátodo do display1 a Vcc e o cátodo do display2 a GND, e utilizas o 74hc595 para enviar o numero 2.. e por aí fora
-
Sim, utilizas só um 74hc595
Imagina que queres meter la o numero 1234 nos quatros displays
ligas o catodo do display1 a GND, e utilizas o 74hc595 como utilizavas dantes e colocas la o numero 1
Depois, colocas o cátodo do display1 a Vcc e o cátodo do display2 a GND, e utilizas o 74hc595 para enviar o numero 2.. e por aí fora
Já se está a fazer luz, apenas uma coisa.. ao fazer isto:
"ligas o catodo do display1 a GND, e utilizas o 74hc595 como utilizavas dantes e colocas la o numero 1
Depois, colocas o cátodo do display1 a Vcc e o cátodo do display2 a GND, e utilizas o 74hc595 para enviar o numero 2.. e por aí fora"
Ao colocar o cátodo no display 2 desligo o cátodo do display 1 certo? o número que tinha enviado não é apagado?
-
Esquece!
Percebida a ideia! Logo vou testar ;D Obrigadão!!
P.S.: Colocar o cátodo a VCC não vai queimar nada? :P
-
Ao colocar o cátodo no display 2 desligo o cátodo do display 1 certo? o número que tinha enviado não é apagado?
Eu já vi que percebeste, mas fica para as pessoas que leiam mais tarde.
Quando ligas apenas 1 dos cátodos a GND, desligas os outros. Se tivesses uma câmara de muitos frames por segundo ias conseguir ver que na realidade só acende 1 dos displays de cada vez. Contudo, fazes isto tão rápido de forma a que o olho humano não consiga perceber esse "piscar".
-
Ao colocar o cátodo no display 2 desligo o cátodo do display 1 certo? o número que tinha enviado não é apagado?
Eu já vi que percebeste, mas fica para as pessoas que leiam mais tarde.
Quando ligas apenas 1 dos cátodos a GND, desligas os outros. Se tivesses uma câmara de muitos frames por segundo ias conseguir ver que na realidade só acende 1 dos displays de cada vez. Contudo, fazes isto tão rápido de forma a que o olho humano não consiga perceber esse "piscar".
Pois, tenho de testar! Mas para manter o display 1 com o número que lhe dei acesso tenho então de colocar o Cátodo com VCC certo? dessa forma consigo colocar os números nos restantes mantendo os anteriores acessos.. é isto?
-
Sim.
Exemplo de 4 displays:
- Cátodo do display1 a GND e os restantes a VCC: Display1 está ligado, envias o numero que queres. Restantes displays desligados
- Cátodo do display2 a GND e os restantes a VCC: Display2 está ligado, envias o numero que queres. Restantes displays desligados
- Cátodo do display3 a GND e os restantes a VCC: Display3 está ligado, envias o numero que queres. Restantes displays desligados
- Cátodo do display4 a GND e os restantes a VCC: Display4 está ligado, envias o numero que queres. Restantes displays desligados.
Os displays vao tar a piscar, mas como é tão rápido, não vês a piscar...
-
Sim.
Exemplo de 4 displays:
- Cátodo do display1 a GND e os restantes a VCC: Display1 está ligado, envias o numero que queres. Restantes displays desligados
- Cátodo do display2 a GND e os restantes a VCC: Display2 está ligado, envias o numero que queres. Restantes displays desligados
- Cátodo do display3 a GND e os restantes a VCC: Display3 está ligado, envias o numero que queres. Restantes displays desligados
- Cátodo do display4 a GND e os restantes a VCC: Display4 está ligado, envias o numero que queres. Restantes displays desligados.
Os displays vao tar a piscar, mas como é tão rápido, não vês a piscar...
Achas que dá para ligar os 4 cátodos a pinos digitais do Arduino e se estiverem em LOW o display respectivo acende em HIGH apaga. ?
-
Não deve dar, pkausa da corrente.
Mas experimenta. Se não der, tens de usar um transístor. Mas não te esqueças de usar resistências nos segmentos dos displays!
-
Pelo esquema que esta no site da Itead é simples de se ver como se liga isso, tem um ânodo comum a cada display, metes no ânodo um transístor e metes um transístor a high, metes os dados para esse mesmo display, desligas o transístor, ligas o outro, metes os dados do outro display, basta fazeres isso a mais de 20-25 vezes por segundo(super fácil para o micro-controlador) e a persistência de visão do nosso olho faz com que pareça que estão os dois displays ligados, se ligas o anodo a um pino do Arduino vais queimar só o pino se tivers muita muita sorte, se não morre o Atmega
-
Ok, será um esquema como este então só que em vez do LCD é o Cátodo do display respectivo:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg193.imageshack.us%2Fimg193%2F4256%2Fbkcontrol.th.png&hash=79b0ce69bd37ae5948f0fd605060b3c4a8c71ffa) (http://img193.imageshack.us/i/bkcontrol.png/)
http://img193.imageshack.us/i/bkcontrol.png/ (http://img193.imageshack.us/i/bkcontrol.png/)
Vou testar..
-
Ena, finalmente decidi testar isto :P
Liguei apenas o de 2 displays sem qualquer shiftOut e directamente aos pinos do Arduino , funciona bem tirando a parte de mostrar 2 números ao mesmo tempo, neste caso 'enganar' o olho humano:
Código utilizado:
// Seven-segment LED Display
// Common ANODE pins 5 and 10
// G F + A B
// | | | | | -> pins and segments they control
// ---------
// F| A |B
// |---G---| -> segments
// E| D |C
// ---------
// | | | | | -> pins and segments they control
// E D + C DP
// Segments that make each number when lit:
// 0 => ABCDEF
// 1 => BC
// 2 => ABDEG
// 3 => ABCDG
// 4 => BCFG
// 5 => ACDFG
// 6 => ACDEFG
// 7 => ABC
// 8 => ABCDEFG
// 9 => ABCDFG
// Arduino digital pins used to light up
// corresponding segments on the LED display
#define A 4
#define B 9
#define C 8
#define D 6
#define E 7
#define F 5
#define G 2
#define T1 10 //Transistor 1
#define T2 11 //Transistor 2
// Common ANODE;
// OFF when pin is high
// and ON when pin is LOW
#define ON LOW
#define OFF HIGH
int ms = 800;
void setup() {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(T1, OUTPUT);
pinMode(T2, OUTPUT);
digitalWrite(T1, LOW);
digitalWrite(T2, LOW);
}
void loop() {
digitalWrite(T2, LOW);
digitalWrite(T1, HIGH);
zero();
one();
two();
three();
four();
five();
six();
seven();
eight();
nine();
digitalWrite(T1, LOW);
digitalWrite(T2, HIGH);
zero();
one();
two();
three();
four();
five();
six();
seven();
eight();
nine();
//Aqui é onde queria mostrar o número zero em ambos:
digitalWrite(T2, LOW);
digitalWrite(T1, HIGH);
zeroSemDelay();
digitalWrite(T1, LOW);
digitalWrite(T2, HIGH);
zeroSemDelay();
}
// 0 => ABCDEF
void zero() {
digitalWrite(A, ON);
digitalWrite(B, ON);
digitalWrite(C, ON);
digitalWrite(D, ON);
digitalWrite(E, ON);
digitalWrite(F, ON);
digitalWrite(G, OFF);
delay(ms);
}
// 1 => BC
void one() {
digitalWrite(A, OFF);
digitalWrite(B, ON);
digitalWrite(C, ON);
digitalWrite(D, OFF);
digitalWrite(E, OFF);
digitalWrite(F, OFF);
digitalWrite(G, OFF);
delay(ms);
}
// 2 => ABDEG
void two() {
digitalWrite(A, ON);
digitalWrite(B, ON);
digitalWrite(C, OFF);
digitalWrite(D, ON);
digitalWrite(E, ON);
digitalWrite(F, OFF);
digitalWrite(G, ON);
delay(ms);
}
// 3 => ABCDG
void three() {
digitalWrite(A, ON);
digitalWrite(B, ON);
digitalWrite(C, ON);
digitalWrite(D, ON);
digitalWrite(E, OFF);
digitalWrite(F, OFF);
digitalWrite(G, ON);
delay(ms);
}
// 4 => BCFG
void four() {
digitalWrite(A, OFF);
digitalWrite(B, ON);
digitalWrite(C, ON);
digitalWrite(D, OFF);
digitalWrite(E, OFF);
digitalWrite(F, ON);
digitalWrite(G, ON);
delay(ms);
}
// 5 => ACDFG
void five() {
digitalWrite(A, ON);
digitalWrite(B, OFF);
digitalWrite(C, ON);
digitalWrite(D, ON);
digitalWrite(E, OFF);
digitalWrite(F, ON);
digitalWrite(G, ON);
delay(ms);
}
// 6 => ACDEFG
void six() {
digitalWrite(A, ON);
digitalWrite(B, OFF);
digitalWrite(C, ON);
digitalWrite(D, ON);
digitalWrite(E, ON);
digitalWrite(F, ON);
digitalWrite(G, ON);
delay(ms);
}
// 7 => ABC
void seven() {
digitalWrite(A, ON);
digitalWrite(B, ON);
digitalWrite(C, ON);
digitalWrite(D, OFF);
digitalWrite(E, OFF);
digitalWrite(F, OFF);
digitalWrite(G, OFF);
delay(ms);
}
// 8 => ABCDEFG
void eight() {
digitalWrite(A, ON);
digitalWrite(B, ON);
digitalWrite(C, ON);
digitalWrite(D, ON);
digitalWrite(E, ON);
digitalWrite(F, ON);
digitalWrite(G, ON);
delay(ms);
}
// 9 => ABCDFG
void nine() {
digitalWrite(A, ON);
digitalWrite(B, ON);
digitalWrite(C, ON);
digitalWrite(D, ON);
digitalWrite(E, OFF);
digitalWrite(F, ON);
digitalWrite(G, ON);
delay(ms);
}
// 0 => ABCDEF
void zeroSemDelay() {
digitalWrite(A, ON);
digitalWrite(B, ON);
digitalWrite(C, ON);
digitalWrite(D, ON);
digitalWrite(E, ON);
digitalWrite(F, ON);
digitalWrite(G, OFF);
}
Resultado:
Dual Digit Numeric Display (http://www.youtube.com/watch?v=Henm7vXSicA#)
Não deverá ser só fazer isto pois não:
digitalWrite(T2, LOW);
digitalWrite(T1, HIGH);
zeroSemDelay();
digitalWrite(T1, LOW);
digitalWrite(T2, HIGH);
zeroSemDelay();
P.S.: Já agora, os transistores que usei (BD137) podem/devem ser substituídos por outros ou estão bem assim?
-
Bom.. já consegui acho eu...
Alterei o código e adaptei para:
// Segments that make each number when lit:
// 0 => ABCDEF
// 1 => BC
// 2 => ABDEG
// 3 => ABCDG
// 4 => BCFG
// 5 => ACDFG
// 6 => ACDEFG
// 7 => ABC
// 8 => ABCDEFG
// 9 => ABCDFG
#define A 4
#define B 9
#define C 8
#define D 6
#define E 7
#define F 5
#define G 2
#define T1 10 //Transistor 1
#define T2 11 //Transistor 2
// Pins for A B C D E F G, in sequence
const int segs[7] = { 4, 9, 8, 6, 7, 5, 2 };
// Segments that make each number
const byte numbers[10] = { 0b1000000, 0b1111001, 0b0100100, 0b0110000, 0b0011001, 0b0000010,
0b0000010, 0b1111000, 0b0000000, 0b0010000 };
// Common ANODE;
// OFF when pin is high
// and ON when pin is LOW
void setup() {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(T1, OUTPUT);
pinMode(T2, OUTPUT);
digitalWrite(T1, LOW);
digitalWrite(T2, LOW);
}
void loop() {
for (int digit1=0; digit1 < 10; digit1++) {
for (int digit2=0; digit2 < 10; digit2++) {
unsigned long startTime = millis();
for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) { //rapidez na passagem dos números/ incremento
lightDigit1(numbers[digit1]);
delay(5);
lightDigit2(numbers[digit2]);
delay(5);
}
}
}
}
void lightDigit1(byte number) {
digitalWrite(T1, HIGH);
digitalWrite(T2, LOW);
lightSegments(number);
}
void lightDigit2(byte number) {
digitalWrite(T1, LOW);
digitalWrite(T2, HIGH);
lightSegments(number);
}
void lightSegments(byte number) {
for (int i = 0; i < 7; i++) {
int bit = bitRead(number, i);
digitalWrite(segs[i], bit);
}
}
Resultado:
Segment Dual Digit Test II (http://www.youtube.com/watch?v=N0fnkYh2sjc#)
A única coisa que me está a fazer confusão, mas que tb não é nenhum drama, é a passagem do 6 para o 7 (no 2º display) parece que tem uma paragem... mas já revi e revi os ciclos e parece estar tudo Ok.. ::)
-
;D ;D ;D ;D ;D :o :o LOL
Por culpa das horas a que fiz isto e do sono associado.. nem reparei que passada do 4 para o 6.. :) Resolvido. 8)
-
Já agora, para alguém interessado em fazer algo parecido, aqui fica o resultado para o de 4 dígitos (ÂNODO COMUM):
Segment 4 Digit Display (http://www.youtube.com/watch?v=4x6pYL6VH7Y&feature=youtu.be#)
Passo a passo aqui: https://sites.google.com/site/grcbyte/electronica/arduino/segment-4-digit (https://sites.google.com/site/grcbyte/electronica/arduino/segment-4-digit)
Código usado:
// Seven-segment LED Display
// Common ANODE pins 6, 8, 9, 12
// Segments that make each number when lit:
// 0 => ABCDEF
// 1 => BC
// 2 => ABDEG
// 3 => ABCDG
// 4 => BCFG
// 5 => ACDFG
// 6 => ACDEFG
// 7 => ABC
// 8 => ABCDEFG
// 9 => ABCDFG
// Arduino digital pins used to light up
// corresponding segments on the LED display
#define A 4
#define B 9
#define C 8
#define D 6
#define E 7
#define F 5
#define G 2
#define T1 10 //Transistor 1
#define T2 11 //Transistor 2
#define T3 12 //Transistor 3
#define T4 3 //Transistor 4
// Pins for A B C D E F G, in sequence
const int segs[7] = {4, 9, 8, 6, 7, 5, 2};
// Segments that make each number
const byte numbers[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101,
0b1111101, 0b0000111, 0b1111111, 0b1101111 };
// Common ANODE;
// ON when pin is high
// and OFF when pin is LOW
//#define ON HIGH
//#define OFF LOW
void setup() {
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(F, OUTPUT);
pinMode(G, OUTPUT);
pinMode(T1, OUTPUT);
pinMode(T2, OUTPUT);
pinMode(T3, OUTPUT);
pinMode(T4, OUTPUT);
digitalWrite(T1, LOW);
digitalWrite(T2, LOW);
digitalWrite(T3, LOW);
digitalWrite(T4, LOW);
}
void loop() {
for (int digit1=0; digit1 < 10; digit1++) { // DISPLAY 1
unsigned long startTime = millis();
for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) { //rapidez na passagem dos números/ incremento
lightDigit1(numbers[digit1]);
delay(5);
}
}
for (int digit2=0; digit2 < 10; digit2++) { // DISPLAY 2
unsigned long startTime = millis();
for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) { //rapidez na passagem dos números/ incremento
lightDigit2(numbers[digit2]);
delay(5);
}
}
for (int digit3=0; digit3 < 10; digit3++) { // DISPLAY 3
unsigned long startTime = millis();
for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) { //rapidez na passagem dos números/ incremento
lightDigit3(numbers[digit3]);
delay(5);
}
}
for (int digit4=0; digit4 < 10; digit4++) { // DISPLAY 4
unsigned long startTime = millis();
for (unsigned long elapsed=0; elapsed < 400; elapsed = millis() - startTime) { //rapidez na passagem dos números/ incremento
lightDigit4(numbers[digit4]);
delay(5);
}
}
for (int digit=0; digit < 10; digit++) { // DISPLAY 1 + 2 + 3 + 4
unsigned long startTime = millis();
for (unsigned long elapsed=0; elapsed < 500; elapsed = millis() - startTime) { //rapidez na passagem dos números/ incremento
lightDigit1(numbers[digit]);
delay(5);
lightDigit2(numbers[digit]);
delay(5);
lightDigit3(numbers[digit]);
delay(5);
lightDigit4(numbers[digit]);
delay(5);
}
}
}
void lightDigit1(byte number) {
digitalWrite(T1, HIGH);
digitalWrite(T2, LOW);
digitalWrite(T3, LOW);
digitalWrite(T4, LOW);
lightSegments(number);
}
void lightDigit2(byte number) {
digitalWrite(T1, LOW);
digitalWrite(T2, HIGH);
digitalWrite(T3, LOW);
digitalWrite(T4, LOW);
lightSegments(number);
}
void lightDigit3(byte number) {
digitalWrite(T1, LOW);
digitalWrite(T2, LOW);
digitalWrite(T3, HIGH);
digitalWrite(T4, LOW);
lightSegments(number);
}
void lightDigit4(byte number) {
digitalWrite(T1, LOW);
digitalWrite(T2, LOW);
digitalWrite(T3, LOW);
digitalWrite(T4, HIGH);
lightSegments(number);
}
void lightSegments(byte number) {
for (int i = 0; i < 7; i++) {
int bit = bitRead(number, i);
digitalWrite(segs[i], bit);
}
}