Czy zadaliście sobie kiedyś pytanie: a co gdy będę robił jakiś większy projekt z dużą ilością przycisków i zabraknie mi złącz? Niedawno wkroczyłem w grono szczęśliwych posiadaczy płytki Arduino UNO i też zadałem sobie to pytanie. 13 wejść cyfrowych + 5 analogowych – zbyt dużo do tego nie podłączę, a gdybym chciał np. zrobić jakąś klawiaturkę jako kontroler MIDI powiedzmy na 2 oktawy to mamy już 24 przyciski + dodatkowo kilka funkcyjnych. I tu z pomocą przychodzi mały “patent”…
Drabinka rezystorowa to element zbudowany z kilku takich samych rezystorów. Możemy kupić je w gotowych obudowach, bądź zrobić samemu ze zwykłych oporników.
Zasada ich działania jest podobna do potencjometru, z tym, że zamiast kręcić pokrętłem, rezystancję zmieniamy podłączając się do kolejnych nóżek. Można by zadać pytanie – “Po co takie coś? Do czego to mi się przyda? Nie lepiej dać potencjometr – w nim mam płynną regulację?” Otóż podłączając sygnał przez taką drabinkę (sterując przepływem odpowiednimi przyciskami) do wejścia analogowego możemy dzięki zmianom napięcia odczytać który przycisk wcisnęliśmy. W teorii można by podłączyć aż 1022(!) rezystory, jednak w praktyce ciężko byłoby to wykonać ze względu na tolerancję oraz chociażby zależność rezystancji od temperatury.
Przykład mój zaprezentuje na prostym układzie składającym się z diody i trzech przycisków. Po naciśnięciu pierwszego dioda zamiga raz, drugiego, dwa, i analogicznie dla trzeciego – trzy.
Na początek schemat podłączenia. (Już poprawny)
s1,s2,s3 – przyciski; p – potencometr; A0 – analogowe wejście nr 0; DIG4 – wyjście cyfrowe nr4; R – rezystory; LED – dioda led
Na początek napiszemy prosty program, dzięki któremu dowiemy się, jakie wartości są odczytywane gdy naciśniemy poszczególne przyciski.
Ustawiamy potencjometr mniej więcej w połowie. Pozwoli nam to w przyszłości na ewentualną kalibrację.
Oczywiście możemy go równie dobrze pominąć. Odpalamy program i wciskamy po kolei przyciski.
Dzięki temu po wciśnięciu poszczególnych przycisków w SerialMonitorze uzyskamy coś takiego:
Dzięki tym danym możemy zabrać się za pisanie kolejnego kodu, tym razem już wykonującego jakąś czynność – czyli w tym wypadku miganie diodą.
Ze względu na to, że wartości zawsze będą miały jakąś małą granicę błędu, w warunkach zaznaczyłem, że wybieramy wartości z pomiędzy.
I to by było na tyle, program możemy modyfikować w zależności od naszych potrzeb (zmieniamy kod w warunkach if). Możemy też oczywiście dodać więcej przycisków,
dodajemy pary rezystor- przycisk oznaczone czerwonym prostokątem na pierwszym rysunku.
Miłej zabawy :)
wideo:
PS:Dobra, ze schematem były przeboje, ale dzięki Waszej interwencji wszystko powinno być już OK.
Fajnie gdyby pod każdym postem znajdował się filmik jak to działa.
Dobrze prawi! Emil, na co czekasz, kręć filmik! :D
Schemat jest błędny. Na analogowym wejsciu będzie zawsze +5a ponadto przyciski powinny byc połączone równolegle wraz z rezystorami. Autor wpisu nie zrealizowąl tego rozwiązania.
hihi – jestem co prawda początkującym elektronikiem i patrząc na schemat także nie mogę sie nadziwić o co autorowi chodziło… czary normalnie :)
Cichaczem poprawił…
I tak dalej jest źle…
Nie cichaczem, bo napisałem o tym ;p
“W teorii można by podłączyć aż 1022(!) rezystory”
Skąd bierze się akurat taka wartość?
Z rozdzielczości AD i budowy dzielnika napięcia.
Uprzedziłeś mnie o parę sekund. :)
Wiem, że możliwych wartości jest 1024 (od 0 do 1023). Rozumiem, że jedna wartość jest dla sytuacji, gdy nie jest naciśnięty żaden z przycisków. To daje 1023 wartości. Na co zatem jest przeznaczona pozostała jedna wartość?
Bo na 10 bitach maksymalna wartość to 1023 a nie 1024. Miesci się 1024 wartości. Z zerem.
Wiem, że wartość 0 dostaniemy kiedy nic nie jest naciśnięte. Czemu więc 1022 rezystory? Bez tego zera nadal zostają 1023 możliwości (od 1 do 1023).
Sam pomysł jest prosty jak budowa cepa i ma jeszcze jedną zaletę odpowiednio dobierając rezystory możliwe jest sprawdzenie kombinacji klawiszy….
I teraz odwieczna zagadka piszczącego przy niektórych kombinacjach klawiszy peceta rozwiązana! :D
Niestety ale PC komunikuje się poprzez serial. Do komunikacji z klawiaturą wykorzystuje się bardzo prymitywny protokół. Problemem jest tylko rozmiar bufora klawiatury, czy wszystkie klawisze zarejestruje.
Bo jeden rezysystor juz jest zuzyty jako ten stały w dzielniku, pozostałem 1022 zmieniają proporcje dzielnika. Dzielnik napięcia zawsze składa sie z co najmniej 2 rezystorów.
OK, dzięki.
Chyba, że ostatni przełącznik łączy bezpośrednio napięcie z pinem Arduino. Nie ma wtedy dzielnika napięcia, ale pozwala to uzyskać informacje który z 1023 został naciśnięty.
Pewnie z rozdzielczość przetwornika A/D w AVR.
Rozumiem, dzięki :)
Autor miał na myśli rozdzielczość przetwornika ADC w AVR-kach. Niestety nie jest to prawda. Jak by nie zrobić takiego dzielnika, jeśli przełączników jest n to ilość kombinacji jest 2^n i tyle właśnie poziomów napięcia. Jeśli mają być odróżnialne od siebie dla mikrokontrlolera to w każdy fragment zakresu jego ADC musi wpadać dokładnie jedna wartość napięcia. Czyli dla rozdzielczości DAC 1024 mamy teoretycznie jedynie 8 przycisków. Teoretycznie również istnieje do tego drabinka, tyle, że inna, która wymaga od przycisku by przełączał masę i napięcie maksymalne. Zwykły przycisk zwierający styki to za mało, ale można to obejść wprowadzając mały błąd do idealnej drabinki. W praktyce jednak dochodzą szumy odczytu DAC, co oznacza, że liczba 8 jest teoretyczna. Przy pomocy filtrów programowych można podpiąć 6 przycisków co sprawdziłem. Może przy dokładnej drabince i 7 ale 8 to fikcja. Oczywiście daje to możliwość detekcji jednoczesnego wciśnięcia kilku przycisków w odróżnieniu od popularnych kombinacji z matrycami.
A nie prościej kupić opornik dekadowy?
Wybitnie bezsensowny sposob. Widac z reszta, nawet w tresci artykulu, ze trzeba jakies okraczne IFy na zakresy robic, bo nijak nie ma jednoznacznosci stanow. I to wciskajac kilkukrotnie w tych samych warunkach. A co, jak zmieni sie temperatura? Zapewne blad pomiaru wzrosnie.
Dalej – przy seryjnej produkcji – to jeden rezystor bedzie mial 99,8Ohm, drugi 101,2 Ohm, a trzeci nominalne 100Ohm. Znowu czynnik wplywajacy na blad pomiaru.
Dosyc standardowym sposobem multipleksowania przyciskow jest zbudowanie matrycy – wtedy wejsc jest co prawda koniecznych n*m, ale pozwala na jednoznaczna identyfikacje wcisnietego przycisku i jest niezalezna od humoru aury pogodowej i dostawcy czesci.
Kolega jeszcze raz przeczyta artykuł bo autor ewidentnie wskazuje na problem ze zmianą temperatury i fakt, że “. . . a co gdy będę robił jakiś większy projekt z dużą ilością przycisków i zabraknie mi złącz? . . .” A “IFy” na zakresy i tak będą stosowane i tak ;] Nie ma rzeczy idealnych, a zabezpieczenia są potrzebne. Arduino ma po prostu “rozpoznać” przycisk zakładając, że rezystancja znajdzie się w ustalonym zakresie. A tak swoją drogą to matryce się stosuje i to z powodzeniem, natomiast kiedy już wejście nie ma służyć do obsługi przycisku, a np. do enkodera to aura pogodowa i nawet dostawca części Ci nie pomoże jak nie poradzisz sobie z zakłóceniami na złączach czy powszechnym szumem. A tu jest prosty przykład ćwiczenia i rozwoju z Arduino.
W zasadzie to takie coś siedzi już od dawna na forum, mojego autorstwa, zbudowane w oparciu o Nettigo Keypad.
witam, wystepowal u Ciebie ten drazniacy problem czyli efekt “Bounce” switcha ?? zrobilem, taki uklad – ogolnie dziala, no ale czasami musze po kilka razy kiknac…
Powiedz proszę, czym rysujesz takie fajne schematy?
Arduino ma nie 13 tylko 14 złączy cyfrowych i 6 analogowych, poza tym złącza analogowe można wykorzystać jako cyfrowe, czyli mamy 20 złączy cyfrowych.
Radzę się poduczyć z tematu AVRów, ponieważ Arduino, mimo, że ułatwia tworzenie układów nakłada też niektóre sztuczne ograniczenia, na przykład ATmega8 ma bodajże maksymalnie 23 piny do dowolnego korzystania(po przestawienia fusebitów i zastosowaniu wewnętrznego kwarcu) a Arduino Uno R3 (tylko) 14 cyfrowych i 6 wejsc analogowych.
Witam pomogłeś mi tym artykułem przy własnym projekcie a tym bardziej ze nie jestem specjalista w tej dziedzinie
dlatego tez wielkie dzięki
Cieszę się, że komuś się przydało :)
Genialne w swojej prostocie, że też sam na takie coś nie wpadłem :) Dzięki za pomysł, na pewno kiedyś wykorzystam :]
Nie jest to najlepsze rozwiązanie. Właśnie mam z tym problem w miniwieży JVC, gdzie panel przycisków rozwiązano w ten sposób. Okazało się, że z czasem styczniki przestały zwierać na zero omów i tym samym na wyjściu otrzymujemy sumę oporu przycisku i oporników z drabinki. Efektem tego jest błędna interpretacja przycisku.