Go Down

Topic: Duvidas sobre COL-ROW scanning (Read 3 times) previous topic - next topic

Bruno P. Gonçalves

Ola pessoal.

Procurei bastante sobre isso, e sei que existe bastante conteudo, mas ainda assim nao estou conseguindo um simples matrix 2x2 funcionar.

Não consigo pelo seguinte, não sei se eu vou conseguir explicar. Supondo que eu tenha

         D10        D11

D08     0,0         0,1

D09     1,0         1,1


Se eu mandar um pulso D9+D11, acendo o led 1,1. Se eu tento acender o 0,0, eu acabo acendendo o 0,1 também, pois ja tem pulso do D11, entenderam?

Estou pulando alguma coisa? acho que sim, por que ainda não consegui entender como vou fazer isso funcionar =)

Valeu gente!

Radames

mande o esquema elétrico desta montagem de leds ai
não consegui entender esse seu diagrama, existem transistores na linhas? colunas/

DiegoWA

Olá Bruno!

Acho que entendi o que tu queres fazer. Os caras da NerdKit tem uma explicação bacana que pode ser a tua solução. Procure no google por nerd kit + ledarray2, deve ser o 1 link disponível.

O esquema é colocar 2 leds invertidos como nessa figura onde diz LED Wiring Plan.

A explicação simples é, quando tu tens uma diferença de potencial entre 2 pinos do uControlador (por exemplo um pino 0 em HIGH e o pino 1 em LOW) e um LED para ligá-los. Veja a figura acima e imagine o pino 0 ligado na coluna 0 e o pino 1 na linha 0.

Se o Led estiver ligado de forma a ser polarizado pino + (anodo) ligado no pino onde temos a tensão HIGH e o outro pino do Led - (catodo) em LOW teremos um caminho para a corrente e dessa forma o Led deve acender (Led no topo a esquerda). Quando invertemos o pino 0 de HIGH para LOW e o pino 1 de LOW para HIGH o outro Led conectado na mesma linha e coluna (mas de forma invertida) será polarizado.
Leia a descrição no texto no link que mandei onde diz "Led Wiring Plan" ta bem claro o funcionamento.

Bom, espero ter ajudado. Se não for nada disso... hahahah sorry!

Abraço, Diego

PS. Não deu pra colocar o link pro site e pra figura direto pq é o 1 post.

Bruno P. Gonçalves

Diego, muito legal ser seu primeiro post e já me ajudando, muito legal =)

Sobre sua dica, nao conhecia essa técnica, aparentemente vc consegue dobrar sua matriz de led sem componente nenhum a mais, só com técnica de software, muito bom saber, mas se minha matrix tiver mais de 2 colunas e 2 linhas, ai ja volto a ter meu problema outra vez, pois vai haver polaridade intercalada.

Radames, segue meu esquema:



Tirei isso desse artigo:
http://arduino.cc/en/Tutorial/RowColumnScanning

Mas em pequena escala.

Estou fazendo 2x2 para saber como controlar com essa técnica, mas meu projeto final consiste em uma matriz 25x7:

http://bl-tyrone.student.utwente.nl/~RuudBijnen/electronics/basicschemazonderdrivers.png

Valeu pessoal =)

fabio_h

blz, procure na internet por POV(persistence of vision) arduino, basicamente para ligar qualquer led numa array de ex 3x3
[font=Courier]a1 a2 a3
b1 b2 b3
c1 c2 c3[/font]
voce faz uma varredura, pega linha "a" e liga todos os leds da coluna,
desliga a coluna "a" e todas a linhas, liga coluna "b" e todas as linhas...
e faz esse ciclo no minimo 25 vezes por segundo  e tera a imagem que quiser usando comandos for em cascata para linha e coluna.
no link da sua ultima mensagem voce vai ver no codigo uma funcão chamada "refresh"

um exemplo de codigo:


line[3]:={pino2,pino3,pino4}
row[3]:{pino5,pino6,pino7}
imagem[3][3]{{1,0,0},
                     {0,1,0},
                     {0,0,1}}



refresh:
for linha:=1 to 3{
 digitalwrite(line[linha],on)
   for coluna:=1 to 3{
     if imagem[linha][coluna]=1{
       digitalwrite(row[coluna],off)}
   }
   delay(10)    
   digitalwrite(line[linha],off)
   digitalwrite(coluna[1],on)
   digitalwrite(coluna[2],on)
   digitalwrite(coluna[3],on)
}
   
*sei que o vetor começa  em 0, mas fiz isso para que outras pessoas entendam melhor o codigo

