Skocz do zawartości

Arduino Leonardo - Klawiatura 4x3 - problem ze wprowadzanymi znakami


daszy

Pomocna odpowiedź

Szanowni Forumowicze,

na początku chciałem się przywitać. Jestem tutaj nowy 🙂.

Dopiero co rozpocząłem przygodę z Arduino - platforma jest mega (możliości, itp).

Napotkałem niestety problem z odczytem zwykłej klawiatury 4x3.

Mój kod poniżej:

#include <Keypad.h>

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


//obsluga klawiatury--------------------------------------------------------------------
const byte ROWS = 4; //four rows
const byte COLS = 3; //three columns
char keys[ROWS][COLS] = {
 {'1','2','3'},
 {'4','5','6'},
 {'7','8','9'},
 {'*','0','#'}
};
byte rowPins[ROWS] = {5, 4, 3, 9}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {8, 7, 6}; //connect to the column pinouts of the keypad

Keypad customkkeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

//obsluga wyswietlacza
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  // Ustawienie adresu ukladu na 0x27

char key2;

void setup() {
 // put your setup code here, to run once:
 //inicjalizacja LCD
 lcd.begin(16,2);   // Inicjalizacja LCD 2x16

 lcd.backlight(); // zalaczenie podwietlenia 
 lcd.setCursor(0,0); // Ustawienie kursora w pozycji 0,0 (pierwszy wiersz, pierwsza kolumna)
 lcd.print("Test 1");
 //delay(500);
 lcd.setCursor(0,1); //Ustawienie kursora w pozycji 0,1 (drugi wiersz, pierwsza kolumna)
 lcd.print("test_start");
 delay(1000);

 lcd.clear();

 //customkkeypad.setHoldTime(500);
 //customkkeypad.setDebounceTime(10);

}

void loop() {
 // put your main code here, to run repeatedly:

   key2 = customkkeypad.getKey();
   if (key2 != NO_KEY)
   {
     //lcd.clear();
     //lcd.setCursor(0,0);
     //delay(200);
     lcd.print(key2);
   }
     //lcd.clear();
     //lcd.setCursor(0,0);

     //delay(1000);

}

Problem jest następujący: na LCD wyświetla mi losowo znaki z klawiatury. tzn. np. pierwsze 4 cyfry wyświetli OK, a jak wcisnę "1" to się program zawiesi. Jak mu się uda odwiesić, to wyświetla znaczki "s" "S" itp., które nie są zdefiniowane w matrycy 😖.

Zauważyłem, że problem pojawia się na jednej linii: 1 4 7 *. Sprawdziłem połączenia - są OK.

Jak na początku wcisnę "1" to program zaraz się zawiesza.

Nie mam już powoli pomysłu, co to może być.

Obecnie konfiguracja wygląda następująco:

Pin 0 - przerwanie z enkodera,
1- puste

2 - puste

3 do 9 - klawiatura

10 do 11 - guziki

12 do 13 przekaźniki

A0 - alarm (buzzer).

-Arduino Leonardo

-LCD 16x2 I2C

-klawiatura https://botland.com.pl/klawiatury/2202-klawiatura-numeryczna-12-klawiszy.html?search_query=klawiatura&results=105

- klawiatura podłączona bez rezystorów podciągających

- odległość Arduino - klawiatura - jakieś 100cm, kabel 0,5.

Dodatkowo zauważyłem, że po naciśnięciu klawisza nie ma pełnego zwarcia na zwieranych stykach na klawiaturze - jest różnie od 90 do 150 ohm.

Obecnie nie działa 1,4,7,* i 8, 9. Podejrzewam uszkodzone I/O.

Będę wdzięczny za pomoc. Pozdrawiam

Link do komentarza
Share on other sites

Nie zgadza się liczba nawiasów klamrowych otwierających i zamykających -- to nie ma prawa się skompilować.

Co do twojego problemu, to zwróć uwagę, że zmienna "key2" jest globalna i nie jest "czyszczona" nigdzie, więc jak już raz wciśniesz jakiś klawisz, to on tam zostaje dopóki nie wciśniesz innego.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Wg mnie liczba nawiasów jest OK. Program tak jak go pokazałem jest bez błędów kompilatora wgrywany do Arduino.

Odnośnie zmiennej key2, to uważam, że jest ona "czyszczona" przez funkcję customkkeypad.getKey();

Po prostu jak nie ma wciśniętego klawisza podczas przechodzenia przez nią - jest wystawiana flaga NO_KEY na key2. Jak np. wcisnę 5 to wyświetli 5 i nic więcej nie wyświetla. Czeka. Wcisnę 2 to wyświetli 2 i znowu czeka.

Dodam, że jak wcisnę po kolei "2 3 2 3 4 5 1 1 1 ", to wyświetla "2 3 2 3 4 5..." i wisi.

hmmm

[ Dodano: 01-11-2016, 21:32 ]

OK. Info z frontu. dopisałem na koniec głównej pętli coś takiego:

//test z dioda- czy dziala program

   digitalWrite(DiodaBlink, HIGH);   // turn the LED on (HIGH is the voltage level)
   delay(500);              // wait for a second
   digitalWrite(DiodaBlink, LOW);    // turn the LED off by making the voltage LOW
   delay(500);              // wait for a second

oczywiście u góry

#define DiodaBlink 13

oraz w setup

pinMode(DiodaBlink, OUTPUT);

Zrobiłem to w celu sprawdzenia czy program przestaje wykonywać główny loop, czy może go wykonuje, ale nie działa coś innego.

Objaw jest taki:

- jak wciskam "działające" klawisze to mi je wyświetla, a dioda sobie mruga.

- jak wcisnę "zły klawisz" to program się wiesza, LCD nie wyświetla go, a dioda przestaje mrugać.

Wniosek - program leży w głównym loopie (czeka na coś, ??)

Teraz przystąpiłem do prób i błędów - wypiąłem LCD (bez zmieniania czego kolwiek w programie). Objaw: program sobie działa, dioda mruga, mimo wciskania każdego z klawiszy!

jakieś pomysły? Padnięty LCD? Zła biblioteka do obsługi LCD?

LCD https://botland.com.pl/wyswietlacze-alfanumeryczne/2351-wyswietlacz-lcd-2x16-znakow-niebieski-konwerter-i2c-lcm1602.html?search_query=lcd&results=350

Biblioteka https://bitbucket.org/fmalpartida/new-liquidcrystal/downloads

Link do komentarza
Share on other sites

Zamiast stać przed ścianą ja bym spróbował ograniczyć pole walki do niezbędnego minimum. To być może pozwoli izolować błąd. Zacznij od uproszczenia programu jak się tylko da i testowania rzeczy osobno. Wywal wszystkie nagłówki .h oprócz aktualnie testowanego, tak żeby do kodu dołączało się tylko to co niezbędne, np:

1. Sprawdź działanie samej klawiatury a jej wyniki wypisuj na terminal znakowy przez Serial. Biblioteka portu szeregowego jest dość dobrze sprawdzona i raczej nie będzie powodować kłopotów. Wypisuj znaki na PC, pobaw się klawiaturą i zobacz, czy program działa bez zaciachów, czy wszystkie klawisze oddają poprawne kody.

2. To samo z lcd. Wstaw tylko niezbędne .h i wypisz na nim z 1000 losowych znaków.

Chodzi o to, by kolejne wersje programu budować na sprawdzonych fragmentach. Duża rzecz nigdy nie zadziała od razu cała. Jeżeli w którymś teście będą problemy, drąż temat: skróć kable, przełącz na inne piny itp. Napisanie własnej obsługi klawiatury matrycowej jest trywialne więc pomyśl także i o tym. Jak daleko masz do LCD? Jak go zasilasz? Jak go podłączyłeś? I2C to nie jest interfejs, który był planowany do metrów kabla.

Biblioteki Arduino często gryzą się ze sobą, poszukaj w sieci informacji o używaniu tych konkretnych najlepiej w jednym projekcie.

Link do komentarza
Share on other sites

Klika info w moim poście wcześniej.

Jak daleko masz do LCD? Jak go zasilasz? Jak go podłączyłeś? I2C to nie jest interfejs, który był planowany do metrów kabla.

1) Z Arduino do LCD mam z 100cm, kabel BIT LIYCY 10x0,5mm2. 4 żyły są dla LCD (5V, GND, SDA, SCL)

2) Zailsam go z portów Arduino 5V/GND;

3) Podłączyłem go Arduino SCL - LCD SCL, Arduino SDA - LCD SDA;

Potrzebuję tylko biblioteki dla klawiatury i LCD.

Link do komentarza
Share on other sites

Z ostatnich informacji wynika, że zwisa transmisja do LCD. No to spróbuj podłączyć go na kabelkach 10cm.

Rozumiem, że masz dwie biblioteki, ale testowanie oddzielnie to oddzielnie. Wywalasz jedną i sprawdzasz działanie tylko tej drugiej a potem na odwrót.

Link do komentarza
Share on other sites

marek1707 dzięki za konstruktywną pomoc.

Zmieniłem kod na:

    key2 = customkkeypad.getKey();
   if (key2 != NO_KEY)
   {
     Serial.println(key2);
     //lcd.print(key2);
   }

Klawiatura działa idealnie. Na lapku widać każdy klawisz

Aktywne lcd.print(key2);, nawet przy wypiętym LCD, wprowadza pewne opóźnienie, ale nie wiesza programu (podejrzewam, że próbuje komunikować się z LCD).

10cm LCD od Arduino psuje mi trochę projekt, ale dla testów sprawdzę.

Link do komentarza
Share on other sites

Poprawa działania na krótkich kablach nie musi oznaczać zwałki projektu. Masz tylko znaleźć przyczynę problemów, to zwykła procedura uruchamiania. Potem możesz zająć się poprawkami. Po pierwsze: jakie i gdzie podłączone masz oporniki podciągające na I2C? Po drugie: czy na LCD pracuje jakieś podświetlanie?

Link do komentarza
Share on other sites

Po pierwsze: jakie i gdzie podłączone masz oporniki podciągające na I2C? Po drugie: czy na LCD pracuje jakieś podświetlanie?

1) oporniki podciągające?? 🙂 OK. Nie mam 'osobno' czegoś takiego. (chyba, że to jest na płytce Arduino lub LCD/I2C).

W opisie LCD na botland jest napisane: Brak rezystorów podciągających linie magistrali I2C (załączane w Arduino);

2)Tak, jest podświetlenie - niebieska dioda.

Link do komentarza
Share on other sites

W Arduino mogą być załączone oporniki wbudowane w procesor, ale są to bardzo duże wartości wystarczające do wolnych transmisji I2C na niewielkie odległości. W żadnym razie nie są one wystarczające do wystawiania sygnałów tego interfejsu na zewnątrz płytki. O ile pamiętam Arduino nie mają osobnych rezystorów na I2C i - jeśli nie ma ich w żadnym module podłączanym do płyty głównej - trzeba o to zadbać samemu.

Weź zatem dwa identyczne oporniki w okolicach 5.1kΩ i podłącz je jednym końcem do +5V na Arduino a drugim do linii SDA oraz SCL. Każda linia ma dostać swój własny opornik. Trzeba to zrobić tak czy tak, a potem możesz robić próby z dłuższymi i krótszymi kablami.

Pytałem o podświetlenie LCD, bo duży prąd powoduje spadek napięcia na przewodzie masy i może być przyczyną problemów z I2C, ale to raczej pro forma bo to trochę za mały prąd (mierzyłeś?) i niezły kabelek. Dla pewności możesz podłączyć się minusem woltomierza na zakresie 200mV do masy Arduino i zmierzyć potencjał masy na LCD podczas pracy całości. Zacznij się martwić jeśli będą różnić się o więcej niż 100mV.

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.