Maker LED Display: sve na jednom mjestu

Maker Display proizvod je e-radionice crowdfundan preko kampanje na platformi Crowd Supply u travnju 2019. godine. Detaljan opis proizvoda pronađite na kampanji, a trenutno uređaj možete nabaviti na shopu e-radionica.com

Uvod

Da li Vam se ikada dogodila situacija da bi ste si željeli napraviti uređaj koji će pratiti cijenu Bitcoina u realnome vremenu ili možda broj Facebook like-ova na Vašem najdražem postu ili pak možda da Vam se ispisuje trenutno vrijeme i vremenska prognoza? No, onda ste shvatili da tako nešto neće biti jednostavno, te pogotovo neće biti malih i kompaktnih dimenzija. Rješenje je vlastiti PCB ili naš Maker LED Display će Vas spasiti ovih problema. Naime, Maker LED Display je vrsta Arduino pločice koja je opremljena s ESP8266 mikroupravljačem koji sadrži WiFi i LED matricom na kojoj se mogu ispisivati informacije, ima JST konektor na koji možete spojiti litij-ion bateriju, te cijelu pločicu napajati s baterijom, a ujedno ima u punjač baterije, pa ju možete i puniti preko micro USB konektora.

 

 

Za početak, idemo se malo detaljnije upoznati s našom novom pločicom.
 

Tehničke specifikacije:

  • Napon napajanja:
    • USB: 5 VDC
    • JST: Litij baterija: 3.7 VDC (raspon od 3.3 VDC do 4.2 VDC)
  • Mikroupravljač: ESP8266 radnog takta od 80MHz to 160 MHz (ESP8266-12E modul)
  • Broj slobodnih (neiskorištenih) pinova: 4
  • Rezolucija displaya: 32x9 za Maker Display 2 i 64x9 za Maker Display 4
  • Rezolucija greyscalea: 256 (8 bitna)
  • Dimenzije:
    • Maker Display 2: Približno 104mm x 39.5mm
    • Maker Display 4: Približno 185mm x 39.5mm
  • Dostupne boje LEDica: Bijela, plava, zelena, ljubičasta, narančasta, crvena (prikazane na slici ispod)

 

 

Kako programirati Maker Display?

Pločice na sebi imaju ESP8266 mikroupravljač, dobro poznat kod Croduino Nova pločica. Navedeni mikroupravljač na sebi ima WiFi, što mu omogućava povezivanje na Internet ili pak na lokalnu mrežu, putem koje ga možete kontrolirati putem računala ili Vašeg smartphonea. On se programira pomoću Arduino IDE sučelja. No, prije toga treba instalirati na Vaš Arduino IDE ESP8266 Adruino Core, a proces je jednak onome procesu kod Croduino Nove, tako da preporučamo pratiti upute s tog linka. No, da bi ste prebacili program s računala na Maker LED Matrix pločicu, potreban Vam je programator. Naša preporuka je korištenje NOVA programatora, koji je bazira na CP2102 USB to UART integriranom krugu. Ako želite koristiti Croduino Nova programator, prvo morate instalirati drivere za taj integrirani krug. No, to nije jedini programator koji možete koristiti, bilo koji USB to UART pretvarač može poslužiti u tu svrhu, pa proces programiranja jednak je onome kako se programira ESP8266 razvojna pločica (opet možete koristiti upute s linka za programiranje Croduino NOVA2).

 

 

Programator i Maker LED Display se spajaju tako da se programator spaja na pinove Maker LED Display koji se gore u desnom kutu pločice (6 pinski programatorski konektor). Treba primijetiti da na programatoru pin s lijeve strane ima mali kružić, što označava prvi pin. Taj prvi pin mora biti spojen na prvi pin 6 pinskog konektora za programiranje na Maker LED Display, a to je prvi pin s lijeve strane - baš kao što je prikazano na slici.

 

 

Možete zalemiti 6 pinski ženski header na to mjesto na Maker LED Displayu ili možete jednostavno prisloniti headere na padove (kako je prikazano na slici). Ovo je bolje rješenje ako će te vrlo rijetko reprogramirati pločicu, jer je brzo, jednostavno i nema headera koji zauzima prostor, no problem je što je takav način programiranja ponekad nepouzdan, jer treba dobro namjestiti programator da se isprogramira (ponekad pomaže da se pločica programatora nakrene prema gore rade boljeg kontakta). Ovakav način programiranja je sličan onome postupku kako se programira Arduino Pro Mini.

 

Kako radi Maker Display?

Sada napokon možemo nešto reći o samim LED Driverima. LED Driveri (integrirani krugovi koji upravljaju s LEDicama) su IS31FL3731. Princip na kojem se kontroliraju LEDice nije ovoga puta multipleksiranje (engl. Multiplexing) već Charlieplexing.

 

 

Razlika između charlieplexiranja i multipleksiranja je ta da se kod multipleksinga (u slučaju matrice) pali samo jedan red (ili stupac) u jednome trenutku, te se u tome redu pale zadane ledice, zadržavaju neko vrijeme upaljene, zatim se redak (ili stupac) gasi, pali se sijedeći, pale se ledice, zadržavaju i proces se ponavlja. Ovo se događa izuzetno brzo, toliko brzo da čovjekovo oko ne primijeti paljenje i gašenje, već vidi stabilnu sliku. Charlieplexing radi na drugačiji način, kod njega su LEDice pospajane na sve moguće načine tako da se popune sve moguće kombinacije, bez da se neke kombinacije ponavljaju, a da se svaka LEDica može upaliti, bez paljenja neke druge LEDice istovremeno. Recimo u primjeru gore, ako želimo upaliti LEDice LED1 i LED3, prvo ćemo dovesti VCC na X1, GND na X2 i X3 u stanju visoke impedancije, zadržati neko vrijeme, zatim X1 prebaciti u stanje visoke impedancije, X2 postaviti na VCC i X3 na GND. Vidljivo je da je ovakav pristup kompliciraniji, nego multipleksiranje, ali omogućava da se koristi puno manji broj pinova. U našem slučaju, za 16x9 matricu (koliko nudi jedan IS31FL3731) za multipleksiranje potrebno nam je 25 pinova, a za charlieplexing 18 pinova. Paljenje i gašenje LEDica radi sam driver, tako da se mi ne trebamo brinuti o tome. Sami driveri rade na 5 VDC, odnosno na naponu baterije, ako se napaja preko baterije. Koriste Constant current drivere, što znači da će struja kroz svaku LEDicu biti regulirana, a iznos struje se regulira pomoću otpornika. Komunikacija se izvršava pomoću I2C protokola, a driveri se raspoznaju pomoću adresa. Spojeni su na pinove GPIO4 (SDA) i GPIO5 (SCL) ESP8266 mikroupravljača. Na easyC konektor su spojeni isti ti pinovi (dakle LED driveri dijele I2C sabirnicu s drugim I2C uređajima), no poneki uređaji (senzori) mogu biti jako izbirljivi po pitanju uređaja koji su spojeni na I2C sabirnicu, stoga se može dogoditi situacija da senzor ne želi raditi zajedno s LED driverima. U tom slučaju, potrebno je koristiti druge (neiskorištene) pinove za komunikaciju.

Na kraju treba napomenuti da je ADC mikroupravljača spojen preko dijelila napona, tako da mjeri napon baterije. Ovo je vrlo zgodno u slučajevima kada će se pločica napajati preko baterije, pa se na display može  ispisati upozorenje kada je baterija prazna ili jednostavno status baterije.

Kako povezati?

Proces spajanja programatora i Maker LED Display pločice je prethodno objašnjen, pa ga nećemo ponavljati. Treba samo imati na umu da ne valja ostaviti USB napajanje na Maker LED Display pločici tijekom programiranja, jer to može oštetiti programator. Za prva četiri primjera nam neće trebati ništa osim Maker LED Displaya, programatora i micro USB kabela. Za zadnja tri primjera, bit će potreban i APDS9960 senzor, kao i eksperimentalna pločica, spojni vodovi, easyC kabel i easyC adapter.

Za peti i šesti primjer, senzor i Maker LED Display pločicu potrebno je spojiti na slijedeći način (nije bitno da li je Maker LED Display 2 ili Maker LED Display 4 u pitanju).

 

 

Zadnji primjer je nešto kompliciraniji i zahtjeva nešto lemljenja. Zadnji primjer se odnosi na senzore koji ne rade dobro na istoj I2C sabirnici kao i LED driveri. Stoga Vam ovaj zadnji primjer pokazuje kako postići da uspijete očitati podatke i s takvog jednog "problematičnog" senzora.

 

 

Prvo, morate naći neiskorištene pinove ESP8266 mikroupravljača, a oni se nalaze na zadnjoj strani pločice.

 

 

Nakon toga, potrebno je zalemiti žice na njih s kojima ćete povezati Vaš senzor (APDS9960 u ovome primjeru) s pločicom.

 

 

Zatim senzor i pločicu povežite na način kakav je prikazan na sljedećoj slici. Crvena žica predstavlja napajanje senzora (3.3 VDC), plava GND, pin 12 je SDA, a pin 13 SCL I2C veze. INT pin na APDS9960 senzoru ne koristimo.

 

Arduino kod

Prije nego li kreneo programirati treba napraviti par bitnih stvari. Prvo, potrebno je otvoriti Arduino IDE i podesiti ga na sljedeći način:

 

 

Ako Vam se port nije pojavio (zatamnjen je kao na ovome primjeru) to znači da niste programator uključili u računalo ili da niste instalirali drivere za programator. Ako Vam port nije zatamnjen, ali ne piše COMX (gdje je X neki broj), kliknite na port i odaberite ga (najčešće bude COM sa najvećim brojem pored sebe). Ako Vam upload programa na pločicu ne bude uspješan niti nakon par pokušaja, pokušajte smanjiti brzinu uploada (Upload Speed) na 115200.

Nakon toga, potrebno je skinuti i instalirati biblioteke. Postoje dvije glavne biblioteke s kojima se može upravljati LED matricom: IS31FL3731 i Maker Display Arduino Library.

Razlika između te dvije biblioteke je slijedeća: Maker Display Arduino Library biblioteka Vam omogućava vrlo jednostavnu kontrolu nad matricom, vrlo jednostavno možete ispisivati poruke, slike, pa čak i slike u nijansama sive, kao i razne oblike iz Adafruit GFX grafičke biblioteke, otvarati tekst s Interneta i prikazivati ga na displayu, te će se sve to moći scrollati (pomicati na zaslonu s desna na lijevo), no takva biblioteka koristi softwareski timer Ticker.h koji poziva funkciju za ispis nove slike na matricu periodički. Dakle, ono što se trenutno obavlja bit će prekinuto na tren, te će se ispisati nova slika na display, nakon čega se nastavlja korisnički program. To se zovu prekidi programa (engl. Interrupts). Zbog toga, ovakva biblioteka je malo sporija, pa neke kompliciranije animacije i ispise će biti teže izvesti pomoću nje, te zbog toga postoji i druga biblioteka koja omogućava korisniku da direktno upravlja s LED driverima bez ikakvog timera, a to je IS31FL3731 biblioteka. Preporuka je, ako želite ispisivati jednostavne poruke koje dobivate s weba ili neke podatke sa senzora ili ste pak početnik u programiranju, koristiti Maker Display Arduino Library, a za kompliciranije i složenije stvari, gdje želite imati više kontrole, koristite IS31FL3731 biblioteku.

 

