Arduino Display
Denne del dokumenterer forskellige måder at tilslutte et LCD Display på Arduinoen.
Grunden til at der er forskellige måde at tilslutte displays på er, at man kan købe displays i forskellige konfigurationer, som skal tilsluttes forskelligt.
Software
Til nogle displays kan man anvende det standard software der ligger sammen med installationen af Arduino, mens andre typer kræver at man finder andre biblioteker og installerer dem sammen med sin software.
Det Rå display i 2*16 karakterer
Det første vi skal er at prøve at få et af de displays vi køber hjem som standard ALCD 2*16 Datablad.
I Arduino-programmet åbnes Fil - Eksempler - LiquidCrystal - HelloWorld[1].
Virkemåde
I funktionen setup() initialiseres LCD-displayet med lcd.begin(16, 2), hvor det angives at det er 16 karakterer på to linjer, og derefter skrives "Hello, World!".
Her er lcd defineret uden for funktionerne som:
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
Altså angivet hvilke digitale ben der anvendes til displayet.
I funktionen loop() afvikles den samme kode i en uendelig løkke, hvor cursoren placeres samme sted hver gang (i starten af 2. linje) og der udskrives hvor mange sekunder der er gået siden reset.
Hardware
For at teste programmet fornuftigt skal Displayet selvfølgelig tilsluttes.
Der skal tilsluttes +5V og stel, 3 styreledninger og 4 dataledninger for at kunne kommunikere med displayet. Ud over det skal der tilsluttes et potentiometer (10-100k) som justerer kontrasten i displayet.
Forbindelserne er dokumenteret i softwaren:
/*
The circuit:
* LCD RS pin to digital pin 12
* LCD Enable pin to digital pin 11
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
Dette er illustreret i følgende diagram:
Diagram over Arduinoen med Display tilkoblet
Kobler man det op på fumlebræt kan det gøres som illustreret her:
Fumlebræt med Arduinoen tilsluttet et display
For at kunne sætte de displays vi har på lager ned i et fumlebræt, så skal der loddes en 16 bens pin-række på (vi har dem på lager i 40 pins, som man så brækker et stykke af), hvor de korte ben skal loddes ned i displayet, så de lange ben kan komme ned i fumlebrættet.
Pin-rækken monteres i CON1 som vist her:
Display med 16 bens pin-række loddet på, til fumlebræt-montage
Test
For at teste programmet laves opstillingen som vist, hvorefter man skal se at der skrives det ønskede i displayet, og at den tæller sekunder op.
Udvidelse 1
Prøv at skrive dit fornavn inden antal af sekunder.
Observer hvordan rettelsen har ændret programmets opførsel.
Udvidelse 2
Prøv at få displayet til at vise niveauet af en knap tilsluttet et ben på Arduinoen (set evt. Arduino Button).
Udvidelse 3
Afprøv nogle af de andre eksempler der ligger under eksempler.
Displayvisning til dokumentation
Når man skal dokumentere en opstilling eller et program, hvor man anvender et display, så kan det være rart at kunne vise hvad der skal stå/står i displayet.
Det kan man selvfølgelig løse ved at tage billeder af displayet når det viser det ønskede, men en anden måde at gøre det på er at udnytte et web-program[2], hvor man kan lave eksempler på displayvisning i forskellige størrelser og farver - der er også mulighed for at vise andre displaytyper.
Herunder vises eksempler på displayvisninger lavet på avtanski.net LCD-side.
Eksempel på visning af et display
Andre displays koblet direkte
Der er selvsølgelig andre størrelser af displays man kan koble på, hvor nogle skal skaffes hjem, og andre har vi i mindre antal i afdelingen.
Råt display med 2*8 karakterer
Dette fungerer lige som det 2*16 karakters display, men blot med 2 linjer af 8 karakterer. Der skal forbindes lige så meget til displayet, men blot med et andet stik, som angivet i databladet.
Der skal rettes lidt i softwaren, nemlig inde i setup() hvor der skal stå:
lcd.begin(8, 2);
Displays designet til PIC
De to ovennævnte displays har vi lagt print ud til, og placeret potentiometeret på printet, så det er lettere at tilslutte en PIC til displayet. Det er dokumenteret i ALCD, og kan gøre det lidt lettere at tilslutte displayet, da man ikke skal have potentiometeret på fumlebræt.
Denne opstilling gør at der kun skal tilsluttes +5V, stel, og 6 kommunikationsledninger.
Display Shield 2*16 karakterer
Det næste vi skal er at prøve at få et noget op at køre som er lettere rent hardware-mæssigt, et Display Shield fra dx.com.
Der er dog også en ulempe ved dette display, da benforbindelserne er anderledes, så det skal rettes til i softwaren.
Display Shield sat på en Arduino
Det kan være lidt svært at se, men Arduinoen sidder under display-shieldet.
I Arduino-programmet åbnes Fil - Eksempler - LiquidDisplay - HelloWorld[1].
Shield Virkemåde
Præcis den samme som før.
Der skal dog ændres i softwaren, fordi benene sidder anderledes:
/*
The circuit:
* LCD RS pin to digital pin 8
* LCD Enable pin to digital pin 9
* LCD D4 pin to digital pin 4
* LCD D5 pin to digital pin 5
* LCD D6 pin to digital pin 6
* LCD D7 pin to digital pin 7
* LCD R/W pin to ground
*/
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
Shield Hardware
For at teste programmet fornuftigt skal Display Shieldet selvfølgelig sidde korrekt på Arduinoen.
Shield Test
For at teste programmet laves opstillingen som vist, hvorefter man skal se at der skrives det ønskede i displayet, og at den tæller sekunder op.
Shield Udvidelse 1
Prøv nogle af de foregående udvidelser
Shield Udvidelse 2
Prøv at få displayet til at vise hvilke af knapperne der sidder på shieldet der er trykket på.
Hint:
int keyVal = analogRead(0);
I2C Display 2*16 karakterer
Det sidste display er laved til at kommunikere med I2C protokollen, der er en seriel kommunikation på to ledninger. Her er det et display fra MiniInTheBox.
Displayet kan altså tilsluttes ved hjælp af +5V, stel og to kommunikations-leninger, der skal tilsluttes korrekt til Arduinoen.
I2C Virkemåde
Der skal en helt anden software til for at kommunikere med displayet via en I2C_Bus. Denne software ligger ikke i de normale eksempler, men er stadig dokumenteret inde på Arduinos hjemmeside[3]. Grunden til at der ikke ligger et fast bibliotek er at der er flere forskellige måder at etablere I2C kommunikation til tilplayet på.
Den type vi anvender på Holstebro HTX er ved hjælp af en kreds der hedder PCF8574, som i den grundlæggende konfiguration kan omforme et I2C signal til 8 parallelle signaler, hvilket er det man har behov for at kunne, når man skal kommunikere med et LCD-display.
Hvis man anvender der bibliotek det ligger på Arduinos hjemmeside, så vil man opleve at det ikke fungerer. Grunden til dette er at de 8 ledninger til displayet er koblet anderledes til I2C-kredsen PCF8574 end den den vi har købt hjem.
Dette betyder at der er lavet en omskrevet kode, der retter op på dette. Dette er placeret i Denne ZIP-fil med biblioteksfiler, som man kan installere ind i bibliotekerne, ved at følge proceduren angivet under Arduinos Biblioteker. Dette gør at der fremkommer et bibliotek der hedder LiquidCrystal_I2C.
Dette bibliotek fungerede kun i de lidt ældre versioner af Arduinos IDE - det fungerer på version 1.6.4.
Med en mindre rettelse er det kommet til at fungere på 1.6.6 - det er ikke dog ikke 100 % gennemtestet.
Hvis lægger den ind og genstarter arduino-PC-programmet, så vil man se at der under Eksempler er kommet et punkt der hedder LiquidCrystal_I2C hver der er 5 forskellige eksempel-programmer.
I alle eksempler er der angivet at I2C adressen er 0x27 - det er den adresse den type display vi har på Holstebro HTX har, men det kan rettes ved at kode på A0, A1 og A2 på displayet.
I2C Software
I Arduino-programmet åbnes Fil - Eksempler - LiquidDisplay_I2C - HelloWorld_ext.
I setup() sættes den serielle kommunikation op, så man kan overvåge i den serielle monitor hvad programmet laver (hvis man har lyst). LCD-displayet bliver initialiseret, hvor den anvender LiquidCrystal_I2C lcd(0x27,16,2); datastrukturen til at se at det er på I2C adresse 0x27 og et display med 16 karakterer i 2 linjer.
Så tændes baggrundslyset.
Til sidst printes der en besked i displayet (ind mellem disse ting blver der skrevet til den serielle monitor, det er fjernet her).
Serial.begin(9600); // start serial for output
lcd.init(); // initialize the lcd
// Print a message to the LCD.
lcd.backlight();
lcd.print("Hello, world!");
I loop() sker der i en uendelig gentagelse det at der ventes 0,5 sekund cursoren placeres et fast sted og en tæller printes ud før den tælles op. Så tændes backlight, før det ventes et halvt sekund igen og baggrundslyset slukkes.
På denne måde vil programmet tælle op hvert sekund mens baggrundslyset står og blinker (igen er der slettet informationen der sendes til den serielle monitor).
delay(500);
lcd.setCursor(1,1);
lcd.print(tael);
tael++;
lcd.backlight();
delay(500);
lcd.noBacklight();
I2C Hardware
For at teste programmet fornuftigt skal Displayet forbindes til I2C, stel og forsyning der selvfølgelig er forbindelser på Arduinoen, som det er beskrevet under I2C Bus.
I2C er på Arduino UNO Rev. 3 markeret som SDA og SCL på bagsiden af printet. På andre typer hvor de to ben ikke er der kan man forbinde til A4 og A5 hvor A4 er SDA og A5 er SCL. På Arduino UNO Rev. 3 er der forbindelse mellem I2C signalerne og A4, A5, så disse to analoge indgange kan ikke anvendes sammen med I2C funktionen.
På displayet er der markeret hvad de forskellige ben skal forbindes til. GND til stel, VCC til +5V, SDA til SDA/A4 og SCL til SCL/A5.
Stikforbindelsen på display med I2C interface
I2C Test
For at teste programmet laves opstillingen som beskrevet, hvorefter man skal se at der skrives det ønskede i displayet, og at den tæller sekunder op samtidig med at baggrundslyset blinker.
I2C Udvidelse 1
Prøv at læse en værdi fra en analog indgang (f.x. A0) og skrive den ud på displayet i stedet for tiden.
Referencer
- ↑ 1,0 1,1 http://www.arduino.cc/en/Tutorial/LiquidCrystal LCD Display grundlæggende kode
- ↑ LCD visning ved avtanski.net hvor man kan lave eksempler på displayvisning
- ↑ Arduinos I2C Display-rutine