Meus amigos,
Estou com um projeto que usará 7 botões, 7 leds, 1 buzzer e 8 display de 7 seguimento (8x7=56 ligações).
Meus amigos, não existe nenhum arduino com todas essas portas (71 I/O)...
Como ligar isso tudo? Uso 3 ou 4 arduinos via master/slave (nunca fiz e não faço a mínima ideia de como fazer)?
Ou uso alguns Mux/Desmux (também nunca usei e também não faço a mínima ideia de como usar)?

Alguém pode me dá uma ideia e uma mãozinha?

Abraços a todos

Exibições: 1506

Responder esta

Respostas a este tópico

Olá.

O que mais gasta aí são os displays.

O costume é ligar displays multiplexados. Que eu saiba todos os circuitos comerciais são assim.

https://www.google.com.br/search?q=multiplex+7+segment+display&...

Isso derruba as 56 ligações para 7+8=15.

Vc pode ainda tratar os 7 leds como um display de 7 segmentos, assim vc faria leds+8 displays com 7+9=16 pinos.

Daria 7+16+1=24 pinos.

24 pinos é bem pouco...

Mas a economia pode gerar perda de qualidade. Pode ser que com 1/9 do tempo ligado o display fique um pouco fraco... Aih a solução seria fazer um barramento de 14 pinos para o display.

Aih ficaria 14 linhas e 4 colunas. = 28 fios.

7+7+1+28=15+28=43

43 é uma quantidade bem tranquila pra um Arduino Mega.

Opa, errei !!!
Onde se lê:

"Aih ficaria 14 linhas e 4 colunas. = 28 fios.

7+7+1+28=15+28=43"

Leia-se:

"Aih ficaria 14 linhas e 4 colunas. = 18 fios.

7+7+1+18=15+28=33

33 é uma quantidade super tranquila pra um Arduino Mega."

Bom dia 

Minha sugestão - use um Shield Multi função para Arduino:

https://wiki.eprolabs.com/index.php?title=Multi-functional_Learning...

Bom dia Sr. E,

os display também podem ser ligados via I2C, usando somente 2 ports do arduino, (PCF8574)

     http://www.picmicrolab.com/7-segment-led-display-pcf8574-i2c-arduino/

  7 botões + 7 LEDs + 1 Buzzer + 2 I2C 

Vc pode usar os botões usando um ou 2 ports analógicos, 

http://automacaoerobotica.blogspot.com/2013/03/multiplos-botoes-usa...

ficando então assim: 

2 ports I2C (Dispalys), 2 ports analógicos (botões)  e 7 ports digitais(LEDs), 1 port digital (buzzer).

Total: 2 ports analógicos, 10 ports digitais.

Qualquer Arduíno (Uno/Mini/Nano) servirá.

RV

Mineirin,
Muito obrigado mesmo pela ajuda! Estou tentando por a mão na massa...

Seguinte, fui nas lojas de eletrônicas da minha cidade pra comprar o CI PCF8574... Eles tem um monte de PCF, menos o 8574 (tem o 8572 e 8576)... 

Bem, dai eu comprei um que o cara falou que rola substituir (74HC595)... Era o ultimo da loja... Mas fiz o exemplo do link https://www.arduino.cc/en/Tutorial/ShiftOut mas não acende nem um LED.

Boa tarde E,

o 74HC595 não é substituto do PCF8574.

RV

Ferrou então! Só encomendando o PCF8574...

