VIDI Project X #63:
Dva ili više monitora na VIDI X mikroračunalu

Većina korisnika računala teži raditi na dva ili više monitora. U ovoj radionici ćete naučiti kako spojiti nekoliko monitora na VIDI X mikroračunalo kako biste i na njemu imali mogućnost rada s više monitora

Kada na računalu ne stane sve na jedan monitor, najčešće posežemo za drugim. Tako je jednostavnije raditi s nekoliko programa odjednom, pa makar to bio i Powerpoint, dok na drugom monitoru pretražujemo fotografije s pixabey.com servisa koje bi pasale u prezentaciju, a da ne spominjemo kompleksnije aplikacije poput onih za video montažu.

 

Kako je VIDI X mikroračunalo namijenjeno upravljanju raznim aktuatorima te čitanju podataka s raznih senzora, nerijetko će vam trebati prostora tj. više monitora kako bi uspjeli prikazati silne podatke.

Za ovu radionicu potrebno vam je Arduino IDE razvojno okruženje s instaliranom podrškom za ESP32. Nemate li postavljeno Arudino IDE razvojno okruženje, upute kako ga postaviti potražite na linku https://vidi-x.org/radionice/vidi-project-x-91-arduino-ide/.

VIDI Project X #91: Arduino IDE – Windows instalacija

Osim toga, trebat će vam dva ili više 2,8“ TFT ekrana s ILI9341 driverom te VIDI X mikroračunalo.

 

Ekran

VIDI X mikroračunalo koristi TFT Touchscreen Display u boji dijagonale 2.8“ i rezolucije 240 x 320 pixela.
Kako bi mogli programirati navedeni ekran, potreban nam je Adafruit ILI9341 driver za TFT zaslon, koji ćete instalirati tako da u Arduino IDE razvojnom sučelju otvorite Manage Libraries (CTRL + SHIFT + I) iz izbornika „Alati“ te u tražilicu upišete ILI9341. Ovdje možete odabrati verziju te biblioteke. Mi smo instalirali verziju 1.5.3 te smo odabrali opciju instaliranja ostalih pripadajućih biblioteka kako kompajliranje koda ne bi javljalo greške.

 

 

SPI komunikacija

Navedena biblioteka tj. ekran koristi SPI komunikaciju. SPI je kratica od “Serial Peripheral Interface”.

To je “sinkrona” sabirnica podataka, što znači da koristi odvojene podatkovne linije za podatke i “sat” koji održava obje strane, primatelja i pošiljatelja, u savršenoj sinkronizaciji. Sat (SCK pin) je oscilirajući signal koji primatelju točno govori pri kojoj frekvenciji tj. u kojem trenutku treba pročitati uzorke bitova na podatkovnoj liniji. Brže osciliranje sata rezultirat će i bržom razmjenom podataka, a podatci mogu putovati u oba smjera istovremeno te je stoga SPI komunikacija sinkrona. Asinkrona komunikacija bila bi npr. I2C tj. IIC sabirnica, koja ne može istovremeno primati i slati podatke. I2C sabirnica koristi dvije žice za komunikaciju.

Kako bi ostvarili sinkronu komunikaciju potrebne su nam četiri žice. To su:
MOSI – Master-out, Slave-in linija prenosi podatke iz našeg VIDI X-a na uređaje pod nadzorom SPI sabirnice
MISO – Master-in, Slave out linija prenosi podatke sa SPI-kontroliranih uređaja, u našem slučaju ekrana, natrag u VIDI X
CS ili SS – Slave-select tj. Chip-select linija govori uređaju na sabirnici da s njime želimo komunicirati. Svaki SPI uređaj, što nam govori da ih može biti nekoliko, treba jedinstvenu CS liniju do VIDI X-a. Kada je CS pin HIGH, tada samo taj uređaj sluša što mu dolazi putem ostalih žica
SCK – Serial clock je sat koji oscilira na brzini od 60 megaherca pri default postavkama biblioteka, no uz VIDI X moguće ga je postaviti na maksimalno 80 megaherca

VIDI X monitor koristi još i petu žicu oznake DC. Ta peta žica nije dio standardnog SPI protokola, no neki uređaji ju koristite za kvalitetniju komunikaciju.
DC ili D/C – Data/Command koristimo kako bi monitoru odredili dobiva li neku naredbu za izvršiti (kada je DC pin postavljen na LOW) ili dobiva podatke za prikaz (kada je DC pin postavljen na HIGH).

 

 

Instalacija biblioteke

Kod koristi Adafruit ILI9341 driver za TFT zaslon koji ćete instalirati tako da otvorite Manage Libraries (CTRL + SHIFT + I) iz izbornika „Alati“ te u tražilicu upišete ILI9341. Ovdje možete odabrati verziju te biblioteke. Mi smo instalirali verziju 1.5.3 te smo odabrali opciju instaliranja drugih pripadajućih biblioteka kako kompajliranje koda ne bi javljalo greške.

 

Potrebno je modificirati kod biblioteke kako je opisano u tekstu

 

Sada se biblioteka nalazi unutar %USERPROFILE%\Documents\Arduino\libraries\Adafruit_ILI9341 mape.
Ovdje možete modificirati brzinu SPI sata dodavanjem linije koda prije deklariranih funkcija. Otprilike na 80 liniju biblioteke kao na slici.

#define SPI_DEFAULT_FREQ 80000000

 

 

S izbornika „Datoteka“ -> „Primjeri“ -> „Adafruit ILI9341“ odaberite „graphicstest“ skicu koja će vaše rezultate koje dobijete na COM port usporediti s prikazanima. Možete primijetiti kako su rezultati isti pri brzini sata od 80 i 100 MHz, što nam govori kako je 80 MHz maksimum.

 

Shema spajanja

S obzirom na to da priloženi LCD ima touchscreen te čitač SD kartica, ne moramo spojiti sve pinove monitora. Dovoljno je spojiti 8 žica kao na priloženoj shemi. Prema ovoj shemi moguće je imati 3 monitora na VIDI X mikroračunalu. Prvi je spojen u header predviđen za montažu monitora, dok su ostala dva monitora spojeni na slot proširenja.

 

SPI komunikacija za nekoliko uređaja koristi iste žice dok jedino CS (Chip select) pin mora imati posebnu žicu za svaki uređaj

 

Kako bi spojili nekoliko monitora na VIDI X potrebno je istoimene pinove međusobno povezati, izuzev pina CS (Chip Select), koji za svaki monitor mora imati zaseban pin.

Kada biste kojim slučajem dva monitora spojili na isti CS pin, tada bi na ta dva monitora imali istu sliku, što je možda i potrebno u nekim specijalnim slučajevima pa to valja imati na umu. Na PC računalu takav način prikazivanja slike na više monitora zovemo mirroring, tj. dupliciranje slike.

Krenimo sa spajanjem. Pin monitora s oznakom LED spajamo na 3,3 volti napajanja kako bi osvijetlili ekran jer u suprotnome nećemo vidjeti ništa na njemu. Kada biste na ovu žicu spojili potenciometar (promjenjivi otpornik) mogli biste njime proizvoljno smanjivati količinu pozadinskog osvjetljenja.

Pin SCK spajamo sa satom VIDI X-a koji je u ovom slučaju GPIO18.

Pin oznake SDI (MOSI) spajamo s pinom GPIO23 VIDI X-a.

Sljedeći u nizu je D/C kojeg spajamo s GPIO21 DC pinom VIDI X-a.

RESET pin spojili smo s GPIO22 pinom.

CS je jedini pin koji od svakog monitora mora biti spojen na različite pinove VIDI X-a. Tako smo „ugrađeni“ monitor spojili na GPIO5, dok smo druga dva spojili na GPIO13 te na GPIO19.

Ostali su nam pinovi napajanja samog monitora, od kojih GND pin (uzemljenje) spajamo s GND pinom VIDI X-a, a VCC sa +3V3 pinom VIDI X-a tj. napajanjem.

Kada biste spajali više od 3 monitora, napajanje VIDI X-a vam ne bi bilo dovoljno za sve te monitore te biste trebali dovesti vanjsko napajanje od 3,3 volte do monitora.

 

Nikako ne smijemo zaboraviti postaviti switcheve u poziciju za korištenje expansion slota, kao na slici

 

Programski kod:

Programski kod pronađite na našem GitHubu na linku: https://github.com/VidiLAB-com/Vidi-X/tree/master/Multy_Screen

 

Prvo što moramo učiniti je dodati biblioteke koje smo ranije instalirali i prilagodili prema želji za bržu komunikaciju s monitorima.

#include “Adafruit_ILI9341.h”
#include “Adafruit_GFX.h”
#include <SPI.h>

 

Sada je potrebno definirati pinove na koje spajamo Chip Select pinove te Data/Command pin.

#define TFT_CS1 5
#define TFT_CS3 13
#define TFT_CS2 19
#define TFT_DC 21

 

Nakon toga kreiramo poseban objekt za svaki monitor kako bi mogli programski određivati na kojem monitoru se što prikazuje. Naše monitore kreirali smo kao objekte TFT1, TFT2 i TFT3.

Adafruit_ILI9341 TFT1 = Adafruit_ILI9341(TFT_CS1, TFT_DC);
Adafruit_ILI9341 TFT2 = Adafruit_ILI9341(TFT_CS2, TFT_DC);
Adafruit_ILI9341 TFT3 = Adafruit_ILI9341(TFT_CS3, TFT_DC);

 

U setup petlji koda potrebno je inicijalizirati svaki od zaslona te mu odrediti rotaciju ukoliko želimo koristiti tekst na ekranu. Zavisno o fizičkoj orijentaciji zaslona postavit ćemo i rotaciju. Tako brojevi jedan i tri postavljaju ekrane u horizontalu poziciju kao u našem slučaju, no ukoliko ih zarotirate za 90° rotaciju ćete postaviti na nula ili dva.

TFT1.begin(); // inicijalizacija zaslona br 1
TFT2.begin(); // inicijalizacija zaslona br 2
TFT3.begin(); // inicijalizacija zaslona br 3
TFT1.setRotation(3); // postavi orijentaciju
TFT2.setRotation(1); // postavi orijentaciju
TFT3.setRotation(1); // postavi orijentaciju

 

Bojanje ekrana u crnu boju je proizvoljno te se možete poigrati i s ostalim bojama.

TFT1.fillScreen(ILI9341_BLACK); // obojaj zaslon 1 u crno
TFT2.fillScreen(ILI9341_BLACK); // obojaj zaslon 2 u crno
TFT3.fillScreen(ILI9341_BLACK); // obojaj zaslon 3 u crno

 

Postavljamo veličinu teksta na 1 kako bi nam ostalo više prostora za crtanje grafikona vrijednosti senzora. Primijetite kako svaka linija koda započinje s drugim TFT objektom te će se zadani tekst ispisati na različitim monitorima.

TFT1.setTextSize(1);
TFT1.setTextColor(ILI9341_RED);
TFT1.println(“Monitor 1 - Analog PIN 14 - MIC”);
TFT2.setTextSize(1);
TFT2.setTextColor(ILI9341_GREEN);
TFT2.println(“Monitor 2 - Analog PIN 26 - Senzor temperature”);
TFT3.setTextSize(1);
TFT3.setTextColor(ILI9341_BLUE);
TFT3.println(“Monitor 3 - Analog PIN 2 - Detektor svjetlosti”);

 

Glavna petlja programa vodi nas kroz for petlju koja se kreće od nule do 320 koliko iznosi širina našeg ekrana. U kompletnom kodu na našem GitHubu pogledajte kako je definirana varijabla myWidth.

void loop()
{
for (int j = 0; j++ <= myWidth + 1; ) // petlja je brža uz sintaksu
// ugnježđene liste
{ // sporija sintaksa petlje izgleda ovako
// for(int j = 0; j <= myWidth + 1; j = j + 1)
TFT1.drawFastVLine( j, 10, myHeight, ILI9341_BLACK);
TFT1.drawFastVLine( j, map(analogRead(analogInPin1), 0, 4095, myHeight - 1, 1), myHeight, ILI9341_RED);
TFT1.drawPixel(j, map(analogRead(analogInPin1), 0, 4095, myHeight - 1, 1), ILI9341_PURPLE);
TFT2.drawFastVLine( j, 10, myHeight, ILI9341_BLACK);
TFT2.drawFastVLine( j, map(analogRead(analogInPin2), 0, 4095, myHeight - 1, 1), myHeight, ILI9341_DARKGREEN);
TFT2.drawPixel(j, map(analogRead(analogInPin2), 0, 4095, myHeight - 1, 1), ILI9341_GREEN);
TFT3.drawFastVLine( j, 10, myHeight, ILI9341_BLACK);
TFT3.drawFastVLine( j, map(analogRead(analogInPin3), 0, 4095, myHeight - 1, 1), myHeight, ILI9341_CYAN);
TFT3.drawPixel(j, map(analogRead(analogInPin3), 0, 4095, myHeight - 1, 1), ILI9341_BLUE);
}
}

 

Kako smo svaku liniju koda koju započinjemo TFTx objektom iscrtali u drugoj boji, nakon pokretanja programa lako ćete prepoznati što to točno iscrtava svaka linija koda.

TFT1 objekt prikazat će grafikon dobiven čitanjem analognog pina mikrofona te tako možemo vizualizirati razne zvukove.

TFT2 objekt prikazat će očitanje vrijednosti senzora temperature te će taj graf biti uvijek ravan, čak i kada se temperatura nešto podigne, jer se radi o vrlo čestim očitanjima pa se razlike ne uočavaju.

TFT3 objekt tj. treći monitor prikazuje očitanja PIN-a 2 na koji je spojena plava LED-ica koja u ovom slučaju, kao input pin, služi kao senzor svjetlosti. Obasjate li ju mobitelom primijetit ćete promijene u grafu kako se mijenja intenzitet svjetlosti. PIN 2 sposoban je reagirati na dodir. Spojite li žicu na pin 2

 

Savjeti

Pokušaj spajanja monitora putem breadboarda nije nam pokrenuo monitore uslijed loših spojeva koje stvaramo gomilanjem žica. Stoga smo breadboard iskoristili samo kao držač dodatnih monitora, a najbolje rezultate smo dobili spajanjem žica iste dužine s pinovima proširenja VIDI X-a.

Priloženim kodom se možete poigrati čak i kada nemate više ekrana pri ruci tako da ekran priložen uz VIDI X pokušate spojiti s pinovima kako je prikazano na shemi te promatrajte što se dešava na ekranu kada CS pin spojite na druge pinove kako je naznačeno na shemi.

 

Zadatci

Zadatak 1.

Iz koda koji iscrtava grafičke elemente na ekranu izbacite po jednu liniju koda od ove dvije, za svaki TFTx objekt te promatrajte vidite li razliku u brzini iscrtavanja preostalih objekata na ekranu.

TFTx.drawFastVLine( j, map(analogRead(analogInPinx), 0, 4095, myHeight - 1, 1), myHeight, ILI9341_CYAN);
TFTx.drawPixel(j, map(analogRead(analogInPinx), 0, 4095, myHeight - 1, 1), ILI9341_BLUE);

 

Zadatak 2.

Promijenite veličinu teksta tako da umjesto jedinice stavite dvojku za sve ekrane.

TFTx.setTextSize(2);

Što je još potrebno modificirati u kodu kako vam se ne bi obrisao dio teksta?

 

Zadatak 3.

Na pin proširenja označen tekstom „STAT“ koji se nalazi na četvrtom mjestu, odmah pored pina oznake 5V spojite žicu. Kada dotaknete tu žicu promatrajte očitanja na ekranu definiranom objektom TFT3.

 

Umjetnički zadatak:

Možete li postaviti ekrane na model neke zgrade kako biste time dobili maketu s efektom neonskog grada, možda iz Cyberpunk igre. Do potpunog doživljaja još je potrebno isprogramirati ekrane da prikazuju neke reklame.

PRIJTELJI PROJEKTA

bez kojih sve ovo ne bi bilo moguće.

SVA PRAVA PRIDRŽANA - VIDI TO 2020.

Niti jedan dio ovog web site-a ne smije se u bilo kojem obliku ili radi bilo koje namjene reproducirati bez prethodne pismene suglasnosti izdavača, Svi tekstovi objavljeni na www.vidi-x.com pripremljeni su s osobitom pažnjom i kontrolirani na više razina. Redakcija www.vidi-x.com međutim, ni u kojem slučaju ne može odgovarati za moguće štete bilo kakve vrste nastale na osnovu savjeta, tekstova, slika ili drugog redakcijskog ili oglašivačkog materijala objavljenog na www.vidi-x.com ili na drugi način datog od strane zaposlenika ili suradnika izdavača.