essa tecnica de aumentar o numero de led para poucos pinos do arduino chama-se chalieplex


espero ter ajudado
                   


Bruno P. Gonçalves

Poxa, desde a hora que voce postou que eu to tentando, e nada ainda, o pior que meus shift register estao chegando e eu nao vou saber o que fazer com eles uaehuhae

OOOOO raios :P

Mas nao vou desistir, vou continuar aqui =)

Italo Lima

#6
Jul 30, 2010, 07:04 am Last Edit: Jul 30, 2010, 07:11 am by italoraony Reason: 1
fabiohbm007 o CharliePlex é uma técnica um pouco diferente de multiplexação. Com o CharliePlex, vc consegue controlar n(n-1) LEDs usando n pinos. Com essa matriz, n?2 com 2n pinos.

Bruno, a técnica é bem mais simples do que parece. O problema que aconteceu com vc é que, ao acender dois LEDs (o 00 e o 11), um terceiro acende de lambuja ( o 10). Como vc notou, isso aconteceu porque o d11 tava alto. Como vc resolve? Ao invés de acender o 00 e 11 ao mesmo tempo, acenda um de cada vez. Se vc fizer isso BEM rápido (umas 60 vezes por segundo*), o seu olho nem vai perceber que vc está acendendo só um deles por vez.

*(fabiohbm007 lembra que é necessário duplicar a taxa de amostragem - nesse caso, uns 50~60 hz)

Italo Lima

Só para complementar sobre CharliePlexing: http://en.wikipedia.org/wiki/Charlieplexing

Bruno P. Gonçalves

Italo, qual o nome que eu posso procurar por mutiplexação? eu procurei por multiplexed led display, e só veio os de segmento.

Uma coisa que eu fiquei na duvida, é que se minha matrix for grande de mais, o laço (refresh rate) vai acabar sendo menor, podendo até perder o efeito desejado.

Ainda preciso procurar mais os códigos, por que só acho código que fica um ponto ligado (aquele do pong ou acelerometro)

Bruno P. Gonçalves

Italo, sua dica foi primordial. Mas o software ainda nao ficou legal não, to achando meio complicado, preciso pensar direitinho como fazer para manter um valor por um tempo, e mudar num outro tempo. Nao pode haver interrupção do loop, se não o matrix fica desligado. ô falta faz um thread :P

Segue o código, vou tentar melhora-lo e posto outro em seguida. To pensando em aproveitar pra fazer minha primeira lib ;)

Code: [Select]

long lastDisplayChange = 0;
int changeCount = 0;

const int row[2] = { 9, 10 };
const int col[2] = { 6, 7 };

int pixels[2][2] = {
 {HIGH, HIGH},
 {HIGH, HIGH}
};

void setup()
{
 Serial.begin(9600);
 
 // Inicializa as portas/leds
 for (int thisPin = 0; thisPin < 2; thisPin++)
 {
   // initialize the output pins:
   pinMode(col[thisPin], OUTPUT);
   pinMode(row[thisPin], OUTPUT);
 
   // turn all off  
   digitalWrite(col[thisPin], HIGH);
 }
 
 // Mostra a inicializacao
 Serial.println("Started");
}

void loop()
{
 if ((millis() - lastDisplayChange) > 600)
 {
   lastDisplayChange = millis();
   
   changeCount++;
   if(changeCount > 2)
   {
     changeCount = 0;;
   }
   
 }
 
 switch(changeCount)
 {
   case 0:
     pixels[0][0] = LOW; pixels[0][1] = HIGH;
     pixels[1][0] = HIGH; pixels[1][1] = HIGH;
     break;
     
   case 1:
     pixels[0][0] = HIGH; pixels[0][1] = LOW;
     pixels[1][0] = LOW; pixels[1][1] = HIGH;
     break;
     
  case 2:
     pixels[0][0] = HIGH; pixels[0][1] = HIGH;
     pixels[1][0] = HIGH; pixels[1][1] = LOW;
     break;
 }
 
 refreshScreen();
}

void refreshScreen() {
 // iterate over the rows (anodes):
 for (int thisRow = 0; thisRow < 2; thisRow++) {
   // take the row pin (anode) high:
   digitalWrite(row[thisRow], HIGH);
   // iterate over the cols (cathodes):
   for (int thisCol = 0; thisCol < 2; thisCol++) {
     // get the state of the current pixel;
     int thisPixel = pixels[thisRow][thisCol];
     // when the row is HIGH and the col is LOW,
     // the LED where they meet turns on:
     digitalWrite(col[thisCol], thisPixel);
     // turn the pixel off:
     if (thisPixel == LOW) {
       digitalWrite(col[thisCol], HIGH);
     }
   }
   // take the row pin low to turn off the whole row:
   digitalWrite(row[thisRow], LOW);
 }
}