olá Edgar.

     Vi seu problema em acrescentar mais I/Os para o Arduino. Realmente existem "soluções prontas", mas percebi sua empreitada em "botar a mão na massa" (como vc mesmo disse). Também vi no seu perfil que vc é um programador, então acredito que vc também apreciará a solução que estou postando aqui (além de que certamente, espero ser útil para muitos outros garagistas).

      Mas antes de um bom código, vem um bom Hardware. A solução que estou propondo, já uso em Sistemas embarcados há mais de 25 anos. Então posso garantir que é extremamente funcional e versátil (sempre funcionou perfeitamente sem um único problema). Também já vi implementações semelhantes por aí, mas geralmente nunca há um pacote completo. Uso apenas dois "tipos" de CIs: o 74HC595 (ou o 74HC594, vc escolhe qual vai usar) e o 74HC166.

     Com esta configuração que estou apresentando, você pode expandir a quantidade de Displays e a quantidade de Entradas e Saídas Digitais, de forma independente, e em qualquer combinação. Por exemplo: vc pode implementar 4 Displays, 8 Entradas Digitais, 24 Saídas Digitais. Para a quantidade de Entradas e Saídas Digitais, sempre teremos um múltiplo de 8, já que o CIs usados comportam 8 bits cada. Para os Displays, a quantidade pode ser impar ou par.

     No exemplo que mostro aqui, fiz a implementação de 8 Displays, 16 Entradas Digitais, e 16 Saídas Digitais. Ou seja Edgar, praticamente uma solução completa pra sua necessidade. Mas se vc precisar de mais Displays ou I/Os, basta expandir.

     A principal característica do Hardware, é sua grande simplicidade, isto sem usar "gambi" alguma. São todas técnicas rigorosamente clássicas, portanto fundamentadas. Observe que apenas 6 pinos do Arduino são necessários na implementação, e isso é independente da quantidade de Displays e I/O implementados. Um sinal adicional é usado para controle das saídas e displays, de acordo com o CI usado: HC595 ou HC594. Mas esse sinal (chamado de "OUTS_ON") não é absolutamente necessário e pode ser facilmente eliminado. Mas aconselho deixá-lo pois ele impede que as saídas tenham valores aleatórios quando a alimentação é aplicada ao sistema (quando a energia é ligada).

     O hardware do exemplo que implementei, é mostrado na figura a seguir (Proteus):

     Neste exemplo, note que implementei 16 Saídas Digitais, sendo que conectei 8 LEDs em 8 dessas saídas, deixando as demais "livres". Também foram implementadas 16 Entradas Digitais, sendo que conectei 8 chaves (tipo "DIP Switch") em 8 dessas entradas, deixando as demais "livres". Note também que há resistores de "pulldown" em cada entrada implementada. Isto é necessário porque Entradas Digitais que não sejam usadas, não podem ficar "flutuando" (sem conexão), e isso vale pra qualquer sistema digital. Mas os resistores são de 100k e portanto não precisam ser removidos quando a entrada for usada.

       Outra observação é sobre a tabela no esquemático, que mostra a configuração de R1 e R2 conforme o CI usado: HC594 ou HC595. Esta configuração, refere-se ao caso quando o sinal "OUTS_ON" é usado, ou seja, quando vc liga esse sinal a um pino do Arduino. Caso não se use um pino do Arduino para o "OUTS_ON", então inverta a lógica mostrada na tabela (por exemplo, se estiver usando HC595, R1 não seria montado e R2 seria montado), e claro: neste caso não haverá a conexão do sinal "OUTS_ON" ao Arduino (mas no Hardware o sinal ainda existirá, sendo provido ou por R1 ou por R2).

     Sobre o código, é simples, mas técnico, já que técnicas de controle de Hardware são necessárias. No código, as primeiras rotinas são as de mais baixo nível, seguindo a regra geral de implementação de código em C. Como vc é programador, não terá dificuldades em identificar e usar as funções da interface, pois o código está totalmente organizado e os diversos blocos estão separados e completamente identificados. O código também está comentado, conforme necessário, assim descrevendo todas as funções, sejam de baixo ou alto nível.

     Esta organização do código, permite que vc facilmente implemente uma Classe, e portanto uma  "LIB", caso deseje (o que auxilia uma reutilização do código).

     Sobre as temporizações, veja a de escrita em 8 Displays:

     Note que o tempo de 1.36ms (1.36 mili-segundos) mostrado na figura , é o total quando todos os 8 Displays são atualizados juntos. Alguns poderão achar que o tempo está inflacionado. Ocorre que usei tempos de "setup" e "hold" de 1us (1 micro segundo), para cada bit. Embora isso resulte em até quadruplicar o tempo total resultante, ele garante o perfeito funcionamento, já que nas funções básicas do Arduino não há temporização menor que 1us (isto é possível, mas usando a "LIB AVR" do C GNU). Claro, qualquer código escrito estará também inflacionado pelas funções de background da plataforma (no caso a do Arduino), mas isso sempre será assim (do contrário teria-se que desabilitar IRQs, o que não é aconselhável).

     Da mesma forma, mostro a temporização para a escrita em 16 Saídas Digitais, na figura a seguir:

     Novamente, 0,34 ms é o tempo de atualização de todas as 16 saídas juntas.

     A temporização da leitura de todas as 16 Entradas Digitais, é mostrada na figura  a seguir:

     Mais uma vez, 0,35 ms é o tempo de leitura de todas as 16 entradas juntas.

     Note também a extremamente reduzida quantidade de memória RAM usada nesta implementação, conforme a saída compilada/linkada da IDE do Arduino:

     Esse total muito reduzido de memória usada, libera praticamente toda a memória do Arduino para ser usada nas funções do seu Sistema em específico, dando a vc uma grande alternativa de uso.

    No anexo ao final deste post, vc encontrará o código do Arduino, os arquivos do Proteus para simulação (com esquemático também impresso em PDF), datasheets, e as figuras da temporização medida).

    Informação final importante:  no código, implementei no "loop" do Arduino, uma demonstração de como usar as funções da Interface de alto-nível, que você também poderá ver em ação na simulação no Proteus (a última parte parece "parada", mas são 15 segundos nos quais o que vc colocar nas chaves DIP, será copiado para os LEDs). Também note que as configurações do Hardware estão logo no início do código (como tradicional). Estas configurações permitem você determinar o total de Displays e total de I/Os, tipo do Display (anodo ou katodo comum), como os LEDs são ligados (acionados por "1" ou por "0"), o tipo do CI usado (HC594 ou HC595), além é claro de quais pinos do Arduino são usados para os sinais de controle do Hardware. Tudo muito facilmente acessível e identificado.

    Ah, e claro: como um programador, vc verá que também é fácil acrescentar tabelas adicionais para outros caracteres que deseje mostrar nos Displays, assim personalizando seu Sistema.

    Espero ter contribuído para solucionar seu problema. Quaisquer dúvidas, post aqui que certamente irei responder.

    Abrçs,

    Elcids.

Anexos
Gostaria muito de ver os arquivos do anexo para ver qual era a forma do código desenvolvido na epoca

Olá, André!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço