Otimizando pinagem do Arduino - 3 pinos p/ 30 LEDs

Boa noite gente!

Tenho visto bastante gente comentando a respeito de "aumentar" o número de pinos de uma Arduino. Pois bem, vi no EfeitoNerd um projeto para controlar 30 LEDs com 3 pinos do Arduino, usando 4 CIs 595 (74HC595N, para a versão mais comum).

O link do projeto, com esquemas e código: http://www.efeitonerd.com.br/2012/02/ampliar-saidas-do-arduino.html

Apesar de no projeto, o Felipe Couto usar resistores de 220R, usei os de 330 por serem os únicos disponíveis no estoque =D. 

Foto do que eu montei:

Um vídeo:

https://www.youtube.com/watch?v=cK_iL91cfZk

Um CI queimou... Só acendem 24 LEDs!

Não estou querendo levar crédito por um projeto alheio, apenas compartilhando uma ideia boa que é de interesse de pessoas do fórum.

Valeu

Exibições: 6206

Responder esta

Respostas a este tópico

Euclides, eu fiz algo parecido que no código eu envio uma função dizendo quem deve apagar e quem deve acender... ficou muito simples pro programador!

controla 24 LEDs... 

Exemplo:


acionaPortas("000000000000000000000000"); //<== apaga todos

acionaPortas("010000000000000000000111"); //<== acende o segundo e os três últimos LEDs... 

Isso ajudou muito nos meus projetos com várias portas de saída... quero fazer o mesmo pra entradas... mas ainda não finalizei! vou usar o 74HC138... acho que é isso! hahahah Já usou?

Faz tempo...olha a data da foto: http://labdegaragem.com/photo/demux-32?context=user

Uma outra forma de pensar em entradas é usando aqueles circuitos que tem dentro dos teclados. A idéia seria capturar todas as entradas e guardar em um array tambem e a medida que for solicitado leituras as posições das portas virtuais, o Arduino poderia colher e retornar o conteúdo das posições deste array.

Sérgio... muitas dúvidas heim!! :D... bem qto a programação, tentei fazer de forma fácil e intuitiva o código.... vc já tem algo funcionando? 

Em resumo, as funções que eu fiz permitirão vc controlar seu cubo sim... de forma fácil...

Veja o código abaixo:

//Se gostou e vai usar, mande um SALVE p mim vai! eduardo@gruponogues.com.br ;)
//Eduardo Nogueira

int latchPin = 8; //conectar ao pino 11 no chip : ST_CP
int clockPin = 12;//conectar ao pino 12 no chip : SH_CP
int dataPin = 11;//conectar ao pino 14 no chip : DS
String strEstadoPinos = "0000000000000000";
byte maxPin = 16;//se tiver mais CI´s, basta informar aki a qtde total de portas... (1 CI = 8 portas) e adicionar no stringão acima

void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);

digitalWrite(latchPinLer,1);
digitalWrite(clockPinLer,0);

Serial.begin(9600);
stringToChip(strEstadoPinos);
}

void loop() {
/*
stringToChip("0000000000000000"); //isso apagaria todos os LEDS
delay(200);
stringToChip("1111111111111111"); //isso acenderia todos os LEDS!
delay(200);
acionaPino(12, 1); //isso acenderia o LED do pino 12, ou seja, CI numero 2, porta 4.... efeito cascata
//o acionamento de um pino não intervem nos outros !!!
*/

//exemplos de visualização
for(int i = 1; i <= 16; i++){ acionaPino(i, 1); delay(5); acionaPino(i, 0); delay(5); } for(int i = 16; i > 0; i--){
acionaPino(i, 1);
delay(5);
acionaPino(i, 0);
delay(5);
Serial.println(i);
}
delay(100);
}

void acionaPino(int pino, byte estado){
//identifico qual LED quer acender, localizo a posição dele no stringão e faço o replace
if (pino <= 0) pino=1; if (pino > maxPin) pino=maxPin;
String strIni = strEstadoPinos.substring(0,pino-1);
String strFim = strEstadoPinos.substring(pino);
strEstadoPinos = strIni + (String)estado + strFim;
stringToChip(strEstadoPinos);
}

void stringToChip(String portas){
//inicio a transmissão
digitalWrite(latchPin, LOW);
byte pinState;
for (int i= maxPin-1; i>=0; i--) {
//digo que vai mais um bit
digitalWrite(clockPin, 0);
if(portas.substring(i,i+1) == "1")
pinState= 1;
else
pinState= 0;
//determino se o bit está ON ou OFF (1 ou 0)
digitalWrite(dataPin, pinState);
//digo que o bit foi enviado
digitalWrite(clockPin, 1);
//limpo o canal! kkkk
digitalWrite(dataPin, 0);
}
//fecho a transmissão
digitalWrite(latchPin, HIGH);
//pronto... aqui foram os bit em formatos de byte!
}

 

Acho que deve servir p outros tb... 

 

Bem, para rodar com 64 Leds, mude as linhas:

String strEstadoPinos = "0000000000000000";
byte maxPin = 16;

para:

String strEstadoPinos = "0000000000000000000000000000000000000000000000000000000000000000";
byte maxPin = 64;

Isso permitira vc a usar os 64 Leds... assim a animação seria feita de forma mais tranquila... pode-se até adaptar a função pra receber o numero da linha ou coluna p facilitar... vou pensar nisso pra vc... ;)

Blz.... vou precisar de um help seu na montagem do meu depois, blz?

Aê! Compartilhar é o que há! :D

Abraços!

acho que vc pode me ajudar.. ao invés de leds eu quero colocar piezo. quero montar um bateria eletronica caseira...

obrigado desde já.. Deus te abençõe

Não Sei se você tem interesse  em  controlar os leds individualmente,  você pode usar o Ci

Display Driver LED (8-Digit) - MAX7219CNG

 São vendidos na sparkFun, com ele você usa 4 portas do Arduino e controla uma matriz de leds  8x8 ou 64 leds individualmente, um outro esquema seria, você controlar 8 displays de 7-Segmentos apenas com um CI. 

Felipe do BackTrack, no ML tem estes por uns R$13!

http://produto.mercadolivre.com.br/MLB-223869401-max7219-driver-de-...

Valeu

Este CI não mantem o sinal constante para cada saída certo? Ele faz uma varredura entre linhas e colunas para manter o sinal (imperceptível ao olho, mas eletrônicamente o segmento/pino sofre refresh durante o processo), ou estou enganado???? Este CI não tem 8 x 8 pinos (64 portas) de saídas. É um quebra galho para enganar os olhos.

Todo cubo de led ou semelhante usa essa técnica

Sim, nada contra a técnica. Mas ela só deve ser usada nos casos que a "oscilação" de sinal não interfira com a necessidade de se manter uma constante na saída, o que costuma ser o caso das saídas do Arduino.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço