Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Klawiatura 4x4 - trzy przyciski

10 Cze 2019 09:17 159 6
  • Poziom 28  
    Mam klawiaturę membranową 4x4 podłączoną do Atmega328 (jednak wątek celowo zakładam w ogólnym temacie, bo problem nie zależy od typu mikrokontrolera). Przewiduję możliwość jednoczesnego naciśnięcia kilku przycisków na klawiaturze.

    Podłączenie typowe, czyli 4 piny jako wejście i 4 piny jako wyjście. 4 piny skanowania ustawiam tak, że jeden jest jako wyjście z wystawionym 0, a pozostałe jako wejście z podciągnięciem do 1. Jak wszystkie 4 piny były jako wyjście, z których na jednym był 0, na pozostałych 1, to miałem problemy z działaniem w przypadku jednoczesnego naciśnięcia dwóch przycisków. Na pinach odczytu, naciśnięty klawisz daje 0, a w stanie spoczynkowym daje 1. Teraz, jak nacisnę dowolne dwa klawisze, to odczyt jest prawidłowy i program "wie", które klawisze są naciśnięte.

    Natomiast, jak się naciśnie jednocześnie 3 klawisze nie będące w linii prostej, czyli tworzące jakby prostokąt, to mikrokontroler interpretuje, że są naciśnięte 4 klawisze. Na przykład, klawisze "1", "3", "7" i "9", jak się naciśnie dowolne 3 z nich, to z odczytu wynika, że są naciśnięte wszystkie 4.

    Jak szukałem w sieci sposobów podłączania klawiatury 4x4, to znajdowałem praktycznie tylko jeden sposób, ten, który właśnie zastosowałem (to, że co schemat, to były użyte różne piny i różne mikrokontrolery, nie zmienia faktu, że jest to jeden i ten sam sposób), czasem "wzbogacony" o diody na pinach skanowania lub odczytu, ale moim zdaniem te diody niczego nie zmienią w przedmiocie wątku.

    Czy jest możliwe takie obsłużenie klawiatury 4x4, że jednoczesne naciśnięcie trzech lub więcej przycisków zostanie prawidłowo odczytane? Patrząc na schemat, to w każdym przycisku powinna być dioda szeregowo ze stykiem, ale na przykład popularne klawiatury membranowe nie mają tych diod i nie można ich dorobić.
  • Pomocny post
    Specjalista - Mikrokontrolery
    Sam sobie odpowiedziałeś - nie jest to możliwe. Popularne klawiatury matrycowe nie są przystosowane do wykrywania naciśnięcia kilku przycisków na raz, bo rzadko jest takie wymaganie. Powiedziałbym, że jest to ergonomicznie dosyć karkołomne.
  • Pomocny post
    Poziom 30  
    andrzejlisek napisał:
    czasem "wzbogacony" o diody na pinach skanowania lub odczytu, ale moim zdaniem te diody niczego nie zmienią w przedmiocie wątku.

    Właśnie owe diody umożliwiają odczyt wciśnięcia kilku przycisków.
  • Poziom 28  
    szelus napisał:
    Sam sobie odpowiedziałeś - nie jest to możliwe. Popularne klawiatury matrycowe nie są przystosowane do wykrywania naciśnięcia kilku przycisków na raz, bo rzadko jest takie wymaganie. Powiedziałbym, że jest to ergonomicznie dosyć karkołomne.


    Zgadzam się z tym, że w 95% przypadków nie jest potrzebny odczyt 3 przycisków naciśniętych jednocześnie, teraz rozważam to w kontekście zabezpieczenia przed skutkami wywołania naciśnięcia nienaciśniętego przycisku (najprostsze to takie, że jak się wychwyci fakt naciśnięcia więcej niż 2 przycisków, to przyjmuje się, że są naciśnięte te dwa, które zostały odczytane przed naciśnięciem trzeciego). Jak patrzę na schemat, to wydaje mi się, że problem sprawiają wyłącznie naciśnięte 3 przyciski tworzące 3 wierzchołki prostokąta, w każdym innym przypadku problemu nie ma. Czy dobrze myślę? To, czy w danej aplikacji odczyt wielu wciśniętych przycisków jest naprawdę potrzebny, to już inny temat. Chodzi o to, co spostrzegłem podczas wczorajszych testów. Podchodzę do tego, że jest to pewne ograniczenie, ale możliwe do zaakceptowania, w przypadku, gdy nie jest możliwe obejście bez przerabiania lub wymiany samej klawiatury. Warto wiedzieć, jakie układy naciśnięć są nieprawidłowo odczytywane.

    LChucki napisał:
    andrzejlisek napisał:
    czasem "wzbogacony" o diody na pinach skanowania lub odczytu, ale moim zdaniem te diody niczego nie zmienią w przedmiocie wątku.

    Właśnie owe diody umożliwiają odczyt wciśnięcia kilku przycisków.


    Piszesz o 4 diodach na liniach, czy o 16 diodach po jednej w każdym przycisku? Weźmy pierwszy lepszy przykład z diodami na liniach:
    http://winavr.scienceprog.com/example-avr-pro...-keypad-example-using-avr-gcc-c-language.html
    Ja znajdowałem schemat z zastosowaniem diod w miejscu oporników 10k na podlinkowanym rysunku. Jeżeli tak, to w którą stronę skierowane i czy na liniach odczytu czy wybierania one powinny być? Jak 16 diod w każdym przycisku, to jedyne wyjście jest zakup klawiatury tak wyposażonej lub jej budowa.
  • Pomocny post
    Poziom 30  
    andrzejlisek napisał:
    Piszesz o 4 diodach na liniach, czy o 16 diodach po jednej w każdym przycisku?

    Diody przy każdym klawiszu.

    Dodano po 1 [minuty]:

    andrzejlisek napisał:
    to jedyne wyjście jest zakup klawiatury tak wyposażonej lub jej budowa.

    Nie widziałem takich w sprzedaży. Możesz zamówić, przy niewielkiej ilości ok 50zł/szt + koszt uruchomienia produkcji ok 1500zł (klawiatura membranowa). Pewnie w chinach będzie taniej ale czy lepiej? Tam raczej nie akceptują reklamacji.
  • Pomocny post
    Poziom 34  
    Możesz również pokombinować z drabinką rezystorowo-przyciskową: http://mikrokontrolery.blogspot.com/2011/03/epp-klawiatura-adc-by-dondu.html
    Przy różnych wartościach rezystorów będzie możliwa detekcja wciśnięcia jednego lub więcej konkretnych przycisków w oparciu o pomiar napięcia. Natomiast może być nieco trudne ustalenie konkretnych zakresów mierzonych napięć, które będą odpowiadały wciśniętym przyciskom.
  • Poziom 28  
    Temat uważam za wyczerpany, wklejam kod programowego zabezpieczenia, które wymyśliłem i działa zgodnie z oczekiwaniem (testowałem na prawdziwej klawiaturze podłączonej do ATMega328). W tablicach klawisze są ponumerowane wierszami niezależnie od symboli nadrukowanych na klawiszach. Co do klawiatur z diodami, to miałem na myśli niekoniecznie klawiatury membranowe (na 99% takich się nie produkuje), tylko ogólnie klawiatury 4x4, na przykład kontaktronowe lub wykorzystujące przyciski typu "tact switch" (wybór na membranową padł z innych powodów, klawiatura inna niż membranowa nie spełnia założeń projektu, który realizuję).

    Koncepcja jest następująca: Jak się naciska kolejne klawisze, to w momencie naciśnięcia trzeciego klawisza powodującego niejednoznaczność (program odczytuje fakt naciśnięcia 4 klawiszy, ale nie wiadomo, czy są naciśnięte wszystkie 4 czy 3 z nich i które), program ignoruje kolejne naciśnięcia. Te naciśnięcia są uwzględniane w momencie zwolnienia klawiszy aż do stanu jednoznacznego, nie ma znaczenia, które klawisze zostaną zwolnione w pierwszej kolejności. Wśród naciśniętych klawiszy sprawdza się, czy istnieją co najmniej 3 klawisze, które tworzą układ trzech narożników prostokąta. Jeżeli tak, to do zastosowania przyjmuje się poprzedni odczyt stanów, przy czym jest on aktualizowany tylko o stan tych klawiszy, które w poprzednim odczycie były naciśnięcie i w bieżącym odczycie nie są naciśnięte. W przypadku braku wymienionej wyżej kombinacji, do zastosowania przyjmuje się stan bieżący wszystkich klawiszy.

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Założenie jest takie, że możliwość odczytu kilku jednocześnie naciśniętych klawiszy jest pożądane, ale nie jest konieczne, można zaakceptować fakt, że pewne kombinacje kilku klawiszy nie są dozwolone z uwagi na niejednoznaczny odczyt (można wywołać skutek naciśnięcia klawisza, który faktycznie nie jest naciśnięty), bez blokowania kombinacji, które można jednoznacznie odczytać. Jest to część większego projektu, który ukończę za kilka tygodni, wtedy zaprezentuję go w dziale konstrukcji DIY.