A15. Näytöt - matpi/EmbeddedSystemsUTU GitHub Wiki
LCD näyttöön voidaan kytkeä I/O-expander moduuli, jolloin sen käyttö on yksinkertaisempaa ja vie vähemmän pinnejä mikrokontrollerista. Lisäksi moduuliin on integroitu taustavalon virransyöttö ja kontrastinsäätö. Moduuli tottelee I2C-protokollaa. I2C-väylässä on kaksi johdinta( kello ja datalinja) ja laitteet viestivät vetämällä vuorotellen jännitteen alas datalinjassa kellopulssin tahdissa. I2C-väylään voidaan liittää useita laitteita koska jokaista laitetta kutsutaan omalla osoitteella.
Eri valmistajilla on erilaisia ja eri kokoisia näyttöjä. Yllä olevassa kuvassa on YwRobot merkkinen I/O-expander moduulilla varustettu näyttö kuvattuna näytön kääntöpuolelta. Alla olevassa kuvassa on sama sinisellä taustavalolla varustettu 16 merkin 2 rivinen näyttö edestä kuvattuna.
I2C-väylissä pitää olla AINA ylösvetovastukset, eli ne kytketään esim 4,7k vastuksilla käyttöjänniteeseen. Alasvetovastukset on joillain elektroniikkavalmistajilla integroitu suoraan näytön tai I/O-expanderin piirilevyyn, jolloin niitä ei tarvitse lisätä kytkentään.
Näytön kytkeminen Arduinoon:
1.Kytke GND ja 5v jännite.
2.Kytke moduulien datapinnit (SDA) ja kellopinnit (SCL) yhteen kuvan mukaisesti.
3.Kytke kummastakin linjasta 4,7k vastukset 5v jännitteeseen. (Koululta löytyvissä näytöissä ei tarvita)
Kun kytkennät on tehty, on aika kokeilla näytön käyttöä. LCD näytön protokolla olisi työläs koodata itse, mutta arduinolle on olemassa valmiita kirjastoja (library), jotka tekevät vaikeasta helppoa. Arduino ohjelman mukana tulee monia kirjastoja, mutta I2C moduulin kautta LCD-näytön ohjaaminen vaatii ulkopuolisen kirjaston asentamista. Eri elektroniikkavalmistajilla I/O-expander moduuli on saatettu kytkeä eri tavoin LCD moduuliin. Sen vuoksi on tärkeää, että laitteelle löytyy sopiva kirjasto. Valmistajan nimellä voi Googlettaa laitteeseen sopivaa kirjastoa. Koulun näyttöihin kirjasto löytyy täältä: https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
Kirjasto asennetaan seuraavasti:
-
Valitse vaihtoehto Download ZIP, ja pura pakattu kansio.
-
Muuta puretun kansion nimi Arduino-LiquidCrystal-I2C-library-master ---> ArduinoLiquidCrystal_I2C
-
Vie kansio joka sisältää kirjaston arduinon ohjelmakansiossa olevaan "libraries"- kansioon.
-
Kun nyt käynnistät arduino-ohjelman uudestaan, kirjasto on asennettuna.
-
Kokeile näytön toimintaa seuraavan esimerkkikoodin avulla:
#include <Wire.h> // Tämä tuo I2C-kirjaston käyttöön.
#include <LiquidCrystal_I2C.h> // Ja tämä LCD-kirjaston.
LiquidCrystal_I2C lcd(0x27, 16, 2); // Asetetaan LCD näytön osoite
void setup()
{
// Käynnistetään näyttö ja asetetaan ja taustavalo päälle
lcd.begin();
lcd.backlight();
}
void loop()
{
lcd.setCursor(2,0); // määritellään tekstin aloituskohta
lcd.print("Hello, world!"); // Kirjoitetaan näytölle Hello, world!
delay(2000);
lcd.clear(); // tyhjennetään näyttö
lcd.setCursor(2,1); // määritellään tekstin aloituskohta
lcd.print("Hello, Rauma!"); // Kirjoitetaan näytölle Hello, Rauma!
delay(1000);
lcd.clear(); // tyhjennetään näyttö
}
Jokaiseen kirjastoon on liitetty vähintään yksi esimerkki ohjelma. Ne löytyvät polusta "File->Examples->kirjaston nimi". Lataa "Hello World" esimerkki arduinoon. Kokeile muuttaa teksti mieleiseksi.
#include <Wire.h> // Tuodaan I2C-kirjasto
#include <LiquidCrystal_I2C.h> // TuodaanLCD-kirjasto
LiquidCrystal_I2C lcd(0x27, 16, 2); // Asetetaan LCD näytön osoite
int echoPin = 11; // Määritellään, mihin Arduino pinniin echoPin yhdistetään
int trigPin = 12; // Määritellään, mihin Arduino pinniin trigPin yhdistetään
long kesto = 0; // Määritellään long-tyyppinen muuttuja nimeltä kesto
long matka = 0; // Määritellään long-tyyppinen muuttuja nimeltä matka
void setup()
{
// Käynnistetään näyttö ja asetetaan ja taustavalo päälle
lcd.begin();
lcd.backlight();
Serial.begin (9600); // Avataan sarjaliikenne tietokoneelle nopeudella 9600 bps
pinMode(trigPin, OUTPUT); // Määritellään trigPin outputiksi
pinMode(echoPin, INPUT); // Määritellään echoPin inputiksi
}
void loop()
{
ultra(); // Määritellään ultra -niminen fuktio
if (matka <30)
{
stop(); // Määritellään stop muuttuja
}
else
lcd.print("matka=");
lcd.setCursor(0,1); // vaihtaa riviä
lcd.print(matka);
delay(2000);
lcd.clear(); // tyhjentää näytön
}
void ultra() // Kutsutaan ultra
{
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
kesto = pulseIn(echoPin, HIGH);
// Muuttujan matka arvo muutetaan senttimetreiksi kaavalla
matka = kesto/58.2;
return;
}
void stop()
{
lcd.clear(); // tyhjentää näytön
lcd.print("seis");
delay(1000);
lcd.clear(); // tyhjentää näytön
return;
}
#include <Wire.h> // Tämä tuo I2C-kirjaston käyttöön.
#include <LiquidCrystal_I2C.h> // Ja tämä LCD-kirjaston.
#define SUMMERI_PIN 8 // Määritellään summerille pinni
LiquidCrystal_I2C lcd(0x27, 16, 2); // Asetetaan LCD näytön osoite
int echoPin = 11; // Määritellään, mihin Arduino pinniin echoPin yhdistetään
int trigPin = 12; // Määritellään, mihin Arduino pinniin trigPin yhdistetään
long kesto = 0; // Määritellään long-tyyppinen muuttuja nimeltä kesto
long matka = 0; // Määritellään long-tyyppinen muuttuja nimeltä matka
void setup()
{
// Käynnistetään näyttö ja asetetaan ja taustavalo päälle
lcd.begin();
lcd.backlight();
Serial.begin (9600); // Avataan sarjaliikenne tietokoneelle nopeudella 9600 bps
pinMode(trigPin, OUTPUT); // Määritellään trigPin outputiksi
pinMode(echoPin, INPUT); // Määritellään echoPin inputiksi
pinMode(13, OUTPUT); // Määrittää LEDin outputiksi
pinMode(SUMMERI_PIN, OUTPUT);
}
void loop()
{
if (matka < 30) // Jos matka alle 30 cm...
{
digitalWrite(SUMMERI_PIN, HIGH); // LED syttyy
lcd.print("STOP"); // LCD Näytöllä lukee STOP
delay(1000); // Sekunnin viive
lcd.clear(); // Näyttö nollautuu
}
else // Muuten...
{
digitalWrite(SUMMERI_PIN, LOW); // LED ei ole päällä
lcd.print("MATKA (CM)"); // Näytöllä lukee MATKA (CM)
lcd.setCursor(0,1); // Vaihtaa riviä
lcd.print(matka); // Toisella rivillä lukee etäisyys
delay(1000); // Sekunnin viive
lcd.clear(); // Näyttö nollautuu
}
ultra(); //Määritellään ultra -niminen fuktio
delay(50);
}
void ultra() // Kutsutaan ultra funktio
{
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
kesto = pulseIn(echoPin, HIGH);
// Muuttujan matka arvo muutetaan senttimetreiksi kaavalla
matka = kesto/58.2;
return;
}
Nokian eräs yleinen näyttömalli on erittäin suosittu harrastajien parissa. Se maksaa halvimmillaan pari euroa ja siihen on olemassa hyvät teksti ja grafiikkakirjastot. Kytke alla olevan kuvan mukaisesti. Muista liittää Nokia näytön VCC Arduinon 3,3 V jännitteeseen. Valitse kytkimellä Arduino Nanolle 3,3 V jännitealue, tai käytä esim. Unossa jännitteen tason muunninta (Voltage level converter):
Kun kytkennät on tehty, on aika kokeilla näytön käyttöä. Tämänkin LCD näytön protokolla olisi työläs koodata itse, mutta arduinolle on olemassa valmiita kirjastoja (library), jotka tekevät vaikeasta helppoa. Arduino ohjelman mukana tulee monia kirjastoja, mutta Nokian näytön ohjaaminen vaatii kahden eri ulkopuolisen kirjaston asentamista.
Kirjasto asennetaan seuraavasti:
-
Pura kansiot jotka sisältävät kirjastot arduinon ohjelmakansiossa olevaan "libraries"- kansioon.
-
Leikaa ja siirrä "robot control" kirjasto pois "libraries"-kansiosta koska se sisältää uusien kirjastojen kanssa ristiriitaisia tiedostoja.
-
Kun nyt käynnistät arduino-ohjelman uudestaan, kirjastot ovat asennettuna.
-
Kokeile kirjastoa. Jokaiseen kirjastoon on liitetty vähintään yksi esimerkki ohjelma. Ne löytyvät polusta "File->Examples->kirjaston nimi". Lataa esimerkki arduinoon. Alla oleva kommentoitu koodi selittää miten kirjastoa käytetään. Siinä tulostetaan pelkkää tekstiä:
#include <Adafruit_GFX.h> //näillä komennoilla lisätään kirjastot.
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); // määritellään pinnit joita käytetään.
void setup()
{
display.begin(); // aloittaa kirjaston käytön.
display.setContrast(50); // tällä arvolla voi säätää kontrastia.
display.display(); // päivittää näytön.
delay(2000);
display.clearDisplay(); // tyhjentää näytön.
display.setTextSize(1); // fontin koko.
display.setTextColor(BLACK); //tekstin väri.
display.setCursor(0,0); // mistä kirjoitus alkaa
display.println("Hello, world!"); // tähän tulee jokin muuttuja tai teksti mikä tulostetaan.
display.display(); //päivittää näytön.
delay(2000);
display.clearDisplay();
}
void loop()
{
//Tässä kirjoitetaan vuorotellen kaksi ystävyyden tekstiä...
display.clearDisplay();
display.setCursor(0,0);
display.println("Hello, Rauma!");
display.display();
delay(1000);
display.clearDisplay();
display.setCursor(0,0);
display.println("Hello, Pori!");
display.display();
delay(1000);
}