Skocz do zawartości
Zaloguj się, aby obserwować  
Lukasz1979

Arduino klawiatura z dzielnika napięciowego i ADC

Pomocna odpowiedź

Realizując swój pierwszy samodzielny projekt natknąłem się na problem, który (jak mi się wydaje) można rozwiązać z wykorzystaniem ADC oraz rezystorów połączonych w roli dzielników napięcia. Będę wdzięczny, jeśli ktoś bardziej doświadczony "rzuci okiem" na moje wypociny i potwierdzi, czy można tak postępować (ja nie widzę przeciwskazań, ale być może coś mi umyka).

Problem - zbyt mała ilość dostępnych wyjść/wejść cyfrowych w projekcie zawierającym wyświetlacz LCD, serwo, sporo diod sygnalizacyjnych i 5 przycisków. Oczywiście wiem (przynajmniej pobieżnie), że można użyć wyświetlacza I2C, klawiatury matrycowej itp. ale na razie chciałbym oprzeć się na już posiadanych elementach (poza tym klawiatura matrycowa i tak zajmuje sporo pinów).

Pomysł (być może naiwny ale taki przyszedł mi do głowy) - zamiast "marnować" piny na przyciski, postanowiłem połączyć przyciski z rezystorami służacymi jako dzielniki napięcia w taki sposób (rysowane w Cuircuits/Tinkercad):

image.thumb.png.d71fdfa24140f8b7e167d6d1c72be43c.png

Dzięki różnym wartościom rezystorów (stopniowane co ok. 330R) na ADC możemy otrzymać inny odczyt przy każdym przycisku. Rezystor 10k stale "podciąga" wejście A0 d0 5V dla zabezpieczenia przed zakłóceniami, kiedy żaden przycisk nie jest wciśnięty.

W celu testowym zbudowałem układ na płytce łączac szeregowo rezystory 1k i 330R:

image.thumb.png.b9d523c1c8ee8947fe0c9bb823612f58.png

i napisałem krótki program próbny:

#include <LiquidCrystal.h>
LiquidCrystal lcd(1, 2, 3, 4, 5, 6);
int odczyt=0;
int odczytzmapowany=0;
void setup() {
 lcd.begin(16, 2); //Deklaracja typu
  lcd.setCursor(0, 0); //Ustawienie kursora
  lcd.print("TEST KLAWIATURY"); //Wyświetlenie tekstu
  lcd.setCursor(0, 1); //Ustawienie kursora
  lcd.print("1 PINOWEJ"); //Wyświetlenie tekstu
delay(2000); lcd.clear();

}

void loop() {
odczyt=analogRead(A0);
  while(odczyt>200){odczyt=analogRead(A0);}
  odczyt=analogRead(A0);
  odczytzmapowany=map(odczyt,30,145,1,5);
  lcd.setCursor(0, 0);
  lcd.print("NACISNIETO ");lcd.print(odczytzmapowany);
    lcd.setCursor(0, 10);
    lcd.print("ODCZYT ADC ");lcd.print(odczyt);
  delay(1000);
  lcd.clear();

}

Poniżej efekt:

ezgif.com-video-to-gif.thumb.gif.1bf27e86705d9de259a54ed4a3830ea3.gif

 

Być może warto byłoby zwiększyć "rozrzut" rezystorów dla większej pewności, że nie dojdzie do błędów odczytu, ale wydaje mi się, że układ działa poprawnie. Czy są jakieś poważniejsze przeszkody techniczne dla stosowania w praktyce takiego rozwiązania?

 

 

 

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites

Właśnie po raz kolejny wynalazłeś koło 🙂

Wrzuć w Google (grafika) hasło "Arduino resistive keyboard", jest parę fajnych przykładów jak to można zrobić (np. drabinka rezystorów, podłączenie klawiatury matrycowej do jednego pinu itp.). Tak jak Ty połączyłeś można zrobić niezależny odczyt każdego klawisza, ale więcej niż 6 raczej nie wyjdzie.

A tak swoją drogą to jednak warto zainwestować w I2C do wyświetlacza - choćby z tego powodu że trochę mniej kabli.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites
1 minutę temu, ethanak napisał:

Właśnie po raz kolejny wynalazłeś koło 🙂

Wrzuć w Google (grafika) hasło "Arduino resistive keyboard", jest parę fajnych przykładów jak to można zrobić (np. drabinka rezystorów, podłączenie klawiatury matrycowej do jednego pinu itp.). Tak jak Ty połączyłeś można zrobić niezależny odczyt każdego klawisza, ale więcej niż 6 raczej nie wyjdzie.

A tak swoją drogą to jednak warto zainwestować w I2C do wyświetlacza - choćby z tego powodu że trochę mniej kabli.

Dzięki za odpowiedź. No tak, można to było znaleźć.... Ale z drugiej strony jak się coś samemu wykombinuje to lepiej zapada w pamięć (raczej nie miałem złudzeń, że dokonałem epokowego wynalazku 😉  - chciałem tylko potwierdzenia, że nie popełniłem jakiegoś powaznego błędu). I2C oczywiście w planach, ale chcę wykonać jedno urządzenie, które będzie już pracować na stale (mam jeszcze jakiegoś chińskiego klona Arduino, który będzie tym zarządzał) i warto wykorzystać posiadany wyświetlacz zamiast zostawiać go w szufladzie. Do kolejnych projektów podejdę już z I2C. Na razie, przed zakupem elementów do 2 części kursu chcę zrobić już coś praktycznego.

A czemu uważasz, że granicą jest 6 przycisków? Jeśli spojrzysz na odczyty ADC (widoczne na gifie) to zapas jest jeszcze duży....

Udostępnij ten post


Link to post
Share on other sites
(edytowany)
11 minut temu, Lukasz1979 napisał:

A czemu uważasz, że granicą jest 6 przycisków?

Przy założeniu że naciśnięty jest tylko jeden klawisz, może być ich oczywiście więcej. Ale jeśli chciałbyś zrealizować niezależny odczyt - rozdzielczość ADC może być za mała.

Kiedyś była tu dyskusja na ten temat ale nie mogę znaleźć...

W każdym razie robiłem odczyt zderzaków w robocie (niezależne cztery mikroswitche) i działało świetnie, teraz właśnie będę musiał zrobić klawiaturę na 6 niezależnych klawiszy i pewnie skończy się na dobieranych rezystorach.

Co do wyświetlacza - można kupić sam moduł I2C, robiłem tak jak mi nie odpowiadały kolory w gotowcach (były tylko niebieskie negatywy, a ja chciałem zielony).

Edytowano przez ethanak

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

Zaloguj się, aby obserwować  

×
×
  • Utwórz nowe...