Ako ne znate kako instalirati biblioteku, pogledajte naš tutorijal.

 

Prvi primjer koristi Maker Display Arduino Library biblioteku za ispisivanje jednostavne poruke na zaslon.

 

#include "Maker_LED_Matrix.h" //Prilozimo Maker LED Matrix biblioteku u nas program
//Napravimo objekt na klasu napravljenu u nasoj biblioteci, a kao argument u konstruktor predamo podatak koju verziju displaya imamo (Maker Display 2 ili Maker display 4)
//Potrebno je samo odkomentirati verziju displaya koji imamo:
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_2);
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_4);
void setup() {
Serial.begin(9600); //Pokreni serijsku komunikaciju ss baudom od 9600
matrix.begin(&matrix); //Inicijaliziraj nasu biblioteku. Kao argument salje se adresa naseg objekta iz biblioteke. Ovo je vrlo bitno da se napravi, inace pomicanje slike na zaslonu nece biti moguce!
matrix.brightness(25, 1); //Podesi novu svjetlinu displaya. Postavi svjetlinu fonta na 25 od 255 i pozadine na 1 od 255 (ovo ce stvoriti efekt pozadinskog osvjetljenja, ako ne zelis to, postavi to na nulu).
//Ispisi poruku na display s pauzom od 75 milisekundi izmedju koraka i s korakom od 2 piksela, te ponovi tu poruku 3 puta.
//Ukoliko poruka treba da se uzastopno ponavlja, zadnji argument treba biti -1, a ako zelimo da bude staticna, treba napisati nulu.
matrix.message("Hello world! Ovo je poruka koja ce se ispisati tocno 3 puta.", 75, 2, 3);
delay(60000); //Napravi dovoljno dugacku pauzu da se stigne ispisati poruka tri puta nakon cega ce dispaly ostati prazan.
//Posalji novu poruku s pauzom od 100 milisekundi izmedju koraka, korakom od 3 piksela i vrti je beskonacno (dok je nova poruka ne obrise).
matrix.message("Ovo je Maker LED Display napravljen od strane ekipe iz e-radionice! :)", 100, 3, -1);
//Sad prati koliko se puta ova poruka ispisivala i cekaj dok se ne ispise tocno dva puta nekon cega nasatavi program dalje.
do{
delay(100); //Napravi neki mali delay da ESP8266 stigne obaviti svoje taskove (tu mora biti delay inace ce se ESP8266 rusati!).
}while(matrix.repeatCount() != 2);
matrix.message("Ispis se vrsi u pozadini dok se na Serial monitor salje koliko se puta ova poruka ponovila", 100, 3, -1);
}
void loop() {
//Ispisuj poruku na Serial monitor (UART) dok se istoveremno poruka ispisuje na displayu.
Serial.print("Poruka je prikazana ");
Serial.print(matrix.repeatCount(), DEC);
Serial.println(" puta.");
delay(1000);
}

 

Drugi primjer također koristi Maker Display Arduino Library biblioteku, no ovaj primjer, osim prikazivanja teksta (poruke) ispisuje monokromatsku sliku, kao i sliku u nijansama sive (greyscale). Za bolji prikaz slike (bolji kontrast, jer se male promjene u nijansama na većim intenzitetima lošije vide) koristi se Gamma transformacija s faktorom od 2.2. Ta vrijednost može se promijeniti u Maker_LED_Matrix.h. Također, pokazuje da se slika tijekom pomicanja može trenutno zaustaviti, te nakon toga opet nastaviti s pomicanjem, pomoću pozivanja funkcija stopScroll() i resumeScroll(). Ove dvije funkcije ne vrijede samo za slike, nego vrijede za sve (poruka, monokromatska slika, slika s nijansama sive i Adafruit GFX funkcije).

 

