Najčešće korišteni sat danas je mobitel. No, kako mobiteli imaju tendenciju gasiti ekran radi produljivanja stanja baterije, najčešće ga trebate dotaknuti da bi pokazao vrijeme. Ukoliko imate prljave ruke to baš i nije zgodno. Ukoliko ste u nekom poslu, preporučljivo je skinuti i ručni sat s ruke kako ga ne biste oštetili.
Ova radionica naučit će vas kako isprogramirati VIDI X i napraviti sat koji može reći vrijeme. Kao takav mogao bi biti od koristi i osobama sa slabijim vidom te slijepim osobama, no i oni će ipak trebati nekoga od vas koji čitate ovaj tekst kako biste im podesili kod i uploadali ga na VIDI X mikroračunalo.
Kronometar (Sat)
Danas poznajemo mnogo vrsta satova. Izrazito precizan mehanički sat naziva se kronometar. Upotrebljavao se u pomorstvu kao alat za određivanje sjevera, a time i za navigaciju brodova. Danas koristimo satelitske GPS sustave navigacije koji također koriste sat kao jednu od glavnih komponenti.
Taj satelitski sat je vrlo precizan atomski sat koji za mjerenje protoka vremena koristi elektromagnetsko zračenje atoma. Najčešće se koristi atom cezija-133, koji na temperaturi apsolutne nule vibrira tj. mijenja stanje dvaju razina osnovnog stanja 9.192.631.770 puta u sekundi. Dakle, ima vrlo precizno definirano titranje tj. osciliranje kojim precizno možemo mjeriti protok vremena. Najnoviji atomski satovi imaju maksimalnu grešku od 1 sekunde na 30 milijuna godina.
Priprema VIDI X mikroračunala
Za ovu radionicu potrebno vam je VIDI X mikroračunalo sa spojenim zvučnikom. Priloženi zvučnik spojite na konektor na poleđini VIDI X-a koji se nalazi s desne strane odmah iznad 3,5 mm banana jack priključka za slušalice. Osim priloženog mikrofona, uz četveropolni 3,5 mm banana audio jack možete spojiti vanjske zvučnike snage 3 W.
Ukopčate li slušalice u 3,5 mm audio jack, zvučnik se isključuje te se zvuk preusmjerava na slušalice
Mikrofon je već ugrađen, no na 3,5 mm banana jack moguće je spojiti vanjski mikrofon ukoliko smatrate da vam je potreban.
Na 3,5 mm banana jack moguće je spojiti vanjski mikrofon ukoliko smatrate da vam je potreban
Network time protocol
Kako bi naš sat bio što precizniji, povezali smo ga s NTP serverom koji nam javlja točno vrijeme.
Network time protocol (NTP) komunicira na UDP portu 123 kako bi vašim računalima ili gadgetima koji žele znati točno vrijeme mogao servirati tu informaciju. Hrvatska ima nekoliko vlastitih NTP servera koje možete koristiti za sinkronizaciju sata, a više o njima saznajte na linku https://www.pool.ntp.org/zone/hr.
Zatražiti točno vrijeme od NTP servera možemo ovom linijom koda
NTPClient timeClient(ntpUDP, “europe.pool.ntp.org”, utcOffsetInSeconds);
Varijabla utcOffsetInSeconds postavljena je kao vremenska zona u kojoj se nalazimo te u našem kodu dodaje 2 sata, tj. 7200 sekundi, na vrijeme dobivano sa servera. Kako nam za provjeru vremena treba Internet veza, morat ćete VIDI X povezati s vašom bežičnom vezom.
Kroz sljedeće varijable upisali samo ime vaše Wi-Fi mreže i password za spajanje na nju.
const char *ssid = “Ime wireless mreže”;
const char *password = “Password wireless mreže”;
Naredbom WiFi.begin započinje postupak povezivanja
WiFi.begin(ssid, password);
Kada ste spojeni na Wi-Fi mrežu nije moguće koristiti neke pinove VIDI X mikroračunala jer su oni zauzeti internim vezama za ostvarivanje Wi-Fi komunikacije. Među pinovima koje nije moguće koristiti našao se i GPIO14, na koji je spojen mikrofon VIDI X mikroračunala.
Kako bismo mogli koristiti mikrofon nakon ostvarene Wi-Fi veze te nakon što se vrijeme sinkronizira potrebno je ugasiti Wi-Fi naredbom
WiFi.mode(WIFI_OFF);
Sada su se oslobodili pinovi za korištenje, među kojima je bio i GPIO14, te je i mikrofon moguće koristiti.
Upload i pokretanje koda
Nemate li instaliran Arduino IDE na vaše računalo, radionicu kako ga instalirati potražite na linku https://vidi-x.org/radionice/vidi-project-x-91-arduino-ide/.
Kod za „Sat koji govori“ preuzmite s VidiLAB GitHuba s linka https://github.com/VidiLAB-com/Vidi-X/tree/master/Talking_Clock
Kako biste kompajlirali preuzetu skicu trebat će vam i sljedeće biblioteke, koje možete preuzeti s linkova:
https://github.com/ArminJo/Talkie/releases/tag/1.2.0
https://github.com/arduino-libraries/NTPClient
https://github.com/adafruit/Adafruit_ILI9341
Od mnogih verzija, najmanje nepotrebnih klikova i popsova u zvuku imala je biblioteka verzije 1.2.0
Još malo o kodu
Nakon što se vrijeme VIDI X mikroračunala sinkronizira, ukoliko poželimo čuti točno vrijeme moramo proizvesti nekakvu, ne pretjerano glasnu, buku. Bit će dovoljno fućnuti ili pljesnuti dlanovima, koje će mikrofon VIDI X-a prepoznati kao buku te tako pozvati funkciju koja će nam izgovoriti vrijeme na engleskom jeziku.
Mikrofon VIDI X-a pri tišini nam javlja analognu vrijednost od otprilike 1950, a što će zavisiti o napunjenosti baterija ili kvaliteti USB napajanja. Ukoliko su baterije ili USB napon slabiji, analogna vrijednost će biti manja.
valMin = 4096; // ove varijable postavljamo na besmisleno velike vrijednosti
valMax = -4096; // ..koje nam softver neće javiti
Stoga mikrofonsku aktivnost provjeravamo varijablama valMin i ValMax. Te varijable periodički, na početku funkcije Zvuk(), resetiramo, odnosno postavljamo na besmisleno velike vrijednosti koje gotovo sigurno nećemo dobiti pri normalnoj upotrebi VIDI X-a.
val = analogRead(analogInPin1); // Očitaj stanje mikrofona
TFT.fillRect(j, 50, 4, myHeight, ILI9341_BLACK); // Iscrtaj crni pravokutnik
TFT.drawPixel(j, map(val, 50, 4095, myHeight, 1), ILI9341_YELLOW); // grafički prikaži vrijednost mikrofona
Zatim jedno kraće vrijeme osluškujemo mikrofon, a dobivene analogne vrijednosti iscrtavamo radi dojma i kako bismo vizualizirali što se trenutno događa kroz kod.
if (valMin > val) { // Ukoliko je dosegnut novi minimum
valMin = val; // postavi DeltaMin vrijednost
}
if (valMax < val) { // Ukoliko je dosegnut novi maksimum
valMax = val; // postavi DeltaMax vrijednost
}
Ukoliko je nova vrijednost manja od prijašnjeg minimuma te veća od prethodnog maksimuma, tim varijablama dodijeli nove vrijednosti.
Sada je potrebno provjeriti zadovoljavaju li nove vrijednosti rezultatom koji ćemo protumačiti kao buku. To činimo IF uvjetom koji pokreće funkciju sat() koja je zadužena za izgovaranje trenutnog vremena
if ( valMin < 1800 && valMax > 2100 ) { // Prelaze li vrijednosti ove uvijete
sat(); // Pokeni funkciju sat()
return 0;
}
Glavna biblioteka zadužena za govor nalazi se na linku https://github.com/ArminJo/Talkie, no mi smo je instalirali kroz sučelje Arduino IDE alata upisujući Talkie u Library Manager.
Od mnogih verzija, najbolje će vam raditi verzija 1.2.0 biblioteke, iako je dostupna i verzija 1.3.0 s kojom nismo imali toliko sreće. Korisno je susresti se s pojavom da novija, updateana verzija ne radi dobro kao stara. To će vas, a i nas, naučiti kako ne treba brzopleto kliknuti na „Update“ kada ga Arduino IDE ponudi jer se time mijenja znatan dio koda vaše skice za koji možda niste niti svjesni što se točno sve promijenilo.
timeClient.update(); // Koliko je sati?
Voice.sayQ(spPAUSE1); // Inicijaliziraj govor
Funkcija sat() prvo će provjeriti koliko je sati, a zatim će inicijalizirati govorne funkcije.
Želite li izvršiti neki dio koda u vrijeme kada se izvodi sam govor to možete kroz petlju while.
while (Voice.isTalking()) {
; // Dok traje govor izvaršava se ovaj dio koda
// Koji je u našem slučaju prazan
}
No, postoje neka ograničenja. Unutar te while petlje neće raditi analogWrite(), a moguće i neke druge funkcije ili biblioteke koje bi mogle koristiti analogWrite().
Nismo se previše zabrinuli zbog tog ograničenja. Svejedno smo van while funkcije postavili naredbe za ispisivanje točnog vremena na ekran.
TFT.fillScreen(ILI9341_BLACK); // obojaj zaslon u crno
TFT.setCursor(35, 0);
TFT.println(“Talking Clock!”);
TFT.setCursor(105, 25);
TFT.print(timeClient.getHours()); // Ispiši sate
TFT.print(“:”); // i
TFT.print(timeClient.getMinutes()); // minute
Zatim smo postavili funkcije zaslužne za generiranje signala zvučnika.
Voice.say(spc_THE);
Voice.say(spc_TIME);
Voice.say(spc_IS);
sayNumber(timeClient.getHours());
sayNumber(timeClient.getMinutes());
Voice.sayQ(spPAUSE1);
Funkcija Voice.say izgovorit će sadržaj niza spc_THE u kojemu se nalazi podataka kako izgovoriti riječ „The“. Isto je i za riječi „Time Is“ nakon kojih slijedi izgovor brojeva. Funkcija sayNumber(); izgovorit će proslijeđeni joj broj.
Sada možemo pričekati neko vrijeme. Mi smo odlučili čekati 3 sekunde prije nego što pozovemo funkciju startScreen(); koja pokazuje pozdravni ekran s uputama što učiniti.
Nakon toga, glavna petlja koda kreće s izvršavanjem od početka. Dakle resetiramo vrijednosti varijabli i ponovno osluškujemo mikrofon.
Hrvatski jezik ili dodavanje riječi
Riječi su kodirane u LPC formatu (Linear-Predictive decoding scheme), a za engleski jezik postoji baza od oko tisuću riječi za korištenje.
Dodaju se u skice uz korištenje include naredbe poput
#include “Vocab_US_Clock.h”
#include “Vocab_US_Large.h”
#include “Vocab_US_TI99.h”
#include “Vocab_Special.h”
Zavirite li u spomenute datoteke pronaći ćete popis riječi koje možete koristiti. Neke datoteke sadrže čitave fraze, a tu je i pjesma Toms Diner od Suzanne Vega koju ćete pronaći u primjerima biblioteke Talkie.
Želite li konvertirati vlastiti .wav zapis u LPC format možemo vas uputiti na QBoxPro aplikaciju koju i autor biblioteke navodi kako dobar alat. Međutim, aplikacija je pisana za davne Windowse 3.11, no radit će i na Windowsima 95 ili XP. Ovdje će dobro doći poneka virtualna mašina koja može pokrenuti starije Windowse. Autor biblioteke navodi kako aplikaciju možete pronaći na http://ftp.whtech.com/pc%20utilities/ te preuzmite datoteku qboxpro.zip. Trebat će vam i .dll koji nedostaje, a možete ga preuzeti s linka http://www.download-dll.com/dll-BWCC.dll.html.
Na modernijim strojevima postoji mogućnost korištenja Python skripte kao alata za konverziju .wav zapisa u LPC format, a postupak opisan na engleskom jeziku pronađite na YouTube videu naziva „Add Your Voice to Arduino. How to Make Arduino Talk With Customized Words„ tj. linku
Za kraj
VIDI X mikroračunalo ima dovoljno procesorske snage za reprodukciju .wav ili .mp3 datoteka, no korištenjem Talkie biblioteke kada vam je potrebno tek nekoliko riječi od mnogih može uštedjeti memoriju VIDI X mikroračunala i zaobići potrebu za korištenjem SD kartice.
Sada kada znate kako radi kod i kada ste ga uploadali na VIDI X mikroračunalo, pokrenite ga i pljesnite rukama ili zafućkajte, a VIDI X će vam reći točno vrijeme.