Italo Lima

Bruno, com o arduino rodando na faixa dos mhz, vc vai precisar de um matriz beeeeeem grande para diminuir a refresh rate a um nivel indesejavel.

Para quase tudo que vc tem sentido falta do multithread, vc pode usar as interrupcoes (interrupts). Da um lida mais a fundo sobre isso, e vc vai ver que resolve o problema de um codigo mais pesado.

Bruno P. Gonçalves

Buenas, meus shifts chegaram, 595, montei os exemplos com 2 shifts e rodou blz, mas confeso que fiquei com medo de montar a matrix que passei.

Ainda nao entendi como funciona os shifts, achei muito loco com 3 portas ele fazer tudo aquilo. Seria muito pedir uma explicação de como funicona? vi que nao tem muito haver com a forma que eu tava fazendo.

Outra coisa, seria de mais, numa olhada rapida, dizer que esse esquema [1] vai funcionar? ou tem algo absurdo? nunca trabalhei com os shifts, fiquei meio preocupado, estou até pensando em montar um 5x7 pra testar primeiro, o que acham?


[1] - http://bl-tyrone.student.utwente.nl/~RuudBijnen/electronics/basicschemazonderdrivers.png

Bruno P. Gonçalves

#12
Jul 31, 2010, 08:25 pm Last Edit: Aug 01, 2010, 12:15 am by scorninpc Reason: 1
Poxa, achei um site [1] muito legal, e muito bem explicadinho, varias coisas. Achei uma aulinha [2] sobre shift-register la, consegui entender certinho como funciona, muito legal esse CI hem? Estou mandando a versão impressa [3] do artigo, por que pelo site, ele tava comendo algumas palavras, mas ta valendo =)))

Mesmo assim, ainda nao consegui entender como controlar tantos leds, se sem os shift eu ja achei complexo, com o shift é mais doido ainda, pq preciso prever o que fazer antes de enviar os binarios, bem diodo =) mas to chegando la ;)

[1] - http://www.newtoncbraga.com.br/
[2] - http://www.newtoncbraga.com.br/index.php/cursos-on-line/52-eletronica-digital/102-licao-11-como-funcionam-os-registradores-de-deslocamento-shift-registers.html
[3] - http://www.newtoncbraga.com.br/index.php/cursos-on-line/52-eletronica-digital/102-licao-11-como-funcionam-os-registradores-de-deslocamento-shift-registers.html?tmpl=component&print=1&page=


EDITED: Vi e acho que vai fucionar sim, entendi como funcionaria, eu mandaria os bits dos de cima (colunas),  e faria o scan das linhas, então eu teria 25/8 iterações nas colunas, e 25 iterações nas linhas. Só estu achando estranho ele usar uma porta da linha para servir de coluna, isso nao vai me dar uma dorzinha de cabeça na hora de programar não?

Bruno P. Gonçalves

Pessoal, quando se usa N ou mais shift register, ao invés de mandar 8bits, eu mando (8*n)bits? Como controlar 2 shifts se e o latch é o mesmo? Pensei em separar os pinos da linha com os da coluna, deixa o da linha separado, seria mais fácil de controlar eu acho. Alguma sugestão?

Valeu!

Osias Neto

Bruno,

no esquema que você quer montar, você envia todos os dados serialmente (estou com preguiça de ver se primeiro é do mais, para o menos significativo ou vice-versa), então você só tem que lembrar que você enviará primeiro os bits na ordem das ligações das portas e dos shift registers, então ao dar o sinal de latch em todos ao mesmo tempo, você simplesmente irá atualizar todas as saídas, então para usar assim, você só tem que seguir esta rotina sempre: envia todos os bits (mesmo os que não mudarão), e atualiza as saídas.

No caso é o que você disse mesmo, manda 8*n bits toda a vez.

Este método é bastante usado, pois controlando todos simultaneamente, você economiza algumas linhas de programação alem de pinos no controlador.

Quanto ao caso de se irá funcionar ou não o projeto completo, eu tenho minhas dúvidas quanto à tensão... mas não custa tentar, o fato é que você certamente irá precisar de uma fonte de 5V externa com corrente de no mínimo 800mA.

Só mais uma coisa, um fato curioso deste circuito, quanto mais leds da mesma coluna você acende, menor é a corrente de consumo :)

Go Up