Netduino i LCD

W tej części opiszemy podłączenie do Netduino wyświetlacza LCD ze standardowym sterownikiem HD44780. Wykorzystamy do tego udostępnioną na zasadach Open Source bibliotekę microLiquidCrystal.

Kompilacja LiquidCrystal

W tej części opiszemy podłączenie do Netduino wyświetlacza LCD ze standardowym sterownikiem HD44780. Wykorzystamy do tego udostępnioną na zasadach Open Source bibliotekę microLiquidCrystal http://microliquidcrystal.codeplex.com/, powstała ona na podstawie popularnej Arduino Liquid Crystal Library.

Twórcy udostępniają źródła biblioteki, musimy ją samodzielnie skompilować. W tym celu ściągamy najnowszą wersję http://microliquidcrystal.codeplex.com/SourceControl/latest, uruchamiamy VisualStudio (możemy użyć oczywiście darmowej wersji Exrpess) i ładujemy projekt – plik solucji: MicroLiquidCrystal.sln. Ważne jest ustawienie odpowiedniej wersji .NET Micro Framework dla naszej świeżo budowanej biblioteki: we właściwościach projektu (Alt+F7) ustawiamy Target framework na wersję 4.2.

blah

Uruchamiamy kompilację i budowanie biblioteki, nie przewidujemy jej debugowania, więc odpowiednia będzie wersja Release. Po zakończeniu dostajemy pojedynczy plik MicroLiquidCrystal.dll. Biblioteka jest gotowa do użycia, możemy zająć się podłączeniem wyświetlacza.

Podłączenie wykonamy w najprostszym wariancie wykorzystując sześć linii sterownika LCD:

Podłączenie LCD

RS - sygnalizacja przesłania rozkazu,
ENABLE- sygnalizacja transferu danych,
DB4, DB5, DB6 i DB7 - linie do przesłania danych.

Do tego standardowe podłączenie zasilania: +5V - złącze VDD, masa - złącze VSS. Dodatkowo do masy złącze VO (kontrast - w najprostszej wersji, bez regulacji potencjometrem, będzie maksymalny), i RW (kierunek transmisji danych - tylko zapis).

Schemat podłączenia LCD do Netduino

Uwaga
W niektórych przypadkach, maksymalny kontrast może oznaczać wyświetlanie kwadaracików zamiast liter - jeżeli tak jest w przypadku Twojego LCD, nie masz wyjścia musisz skorzystać z potencjometru. Kit LCD od Nettigo ma oczywiście taki dołączony.

Programujemy pierwszy przykład

Wracamy do programowania, tworzymy nowy projekt, dodajemy odpowiednie biblioteki podstawowe (.NET Micro Framework i Netduino SDK), dodatkowo tym razem bibliotekę MicroLiquidCrystal. Program jak zwykle zapiszemy wewnątrz statycznej funkcji Main.

Po pierwsze musimy ustalić tryb działania biblioteki, dostępnych jest kilka, my skorzystamy z najprostszego – użyjemy bezpośrednio portów wejścia/wyjścia (GPIO). Musimy utworzyć obiekt bibliotecznej klasy GpioLcdTransferProvider i odpowiednio ustawiając parametry konstruktora klasy odwzorować nasz schemat podłączenia wyświetlacza do portów Netduino. Parametry kolejno odpowiadają liniom: RS, ENABLE, D4, D5, D6 i D7. Podstawiamy odpowiednie wartości portów Netduino: Pins.GPIO_PIN_D12, Pins.GPIO_PIN_D11, Pins.GPIO_PIN_D5, Pins.GPIO_PIN_D4, Pins.GPIO_PIN_D3 i Pins.GPIO_PIN_D2. Jeżeli wybierzemy inny schemat podłączenia Netduino i LCD (nic nie stoi na przeszkodzie żeby użyć dowolnych sześciu wolnych portów) w tym miejscu programu musimy zmiany uwzględnić.

Mając utworzony skonfigurowany obiekt GPIO providera tworzymy instancję interfejsu Lcd, przez który będziemy wywoływać metody sterujące już bezpośrednio wyświetlaczem: kolejno ustawienie liczby kolumn i wierszy obsługiwanych przez nasz egzemplarz wyświetlacza (tu założono standardowo dwie linie po szesnaście znaków) i wreszcie wypisanie naszej wiadomości.

Jeśli wszystko potoczyło się pomyślnie i po kompilacji przykładowego kodu i załadowaniu go do Netduino faktycznie na LCD pojawił się powitalny napis, możemy pójść o krok dalej i pokusić się o zrobienie prostej animacji. Wykorzystamy metody .NET: Substring (metoda klasy string) do wycinania fragmentów napisu i Sleep (metoda klasy Thread) do ustawienia opóźnienia przy wyświetlaniu kolejnych klatek naszej animacji.

Uzyskamy efekt płynącego w kółko napisu, zmieniając wartość parametru funkcji Sleep (uśpienie wątku na podaną liczbę milisekund), regulujemy szybkość naszej animacji. Ciekawe może być ustalenie maksymalnej możliwej częstotliwości odświeżania LCD, przy której animacja pozostaje jeszcze czytelna i płynna, tak aby poszczególne znaki nie zaczęły się już zlewać ze sobą. Dla mojego egzemplarza to było 200 ms co daje około 5 klatek animacji na sekundę.

        public static void Main()
        {
            var lcdProvider = new GpioLcdTransferProvider(Pins.GPIO_PIN_D12, Pins.GPIO_PIN_D11,                     Pins.GPIO_PIN_D5, Pins.GPIO_PIN_D4, Pins.GPIO_PIN_D3, Pins.GPIO_PIN_D2);

            var lcd = new Lcd(lcdProvider);

            lcd.Begin(16, 2);

            string msg = "Hello, world!   ";
            lcd.Write(msg);

            int x = 0;
            while (true)
            {
                lcd.SetCursorPosition(0, 0);
                lcd.Write(msg.Substring(x, 16 - x));
                lcd.Write(msg.Substring(0, x));
                if (++x == 16)
                    x = 0;

                Thread.Sleep(200);
            }
        }