#include "Maker_LED_Matrix.h" //Prilozimo Maker LED Matrix biblioteku u nas program
//Napravimo objekt na klasu napravljenu u nasoj biblioteci, a kao argument u konstruktor predamo podatak koju verziju displaya imamo (Maker Display 2 ili Maker display 4)
//Potrebno je samo odkomentirati verziju displaya koji imamo:
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_2);
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_4);
//Crno-bijela (monokromatska) slika. Slika sinusoide. Moze biti bilo koja slika, no potrebno ju je pretvoriti u zadani format.
//Kako to napraviti pogledati ovdje: https://learn.adafruit.com/steampunk-cameo-necklace/bitmaps-and-code
//Ili prepraviti sliku na zadanu rezoluciju (idealno velicine displaya, no moze biti i veca) i konvertirati je koristeci https://www.skaarhoj.com/FreeStuff/GraphicDisplayImageConverter.php
const uint8_t slika[] PROGMEM = {
0x03, 0xc0, 0x00, 0x00,
0x0c, 0x30, 0x00, 0x00,
0x30, 0x0c, 0x00, 0x00,
0x40, 0x02, 0x00, 0x00,
0x80, 0x01, 0x00, 0x00,
0x00, 0x00, 0xc0, 0x03,
0x00, 0x00, 0x20, 0x0c,
0x00, 0x00, 0x1c, 0x70,
0x00, 0x00, 0x03, 0x80,
};
/*
* 8 bitna slika u nijansama sive (256 mogucih razina svijetline). Sliku je prvo potrebno pretvoriti u niz byteova kao sto je prikazano dolje.
* Da bi se to ucinilo, potrebno je pratiti slijedece upute:
*
* Za pretvorbu slike s nijansama sive, koristiti LCD Image Converter program
* Pokreni program, New Image-> Unijeti ime slike i klikni OK. Zatim Image->Import
* Zatim odaberi sliku koju zelis pretvoriti (imaj na umu da slika ne bi trebala biti veca od rezolucije displaya). Ako je, onda koristiti Paint za smanjenje velicine.
* Nakon toga, Options->Conversion
* Preset treba biti podesen na Greyscale 8, Type Greyscale, Inverse odabran, Main scan direction: Top to botom
* Line scan direction treba biti podesen na Forward. Zatim kliknuti na Image, Block Size treba biti podesen na 8 bita i Byte Order treba biti na Little endian
* Pritiskom na Show Preview, trebao bi vidjeti sliku i ujedno niz (polje) podataka slike. Boje na toj slici bi trebale biti obrnute od originala.
* Kliknuti na OK, spremiti ju klikom na Save, zatim File->Convert i spremiti polje podataka u datoteku. Otvoriti tu datoteku i kopirati je ovdje.
*/
const uint8_t vatra[288] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x69, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x93, 0x93, 0x93, 0x00, 0x00, 0x00, 0x93, 0x69, 0x69, 0x93, 0x93, 0x93, 0x00, 0x93, 0x93, 0x69, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x93, 0x93, 0x93, 0x93, 0x69, 0x93, 0x93, 0x93, 0x93, 0x69, 0x69, 0x69, 0x69, 0x93, 0x93, 0x93, 0x69, 0x69, 0x93, 0x93, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x93, 0x93, 0x93, 0x93, 0x69, 0x69, 0x3f, 0x69, 0x69, 0x69, 0x69, 0x3f, 0x3f, 0x69, 0x69, 0x69, 0x69, 0x3f, 0x69, 0x69, 0x93, 0x93, 0x93, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x93, 0x93, 0x69, 0x69, 0x3f, 0x3f, 0x0f, 0x0f, 0x3f, 0x3f, 0x3f, 0x0f, 0x3f, 0x3f, 0x3f, 0x0f, 0x3f, 0x3f, 0x69, 0x69, 0x69, 0x93, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x93, 0x93, 0x69, 0x69, 0x3f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x3f, 0x69, 0x93, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup() {
Serial.begin(9600); //Pokreni serijsku komunikaciju s baudom od 9600
matrix.begin(&matrix); //Inicijaliziraj nasu biblioteku. Kao argument salje se adresa naseg objekta iz biblioteke. Ovo je vrlo bitno da se napravi, inace pomicanje slike na zaslonu nece biti moguce!
matrix.brightness(25, 1); //Podesi novu svjetlinu displaya. Postavi svjetlinu fonta na 25 od 255 i pozadine na 1 od 255 (ovo ce stvoriti efekt pozadinskog osvjetljenja, ako ne zelis to, postavi to na nulu).
//Ispisi poruku na display s pauzom od 75 milisekundi izmedju koraka i s korakom od 2 piksela, te ponovi tu jednom.
matrix.message("Slika ce biti ispisana uskoro", 75, 2, 1);
delay(10000); //Napravi dovoljno dugacku pauzu da se stigne ispisati poruka jednom nakon cega ce dispaly ostati prazan.
//Ispisi monokromatsku sliku sinusoide dimenzija 32x9 piksela s pauzom izmedju koraka od 100 milisekundi, korakom od 1 piksela i ponovi je dva puta
matrix.picture(slika, 32, 9, 100, 1, 2);
delay(4000);
matrix.stopScroll(); //Zaustavi pomicanje slike
delay(3000); //Zadrzi ju tako 3 sekunde
matrix.resumeScroll(); //Nastavi pomicanje slike
//Pricekajmo da se poruka ispise dva puta, pa zatim se program nastavlja dalje.
do{
delay(100);
}while(matrix.repeatCount() != 2);
//Sada ispisi staticnu sliku u nijansama sive, dimenzija 32x9 piksela, 75 milisekundi pauze izmedju koraka s korakom od jednog piksela (iako je slika staticna, moramo predati neke podakte za pauzu i pomak)
matrix.picture8Bit(vatra, 32, 9, 75, 1, 0);
delay(5000); //Zadrzi sliku neko vrijeme na zaslonu
//Prije nego li se ispise slika, potrebno je ugasiti "pozadinsko osvjetljenje" jer ce inace biti crni okvir oko slike (napravljen od ugasenih LEDica).
//Odmah podesi novu svjetlinu slike na 128 od 255
matrix.brightness(128, 0);
//Sada napravi da se slika pomice stalno
matrix.picture8Bit(vatra, 32, 9, 75, 1, -1);
}
void loop() {
//Ispisuj poruku na Serial monitor (UART) dok se istoveremno poruka ispisuje na displayu.
Serial.print("Slika je prikazana ");
Serial.print(matrix.repeatCount(), DEC);
Serial.println(" puta.");
delay(1000);
}

 

Treći primjer koristi Maker Display Arduino Library biblioteku i pokazuje na koji način se mogu koristiti Adafruit GFX funkcije prilikom scrollanja (pomicanja). Ovdje je situacija nešto kompliciranija. Naime, sve što se želi da bude ispisano, a vezano je za Adafruit GFX funkcije, treba biti u zasebnoj funkciji. Ta funkcija ne smije biti niti loop() niti setup(), već neka korisnička funkcija. Ta funkcija mora biti tipa void() i ne smije imati niti jedan argument. Tada se takva funkcija šalje kao argument scrollAll() funkciji koja onda izvršava pomicanje sadržaja na displayu.

 

#include "Maker_LED_Matrix.h" //Prilozimo Maker LED Matrix biblioteku u nas program
//Napravimo objekt na klasu napravljenu u nasoj biblioteci, a kao argument u konstruktor predamo podatak koju verziju displaya imamo (Maker Display 2 ili Maker display 4)
//Potrebno je samo odkomentirati verziju displaya koji imamo:
Maker_LED_Matrix matrix(MAKER_LED_MATRIX_2);
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_4);
//Crno-bijela (monokromatska) slika. Slika sinusoide. Moze biti bilo koja slika, no potrebno ju je pretvoriti u zadani format.
//Kako to napraviti pogledati ovdje: https://learn.adafruit.com/steampunk-cameo-necklace/bitmaps-and-code
//Ili prepraviti sliku na zadanu rezoluciju (idealno velicine displaya, no moze biti i veca) i konvertirati je koristeci https://www.skaarhoj.com/FreeStuff/GraphicDisplayImageConverter.php
const uint8_t slika[] PROGMEM = {
0x03, 0xc0, 0x00, 0x00,
0x0c, 0x30, 0x00, 0x00,
0x30, 0x0c, 0x00, 0x00,
0x40, 0x02, 0x00, 0x00,
0x80, 0x01, 0x00, 0x00,
0x00, 0x00, 0xc0, 0x03,
0x00, 0x00, 0x20, 0x0c,
0x00, 0x00, 0x1c, 0x70,
0x00, 0x00, 0x03, 0x80,
};
void setup() {
Serial.begin(9600); //Pokreni serijsku komunikaciju s baudom od 9600
matrix.begin(&matrix); //Inicijaliziraj nasu biblioteku. Kao argument salje se adresa naseg objekta iz biblioteke. Ovo je vrlo bitno da se napravi, inace pomicanje slike na zaslonu nece biti moguce!
//Podesi novu svjetlinu displaya. Postavi svjetlinu fonta na 25 od 255 i pozadine na 1 od 255 (ovo ce stvoriti efekt pozadinskog osvjetljenja, ako ne zelis to, postavi to na nulu).
//Kod koristenja Adafruit-ovih funkcija, prednost u svjetlini imaju parametri boje (svjetline) koji se salju prilikom crtanja raznih oblika, a zatim svjetlina koristena brightness() funkcijom.
//"Pozadinsko osvjetljenje" se moze podesavati
matrix.brightness(64, 1);
//Potrebno je napraviti funkciju u kojoj ce se pozivati sve Adafruitove funkcije.
//Dakle, u tu funkciju se upisuje ono sto treba biti ispisano na displayu.
//U ovom primjeru, u funkciju oblici() upisujemo sve Adafruitove funkcije (drawLine(), drawRect, drawCircle(), itd...).
//NE POZIVATI TE ADAFRUIT-OVE FUNKCIJE IZ GLAVNOG PROGRAMA (LOOP-A) ILI IZ SETUPA, one moraju biti u posebnoj funkciji!
//Funkcija mora biti tipa void i ne smije sadrzavati niti jedan argument.
//Nakon sto je ta funkcija napravljena, poslat' cemo ju kao argument (callback) funkciji koja ce slati zapis na display
matrix.scrollAll(oblici, 150, 3, -1); //Posalji na display sve iz funkcije oblici i pomici to s desna na lijevo, pauzom izmedju koraka od 150 milisekundi, korakom od 3 piksela i ponavljaj je stalno.
}
void loop() {
}
//Funkcija koja sadrzi sve sto zelimo ispisati na displayu, a tice se Adafruitovih funkcija.
void oblici() {
matrix.setCursor(0,0); //Podesi kursor za ispis teksta na pocetak
matrix.print("Adafruit GFX funkcije :)"); //Ispisi tekst
matrix.drawLine(150, 0, 170, 8, 128); //Nacrtaj liniju od koordinatne tocke (150, 0) do (170, 8) svjetline 128 od 255.
matrix.drawRect(180, 2, 15, 4, 64); //Nacrtaj pravokutnik pocetne koordinate tocke (180, 2) duljine 15 i visine 4 piksela, svjetline 64 od 255
matrix.fillCircle(210, 3, 3, 160); //Nacrtaj krug koordinata sredista (210, 3), radijusa 3 piksela, svjetline 160 od 255
matrix.drawBitmap(230, 0, slika, 32, 9, 40); //Nacrtaj sliku sinusoide, na lokaciji (230, 0), dimenzija 32x9 piksela i svjetline 40
//Ovo nisu jedine funkcije, sve standardne funkcije iz Adafruit GFX biblioteke su podrzane!
}

 

Četvrti primjer ovoga puta koristi IS31FL3731 biblioteku. Ova nam biblioteka omogućava veću fleksibilnost i veću kontrolu na LED driverima. Primjer ispisuje tekst, razne oblike koristeći Adafruit GFX funkcije, te zatim ispisivanje koliko dugo pločica radi (u sekundama) otkad smo je spojili na napajanje (pomoću funkcije millis()). Treba napomenuti da biblioteka radi tako da se cijela slika generira u RAMu, te se zatim pozivom funkcije display() cijeli sadržaj iz RAMa šalje na sami display.

 

#include "IS31FL3731.h" //Prilozimo Maker LED Matrix biblioteku u nas program
//Napravimo objekt na klasu napravljenu u nasoj biblioteci, a kao argument u konstruktor predamo podatak koliko LED Drivera imamo (od dva do najvise cetiri)
//Adrese drivera idu tako da prvi driver ima I2C adresu 0x74, drugi 0x77, treci 0x75 i cetvrti 0x76. Ako ne odgovara redoslijed adresa, moze ga se promijeniti u IS31FL3731.h datoteci.
IS31FL3731 led = IS31FL3731(2);
void setup() {
led.begin(); //Inicijalizacija biblioteke.
led.setTextColor(25); //Podesavanje svjetline fonta na 25 od 255.
led.print("Hello"); //Ispisivaje teksta na pocetak displaya (0, 0)
led.display(); //Ispisivanje sadrzaja iz buffera na display (ova funkcija se mora pozvati nakon sto se sve funkcije za crtanje oblika i teksta pozovu da bi se sadrzaj iz memorije poslao na sam display)
delay(2000); //Zadrzavanje ispisa.
led.clearDisplay(); //Ocisti sve u memoriji i podesi kursor za tekst na pocetak.
led.print("world"); //Ispisi tekst.
led.display(); //Posalji sadrzaj na display.
delay(2000); //Zadrzi ispis.
led.clearDisplay(); //Ocisti sve u memoriji i podesi kursor za tekst na pocetak.
led.fillRect(0,0,32,9, 5); //Nacrtaj popunjeni pravokutnik na lokaciju (0, 0) velicine 32x9 piksena, svjetline (boje) 5 od 255.
led.drawLine(0,8,32,0, 64); //Nacrtaj liniju pocetne lokacije (0,8) i krajnje (32, 0) svjetline (boje) 64 od 255.
led.drawRect(0,0, 32, 9, 128); //Nacrtaj pravokutnik na lokaciju (0, 0) velicine 32x9 piksena, svjetline (boje) 128 od 255.
led.fillCircle(15,4,3, 20); //Nacrtaj popunjeni krug s sredistem u lokaciji (15, 4), radijusa 3 piksela, svjetline (boje) 20 od 255.
led.display(); //Posalji sadrzaj na display.
delay(5000); //Zadrzi ispis.
}
void loop() {
led.clearDisplay(); //Ocisti sve u memoriji i podesi kursor za tekst na pocetak.
led.print("T:"); //Ispisi tekst.
led.print(millis()/1000); //Ispisi koliko sekundi dugo radi plocica.
led.display(); //Posalji sadrzaj na display.
delay(100); //Zadrzi ispis.
}

 

Peti primjer koristi Maker Display Arduino Library biblioteku i APDS9960 biblioteku. Ovaj primjer pokazuje kako se mogu očitavati podaci sa senzora i da se isti ispisuju na displayu. Radi se očitavanje geste s APDS9960 senzora i ispisuje se koja je gesta prepoznata. Maker LED Display i APDS9960 senzor potrebno je spojiti prema slici koja se nalazi u "Kako povezati" dijelu teksta. Za spajanje se koristi easyC kabel i easyC adapter.

 

VAŽNO: Poneki senzori nisu kompatibilni s LED driverima s kojima se dijeli I2C sabirnica. Ako je imate takav slučaj, potrebno je koristiti druge pinove (neiskorištene, na zadnjoj strani Maker LED Display pločice), a primjer kako izgleda takav program, možete naći pod Examples -> Maker_LED_Matrix -> Maker_LED_Matrix_sensor_example ili u nastavku ovoga tutorijala.

VAŽNO: Ukoliko senzor odbija inicijalizaciju ili očitava neispravne i podatke, pokušajte dodati kondenzator od najmanje 47uF između napajanja senzora.

#include <Wire.h> //Prilozimo Wire biblioteku u nas program (za I2C komunikaiju).
#include <SparkFun_APDS9960.h> //Prilozimo biblioteku za APDS9960 senzor u nas program (biblioteka se moze naci ovdje: https://github.com/sparkfun/SparkFun_APDS-9960_Sensor_Arduino_Library).
#include <Maker_LED_Matrix.h> //Prilozimo Maker LED Matrix biblioteku u nas program.
//Napravimo objekt na klasu napravljenu u nasoj biblioteci, a kao argument u konstruktor predamo podatak koju verziju displaya imamo (Maker Display 2 ili Maker display 4)
//Potrebno je samo odkomentirati verziju displaya koji imamo:
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_2);
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_4);
SparkFun_APDS9960 apds = SparkFun_APDS9960(); //Napravi objekt na klasu u bibloteci.
void setup() {
matrix.begin(&matrix); //Inicijaliziraj nasu biblioteku. Kao argument salje se adresa naseg objekta iz biblioteke. Ovo je vrlo bitno da se napravi, inace pomicanje slike na zaslonu nece biti moguce!
if (apds.init() ) { //Provjeri da li je moguce pronaci senzor, te da li je s njime sve u redu, ako je ispisi poruku.
matrix.message("Senzor je pronadjen!", 100, 2, 1);
} else {
matrix.message("Senzor nije pronadjen! :( Provjeri spojeve.", 100, 2, -1); //Ako senzor nije pronadjen, nesto nije u redu s njim ili spojevima, stoga nema smisla dalje nastavjati program.
do {
delay(1);
} while (true);
}
//Pricekaj dok se poruka ne ispise do kraja na displayu.
do {
delay(10);
} while (matrix.repeatCount() != 1);
//Akriviraj detekciju geste na senzoru. Ako je uspjesno aktivirano, prikazi poruku na displayu.
if ( apds.enableGestureSensor(false) ) {
matrix.message("Mahni rukom ispred senzora :)", 100, 2, -1);
} else {
matrix.message("Inicijalizacija senzora za gestu neuspjesna. :(", 100, 2, -1); //Ako nije, obavijesti korisnika porukom na displayu i zaustavi izvodjenje programa.
do {
delay(1);
} while (true);
}
}
void loop() {
//Ovo je vrlo bitno! Posto je senzor spojen na iste I2C pinove kao i LED driver, potrebno je zaustaviti pomicanje (a samim time i slanje podataka na LED display).
//Pomicanje se radi pomocu softwareskog (Ticker.h biblioteka) koji periodicki salje podatke na I2C prema displayu.
//Ovo zaustavljanje se radi da se ne dogodi situacija da se čitaju podaci sa senzora i da se u tom istom trenutku ne pozove slanje podataka na ispis. Dvije komunikacije na I2C sabirnici u isto vrijeme nisu dozvoljene.
matrix.stopScroll();
if ( apds.isGestureAvailable() ) { //Procitaj da li je neka gesta primjecena od strane APDS9960 senzora.
switch ( apds.readGesture() ) { //Ako je procitaj koja je gesta u pitanju i ispisi odgovarajucu poruku na display (nije potrebno niti prebacivati I2C na pinove 4 i 5 jer sama biblioteka za display to napravi).
case DIR_UP:
matrix.message("Smjer gore", 100, 3, -1);
break;
case DIR_DOWN:
matrix.message("Smjer dolje", 100, 3, -1);
break;
case DIR_LEFT:
matrix.message("Smjer lijevo", 100, 3, -1);
break;
case DIR_RIGHT:
matrix.message("Smjer desno", 100, 3, -1);
break;
case DIR_NEAR:
matrix.message("Gesta blizu", 100, 3, -1);
break;
case DIR_FAR:
matrix.message("Gesta daleko", 100, 3, -1);
break;
default:
matrix.message("Nepoznata gesta", 100, 3, -1);
}
}
matrix.resumeScroll(); //Nastavi s pomicanjem poruke na displayu (a time i da display i ESP8266 komuniciraju preko I2C-a).
delay(100); //Mala pauza izmedju ocitanja novih gesti.
}

 

Šesti primjer je sličan kao i prethodni. Isto pokazuje kako koristiti senzor (ili bilo koji drugi I2C uređaj), te ispisivanje očitanih podataka na displayu, no ovoga puta se koristi IS31FL3731 biblioteka. Senzor koji se koristi je APDS9960, a potrebno ga je spojiti s easyC kablom i easyC adapterom kao na slici koja je prikazana u "Kako povezati" dijelu.

 

#include "IS31FL3731.h" //Prilozimo Maker LED Matrix biblioteku u nas program
#include "SparkFun_APDS9960.h" //Prilozimo biblioteku za APDS9960 senzor u nas program (https://github.com/sparkfun/SparkFun_APDS-9960_Sensor_Arduino_Library)
//Napravimo objekt na klasu napravljenu u nasoj biblioteci, a kao argument u konstruktor predamo podatak koliko LED Drivera imamo (od dva do najvise cetiri)
//Adrese drivera idu da prvi driver ima I2C adresu 0x74, drugi 0x77, treci 0x75 i cetvrti 0x76. Ako ne odgovara redoslijed adresa, moze ga se promijeniti u IS31FL3731.h datoteci.
IS31FL3731 led = IS31FL3731(2);
SparkFun_APDS9960 apds; //Napravi objekt na klasu u bibloteci
void setup() {
led.begin(); //Inicijalizacija biblioteke.
led.setTextColor(25); //Podesavanje svjetline fonta na 25 od 255.
if (!apds.init()) { //Inicijaliziraj biblioteku senzora, javi gresku na displayu ako senzor nije moguce pronaci.
led.print("Err!");
led.display();
} else {
led.print("OK!");
led.display();
}
delay(2000); //Zadrzi poruku neko vrijeme na displayu.
led.clearDisplay(); //Ocisti buffer (memoriju) i podesi kursor za tekst na pocetak.
if ( apds.enableGestureSensor(false) ) { //Pokreni ocitavanje geste na APDS9960 senzoru bez interrupt rutine. Ako je inicijalicazija senzora geste prosla u redu, ispisi poruku.
led.print("Ready");
led.display();
} else {
led.print("Fail");
led.display(); //Ako nije, obavijesti korisnika porukom na displayu i zaustavi izvodjenje programa.
do {
delay(1);
} while (true);
}
}
void loop() {
if (apds.isGestureAvailable()) { //Provjeravaj da li je prepoznata ispravna gesta.
led.clearDisplay(); //Ocisti buffer (memoriju) i podesi kursor za tekst na pocetak.
switch (apds.readGesture()) { //Ako je, ocitaj koja je gesta u pitanju i ispisi poruku na displayju o kojoj gesti je rijec i ponavljaj je do slijedece geste.
case DIR_UP:
led.print("Gore");
break;
case DIR_DOWN:
led.print("Dolje");
break;
case DIR_LEFT:
led.print("Lijevo");
break;
case DIR_RIGHT:
led.print("Desno");
break;
case DIR_NEAR:
led.print("Blizu");
break;
case DIR_FAR:
led.print("Daleko");
break;
default: //Ako je nepoznata gesta, ispisi poruku.
led.print("????");
}
led.display(); //Ispisi sadrzaj na display.
}
delay(100); //Pauza, potrebna radi ESP8266 i samog displaya.
}

 

