Mais de um botão no mesmo pino


12

Estou fazendo algum projeto e estou usando o Arduino para prototipar, tenho que usar 10 botões (junto com mais coisas) e não tenho pinos suficientes.

Uma solução em que pude pensar é usar os pinos analógicos e usar cada um deles para dois botões, algo como isto:

esquemático

simular este circuito - esquemático criado usando o CircuitLab

Dessa forma, posso ler o pino A0 e saber qual deles está sendo pressionado, procurando se a tensão é de 5V ou metade disso.

isso é uma boa ideia? Os diferentes botões de pressão NUNCA devem ser pressionados ao mesmo tempo, que é o único problema que consigo pensar.

Existem maneiras melhores?


Quantos pinos você está tentando usar?
W5VO

@ W5VO eu precisaria de 22, com 10 botões, o conselho tem apenas 18 ... então dois botões para cada pino analógico Eu só preciso de 5 pinos analógicos e a placa tem 6.
MyUserIsThis

1
Apenas para sua informação, muitos fabricantes de automóveis usam a mesma abordagem para controles montados no volante do sistema de áudio. Eles têm 8 botões (dar ou receber), cada um com seu próprio resistor. Isso permite que eles usem um único fio (ou par de fios para garantir um retorno limpo) do volante para a cabeça de áudio. É uma abordagem perfeitamente boa.
DoxyLover

Eu acredito que você pode realmente usar três pinos para inserir teoricamente um número infinito de switches usando alguns registradores de deslocamento. Também é possível usar 8 pinos para inserir 256 comutadores usando multiplexadores.
Alvin Wong

Respostas:


22

Por que desperdiçar vários pinos analógicos para dois comutadores cada um, quando você pode executar qualquer número de botões em um único pino analógico?

Duas maneiras de fazer isso. Um é em série, o outro é paralelo.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

É assim que alguns controles de áudio do volante do carro são. E como alguns dos controladores inline ipod mais antigos funcionam.

Dependendo dos resistores que você usa, se você precisar de vários botões pressionados ao mesmo tempo e da sensibilidade da entrada analógica, poderá ter todos os 10 botões em um único pino.


Obrigado, eu também pensei sobre isso, mas também pensei que talvez as leituras de tensão não fossem exatamente o que eu precisava para poder confiar nesse método. Vou tentar isso também e ver como funciona.
MyUserIsThis

Como meus fundamentos de análise de rede de resistores não são muito sólidos, tentei usar o CircuitLab para simular o circuito em série e desenhar uma tabela de verdade para a medida de tensão no pino de entrada analógica. Descobri que, as combinações B2 + B3 resultam em 2.499V e as combinações B1 + B4 resultam em 2.498V. Com números tão próximos, acho que o ADC típico de 10 bits não será capaz de diferenciar as combinações de entradas múltiplas corretamente. O que você disse ? Obviamente, uma chave de cada vez funcionaria perfeitamente - sem dúvida. Nota B1 = Botão1.
icarus74

Na verdade, B2 + B4 fornece 1,666V, enquanto B2 + B3 + B4 também fornece 1,666V! A solução pode estar usando valores diferentes de resistores para R1, R2, R3, R4 e não manter todos eles de 1K. O quê dizer ?
icarus74

7
Uma escada 2R / R antiga transforma os botões em D / A, e cada combinação de pressionamentos de botão teria um valor único. Eu confiar que ele funcione com n-3 botões, onde N é a resolução ADC
Scott Seidman

1
@ icarus74 sim, usar valores diferentes em vez de todos os 1k daria combinações únicas. Tente 1k, 2k, 4k, 8k, 16k, etc (ou 1k, 4k, 16k, etc, para uma faixa mais ampla) #
115513 Passerby

10

Isso funcionaria, mas uma maneira melhor é com uma matriz . Esse é o mesmo conceito dos LEDs multiplexadores com uma matriz, mas com comutadores.

insira a descrição da imagem aqui

Esta é uma matriz 2x2. Uma matriz útil é maior, porque nesse tamanho você não está economizando pinos ao conectar os comutadores individualmente.

Com uma matriz 3x3, você pode obter 9 switches. Você precisa de 10, para que você possa adicionar mais uma linha ou mais uma coluna e dar suporte a 12 switches, ou apenas colocar a décima opção em seu próprio pino.

A vantagem aqui é que você pode usar E / S digital, que é mais barata e geralmente mais abundante que o E / S analógico. Um registro de turno é uma maneira barata de adicionar mais IO digital, se você acabar.

Se você quiser ainda menos pinos, poderá, para aumentar a complexidade, usar o charlieplexing . Você precisará adicionar diodos além dos seus comutadores, e esses diodos provavelmente custam tanto quanto um registro de turno. No entanto, se o custo não for sua principal preocupação, pode haver alguma vantagem. Com esse método, você pode ler todos os seus switches (até 12, na verdade) com quatro pinos.


Só uma pergunta. Por que isso é melhor se vou precisar de mais pinos? Dessa forma, precisarei de 6 pinos para a matriz 9x9 e mais um para o décimo, enquanto no que fiz, precisaria de apenas 5 pinos.
MyUserIsThis

@MyUserIsThis é melhor com o aumento do número total de opções. ex uma matriz 5x5 permite conectar 25 switches a 10 pinos. Como um comentário mais geral, fazer as coisas da maneira convencional facilita a compreensão de outras pessoas pelo que você fez; e para você reconhecer o que os circuitos de outras pessoas fazem (porque você se treinou na implementação padrão).
Dan is Fiddling por Firelight 12/07/2013

@MyUserIsThis ver edições. O transeunte também tem uma boa resposta.
Phil Geada

2

A entrada analógica é uma abordagem válida, você deve poder ter vários botões nela. Eu também gostaria de sugerir o uso de um chip IO Expander como o MCP23017 . Possui 16 pinos que podem ser entradas e saídas e é controlado com I2C usando dois pinos. O Adafruit possui uma biblioteca do Arduino.


2

Sim, parece uma boa ideia, mas, de qualquer forma, vou propor uma alternativa que me veio à mente.

Se você tiver acesso às portas lógicas, poderá mapear muitos nbotões para ceil(log2(n + 1))pinos através da lógica booleana. Por exemplo, se você tiver 4 botões, mas apenas 2 pinos, poderá criar uma configuração como esta:

Buttons | Pins
----    | --
0123    | 01
----    | --
0001    | 00
0010    | 01
0100    | 10
1000    | 11

Ou seja, button0pressionado deve ter pin0e pin1baixo; button1, pin0baixo e pin1alto; button2, pin0alto e pin1baixo; e button3, pin0e pin1alta.

A partir disso, as seguintes expressões booleanas surgiriam

pin0 = button2 OR button3
pin1 = button1 OR button3

Um mapeamento de 4 botões para 2 pinos poderia, portanto, ser realizado com apenas 2 portas OR. Você precisaria de um pino adicional e alguma lógica adicional para indicar se algum botão está sendo pressionado.

Obviamente, ainda haverá problemas se vários botões forem pressionados simultaneamente.

Além disso, se você ainda seguir a abordagem do resistor, considere o uso de valores maiores nos resistores que não sejam 100 ohms, já que 5 V através de resistores da ordem de 100s de ohms produziriam uma corrente da ordem de 10s de mA, que é do tipo desnecessariamente alto. Eu acho que valores mais razoáveis ​​seriam 10k Ohm ou 47k Ohm.


Obrigado pela sua abordagem. Também pensei em algo assim, mas não tenho portas lógicas e tenho toneladas de resistores. E sim, eu costumo usar resistores de 10k para isso, 100 ohms era apenas o valor padrão do editor de circuitos. Obrigado novamente por sua ajuda.
MyUserIsThis

Eu acho que finalmente utilizarei a abordagem do resistor, pois não precisarei comprar portas lógicas, mais a sua abordagem lógica me poupa apenas 1 pino e não preciso disso. Vou ter isso em mente, porém, para projetos maiores. Muito obrigado.
MyUserIsThis

OK! Boa sorte com seu projeto!
nijoakim 12/07/2013

0

A página a seguir pode ser útil:

http://txapuzas.blogspot.co.uk/2010/07/papertecladoanalogico-varios-pulsadores.html

Está escrito em espanhol, mas os esenciais estão diagramados, acho que é uma boa ideia para você.

Neste vídeo você pode ver o resultado final, o esboço também está na página, função encapsulada para facilitar a implementação em seus projetos

Vídeo do Youtube: teclado de 10 teclas em um único pino

Aqui está um esquema do site acima:

insira a descrição da imagem aqui

insira a descrição da imagem aqui


2
Adicione um resumo do conteúdo do link, caso ele morra, especialmente quando estiver em espanhol e este for um site em inglês.
precisa

Desculpe, pode ser a situação normalmente em que na Espanha é normal consultar uma publicação em inglês ... Mas o link é muito interessante, diz como construir um teclado de 10 teclas usando apenas um alfinete com descrição da foto passo a passo, os diagramas para fazer um quadro e uma imagem para fazer a capa dos botões. Também o código para gerenciar o teclado, facilmente compreendido. Bom desenvolvido eu acho.
JohnnyDeauville

Não é apenas o lado espanhol das coisas, eu concordo que o diagrama é claro, parece bom e posso descobrir o que é isso com base nisso. Mas o Stack Exchange desencoraja as respostas apenas ao link porque elas não são úteis se o link acabar, imagine se o blog for encerrado / excluído amanhã como a resposta seria útil. Talvez você possa incluir o esquema e uma ou duas frases sobre o assunto e deixar o link como referência para obter mais informações.
precisa

Eu sou um novato neste fórum, como posso fazer com que você me diga? Alguma seção em especial ...? Obrigado pelo seu tempo #
319 JohnnyDeauville

Acabei de incluir o esquema e a referência de onde veio, mas também pode valer a pena traduzir um pouco mais da página para fornecer um contexto de como funciona e quais serão as leituras do ADC.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.