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

Próba rozgryzienia działania skanowanej klawiatury macierzowej na bazie radia.

13 Kwi 2018 17:26 480 14
  • Poziom 34  
    Cześć,
    teorię jak działa skanowanie itd. znam, problem jest następujący:

    - mam radio z klawiaturą macierzową 4x5 (17 przycisków, 3 kombinacje nieużywane)
    - radio korzysta z procesora ST92F150C
    - skanowane wiersze (4) to wyjścia A0-A3/D0-D3, rezystory 1kOhm (102 smd) wpięte między wierszem a procesorem
    - kolumny (5) idą na wejścia AIN12-AIN15, każda linia ma rezystor 47kOhm (473 smd) do VCC (+5v), a więc pullup.

    Czyli jeśli dobrze rozumiem, wiersze podczas skanowania ściągają kolumny do masy (?). Oczywiście te zwarte / wciśnięte przyciski.

    Chciałbym się wpiąć w tą klawiaturę np za pomocą Arduino i symulować wciskanie klawiszy. Algorytm wydaje się prosty - cztery wiersze przypięte do przerwań, funkcja od przerwania ustawia odpowiednio pięć kolumn aby zasymulować wciśnięcie klawisza (to że trzeba by taki stan utrzymać przez pewien czas bo kontroler na pewno bierze pod uwagę ghosting na moment pomińmy).

    Ale wróćmy do problemu.
    Mam Pro Micro 5v. Ustawiam na pinie 2 (INT1) INPUT_PULLUP (lub wstawiam rezystor pullup 10K do 5v), następnie ustawiam handler do przerwania - attachInterrupt(1, on_interrupt, RISING), odpalam całość - nic. Funkcja od przerwań działa poprawnie gdyż macając pin śrubokrętem wywołuję przerwanie...

    Z braku oscyloskopu używając zwykłego pc speakrea poczyniłem następujące obserwacje:
    - jedna z kolumn do masy - nic nie słychać
    - jedna z kolumn do 5v - nic nie słychać (nie dziwi bo pullup do 5v)
    - jeden z wierszy do masy - nic nie słychać
    - jeden z wierszy do 5v - nic nie słychać (co już mnie dziwi)
    - jeden z wierszy do jednej z kolumn - jest buczenie

    Pytanie zatem - gdzie w moich cud pomiarach jest błąd, lub też czego nie rozumiem - dlaczego "skanowanie" jest widoczne tylko między wierszami a kolumnami kontrolera / w jaki sposób wykryć sygnał od skanowania na Arduino?
  • PCBway
  • Poziom 37  
    Witam,
    mógłbyś odtworzyć schemat Twojej klawiatury wraz z "bliskimi okolicami" i go tutaj umieścić. Z Twojego opisu trudno coś mądrego wywnioskować, być może popełniasz jakiś banalny czeski błąd.

    Pozdrawiam
  • Poziom 34  
    Próba rozgryzienia działania skanowanej klawiatury macierzowej na bazie radia.

    Zgodnie z teorią na A0-A3 podawany jest sygnał podczas skanowania, i za każdym razem odczytywane AIN11-AIN15.

    Problem polega na tym że wpinając się do A0-A3 inputami Arduino mając INPUT_PULLUP i ustawione na nich przerwanie sprzętowe, nie dostaję żadnych śladów sygnału.
    Być może Atmega32u4 ma zbyt małą częstotliwość aby nadążyć i stąd wynika problem?
    Ew. może jest jakiś scalak (demultiplexer?) który załatwił by sprawę tak że po stronie Arduino wystawiałbym dane w formie binarnej na GPIO, a układ zajmowałby się wysyłaniem tego dalej, tak żeby nie przejmować się tu przerwaniami?
  • PCBway
  • Poziom 37  
    Bardzo przepraszam, z głupia frant zapytam czy podłączyłeś masę Arduino do masy radia ?
    kitor napisał:
    Problem polega na tym że wpinając się do A0-A3 inputami Arduino mając INPUT_PULLUP i ustawione na nich przerwanie sprzętowe, nie dostaję żadnych śladów sygnału.

    W jaki sposób to sprawdzasz, może zamieść jeszcze program, chwilowo zapewne nieco "testowy".
    kitor napisał:
    Ew. może jest jakiś scalak (demultiplexer?) który załatwił by sprawę tak że po stronie Arduino wystawiałbym dane w formie binarnej na GPIO, a układ zajmowałby się wysyłaniem tego dalej, tak żeby nie przejmować się tu przerwaniami?

    Dość prostym sposobem symulowania klawiatury matrycowej jest podłączenie transoptorów równolegle z przyciskami, tyle że będziesz potrzebował bardzo dużo tych transoptorów.
  • Poziom 34  
    Cytat:
    Bardzo przepraszam, z głupia frant zapytam czy podłączyłeś masę Arduino do masy radia ?

    Oczywiście :)

    Cytat:
    W jaki sposób to sprawdzasz, może zamieść jeszcze program, chwilowo zapewne nieco "testowy".


    Na pojedynczej linii:
    Code:
    volatile unsigned int counter = 0;
    

    void setup() {
       Serial.begin(9600);
       pinMode(2, INPUT_PULLUP);
       attachInterrupt(1, test, RISING);  // pin 2 to int 1 w pro micro

    }

    void test(){
      Serial.println(counter++);
    }

    void loop() {
       Serial.println("loop");
       delay(1000);
    }


    Może należy się też małe wyjaśnienie co próbuję osiągnąć:
    Fabryczne radia od Fiata Bravo II i Stilo to w zasadzie ta sama elektronika. Różni je panel przedni (i układ klawiszy na mozaice - panele można przełożyć, wszystkie funkcje działają tylko mapowanie przycisków się nie zgadza) i parę opcji dodanych w Bravo II typu Aux, niemożliwy do uzyskania na tym ze Stilo.
    Tym samym chcę zrobić układ "tłumaczący" jeden układ klawiszy na drugi w locie. A dodatkowo, podchodząc do tematu mikrokontrolerem - jako że kierownica multifunkcyjna (fabrycznie wpięta w CAN, nie obsługiwana zresztą przez moje ECU ;) ) fabrycznie posiada wyszukiwanie stacji, nie ma zaś możliwości przełączania między zapisanymi - mając taki kontroler łatwo można by to zmienić wpinając przyciski kierownicy również do niego.

    Znalazłem taki oto wątek: http://forum.arduino.cc/index.php?topic=60248.0
    Wygląda na to że OP próbuje osiągnąć to samo co ja, i udało się to przy wykorzystaniu układów 4051. Patrząc na ich datasheet LINK faktycznie brzmi to sensownie - trzy sztuki 4052 chyba by rozwiązały problem. Pozostaje zdobyć jakiś układ do testu.
  • Poziom 37  
    Moim zdaniem wołanie funkcji portu szeregowego z ISR to jest raczej słaby pomysł. Spróbuj w tej funkcji obsługi przerwania tylko inkrementować zmienną a jej aktualną zawartość wysyłać w głównej pętli, jeżeli będzie się zmieniała to znaczy, że prawidłowo działa.
    Może lepiej jest użyć zalecanego
    Cytat:
    attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)
  • Poziom 34  
    Wartość się nie inkrementuje. Dotykając pin metalowym śrubokrętem lecą przerwania jak i printy na konsoli.
  • Poziom 37  
    Nie jestem pewien, słabo znam Arduino i używane tam procesory, możliwe że wewnętrzny pull-up nie działa gdy pin ma funkcję przerwania. Spróbuj zastosować zewnętrzny pull-up.
  • Poziom 34  
    Stosowałem - pierwszy post. Niestety to samo.
    Cytat:
    Ustawiam na pinie 2 (INT1) INPUT_PULLUP (lub wstawiam rezystor pullup 10K do 5v),


    Tak jak wpinając się między wiersz i kolumnę słyszę buczenie (skan) w głośniku, tak wpinając się tu głośnikiem między ten pin a Arduino, nie słychać impulsów skanowania.
  • Poziom 34  
    Tak, będę miał taki na początku tygodnia.
    Na razie idąc tropem "mam przeczucie że to zegar na masie robi problemy" wstawiłem w linie sygnałowe 7404... i mam "słyszalny" sygnał między wyjściami 7404 a masą. Arduino wciąż go nie łapie (poziomy napięć? niby ok - wysoki ~4.5v, niski 0v; częstotliwość?) ale to już jest coś.
  • Poziom 37  
    Jakby co, możesz opublikować wyniki pomiarów oscyloskopowych, coś się niewątpliwie wykombinuje.
    Moim zdaniem symulację klawiatury można zrobić bez multiplekserów.
  • Poziom 34  
    Zanim sonda mi się rozpadła ( :) ) zmierzone 250Hz, przy pomiarze dwóch wierszy na raz rosło wypełnienie (?) z 1/4 do 1/2.

    [e]
    Tak, udało mi się zmierzyć ponownie (ledwo bo ledwo, kabel od sondy gdzieś nawalił ;) ). Przy R2+R3 pokazywał 500Hz poprzesuwanie o 1/4 więc całkowita częstotliwość skanowania to 1kHz.
    Próba rozgryzienia działania skanowanej klawiatury macierzowej na bazie radia.Próba rozgryzienia działania skanowanej klawiatury macierzowej na bazie radia.
  • Poziom 34  
    Ok, sytuacja sprowokowała mnie do zakupu (w końcu) porządnego oscyloskopu. I myśląc i testując, zrozumiałem co tu się dzieje.

    Stan "początkowy" - po włączeniu układu
    A0-A3: LOW
    AIN11-AIN15: HIGH (przez pullup)

    W momencie wciśnięcia dowolnego przycisku następuje zwarcie któregoś z Ax do AINy i w efekcie zmiana stanu AINy na LOW. I tu kontroler dopiero rozpoczyna skanowanie A0-A3 widocznym sygnałem. Stąd też to co widziałem wcześniej na oscyloskopie myśląc że mam uszkodzone sondy - był zwyczajny stan nieokreślony :)

    Błędem było założenie że klawiatura jest skanowana cały czas - choć tak działa to w teorii.

    Po chwili programowania byłem w stanie z poziomu Arduino narysować taki sam przebieg na wyjściu jak dostawałem na wejściu (tym razem Arduino Uno):
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dolny przebieg to A0 z radia, górny - mój sygnał na D6 Arduino. Także myślę że jestem bliżej niż dalej :)
    Oczywiście przebieg rysuje się tylko w momencie gdy wcisnę któryś z innych przycisków.

    Próba rozgryzienia działania skanowanej klawiatury macierzowej na bazie radia.