VIDI Project X #60:
VIDI X kao video nadzor za psa

Uz ovu radionicu otkrijte kako smiriti uznemirenog psa koristeći VIDI X. Imate li i kameru, moći ćete situaciju provjeriti videonadzorom

Imate li za kućnog ljubimca psa, on zasigurno ponekad ostaje sam kod kuće. Ako se uznemiri, trebao bi čuti vaš glas da se smiri.

 

 

U ovoj smo radionici isprogramirali VIDI X tako da pusti .wav zapis ako mu mikrofon detektira glasniji zvuk. Taj je zvuk najvjerojatnije pseći lavež. Taj bi .wav zapis trebao biti vaš glas koji govori „sjedni, dobar pas“ kako bi vam ljubimac na njega reagirao.

 

Web stream rezolucije 240 x 320 piksela i pas Šapica „uhvaćen“ u lajanju, a uskoro stiže snimka utješne umirujuće poruke vlasnika

 

Nakon detekcije i sviranja .wav zapisa, aktivira se web server na kojemu je moguće uživo vidjeti prikaz slike s kamere ne biste li provjerili smirio li se pas, odnosno što ga je bilo potaknulo na lavež. Da ne biste stalno trebali provjeravati situaciju kod kuće, VIDI X mikroračunalo će vas obavijestiti putem maila o detektiranim aktivnostima.

 

Kôd pronađite na linku: https://github.com/VidiLAB-com/Vidi-X/tree/master/CameraWebServerMail

 

Za ovu će vam radionicu biti potrebno

VIDI X mikroračunalo, nekoliko spojnih žica i OV7670 kamera koju možete pronaći na linku:
https://e-radionica.com/hr/modul-s-cmos-kamerom-ov7670-640×480.html

 

 

OV7670 CMOS kamera je rezolucije 0.3 megapiksela, tj. 640×480 piksela. Opremljena je sa 6 mm lećom s aperturom f/1.8 te je zbog malene potrošnje struje pogodna za ugradnju u embeded projekte. Na internetu je možete pronaći i pod imenom ArduCam jer je kompatibilna s Arduinom. Mi smo je odlučili spojiti na VIDI X mikroračunalo, no kako ne postoje biblioteke napisane za ESP32, iskoristit ćemo drugu, napisanu za OV2640 model kamere. Driver za OV2640 model već je priložen uz instalaciju podrške za ESP32, a na Googleu smo se informirali kako su spomenuta dva modela kamere kompatibilna.

 

Prvo smo u kodu morali modificirati raspored spajanja pinova, pa smo u datoteci „camera_pins.h“ dodali definiranje pinova za „CAMERA_MODEL_VIDI_X“.

 

U glavnoj datoteci skice pronađite ovakav kôd za konfiguriranje kamere:

  config.xclk_freq_hz = 8000000;
  //config.pixel_format = PIXFORMAT_JPEG; // NE RADI
  //config.pixel_format = PIXFORMAT_YUV422;
  config.pixel_format = PIXFORMAT_RGB565;
  //config.pixel_format = PIXFORMAT_GRAYSCALE;

 

Bitno je primijetiti kako smo varijablu „config.xclk_freq_hz“ postavili na 8 KHz. U redu je i 10 KHz, ali nam veće vrijednosti nisu stabilno proradile.

JPEG format nam nije proradio, dok YUV422 nije imao dobru definiciju boja. Najveći smo uspjeh imali s RGB565 formatom.

Bilo je još potrebno podesiti zrcaljenje slike, pa smo to učinili pomoću if uvjeta i linije koda:

#if defined(CAMERA_MODEL_M5STACK_WIDE) || defined(CAMERA_MODEL_WROVER_KIT) || defined(CAMERA_MODEL_VIDI_X) || defined(CAMERA_MODEL_M5STACK_ESP32CAM)
  s->set_vflip(s, 1);
  s->set_hmirror(s, 1);
  //s->set_brightness(s, 1); // up the brightness just a bit
  //s->set_saturation(s, -2); // lower the saturation
  //s->set_framesize(s, FRAMESIZE_CIF);
#endif

 

Zasićenje i svjetlinu nismo uspjeli mijenjati, pa su te linije koda ostale pod komentarom, najvjerojatnije uslijed nekompatibilnosti između korištene kamere i one za koju je pisana „esp_camera.h“ biblioteka.

 

Shema spajanja

Shema spajanja pokazuje kako pinovi kamere označeni s RES i PWDN nisu spojeni

 

Pozicije mikroprekidača: S obzirom na to da koristimo mnoštvo pinova, gotovo ćemo ih sve postaviti u USE EXP. poziciju. U GAME USE poziciji ostaju nam VSPI_CSO te D/C LCD koje koristimo za LCD ekran i MIC_PCB te MIC koje koristimo za mikrofon. Da bi se zvučnici mogli koristiti, njihov prekidač mora također imati odgovarajuću poziciju, lijevo, kako je iznad njega označeno

 

Na shemi spajanja možete primijetiti kako smo iskoristili većinu strapping pinova. ESP32, Procesor VIDI X-a, ima 6 strapping pinova. To su:

  • GPIO0: internal pull-up
  • GPIO2: internal pull-down
  • GPIO4: internal pull-down
  • GPIO5: internal pull-up
  • MTDI/GPIO12: internal pull-down
  • MTDO/GPIO15: internal pull-up

 

Pull-up znači da su pinovi otpornikom spojeni na pozitivno (+) napajanje, a pull-down da su otpornikom spojeni na GND, tj. uzemljenje.

Za vrijeme reseta, bootanja ili gašenja procesora, ti pinovi zauzimaju vrijednosti 0 ili 1 i drže te vrijednosti dok se čip ne upali ili ugasi. U slučaju da ta promjena vrijednosti spomenutih pinova utječe na senzore ili aktuatore spojene na njih, potrebno je na nju obratiti pažnju. Od projekta do projekta može ih biti manje ili više zeznuto koristiti.

Da bi promijenili vrijednosti stanja strapping pinova prilikom bootanja, možete primijeniti vanjske pull-up ili pull-down otpornike. Nakon procesa resetiranja ili bootanja, strapping pinovi radit će kao normalni.

Pinovi su 0, 2 i 12 najkritičniji te njihovo krivo korištenje može uzrokovati da se VIDI X ne resetira pravilno, tj. da se ni ne boota. Ako je korištenje tih pinova nužno za neki vaš projekt, a njihovo mu inicijalno stanje ne odgovara, u takvim se projektima mogu koristiti npr. uz prekidače s vremenskom odgodom.

 

Obratite pozornost kako se nakon uploada koda VIDI X neće automatski resetirati, pa je to potrebo učiniti pomoću ON/OFF prekidača smještenog gore lijevo, odmah pored tipke SELECT.

 

Pozicije mikroprekidača: S obzirom na to da koristimo mnoštvo pinova, gotovo ćemo ih sve postaviti u USE EXP. poziciju. U GAME USE poziciji ostaju nam VSPI_CS0 te D/C LCD koje koristimo za LCD ekran i MIC_PCB te MIC koje koristimo za mikrofon. Da bi se zvučnici mogli koristiti, njihov prekidač mora također imati odgovarajuću poziciju, lijevo, kako je iznad njega označeno.

 

Arduino IDE i borba s bibliotekama

Niste li prije instalirali Arduino IDE, to možete učiniti uz pomoć radionice na linku: https://vidi-x.org/radionice/vidi-project-x-91-arduino-ide/.

Nakon instalacije Arduino IDE razvojnog okruženja, potrebno je instalirati biblioteke koje nedostaju.

 

Putem „Library Manager“ izbornika pronađite „ESP Mail Client“ biblioteku te ju instalirajte.

 

Pazite da instalirate ESP Mail Client biblioteku, a ne ESP32 Mail Client biblioteku koja je zastarjela, pa se ne može koristiti uz Gmail i slične servise.

 

TFT_eSPI“ biblioteku preuzmite s linka: https://github.com/VidiLAB-com/Vidi-X/blob/master/Servo_tipke_AiB/TFT_eSPI-1.4.20.zip.

S izbornika „Skica“ odaberite „Include Library“, zatim „Add .zip library“ te odaberite „TFT_eSPI“ biblioteku koju ste preuzeli. Iako je istu biblioteku moguće instalirati i kroz Library Manager, preuzimanje je bolji način jer je biblioteka na našem GitHub kanalu već podešena za rad s VIDI X mikroračunalom.

U protivnom biste trebali definirati pinove ekrana unutar datoteke „User_Setup.h“ spomenute biblioteke.

 

XT_DAC_Audio.h“ biblioteku preuzmite s linka: https://www.xtronical.com/wp-content/uploads/2019/10/XT_DAC_Audio-4_2_1.zip.

XT_DAC_Audio.h biblioteka zadužena je da s pomoću DAC pina 25 VIDI X-a putem audio pojačala ugrađenog na VIDI X mikroračunalo proizvede zvuk iz .wav datoteke.

Zvučnik priložen uz VIDI X neće biti dovoljno glasan za ovaj projekt, pa je poželjno zvučnike od 3 W spojiti na 3,5 mm audio jack.

Zvučnike glasnije od 3 W, poput npr. desktop zvučnika koje 3,5 mm jackom spajate na računalo, možete spojiti na VIDI X mikroračunalo uz pomoć konvertera koji s jedne strane ima čeveropolni 3,5 mm priključak za VIDI X, a s druge priključak koji paše za vaše zvučnike. Može imati i dodatni priključak za mikrofon ako želite spojiti vanjski mikrofon.

Audio jack VIDI X mikroračunala koristi OMTP standard spajanja.

Audio jack VIDI X mikroračunala koristi OMTP standard spajanja

 

Ovakav video kabel dobro će doći, ali ako nije spojen prema OMTP nego CTIA standardu, bit će vam potreban i OMTP na CTIA konverter. OMTP i CTIA standardi razlikuju se po mjestu na kojem im se nalaze GND i MIC prstenovi

 

Spojite li i drugi mikrofon na konektor, ugrađeni mikrofon VIDI X mikroračunala postaje neaktivan te se koristi vaš novougrađeni kojem je eventualno potrebno prilagoditi varijablu.

 

const int prag = 500;

 

Manja vrijednost varijable „prag“ povećat će osjetljivost mikrofona, no nije preporučeno stavljati vrijednosti manje od 150. Poigrajte se ovom varijablom i isprobajte različite opcije.

 

Na slici možete primijetiti kako za vanjski mikrofon koristimo običan Buzzer koji je nešto manje osjetljiv spram ugrađenog zvučnika.

 

Zvuk „Dobar pas“

Ne biste li svojega psa umirili, trebali biste se snimiti kako mu izričete naredbu kojom to inače činite.

Prvo biste se trebali snimiti kako govorite „dobar pas, sjedni“ ili neku drugu frazu koju želite pustiti na zvučnik, možda čak uključujući njegovo ime, poput „Rex, sjedni“.

Snimiti se možete računalom ili mobitelom aplikacijom koja se zove „Sound Recorder“. Ima ih nekoliko istog imena, a razne verzije mogu imati bogatije ili manje bogate opcije za spremanje zvuka. Najbolje je koristiti onu već priloženu uz vaš mobitel. Bitno je da snimka zvuka nije preglasna jer će dolaziti do njegova probijanja. Kako nebi dolazilo do probijanja zvuka potrebno je koristiti zvučnike impedancije 32 Ohma s obzirom da je VIDI X dizajniran za takve zvučnike. Kako veliki dio desktop zvučnika ima impednaciju od 4 ili 6 Ohma za ovu radionicu je poželjno imati snimku na otprilike 50% glasnoće.

 

 

Svakako zavirite u „Settings“ te aplikacije i, ako moguće, podesite snimanje Mono zvuka na 16 kHz i 8 bita te ju spremite u .wav obliku.

Kako biste naš priloženi zvuk zamijenili vlastitim, potrebno je imati spomenutu 16 KHz .wav datoteku u 8 bita. Ako mobitel nema takvu opciju spremanja, a noviji je modeli najvjerojatnije neće imati, spremite je u nešto najsličnije tome te si ju pošaljite mailom uz korištenje „share“ ikonice za dijeljenje.

Konvertirati zvuk u spomenuti format možete uz pomoć besplatnog programa Audacity tako da njime otvorite ranije snimljeni audio zapis te s menija odaberete „Datoteka“ → „Export“ → „Export Audio…“.

Sada pod opcijom „Spremi u obliku:“ odaberite „WAV (Microsoft)“, a niže pod opcijom „Kodiranje:“ odaberite „Unsigned 8-bit PCM“.

Vašoj datoteci zadajte ime i kliknite na gumb „Spremi“.

 

Kako biste tako pripremljenu .wav datoteku pospremili u varijablu pogodnu za naš kod, potreban vam je „HxD – Hexeditor“ editor heksadecimalnih datoteka koji možete preuzeti s linka: https://mh-nexus.de/downloads/HxDSetup.zip ili potražiti njegovu odgovarajuću verziju na sajtu: https://mh-nexus.de. Njime na klasičan način, „File“ → „Open…“, otvorite .wav zapis koji ste kreirali.

 

 

Ovaj smo heksadecimalni editor odabrali jer ima opciju kojom bilo koju datoteku možete konvertirati u varijablu. Sada dakle odaberite “File“ → „Export“ → “C“.

Datoteka sada izgleda kao na slici.

 

 

Nadalje je potrebno promijeniti ime varijable. Mi ćemo je promijeniti iz „rawData“ u „dobarpas“ jer će sve eksportirane datoteke dobiti ime varijable rawData, pa ako koristimo više od jedne takve, njeno nam ime neće odgovarati.

 

unsigned char PROGMEM dobarpas[36028] = {
  0x52, 0x49, 0x46, 0x46, 0xB4, 0x8C, 0x00, 0x00, 0x57, 0x41, 0x56, 0x45,

 

PROGMEM“ je modifikator varijable koji kompajleru govori da stavi podatke varijable u flash memoriju, umjesto u SRAM, kamo bi inače varijabla bila pohranjena. Takav je način pohrane dobar za kraće zvučne sekvence.

Primjer korištenja:

const dataType variableName[] PROGMEM = {}; // use this form
const PROGMEM dataType variableName[] = {}; // or this one
const dataType PROGMEM variableName[] = {}; // not this one

 

Za sada PROGMEM modifikator može stajati bilogdje pored varijable, iako se preporučuju prva dva primjera korištenja. Mi smo koristili treći način i nismo imali problema, no kako se softver razvija, moguće je da se u budućnosti postroži korištenje tog modifikatora, pa na takve promijene treba obratiti pozornost u nekim novijim verzijama Arduino IDE razvojnog okruženja.

 

Spremite datoteku pod imenom „SoundData.h“, a u glavnoj skici je pozovite naredbom „#include “SoundData.h”“.

 

Web server

Web server aktiviramo samo kada je detektiran zvuk. Detekcija zvuka radi putem mikrofona i pina 14 VIDI X mikroračunala, no on može biti korišten samo kada je Wi-Fi veza ugašena, pa smo tako isprogramirali i kod.

Kada dakle pin 14 pokaže odstupanje od srednje vrijednosti za iznos definiran u varijabli prag, aktivira se Wi-Fi veza te nam web server sa streamingom slike s kamere postaje dostupan putem IP adrese VIDI X mikroračunala.

IP adresa ispisana je u serijskoj konzoli kao i na ekranu VIDI X mikroračunala, a izgleda poput: http://192.168.1.147

 

Većina kontrola kamere neće raditi jer su pisane za drugi tip kamere od ovoga koji mi koristimo.

 

Želite li se poigrati s web stranicom te joj modificirati izgled, možete sadržaj varijable „index_ov2640_html_gz“ iz datoteke „camera_index.h“ copy-pasteati u „CyberChef“ s adrese: https://gchq.github.io/CyberChef/ u „Input“ prozor. Radi se samo o sadržaju od 5. do 274. linije koda.

Aplikacija radi tako da uzmete određenu funkciju pod „Operations“ i odvučete je u „Recipe“ prozor te joj zadate parametre.

Ovdje onda pronađite „Find / Replace“ i s pomoću njega riješite se zareza. Sada još jednim korištenjem iste funkcije maknite „0x“.

Sada možete primijeniti opciju „Remove Whitespace“.

U ovom trenutku rezultat bi trebao izgledati kao na slici.

 

Na dno Recipe prozora odvucite „From Hex“ i na kraju još odvucite „Gunzip“. U „Output“ se prozoru sada trebao pojaviti ljudima čitljivi HTML kod koji ćete moći lagano izmijeniti prema vašim željama te ga prema istom receptu, samo okrenutog postupka, vratiti u Gzip heksadecimalni zapis koji ćemo pospremiti u varijablu iz koje smo ga uzeli.

Morat ćete osim toga promijeniti vrijednost varijable „index_ov2640_html_gz_len“ iz datoteke „camera_index.h“ koja ovisi o veličini heksadecimalnog zapisa koji ste kreirali.

 

Inače, na linku je poput: http://192.168.1.147:81/stream video stream dostupan čitavo vrijeme aktivnog trajanja Wi-Fi veze. Vama će vjerojatno biti drugačija IP adresa dok dio s oznakom porta 81 nadalje ostaje isti.

 

Slanje e-mail obavijesti

Nakon što je zvučna aktivnost detektirana, osim aktivacije web servera, šalje se i obavijest mailom i toj aktivnosti. Mail sadrži i lokalnu IP adresu web stream servera na koju kada kliknete možete vidjeti aktualni web stream.

 

 

Kako biste prilagodili skicu da na vaš mail šalje takvu obavijest potrebno je prilagoditi ove varijable:

 

const char* ssid = "wifi ime mreže na koju se spajate";
const char* password = "wifi password";
#define SMTP_HOST "smtp.gmail.com"
#define SMTP_PORT esp_mail_smtp_port_587
#define AUTHOR_EMAIL "testni.mail.za.slanje@gmail.com"
#define AUTHOR_PASSWORD "gmail password"

 

Osim Gmaila koji smo koristili u našem primjeru, možete koristiti i druge mail davatelje usluga. Nakon što ste prilagodili postavke vašem Gmail računu, potrebno je još i promijeniti ovu liniju koda te u nju upisati vaš mail na koji će obavijest stići:

 

message.addRecipient("user1", "mail@domena.hr");

 

Ako ste sve napravili kako treba, vaš VIDI X sada može detektirati zvuk (nadamo se lavež psa) te vam o tome poslati mail kako biste putem video streama provjerili o čemu se radi, a dok se vi pripremate za spajanje na server, mikroračunalo će pustiti zvuk koji ste postavili za umirivanje psa.

 

Naravno, vrlo je lagano ovu radionicu urediti tako da lopovima da do znanja da se njihova aktivnost nadzire ako nemate psa kojega bi trebalo umirivati kada zalaje.

 

Kako stream učiniti dostupnim s interneta?

Iako se ova radionica ne bavi sigurnosnim aspektima web servera, treba imati na umu kako nije baš najpametnija stvar video stream iz vašeg doma staviti javno na internet, no ipak, poželite li i to, jedno je od jednostavnijih rješenja „ngrok“. To je program, tj. command line aplikacija za dobivanje URL-a koji pokazuje na vaš lokalni VIDI X poslužitelj i zaobilazi bilo koji NAT ili firewall na vašoj mreži.

Kako iskoristiti ngrok saznajte iz radionice na linku: https://vidilab.com/vidi-project-x/4757-vidi-project-x-96-univerzalni-daljinski-upravljac.

 

 

Jedino što bi malčice moglo doprinijeti sigurnosti u ovoj radionici činjenica je da je, kada se aktivira, stream dostupan samo 10 minuta. Iz sigurnosnih aspekata i nije baš neka utjeha, no zgodno je isprobati.

 

Na što treba obratiti pažnju

Prilikom pokretanja koda na VIDI X-u, naišli smo na neke probleme.

 

Greška poput ove:

[E][camera.c:1049] camera_probe(): Detected camera not supported.

[E][camera.c:1249] esp_camera_init(): Camera probe failed with error 0x20004

govori nam da postoji problem u spojnim žicama koje povezuju VIDI X i kameru te je moguće da ih treba bolje namjestiti i samo stisnuti malo prstima za vrijeme boota. Ako ovo riješi spomenutu grešku najbolje bi bilo trajno zalemiti žice i tako osigurati dobre kontakte.

 

Osim labavih spojeva žica, još jedna situacija javlja istu grešku. Naime, imate li Arduino IDE, na Windows stroju koji ste ažurirali iz verzije u verziju najvjerojatnije postoje ostaci starih instalacija uokolo po računalu te je potrebno počistiti taj nered. To ćete najlakše učiniti tako da na računalu deinstalirate Arduino IDE, zatim kreirate novog korisnika Windows operativnog sustava te Arduino IDE instalirate na tom čistom, novo kreiranom korisničkom računu. Izgleda da se problem desio pri prelasku s verzije 1.8.12 ili ranijih na verziju 1.8.13 ili novije kada je Arduino IDE promijenio lokaciju na koju pohranjuje informacije o podršci za mikrokontrolere.

Kreiranje novog korisničkog računa predlažemo jer se većina spomenutih podataka nalazi u korisničkom folderu „%USERPROFILE%\AppData\Local\Arduino15“, te ako baš niste komotni s kopanjem po skrivenim Windows folderima koji zapravo niti nisu namijenjeni za ručno brisanje, kreiranje je novog korisničkog računa jednostavnija opcija. Nemate li kojim slučajem tu mogućnost, ne preostaje vam drugo doli pokušati popraviti situaciju brisanjem sadržaja ovih foldera:

%USERPROFILE%\AppData\Local\Arduino15\packages\esp32\hardware\esp32

Ovdje bi trebao biti folder imena „1.0.6“ i govori nam o verziji ESP podrške instalirane putem Boards Managera

%USERPROFILE%\AppData\Local\Arduino15\packages\esp32\tools\esptool_py

Ovdje bi trebao biti folder imena „3.0.0“ i govori nam o verziji Pythona 3.0.0.

%USERPROFILE%\AppData\Local\Arduino15\packages\esp32\tools\xtensa-esp32-elf-gcc

Ovdje bi trebao biti folder imena „1.22.0-97-gc752ad5-5.2.0“ i govori nam o verziji C kompajlera koju Arduino IDE koristi pri kompiliranju.

Nije nužno da sve spomenute verzije u potpunosti odgovaraju, no bitno je imati na umu kako Arduino IDE evoluira kroz verzije te može uzrokovati nekompatibilnosti u određenim situacijama, a spomenute verzije su one na kojima je nama kôd proradio.

Dakle da sumiramo: mi smo koristili Arduino IDE verziju 1.8.13 i 1.8.15 dok je u Boards Manageru instalirana podrška za esp32 verzije 1.0.6.

 

Pojave li vam se neke od grešaka poput ovdje nabrojanih:

// if PSRAM IC present, init with UXGA resolution and higher JPEG quality

[E][camera.c:267] camera_fb_init(): Allocating 600 KB frame buffer Failed

[E][camera.c:1281] camera_init(): Failed to allocate frame buffer

najbolje bi bilo posjetiti web stranicu biblioteke kamere i tamo potražiti rješenje u nekom od (u trenutku pisanja teksta) 256 riješenih problema ili otvoriti novi problem:

https://github.com/espressif/esp32-camera/issues/

 

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.