Zadnji primjer pokazuje kako koristiti senzor koji ne želi ispravno raditi kada je spojen na easyC konektor, već koristi druge, slobodne pinove na ESP8266 mikroupravljaču za komunikaciju. Primjer pokazuje očitavanje geste preko APDS9960 senzora i ispisivanje detektirane geste na displayu. Za ispis na display koristi se Maker Display Arduino Library biblioteka.

 

#include <Wire.h> //Prilozimo Wire biblioteku u nas program (za I2C komunikaiju).
#include <SparkFun_APDS9960.h> //Prilozimo biblioteku za APDS9960 senzor u nas program (biblioteka se moze naci ovdje: https://github.com/sparkfun/SparkFun_APDS-9960_Sensor_Arduino_Library).
#include <Maker_LED_Matrix.h> //Prilozimo Maker LED Matrix biblioteku u nas program.
//Napravimo objekt na klasu napravljenu u nasoj biblioteci, a kao argument u konstruktor predamo podatak koju verziju displaya imamo (Maker Display 2 ili Maker display 4)
//Potrebno je samo odkomentirati verziju displaya koji imamo:
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_2);
//Maker_LED_Matrix matrix(MAKER_LED_MATRIX_4);
SparkFun_APDS9960 apds = SparkFun_APDS9960(); //Napravi objekt na klasu u bibloteci.
void setup() {
matrix.begin(&matrix); //Inicijaliziraj nasu biblioteku. Kao argument salje se adresa naseg objekta iz biblioteke. Ovo je vrlo bitno da se napravi, inace pomicanje slike na zaslonu nece biti moguce!
Wire.begin(12, 13); //Postavi da su sada I2C pinovi 12 i 13 (inace su 4 i 5 na koje je spojena LED matrica). Ovo se mora raditi prije svake komunikacije s APDS9960 ako je spojen na pinove razlicite od 4 i 5.
if (apds.init() ) { //Provjeri da li je moguce pronaci senzor, te da li je s njime sve u redu, ako je ispisi poruku.
matrix.message("Senzor je pronadjen!", 100, 2, 1);
} else {
matrix.message("Senzor nije pronadjen! :( Provjeri spojeve.", 100, 2, -1); //Ako senzor nije pronadjen, nesto nije u redu s njim ili spojevima, stoga nema smisla dalje nastavjati program.
do {
delay(1);
} while (true);
}
//Pricekaj dok se poruka ne ispise do kraja na displayu.
do {
delay(10);
} while (matrix.repeatCount() != 1);
//Akriviraj detekciju geste na senzoru. Ako je uspjesno aktivirano, prikazi poruku na displayu.
Wire.begin(12, 13);
if ( apds.enableGestureSensor(false) ) {
matrix.message("Mahni rukom ispred senzora :)", 100, 2, -1);
} else {
matrix.message("Inicijalizacija senzora za gestu neuspjesna. :(", 100, 2, -1); //Ako nije, obavijesti korisnika porukom na displayu i zaustavi izvodjenje programa.
do {
delay(1);
} while (true);
}
}
void loop() {
//Ovo je vrlo bitno! Posto je senzor spojen na druge I2C pinove (12 kao SDA i 13 kao SCL), potrebno je zaustaviti pomicanje (a samim time i slanje podataka na LED display koji je spojen na pinove 4 i 5 ESP8266).
matrix.stopScroll();
//Zatim prebaci I2C komunikaciju na pinove 12 i 13 na ESP8266 mikroupravljaču da bi uspjesno komunicirali s APDS9960 senzorom.
Wire.begin(12, 13);
if ( apds.isGestureAvailable() ) { //Procitaj da li je neka gesta primjecena od strane APDS9960 senzora.
switch ( apds.readGesture() ) { //Ako je procitaj koja je gesta u pitanju i ispisi odgovarajucu poruku na display (nije potrebno niti prebacivati I2C na pinove 4 i 5 jer sama biblioteka za display to napravi).
case DIR_UP:
matrix.message("Smjer gore", 100, 3, -1);
break;
case DIR_DOWN:
matrix.message("Smjer dolje", 100, 3, -1);
break;
case DIR_LEFT:
matrix.message("Smjer lijevo", 100, 3, -1);
break;
case DIR_RIGHT:
matrix.message("Smjer desno", 100, 3, -1);
break;
case DIR_NEAR:
matrix.message("Gesta blizu", 100, 3, -1);
break;
case DIR_FAR:
matrix.message("Gesta daleko", 100, 3, -1);
break;
default:
matrix.message("Nepoznata gesta", 100, 3, -1);
}
}
matrix.resumeScroll(); //Nastavi s pomicanjem poruke na displayu (a time i da display i ESP8266 komuniciraju preko I2C-a).
delay(100); //Mala pauza izmedju ocitanja novih gesti.
}
Leave a Reply