Więcej niż jeden przycisk w tym samym pinie


12

Robię jakiś projekt i używam Arduino do prototypowania, muszę użyć 10 przycisków (wraz z innymi rzeczami) i nie mam wystarczającej liczby pinów.

Jednym rozwiązaniem, o którym mogłem pomyśleć, jest użycie pinów analogowych i użycie każdego z nich do dwóch przycisków, coś takiego:

schematyczny

symulacja tego obwodu - Schemat utworzony przy użyciu CircuitLab

W ten sposób mogę odczytać styk A0 i dowiedzieć się, który z nich jest popychany, sprawdzając, czy napięcie wynosi 5 V czy połowa tego.

Czy to dobry pomysł? Poszczególne przyciski NIGDY nie powinny być naciskane jednocześnie, co jest jedynym problemem, o którym mogę myśleć.

Czy są lepsze sposoby?


Ile pinów próbujesz użyć?
W5VO,

@ W5VO Potrzebowałbym 22, z 10 przyciskami, płytka ma tylko 18 ... więc dwa przyciski na każdy pin analogowy Potrzebuję tylko 5 pinów analogowych, a płytka ma 6.
MyUserIsThis 12.12.2013

1
Po prostu FYI, wielu producentów samochodów stosuje to samo podejście do elementów sterujących systemu audio zamontowanych na kierownicy. Mają (dawaj lub bierz) 8 przycisków, każdy z własnym rezystorem. Dzięki temu mogą poprowadzić pojedynczy przewód (lub parę przewodów, aby zapewnić czysty powrót) z koła do głowicy audio. Jest to całkowicie dobre podejście.
DoxyLover

Wierzę, że faktycznie można użyć trzech pinów, aby wprowadzić teoretycznie nieskończoną liczbę przełączników za pomocą niektórych rejestrów przesuwnych. Możliwe jest również użycie 8 pinów do wprowadzenia 256 przełączników za pomocą multiplekserów.
Alvin Wong,

Odpowiedzi:


22

Po co marnować wiele pinów analogowych na dwa przełączniki, skoro można wykonać dowolną liczbę przycisków na jednym pinie analogowym?

Dwa sposoby na zrobienie tego. Jeden jest w szeregu, drugi jest równoległy.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

Tak wyglądają niektóre elementy sterowania dźwiękiem w kierownicy samochodu. I jak działają niektóre starsze wbudowane kontrolery ipod.

W zależności od używanych rezystorów, jeśli potrzebujesz nacisnąć wiele przycisków jednocześnie i jak wrażliwy jest twój analog, możesz mieć wszystkie 10 przycisków na jednym pinie.


Dziękuję, myślałem również o tym, ale także myślałem, że może odczyty napięcia nie były tak dokładnie, jak potrzebuję, aby móc polegać na tej metodzie. Spróbuję również tego i zobaczę, jak to działa.
MyUserIsThis

Ponieważ moje podstawy analizy sieci rezystorów nie są dość solidne, próbowałem użyć CircuitLab do symulacji obwodu szeregowego i narysować tabelę prawdy dla pomiaru napięcia na analogowym pinie wejściowym. Stwierdziłem, że kombinacje B2 + B3 dają 2,499 V, a kombinacje B1 + B4 dają 2,498 V. Przy tak bliskich liczbach myślę, że typowy 10-bitowy ADC nie będzie w stanie poprawnie rozróżnić kombinacji wielu wejść. Co mówisz ? Oczywiście, jeden klucz na raz działałby idealnie - bez wątpienia. Uwaga B1 = Przycisk 1.
icarus74

W rzeczywistości B2 + B4 daje 1,666 V, podczas gdy B2 + B3 + B4 również daje 1,666 V. Rozwiązaniem może być użycie różnych wartości rezystorów dla R1, R2, R3, R4 i nie zachowanie wszystkich wartości 1K. Co powiedzieć ?
icarus74

7
Drabina 2R / R kiedyś zamieniała przyciski w D / A, a każda kombinacja naciśnięć przycisków miałaby unikalną wartość. Ufam, że będzie działać z przyciskami N-3, gdzie N jest rozdzielczością ADC
Scott Seidman

1
@ icarus74 tak, użycie różnych wartości zamiast wszystkich 1k dałoby unikalne kombinacje. Spróbuj 1k, 2k, 4k, 8k, 16k itp. (Lub 1k, 4k, 16k itp., Aby uzyskać większy zasięg)
Passerby

10

To by działało, ale lepszym sposobem jest użycie matrycy . Jest to ta sama koncepcja, co multipleksowanie diod LED z matrycą, ale z przełącznikami.

wprowadź opis zdjęcia tutaj

To jest matryca 2x2. Przydatna matryca jest większa, ponieważ przy tym rozmiarze nie oszczędzasz żadnych pinów na osobne podłączanie przełączników.

Dzięki matrycy 3x3 można uzyskać 9 przełączników. Potrzebujesz 10, więc możesz albo dodać jeszcze jeden wiersz, albo jeszcze jedną kolumnę i obsługiwać 12 przełączników, lub po prostu umieścić 10. przełącznik na swoim własnym pinie.

Zaletą jest to, że można korzystać z cyfrowego IO, które jest tańsze i zwykle bardziej obfite niż analogowe IO. Rejestr przesuwny jest tanim sposobem na dodanie bardziej cyfrowego IO, jeśli zabraknie.

Jeśli chcesz jeszcze mniej pinów, możesz, dla pewnego wzrostu złożoności, użyć charlieplexing . Będziesz musiał dodać diody oprócz przełączników, a te diody prawdopodobnie kosztują tyle, ile rejestr przesuwny. Jeśli jednak koszt nie jest twoim głównym zmartwieniem, może mieć pewną przewagę. Dzięki tej metodzie możesz odczytać wszystkie swoje przełączniki (maksymalnie 12) za pomocą czterech pinów.


Tylko pytanie. Dlaczego to jest lepsze, jeśli będę potrzebować więcej pinów? W ten sposób będę potrzebował 6 pinów dla matrycy 9x9 plus jeszcze jeden pin dla dziesiątej, podczas gdy w tym, co zrobiłem, potrzebowałbym tylko 5 pinów.
MyUserIsThis

@MyUserIsTo to skaluje się lepiej wraz ze wzrostem całkowitej liczby przełączników. np. matryca 5x5 pozwala podłączyć 25 przełączników do 10 pinów. Mówiąc bardziej ogólnie, robienie rzeczy w tradycyjny sposób, zarówno ułatwia zrozumienie tego, co zrobiłeś; i abyś mógł rozpoznać, co robią obwody innych ludzi (ponieważ przeszkoliłeś się w zakresie standardowej implementacji).
Dan bawi się Firelight

@MyUserIsTo zobacz zmiany. Passerby też ma dobrą odpowiedź.
Phil Frost

2

Wejście analogowe jest poprawnym podejściem, powinieneś być w stanie mieć na nim kilka przycisków. Chciałbym również zasugerować użycie układu ekspandera IO, takiego jak MCP23017 . Ma 16 pinów, które mogą być wejściami wyjściowymi i sterowane przez I2C za pomocą dwóch pinów. Adafruit ma do tego bibliotekę Arduino.


2

Tak, wydaje się to dobrym pomysłem, ale w każdym razie zamierzam zaproponować alternatywę, która właśnie przyszła mi do głowy.

Jeśli masz dostęp do bramek logicznych, możesz zmapować wiele nprzycisków do ceil(log2(n + 1))pinów za pomocą logiki logicznej. Na przykład, jeśli masz 4 przyciski, ale tylko 2 piny, możesz utworzyć konfigurację taką:

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

To znaczy, button0presja powinna mieć pin0i pin1nisko; button1, pin0niski i pin1wysoki; button2, pin0wysoki i pin1niski; a button3, pin0i pin1na wysokim poziomie.

Z tego wynikną następujące wyrażenia boolowskie

pin0 = button2 OR button3
pin1 = button1 OR button3

Odwzorowanie 4 przycisków na 2 piny można zatem zrealizować tylko z 2 bramkami OR. Potrzebny byłby jednak dodatkowy pin i trochę logiki, aby wskazać, czy którykolwiek przycisk jest w ogóle naciskany.

Oczywiście nadal będą występować problemy, jeśli kilka przycisków zostanie naciśniętych jednocześnie.

Ponadto, jeśli nadal będziesz stosować podejście opornikowe, rozważ użycie większych wartości na opornikach innych niż 100 omów, ponieważ 5 V przez rezystory rzędu 100s omów dałoby prąd rzędu 10s mA, co jest miłe niepotrzebnie wysokiej. Wydaje mi się, że bardziej rozsądne wartości to 10k Ohm lub 47k Ohm.


Dziękuję za twoje podejście. Myślałem też o czymś takim, ale nie mam bramek logicznych i mam mnóstwo rezystorów. I tak, zwykle używam do tego rezystorów 10k, 100 omów było tylko domyślną wartością edytora obwodów. Jeszcze raz dziękuję za pomoc.
MyUserIsThis

Myślę, że w końcu zastosuję podejście opornikowe, ponieważ nie będę musiał kupować bramek logicznych, a twoje podejście logiczne oszczędza mi tylko 1 pin i nie potrzebuję tego. Będę o tym pamiętać w przypadku większych projektów. Dziękuję Ci bardzo.
MyUserIsThis

W porządku! Powodzenia w projekcie!
nijoakim

0

Przydatna może być następująca strona:

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

Jest napisane w języku hiszpańskim, ale najważniejsze są naszkicowane, myślę, że to dla ciebie bardzo dobry pomysł.

Na tym filmie można zobaczyć końcowy wynik, szkic znajduje się również na stronie, zamknięta funkcja ułatwia wdrażanie w projektach

YouTube wideo: 10 klawiszy klawiatury na jednym pinie

Oto schemat z powyższej strony:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj


2
Dodaj podsumowanie zawartości linku na wypadek, gdyby kiedyś umarł, szczególnie jeśli jest w języku hiszpańskim i jest to strona w języku angielskim.
PeterJ

Niestety, może być normalna sytuacja, że ​​w Hiszpanii normalne jest odsyłanie do publikacji w języku angielskim ... Ale link jest bardzo interesujący, mówi, jak zbudować klawiaturę z 10 klawiszami za pomocą tylko jednego pinezki z opisem zdjęcia krok po kroku, diagramami zrobić planszę i zdjęcie na okładkę przycisków. Łatwo zrozumiały kod do zarządzania klawiaturą. Myślę, że fajnie się rozwinął.
JohnnyDeauville

Nie chodzi tylko o hiszpańską stronę rzeczy, zgadzam się, że schemat jest przejrzysty, wygląda dobrze i mogę na tej podstawie ustalić, o co chodzi. Ale Stack Exchange zniechęca tylko do odpowiedzi na linki, ponieważ nie są one przydatne, jeśli link umrze, wyobraź sobie, że ten blog zostanie zamknięty / usunięty jutro, jak przydatna byłaby odpowiedź. Może mógłbyś dołączyć schemat i zdanie lub dwa o nim i po prostu zostawić link jako odniesienie dla dalszych informacji.
PeterJ

Jestem debiutantem na tym forum. Jak mogę sprawić, że mi powiesz? Jakaś sekcja w specjalnym ...? Dzięki za
poświęcony

Właśnie załączyłem schemat i odniesienie, z którego pochodzi, ale warto też przetłumaczyć nieco więcej strony, aby dać kontekst, w jaki sposób działa i jakie będą odczyty ADC.
PeterJ
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.