Duvidas sobre COL-ROW scanning

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!

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

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.

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:

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 =)

blz, procure na internet por POV(persistence of vision) arduino, basicamente para ligar qualquer led numa array de ex 3x3
a1 a2 a3
b1 b2 b3
c1 c2 c3
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

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 :stuck_out_tongue:

Mas nao vou desistir, vou continuar aqui =)

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)

Só para complementar sobre CharliePlexing: Charlieplexing - Wikipedia

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)

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 :stuck_out_tongue:

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

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

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.

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

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 :wink:

[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?

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!

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 :slight_smile:

Bem, o projeto final ficou assim:

http://picasaweb.google.com/scorninpc/ScornInLed#5500797634401570546

e a placa assim:

http://picasaweb.google.com/scorninpc/ScornInLed#5500797632244553378

Vou tentar confecciona-la hoje, vai ser minha primeira confecção 2 faves, não sei se vai dar muito certo.

Então, é do mais para o menos mesmo, pelos meus testes, e confirmando, tanto faz o ultimo bit controlar a primeira coluna, por que vai tudo num binário só, então tanto faz né.

Sobre a alimentação externa, eu já havia desconfiado, mas ai é duro, tudo que vou fazer preciso testar com 2 fontes. Quais os riscos de eu usar os 5v do arduino? Simplesmente não funcionar e esquentar o regulador?

Uso uma fonte de 12v 1000mA, se eu colocar um regulador na placa, e usar a mesma fonte, tem risco é? 100mA para o arduino, sobra 900mA para a placa, sei la :stuck_out_tongue:

Ja vi que vou ter muito trabalho no código, e eu no começo de tudo achei que o código seria o mais simples, mas to vendo que o código pega forte também =)

Como já disse uma vez, não é nem um pouco aconselhável trabalhar em cima da especificação, se o regulador do Arduino fornece 100mA, tente trabalhar no máximo com uns 80mA, no caso deste projeto, a corrente de consumo será por volta 600 a 900mA então sem chances usar a alimentação do Arduino.

Com esta fonte que você tem , você pode montar um regulador com LM317 ou algum similar (LM350, LM117, LM 338, etc) que fornece uma corrente legal.

Certo, vou providenciar o LM, mas por enquanto vou usando outra fonte que tenho aqui mesmo então.

Poxa, por enquanto, obrigado mesmo ao pessoal que ajudou, e muito hem =D

Vou queimar a placa, dai volto as duvidas ^^

Ai pessoal, adicionei novas fotos da confecção da placa. Teve algumas falhinhas, por que na queima do primeiro lado, acho que o outro nao ficou coberto 100%, mas coisa simples, da pra resolver muito facil, e teve outras que ficou meio grosinha pq passei a caneta pra retocar, mas só por estética =)

http://picasaweb.google.com/scorninpc/ScornInLed

Do mais, ficou uns 97% bom, o que tinha mais medo era de nao acertar os lados, mas consegui.

Não vou poder furar hoje, pq fui furar para dar a medida para o outro lado, minha broca ja "estufou" a placa, entao vou pedir brocas novas para nao haver erro.

Volto a dar noticias, e assim que monta-la, eu posto os arquivos do eagle e tudo mais =)

êee brunão, ta ficando bom a bagaça.....boa sorte!!!