Vidi Project X #88:
Tipkovnica na VIDI-X mikroračunalu

Na Vidi mikroračunalo moguće je spojiti PS/2 tipkovnicu i tako mu znatno proširiti funkcionalnost i obogatiti iskustvo korištenja Vidi X-a.

 

Tipkovnica je vrlo korisna ulazna jedinica te je nalazimo na svim današnjim računalima. Manja računala današnjice (mobiteli) koriste je u virtualnom obliku na ekranu.

Naučit ćete kako na primjeru igre iskoristiti “W, A, S, D” tipke za kontrolu igre, a kasnije i sami možete napraviti kôd koji će tipkovnicu koristiti za znatno naprednije aplikacije.

U ovom tutorijalu pokazat ćemo vam nekoliko načina na koje je moguće spojiti tipkovnicu na Vidi X mikroračunalo. Za njezino korištenje, osim napajanja, trebaju vam samo 2 pina. Većina današnjih tipkovnica koristi 5 V za rad, a tipkovnice starijeg datuma proizvodnje, one koje nemaju RGB rasvjetu, moguće je pokrenuti i s napajanjem od 4,5 V. Napajanje od 4,5 V nije u granicama USB specifikacija jer USB specifikacije zahtijevaju 5 V uz odstupanje od ±5%. Kako Vidi X mikroračunalo radi s napajanjem od 3 V, većina tipkovnica može ispravno raditi i s 4,5 V baterijskim napajanjem Vidi X mikroračunala.

Osim PS/2 tipkovnice, na isti način moguće je spojiti i USB tipkovnicu koja zahtijeva iste specifikacije za napajanjem. PS/2 priključak je 6-pinski DIN priključak, no nama su potrebne samo 4 žice od tih 6: dvije za napajanje i dvije za podatkovnu komunikaciju. Ta komunikacija s tipkovnicom samo je stvar PS/2 protokola koji je relativno jednostavan za razumijevanje. Data i Clock pinovi su preostala dva pina osim napajanja.

 

Protokol PS/2

PS/2 protokol je dvosmjerni serijski sinkroni protokol. Kada su data i clock postavljeni na vrijednosti “high” (digitalni 1), komunikacija je u stanju mirovanja, a tipkovnica ili miš mogu početi prenositi podatke. Host može zaustaviti prijenos u bilo kojem trenutku povlačenjem linije clock na low (digitalna 0) u trajanju od 100 milisekundi. Tipkovnica uvijek generira clock signal, a ako host želi komunicirati, to može učiniti pullup-om clock linije na low (digitalnu 0) (inicira podatkovni prijenos od strane tipkovnice), povlačenjem data linije na low, a zatim oslobađanjem clock linije. To inicira zahtjev za slanje podataka i govori uređaju da počne generirati clock impulse. Podaci sadrže 11 ili 12 bitova (ovisno o smjeru podataka).

START – Prvi je uvijek low (digitalna 0)
DATA(0-7) – Zatim slijedi 8 bitova podataka, LSB prvi
PARITY – Tada slijedi neparan paritetni bit
STOP – Zatim stop bit koji je uvijek high (digitalni 1)
ACK – Zadnjim bitom kao potvrdu uspješnog prijenosa, a prilikom prijenosa s računala na uređaj, uređaj će postaviti data liniju na low.

 

 

Komunikacija od tipkovnice prema računalu

Tipkovnica provjerava stanje clock linije. Ako je high (1), počinje prenositi podatke. Kako bismo bili sigurni da se ne radi o slučajnom izboju napona, clock linija mora biti high najmanje u trajanju od 50 milisekundi prije nego što tipkovnica počne odašiljati. Tipkovnica generira clock puls, a data linija mora biti stabilna na padajućem dijelu clock signala (prema low) i mora se promijeniti nakon što clock prijeđe u stanje high.
Što točno znači da data linija mora biti stabilna na padajućem dijelu signala? Naime, promjena iz low u high stanje, tj. iz nule u jedinicu, traje neko vrijeme, svega par milisekundi.

Vrijeme od prijelaza podataka na padajući rub clock signala mora biti veće od 5 i manje od 25 milisekundi, dok vrijeme od rastućeg ruba signala do prijelaza podataka mora biti barem 5 milisekundi tako da možemo uzorkovati podatke tijekom low razdoblja clock signala, dok se podaci mijenjaju tijekom high razdoblja. Ako računalo inicira prijenos postavljanjem clock linije na low za 100 milisekundi prije 11. bita, tipkovnica mora ponovno poslati podatke kada je clock linija na high i komunikaciju više ne inicira računalo. Svi podaci koji se stvaraju tijekom komunikacije moraju biti blokirani. Stoga tipkovnice imaju međuspremnik od 16 bajtova u svrhu pospremanja tih podataka do trenutka kada se oslobodi linija. Za razliku od tipkovnica, miševi najčešće pohranjuju podatke pokreta u trajanju od 3 sekunde.

 

 

Komunikacija od računala prema tipkovnici

Budući da računalo uvijek generira clock signal, ono mora staviti clock i data linije u poziciju zahtjeva za slanje postavljanjem clock linije na low u trajanju od 100 milisekundi, a zatim postavljanjem data linije na low i clock linije na high. Kada tipkovnica otkrije ovo stanje, počet će generirati impulse na clock liniji (na slici označeno slovom a). Clock će se nalaziti u bitovima podataka okvira (na slici označeno slovom b). Računalo mijenja podatke kada je clock postavljen na low, a tipkovnica uzorkuje data liniju kada je clock na high. To je suprotno od onoga što se događa tijekom komunikacije od tipkovnice prema računalu.

Tipkovnica postavlja data liniju na low za potvrdu podataka, a zatim generira posljednji clock impuls. No zašto uopće postoji potreba za komunikacijom od računala prema tipkovnici? Osim potvrde primitka podataka, ta komunikacija služi i za paljenje LED lampica za Num Lock, Caps lock ili Scroll lock oznake. Neke tipkovnice imaju i druge LEDice ili čak i malene ekrane s kojima se tako komunicira.

 

 

PS/2 tipkovnica

Tipkovnica je mreža tipki koje nadzire kontroler. On je zadužen poslati odgovarajući data signal tj. kôd koji je drugačiji za svaku pritisnutu tipku. Taj kôd nazivamo “scan code”.
“Make code” se šalje kada je tipka stisnuta ili se drži stisnuta, ili kada se tipka otpusti. Postoje dva “make coda” koji se mogu poslati kako bi se razlikovalo stanje tipke tj. je li pritisnuta ili otpuštena.
Postoje različiti setovi scan kôdova na tipkovnici.
Osim toga, razlikujemo i raspored tipki na tipkovnici (tako imamo npr. hrvatsku ili englesku tipkovnicu). Sada kad ste shvatili osnove PS/2 protokola, preuzmite i instalirajte ps2kbdlib biblioteku za korištenje PS/2 tipkovnice u Arduino IDE programskom okruženju.
Biblioteka se nalazi na https://github.com/michalhol/ps2kbdlib

 

Na slici vidimo kodove od scan coda postavljenog na 2

 

USB tipkovnica

USB tipkovnicu je moguće spojiti s VIDI X-om i putem pasivnog USB to PS/2 konvertera, a ako se radi o “običnoj” USB tipkovnici, radit će bez problema. Te “obične” USB tipkovnice u sebi imaju kontroler koji razumije PS/2 protokol, stoga je moguće njihovo jednostavno povezivanje.
Pokušate li tako povezati USB Gamepad, on neće raditi jer u njega nije ugrađen kontroler koji razumije PS/2 protokol. Tako postoje novije tipkovnice koje mogu imati i LCD na sebi te niti one neće raditi tj. neće razumjeti komunikaciju putem PS/2 protokola. Neke druge će pak imati RGB osvjetljenje (niti one neće raditi). Nama je proradila Logitech K120 USB tipkovnica.

 

 

 

 

Shema spajanja PS/2 konektora uz pomoć otpornika

Jedan od načina spajanja je pomoću otpornika za PullUp na Vcc tj. na +5V. Vrijednost otpornika nije toliko važna, a može biti između 1 KΩ i 10 KΩ.
Manje vrijednosti daju manje vrijeme PullUp reakcije, dok veće vrijednosti omogućuju manju potrošnju energije.
Otpornik između data linije i VIDI X-a postavili smo na 120 Ω kao i otpornik između clock pina i Vidi X-a.
Takav spoj djelitelja voltaže osigurat će da prema pinovima Vidi X-a nikada ne dođe napon veći od 3,3 V.

 

 

Clock i data signale ćemo spojiti s Vidi X-om uz pomoć pull-up otpornika kako bismo osigurali siguran napon za GPIO VIDI X-a

 

 

Shema spajanja PS/2 konektora uz pomoć Logic level converter

Osim otpornicima, data i clock signale od 5V koje tipkovnica šalje treba pretvoriti u slabije od 3 V kako se Vidi X mikroračunalo ne bi oštetilo.

 

 

Ovim načinom spajanja, koristeći dvosmjerni Logic Level converter clock i data signale 5 V pretvorit ćemo u signale 3 V kako ne bi oštetili pinove Vidi X-a prevelikim naponom

 

 

VIDI X expander slot ima još i mikro prekidače koje treba postaviti u pravi položaj želite li koristiti određene pinove. U ovom slučaju na S2 mikro prekidaču pod brojevima 5 i 6 moraju biti postavljeni prema dolje, kao na slici gore

 

 

PS/2 konektor odlemili smo sa stare matične ploče uz pomoć plinske lemilice, no za istu svrhu odlićno će poslužiti i upaljać s mrežicom, popularno nazvan Mini brener.

 

 

Igra Tetris

Kako bismo vam pokazali i primjer korištenja tipkovnice u postojećoj igri napisanoj za Odroid-Go konzolu koja je kompatibilna s Vidi X mikroračunalom, morat ćete minimalno modificirati postojeći kôd. Igru Tetris pronađite u izborniku
Primjeri –> ODROID-GO –> Applications –> Tetris

Naravno, imate je instaliranu ako ste slijedili naše ranije how to članke. Ako niste, kako biste dobili Tetris unutar Arduino IDE razvojnog sučelja, slijedite upute za instalaciju Odroid-Go libraryja na linku https://vidilab.com/vidi-project-x/4714-vidi-project-x-arduino-ide

Nakon što su Odroid-Go library i library tipkovnice instalirani, a vi ste pronašli primjer Tetris igre i otvorili ga u Arduino programskom okruženju, napravite sljedeće modifikacije kôda kako biste upravljanje s tipki Vidi X-a prebacili na tipke tipkovnice.

Morali smo modificirati funkciju

bool KeyPadLoop()

 

kako bismo preusmjerili upravljanje s tipki VIDI X-a na tipke tipkovnice.
Naravno da smo na sami početak dodali kôd za učitavanje i inicijalizaciju tipkovnice. Ovdje moramo spomenuti na koje pinove smo spojili data i clock linije. Promijenite li pinove u kôdu, morat ćete promijeniti i ožičenje prema tim pinovima, no neki možda neće radti:

#include <PS2Kbd.h>
#define KEYBOARD_DATA 32
#define KEYBOARD_CLK 33
PS2Kbd keyboard(KEYBOARD_DATA, KEYBOARD_CLK);

 

Zatim smo u funkciju void setup() dodali

keyboard.begin();

 

kako bismo sada mogli u funkciji bool KeyPadLoop() dodati kôd za očitavanje: je li stisnuta tipka A, D ili W.

bool KeyPadLoop(){
if (keyboard.available()) {
char key=keyboard.read();
Serial.write(key);
ClearKeys();
switch (key) {
case ‘w’:
but_A =true;return true;
break;
case ‘a’:
but_LEFT = true;
break;
case ‘d’:
but_RIGHT = true;
return true;
break;
}
return true;
}
return false;
}

 

Radi lakšeg pokretanja igre Tetris, izbacili smo i dvije linije kôda zadužene za učitavanje pozadinske slike s SD kartice, a koje glase:

// M5.Lcd.drawJpgFile(SD, “/tetris.jpg”); // Load background from SD
// GO.lcd.drawJpg(tetris_img, 34215);

 

Gotovi kôd igre Tetris za upravljanje s PS/2 tipkovnicom možete pronaći na GitHub kanalu vidilaba na adresi https://github.com/VidiLAB-com/Vidi-X

Alternativni library PS/2 tipkovnice

S FabGL GitHub repozitorija https://github.com/fdivitto/fabgl možete preuzeti još jedan library za korištenje tipkovnice VIDI X-a, čiji primjer će vam pokazati kako koristiti “scan code” i “make code” vrijednosti za još napredniju upotrebu tipkovnice. Ovdje navedeni primjeri mogu čak paliti i gasiti LEDice Caps Locka, Num Locka i Scroll Locka, no pri pokušaju korištenja tih libraryja u kombinaciji s odroid_go.h librarijem, to nam nije pošlo za rukom.

Naime, s FabGL librarijem inicijalizacija tipkovnice radi se ovim linijama kôda:

#include “fabgl.h”,
fabgl::PS2Controller PS2Controller;

 

Primijetite da ovdje nigdje nismo naveli na koje pinove spajamo data i clock linije, a u samom libraryju definirani su i pinovi korišteni za neke druge funkcionalnosti, stoga se neki preklapaju s pinovima definiranim unutar odroid_go.h libraryja koji nam je potreban za naš primjer Tetris igre.

Koristeći oba libraryja unutar Tetris igre, dobit ćete grešku, a s obzirom na ta preklapanja korištenih pinova.

 

 

Modificirani kod Tetris igre za igranje s PS/2 tipkovnicom pronađite na linku https://github.com/VidiLAB-com/Vidi-X/tree/master/PS2_Tetris

Što ste naučili iz ovog How To članka?

Za vlastite projekte bolje je koristiti library PS/2 tipkovnice s FabGL Github repozitorija, no mislite li koristiti i odroid_go.h library, desit će se konflikt. Za naprednije korisnike ili one koji to žele postati: možete pogledati sadržaj tih libraryja i ukloniti kôd koji vam ne treba kako ne bi nastao konflikt korištenih pinova.

Naučili ste kako data pinove treba zaštititi od većih voltaža nego što oni mogu primiti te da tu zaštitu možete izvesti putem logic level convertera ili putem djelitelja napona uz pomoć dva otpornika. Trebate biti oprezni kako ne biste pretjerali s vrijednostima otpornika te time povećali vrijeme reakcije tog sklopa van standarda koji koristi protokol ili pak kako ne biste previše smanjili voltažu kako ne bi pin uvijek ostao u stanju “low”.