Siemka Majsterkowicze. Dziś chciałbym wam zaprezentować pomysł (nie jest on mojego autorstwa) na podłączenie wyświetlacza do Arduino, tak aby zajmował jak najmniej miejsca. Ostatnimi czasy na Majsterkowie ukazał się wpis jak podłączyć wyświetlacz na trzech pinach. Dla mnie to i tak za dużo. W internecie znalazłem artykuł o tym jak podłączyć wyświetlacz na magistrali I2C. Do rzeczy. Wyświetlacz podłączymy przez ekspander, którego używałem w poprzednim poradniku, a mianowicie PCF 8574.
Potrzebujemy:
- 1x Wyświetlacz LCD (ja używam 16×2)
- 1x Potencjometr
- 1x PCF 8574
- 1x Arduino
- 1x Płytka stykowa
Zaczynajmy!
Zacznijmy od podłączenia Arduino do expandera.
Powyżej znajduje się schemat wyprowadzeń expandera. Nie będę go opisywał bliżej, bo nie oto chodzi w tym poście. Informacje o PCF8574 są tutaj.
Piny podłączamy według schematu:
Tutaj nie ma co do opisywania. Po prostu adresujemy układ (A0…A2), podłączamy zasilanie (Vin, Gnd) oraz podpinamy magistralę I2C (SCL, SDA).
No to teraz podłączmy sobie wyświetlacz (polecam powiększyć bo to plątanina kabli):
Dla ułatwiena dodam opis podłączenia pinów:
Expander
- A0, A1, A2, GND – Masa
- Vin – 5v
- SCL – SCL (Arduino)
- SDA – SDA (Arduino)
- P0 …P3 – D4…D7 (Ekran)
- P6 – RS (Ekran)
- P5 – RW (Ekran)
- P4 – E (Ekran)
Potencjometr
- Boczne nóżki – 5V, GND
- Środkowa nóżka – VO (Ekran)
Arduino
- 5v i Gnd – Listwy zasilające
I to na tyle z podłączenia.
Teraz program
Do programu użyjemy biblioteki, dostępnej tutaj, która pozwoli nam na gotowca podłączyć expander pod wyświetlacz, oraz biblioteki Wire.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x20,16,2); // ustawienie adresu expandera do którego podłączony jest wyświetlacz oraz podanie ilości wierszy i kolumn w wyświetlaczu void setup() { lcd.init(); //Inicjalizacja wyświetlacza //Napisanie tekstu na ekranie lcd.print("Hello, world!"); } void loop() { } |
Może teraz zabawmy się i stwórzmy program, który wypisuje na ekranie dane wpisane w serial monitorze.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x20,16,2); // ustawienie adresu expandera do którego podłączony jest wyświetlacz oraz podanie ilości wierszy i kolumn w wyświetlaczu void setup() { lcd.init(); // inicjalizacja wyświetlacza lcd.backlight(); Serial.begin(9600); } void loop() { if (Serial.available()) { // sprawdz czy wpisano tekst w serial monitor jeżeli tak to czekaj sto milisekund delay(100); // wyczyść ekran lcd.clear(); // przeczytaj tekst wpisany w serial monitor while (Serial.available() > 0) { //zapisz tekst na wyświetlaczu. lcd.write(Serial.read()); } } } |
Pokaz:
https://youtu.be/TdX7Sd5KmLc
Tak na zakończenie powiem, że podłączanie wyświetlacza transmisją I2C ma swoje wady np. zwolniony przesył przy dużych prędkościach zapisu. Nie jest to długi post i mam nadzieję, że go zrozumiecie.
Co to za model klawiatury, którą widać kawałek na filmiku?
A4TECH KD-126
Takie coś byłoby super, gdyby to choćby upchać na płytce uniwersalnej i zintegrować ze samym wyświetlaczem. Nie jest trudne do wykonania (trzeba się trochę lutownica pobawić) ale za to zero problemów z rozkładaniem i składaniem tego za każdym razem i zyskujemy wolną płytkę stykową, którą można wykorzystać do dalszych eksperymentów.
Oczywiście, przecież płytka stykowa służy właśnie do eksperymentów. Chyba naturalne jest, że bo zbudowaniu tego typu układu następnym krokiem jest wytrawienie do niego płytki i przeniesienie całości poza płytkę stykową
Już wolę sobie kupić na ebayu za nie całe 5zł … http://www.ebay.pl/itm/Good-IIC-I2C-TWI-SPI-Serial-Interface-Board-Module-Port-For-Arduino-1602LCD-DZ88-/131082904409?pt=LH_DefaultDomain_0&hash=item1e85266359
Popieram. Mi działa na wyświetlaczu 4×20.
Można też niektóre piny idące do wyświetlacza wykorzystać podwójnie (i nie trzeba żadnych expanderów) – podpiąć do nich wyświetlacz + inne urządzenia. Pamiętajmy że sam LCD na driverze 44780 ma coś takiego jak pin E, czyli Enable. Dopóki nie wystawimy tam stanu wysokiego, wyświetlacz jest “martwy” dla mikrokontrolera :)
Ale wtedy nie można wykorzystać gotowej biblioteki pod arduino
Wiem, że z delikatnym opóźnieniem :)
Dlaczego nie możesz wykorzystać gotowej biblioteki?
Wystarczy, że przed wykonaniem jakiejkolwiek operacji na wyświetlaczu wysterujesz niezależnie tym pinem poziom “enable”.
Po wykonaniu operacji robisz “disable” i już możesz reużywać (o jakie śliczne jest to słowo) pozostałe linie podłączone do wyświetlacza. Nie możesz wykorzystać tylko pinu służącego do enable / disable wyświetlacza.
mam problem z tą biblioteką po wgraniu przykładu wyświetla się znaczek i miga kursor ktoś jest w stanie mi pomóc?
Migający znaczek? zły adres PCF-a
Mam PCF8574P ustalony adres standardowo 3 piny PCF-a podpięte pod masę i nie mogłem za nic w świecie uruchomić LCD poprzez I2C ale wpadłem na pomysł aby uruchomić I2C Scanner tu: http://playground.arduino.cc/Main/I2cScanner
i wykrył układ pod adresem 0x38, zmieniłem adres w kodzie i ruszyło. Wydawać by sie mogło że PCF8574P będzie mial adres standardowo z przedziału 0x20 – 0x27 a nie tak jak PCF 8574A z przdziału 0x38 ….
Pozdrawiam zapaleńców ;)
Jednak jest problem, przykład “Serial Display” po wpisaniu tekstu w serial monitor działa, wyświetla całe wyrazy ale przykład “hello world” niestety wyświetla pierwsza literę, ma ktoś jakiś pomysł ? Bo ja już zgłupiałem
Dopisze jeszcze że kod załadowany przy pomocy Arduino IDE 1.6.6 nie działa poprawnie tzn. pojawia się tylko pierwsza litera wyrazu a załadowany poprzez wersje 1.0.6 działa jak należy.
Problem jak i rozwiązanie są opisane tutaj: http://forum.arduino.cc/index.php?topic=361637.0
Wystarczy zrobić małą zmianę w kodzie źródłowym biblioteki.
Wszystko super, tylko link do biblioteki nie działa :-/
u mnie tylko mrugający kursor, adres sprawdziłem 0x20 jest ktoś w stanie mi pomóc ?
u mnie nic nie działa :(
Jeśli komuś wyświetla tylko pierwszy znak: https://github.com/Mauroalfieri/LiquidCrystal_I2C