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

Olá, para mim não ficou claro se vc. pode controlar (acender) somente 1 LED de cada vez ou se pode selecionar grupos de LEDs ou diversos ao mesmo tempo (podendo manter alguns ligados e outros desligados e mudar o status de qualquer 1 ou diversos deles a qualquer momento).

O código que faz o controle dos LEDs é esse fragmento: 

int tempo = 200;
for (int i=1; i<=30; i++){
   shiftWrite(i);
   delay(tempo);
}
Sendo que na segunda "piscada", que é mais rápida, usa-se um tempo diferente para o delay. Veja que cada LED está sendo usado como independente. Para mapear os registradores de deslocamento, use isso:
void shiftWrite(int pin){
  int qtdRegistradores = 4;
Resumidamente é isso, você tem as rotinas descritas corretamente no site do projeto, que faz a conversão de bits e etc. Valeu

No código disponível no blog, não é possível fazer um controle exato individual de LEDs.

Já estou modificando a lógica e fazendo uma biblioteca pra isso. Ai usaria como se fosse o digitalWrite mesmo, passando parâmetro HIGH / LOW.

Devido a tempo, to indo devagar. Seria legal se alguém tentasse desenvolver isso, pq seria ótimo pra gente!!!! Mas to seguindo, e quando terminar (se conseguir tbm... hehehehe acredito que sim!) posto pra galera.

Abraços!

Estou trabalhando nisso, em criar as portas digitais virtuais de 20 em diante usando 74HC595

Estou apenas procurando a melhor forma de modificar o digitalWrite ou sobrescrever, ou mesmo mudar nas bibliotecas da IDE.

Para  que isso funcione transparente é necessário criar um shield que sobreponha os conectores físicos do Arduino (2009/UNO/Mega/etc...) e replique na próxima camada os pinos extras. O Arduino tem um "engano de projeto" pois os pinos analógicos "nascem" do "centro" para as bordas, mas os digitais "nascem" das bordas para o centro. Aí "acrescentar" portas cria um problema sério de espaço e direção para novas expansões. Para resolver isso bastaria que a biblioteca "invertesse" logicamente os pinos NNN (qualquer número de portas) até o 0 (porta zero), para as digitais. tambem que as máscara que se usa para pintar os números da placa fossem numericamente invertidas. Com isso poderia se ter shields com linhas de números de saídas/entradas compatíveis numericamente e posicionalmente com as versões antigas (quando este "engano" for corrigido) assim como as novas portas estariam na mesma direção (sentido crescente), podendo com isso instalar-se shields de qualquer Arduino em qualquer Arduino (desde que se respeitassem os números de portas necessários para o shield). Outro "engano" é não se ter definido por hardware a existência de portas de Interrupções, ou seja; sinais que pudessem ser enviados ao processador para interromper o processamento e desviasse para outra instrução (ou grupos de instruções) diferentes dentro do programa (quem sabe um dia...isso seria interessante para controles de fim de curso por exemplo). Espero que tenham entendido. Senão eu desenho. T+

Euclides, concordo com voce sobre o "engano de projeto" da localização dos pinos de I/O, a coisa poderia ter sido melhor implementada. Mas pensando bem, "enfileirar" os pinos só torna a placa comprida, a solução usada no MEGA tem pelo menos a vantagem de ganhar espaço físico. Porém em relação a falta de um pino de interrupção não. O pino 2 do arduino pode ser usado para interrupção de hardware e os pinos analogicos para os Timers 0, 1 e 2.

A IDE do arduino foi feita para simplificar ao máximo a programação por leigos e principiantes, mas sempre é possível acessar os registradores do ATMEGA. Para quem quiser se aprofundar mais sobre esse assunto o livro "Arduino Cookbook" tem um capítulo inteiro sobre como programar usando os recursos de hardware do chip do UNO e do MEGA vale a pena a leitura.

Concordo parcialmente Marcos. Fazer a sequência de pinos "virar a esquerda" em vez de corrigir o "engano", "soma" mais problemas ao projeto, embora aparentemente parece que começou a numerar na direção correta desta vez.

Deixar uma placa mais comprida é o menor dos problemas (ainda mais que as placas do Arduino são minúsculas).

Outra coisa: Expandir o número de portas até 52 foge da idéia de uma placa microprocessada cuja característica mais bacana sejam justamente as expansões através dos shields.

Se houvesse um barramento de interrupções (o que até dá para ser feito com modificações "na política de uso de portas") facilitaria para que o projeto de novas expansões pudessem ser agregadas e desenvolvidas (lembra do barramento do PC? Que "acabava dando" nos diversos tipos de conectores (padronizados) que permitiram o desenvolvimento de um monte de placas e dispositivos muito úteis (que no final é o que levou o PC a ser adotado praticamente como um padrão mundial). O Arduino tem tudo para começar a ser o Z80 (filhos e netos, que se tornaram os PC, ATs, XTs e outros "T"s...) da próxima revolução de desenvolvimento de microcomputadores (voltamos a estaca zero???? Cadê o Altair??? Rsrsrsrs...quem conhece a história do PC, sabe o que estou dizendo). Este é um assunto que pode se estender muito ainda...

Não acho que seria necessário criar um barramento de interrupção, pois já temos aceso aos pinos do microcontrolador, talvez falte criar uma biblioteca para usa-los de forma mais transparente. E porque não aproveitar todos os pinos disponíveis de um MCU como os de um MEGA? Usar expansões como a proposta aqui se torna realmente necessário quando os pinos "nativos" do MCU já estão ocupados e não queremos migrar para um MCU maior. Não se pode esquecer que o controle de qualquer sistema "agregado" toma varios ciclos de processamento do MCU e isso pode ser crítico em determinadas situações. No final é aquela história de que cada caso é um caso e que em gosto, comando elétrico e algoritmo dada um tem o seu não concorda?

O arduino é realmente uma plataforma fantástica e que está realmente mexendo com os fabricantes, como mostram o lançamento de versões com processador DSPIC e ARM.

Áh sim. Agora fechou. Vc. entende que para tudo há um "custo" e que isso é importante saber, que este "custo" pode não ser meramente financeiro. Até a próxima.

Minha idéia, era continuar os 19 pinos, sendo acessados diretamente, mas mantendo virtualmente, 

assim se usa-se a portas 2,3,4,5 para controlar os 595

Para assim digitalWrite(21, HIGH), seria acionado o 2 bit do primeiro 595 da cadeia. E não é seria necessariamente um shield para isso.

Com isso não seria indisponibilizados os pinos das portas 2,3,4,5 justamente porque qq. sinal colocado nelas estaria entrando em conflito com a cadeia de 595??? Ou seja ao levantar qq. sinal nestas portas não se correria o risco deste sinal "fazer sentido" e alem dele acionar algum bit da cadeia de 595?

Sim, ao utilizar as funções de digitalWrite "virtual", como quando você usa qualquer  biblioteca tipo liquidcristal.h, você deve saber que não deve "mexer" com certas portas.

Inclusive estive pensando em tentar implementar algo do tipo EnablePin DisablePin.

E minha idéia é apenas para abstrair o controle dos 595.

Estou montando um projeto onde aciono 10 relês, e preciso ainda controlar um LCD, então ter 4 portas a menos, usando  595 posso ter 8 * n - 16 portas de saída.

E também dá para implementar em I2C usando apenas 2 portas.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço