Código Arduino para CI 74HC595 (deslocador de bits)


#1

Ola pessoal, esse é meu primeiro post e gostaria de uma ajuda.
Bom, sou um pouco novo com Arduíno e estou lendo e estudando muito sobre ele.
Estou tentando fazer uma matriz 8x8 de led, usando 2 74HC595 e um ULN2803 para poder usar o minimo de portas do Arduíno.
Meu problema é no código, sei usar com uma linha apenas e uso shiftOut.
Como faço para poder mandar os sinais para toda a matriz? Como criar uma variável do tipo matriz e ainda usar esse o shiftout.
Alguém tem algum código de de fácil entendimento que eu posso usar nessa matriz 8x8 e num futuro fazer o cubo 8x8x8…
Segue abaixo um exemplo de código que usei só para teste.

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);  
}
void loop () {
  digitalWrite(5, LOW);
  shiftOut(4, 6, LSBFIRST, 0b00000011);
  digitalWrite(5, HIGH);
  delay (500);
}

Obrigado.
Daniel Lugão


#2

Olá @dmlugao, usar esses deslocadores de bits é opção sua para aprender? Pergunto pois o mais aconselhável é utilizar um driver de LED. O mais usual é o MAX7219, inclusive já tem conjuntos completos da matriz de LED’s junto com este driver, já que ele é o mais comum neste tipo de tarefa, como este, por exemplo e muitos tutoriais de fácil entendimento, nesse tutorial, você já terá uma idéia de como criar o seu cubo, é só prestar atenção no chaining.

Segunda coisa é sobre o seu projeto: Os deslocadores estão corretamente conectados? Como desmonstrado no Playground?

Por fim, vamos dar uma olhada no seu código… Qual o sentido de declarar a pinagem do deslocador, se você está colocando o número dos pinos literalmente? Ora, se você declara que:

int latchPin = 5;
int clockPin = 6;
int dataPin = 4;

Então este código:

void loop () {
  digitalWrite(5, LOW);
  shiftOut(4, 6, LSBFIRST, 0b00000011);
  digitalWrite(5, HIGH);
  delay (500);
}

Deveria ser escrito da seguinte forma:

void loop () {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, 0b00000011);
  digitalWrite(latchPin, HIGH);
  delay (500);
}

Caso contrário você está apenas fazendo o programa aumentar de tamanho, tomando memória desnecessariamente, por sorte, acho que os pinos são OUTPUT por padrão, caso contrário, essa sintaxe causaria mais problemas.

Sobre a função de shiftOut, em geral, você não precisa declarar a ordem dos bits, creio que, o LSB (Least Significant Bit) é o padrão da função.

Se o teu código está funcionando corretamente, apesar de precisar de otimização, percebo que o problema é óbvio: Uma matriz é composta por linhas e colunas, não há em teu código, um deslocador da linha/coluna, ele escreve sempre na linha/coluna 0, acendendo os dois últimos LED’s (duas linhas/colunas), ou seja, basicamente você está fazendo uso de apenas 1 deslocador de 8 bits, que escreve de 0 a 255 (0x0 a 0xFF/0b0 a 0b11111111), o outro, que deveria deslocar a linha, você não está utilizado, logo, o dado que você deveria passar é um valor de 16 bit, onde os primeiros 8 bits devem deslocar a linha/coluna e os 8 bits restantes devem deslocar a linha/coluna (dependendo da configuração do projeto).


#3

Ola @sksdutra, tudo bem?
Então, estou utilizando o 595 por questões de aprendizado mesmo, assisti alguns videos no youtube e vi que o pessoal usa muito ele. como disse estou começando, mas já tenho um pequeno conhecimento, meu problema mesmo é quanto a linguagem.
O que mandei foi apenas um teste, e sim ele funciona perfeitamente, obrigado ate por ajudar a otimizar. Mas ele não é para a matriz e sim para uma linha. A questão é como vou usar em uma matriz, como deveria escrever esse código para a matriz? Lembrando que vou usar 2 595 e 1 ULN2803, Um seria para a coluna e o outro para a linha, pois quero utilizar o menor numero de portas do Arduíno. Esse código que mandei é em binário e queria ate saber o que seria mais fácil e melhor para o Arduíno: Binário, Hexa, Decimal???
Obrigado mais uma vez. e os link que me passou li e realmente é muito mais fácil. Porem quero dificultar e tentar usar esses 595.
Valeu.


#4

Ponto 1: Sobre o ULN2803, eu diria que ele é ainda menos recomendável para esse fim que o 74HC595, apesar de ter 8 pinos para saída e 8 para entrada, ele é um array de transistores que serve como “driver” para alta demanda de voltagem, ou seja, você pode usar como um “driver” simples para motores, por exemplo, apesar de que para esse fim, é mais inteligente usar um driver de motor de fato ao invés de ULN.

Se você realmente quer dificultar numa matriz multidimensional, é melhor multiplexar mais um 74HC595 para controlar o eixo z ao invés de usar esse array de transistores.

Ponto 2: Binário, hexadecimal ou decimal, não importa, são meras representações numéricas, eu me sinto mais confortável fazendo notações numéricas literais como hexadecimal, eu creio que o binário é interessante para fins de depuração, porque você consegue visualizar claramente que bit está setando ou não, no entanto, devido à largura da notação, acho pouco prático para um código de produção, afinal, é mais rápido, legível e melhor escrever 0xFF que escrever 0b11111111.

Ponto 3: O código, se funciona perfeitamente e o projeto está corretamente montado com os dois 74HC595 em um chaining correto, então, basicamente, você tem um deslocador de 16 bit agora e não um deslocador de 8 bit, logo a única alteração que você precisa fazer em teu código é:

shiftOut(dataPin, clockPin, LSBFIRST, 0b0000000100000011);

Os primeiros 8 bits estão dirigindo a linha e os 8 restantes estão dirigindo a coluna. O resultado esperado é que os 2 últimos LED’s da 2ª linha acendam.


#5

@sksdutra, cara vc ajudou demais mesmo. nuuu… deu uma clareada nas ideias aqui. muito obrigado. Vou fazer os testes aqui e posto os resultados quando terminar.
Quanto a questão ser binaria, hexa ou decimal, realmente não sabia que para o Arduíno tanto faz, e sim o binário ele é mais didático, por isso estou usando ele, pois assim vejo o que realmente estou fazendo. Em seguida vou treinando aos poucos escrever em Hexa. Mas obrigado pela aula.