Projekt ELEKTRONIČKA META
Brza detektorska elektronika
Veličina i gustoća laserske mreže (zavjese)
Osnovni zahtjev koji se postavlja pred našu senzorsku lasersku zavjesu je mogućnost sigurne, brze i točne detekcije svih kalibara dijabola i slagova za zračne puške (4,5 do 12,7 mm) koji lete brzinama do 330 m/s pa i brže. Najteže je svakako detektirati male projektile jer je za njih potrebna gusta svjetlosna zavjesa. Veći projektili će sjeći više susjednih laserskih zraka, što čini pouzdaniju detekciju, a sredina pogotka se lako računa preko srednje vrijednosti međusobne udaljenosti prekinutih zraka. Zato i polazimo od najmanjih projektila 4,5 mm koji sječu samo jednu lasersku zraku, a i to u nekim slučajevima samo djelomično.
Prikaz putanje dijabole točno između dvije laserske zrake što je najteži slučaj za detekciju. Dijabola promjera (kalibra) 4,5 mm i duljine 5 mm zbog svojeg oblika u nekim slučajevima neće presijecati laserske zrake čitavom svojom duljinom, neće je presijecati jednoliko i neće je presijecati u potpunosti.
Na slici vidimo najgori mogući slučaj preleta dijabole 4,5 mm preko laserske mreže 4×4 mm. Laserska zavjesa mora biti postavljena u dva reda zbog same veličine tijela lasera (6 mm) tako da će naizmjenični redovi biti međusobno razmaknuti 7-8 mm (ovisno kako točno fizički posložimo i porazmjestimo same lasere). Dijabola tako u svom preletu prvo glavom djelomično siječe prvi red zavjese, zatim se u struku suknjice laserska zraka gotovo ne prekida, a na kraju se prolaskom suknjice prva zraka ponovno postepeno zaklanjala do polovice sjaja. Nakon toga, isti obrazac zaklanjanja slijedi i preletom dijabole preko susjedne laserske zrake u drugom sloju zavjese.
Iz svega je jasno da prolazak dijabole kroz lasersku mrežu može uzrokovati potpuno ili djelomično zatamnjenje sjaja laserske zrake sa višestrukim ponavljanjem ovog obrasca, te ćemo za detekciju dobiti više impulsa različite širine i različitog razmaka između njih. Također, nejednoliko zatamnjenje laserske zrake će uzrokovati nejednake detektorske napone na foto-diodama. Ti naponi stoga lako mogu pasti u nedefiniranu zonu detekcije logičkog čipa (između nule i jedinice), što detekciju čini nepouzdanom.
Ovo bi se moglo ublažiti postavljanjem gušće optičke mreže (3×3 mm), čime bi prekidanje laserske zrake i najmanjim projektilima bilo puno izraženije. Međutim to za sobom nosi dodatne konstrukcijske probleme, usložnjava optičke zahtjeve (optičko poravnanje, izbjegavanje susjednih refleksija) i čitavu metu čini 6 cm manjom (192×192 umjesto 256×256 mm).
Rješavanje problema djelomičnog i potpunog presijecanja laserske zrake
S obzirom na krivulju osjetljivosti foto-dioda (koja je gotovo linearna) moramo naći dobar balans između reakcije na Sunčevo svjetlo i druga umjetna svjetla (manja energija) i svjetlo iz lasera (veća energija), ali koje može biti potpuno ili djelomično zasjenjeno preletom projektila.
Svakako ćemo morati napraviti optičke pokuse kako foto-diode reagiraju na količinu upadnog svjetla, kako onog iz lasera (nezaklonjenog, zaklonjenog i djelomično zaklonjenog) tako i onog koje će dopirati preko dnevnog ili umjetnog vanjskog svjetla. Moram napraviti pokuse sa više vrsta (veličina) foto-dioda i sa različitim fokusima laserske zrake na foto-senzorima. Nakon toga ću odgovarajućom vrijednosti pull-up ili pull-down otpornika pokušati regulirati pragove napona (histerezu) na koje će najbolje i najbrže reagirati Schmittov okidni sklop (Schmitt inverter).
U tu svrhu će zadovoljavati jeftini integrirani krug SN74HC14 koji sadrži šest Schmitt invertera više nego dovoljne brzine odziva oko 30 ns (prelet dijabole u duljini 1 mm stvara prekid zrake u trajanju 3 µs).
Međutim, ukoliko će te pragove jednostavno biti nemoguće jasno razlučiti, odnosno ako se djelomično zatamnjenje lasera neće moći pouzdano detektirati, onda postoje dva moguća rješenja: jače fokusiranje laserske zrake (tanja zraka) ili moramo ići na gušću lasersku mrežu.
Rješavanje problema obrade višestrukih i nejednakih signala iz senzora
Drugi problem koji moramo riješiti su nepravilni izlazni impulsi koje uzrokuju višestruki prekidi i kašnjenja u prekidima zrake. Kada dijabola svojim oblikom siječe lasersku zraku, kako smo prije opisali, ona tijekom preleta može uzrokovati više logičkih promjena stanja (0 -> 1 -> 0 -> 1 -> 0) te svakako međusobno kašnjenje signala sa dvije susjedne laserske linije. Ta frekvencija promjena stanja kao i vrijeme kašnjenja može biti vrlo različito, ovisno o obliku, veličini i brzini dijabole. U nekom najgorem slučaju gdje bi brzina dijabole bila ispod 10 m/s, na 8 mm dužine kašnjenje može biti i do 10 ms.
Naš sustav detekcije dakle mora paralelno pratiti 128 linija (bitova) sa senzora koji mogu dati višestruke binarne nizove signala različitih širina i sa različitim vremenskim razmacima u širokom rasponu između 30 ns i 10 ms. Svaki prelet specifičnog projektila (veličina, oblik, brzina) kroz određeni dio optičke mreže, dati će drugačiji uzorak signala. Uz sve to, obrada signala sa svih 128 senzora mora biti obavljena u vremenu kraćem od 3 µs (najbolje ne dužem od 1 µs).
MCU ili FPGA
Da bi 128 bita podataka obradili preko mikrokontrolera (programski) u tom kratkom vremenu, potreban nam je vrlo brz mikrokontroler (MCU) sa puno paralelnih ulaznih linija (najbolje neki 128 bitni MCU). Jeftine MCU razvojne pločice poput popularnog Arduina su prespore za taj zadatak (tipično 16 MHz) i premalog kapaciteta ulazno/izlaznih linija (I/O). Čak i sa najbržim (najskupljim) MCU platformama, poput Teensy 4.1 (600 – 816 MHz), Arduino Giga R1 (480 MHz) ili ESP32-P4 (400 MHz), te čak i uz dobru optimizaciju programskog koda, čitanje i obrada podataka sa svih 128 senzora teško bi se mogla obaviti za vrijeme brže od nekoliko mikrosekundi. To je za naš projekt presporo.
Jedino moderno rješenje koje ovdje može pomoći su FPGA platforme (Field Programmable Gate Array). FPGA radi po čistoj hardverskoj logici i kašnjenja su kod tih čipova reda nanosekunde. To je u osnovi kreiranje vlastitog namjenskog čipa koji može biti kombinacija bilo kojih logičkih krugova.
Ako u nekoj boljoj elektroničkoj trgovini (Mouser) filtrirate FPGA čipove sa 128 i više I/O dobivate cjenovni raspon od 20-tak eura do nekoliko desetaka tisuća eura (Microchip, Altera, AMD/Xilinx, Lattice). Razlika se najviše očituje u broju logičkih elemenata koje imate na raspolaganju i količini memorije u koju se upisuju veze između tih elemenata, maksimalnom broju I/O portova, naponu napajanja itd. S obzirom na ovako veliki raspon cijena jasno je da već u početku morate dobro znati što vama zapravo treba, odnosno koji FPGA čip je dovoljan za vašu aplikaciju.
S obzirom na veliki broj pinova, FPGA čipovi najčešće dolaze u BGA kućištima što je posve neprikladno za amatersku samogradnju čak i uz profesionalno izrađene tiskane pločice. Time ste ograničeni na gotove razvojne FPGA module, međutim, tu se taško nalazi neki koji već ima izvedenih 128+ I/O portova. Vjerojatno bi više modula trebalo spajati paralelno ili kupiti dodatne pločice sa I/O proširenjima.
FPGA programiranje nije ni lako ni jednostavno. Potrebno je naučiti programiranje takvih čipova u posebnom „hardverskom“ jeziku (VHDL) i općenito proučiti njihovu strukturu i način funkcioniranja kako bi se našlo optimalno rješenje. FPGA programiranje se uvelike razlikuje od Arduino programiranja, softver za programiranje je puno složeniji i učenje traži puno više vremena i truda. Na Internetu nećete naći ni približno toliko tutorijala i primjera kao za Arduino, a to znači da vam ni UI neće moći puno pomoći.
Veliki problem je što je već u startu potrebno odabrati optimalan FPGA čip jer se čipovi različitih proizvođača programiraju različitim alatima, svaki FPGA čip kao i pripadajući softver za programiranje imaju svoje specifičnosti. Čak i kada se znaju osnovni zahtjevi, usporedbe dostupnih čipova nisu jednostavne, specifikacije za svaki čip su vrlo složene i sve to u startu može dovesti do pogrešnog odabira.
Na sreću, danas već postoje i potpuno vizualni (grafički) editori za konfiguriranje FPGA čipa. Jednostavno se povuku logički krugovi koji vam trebaju i spoje se žicama kao da crtate shemu u nekom programu poput KiCad, Micro-Cap i sličnima. Na kraju jednim klikom programirate FPGA. Ovo na primjer funkcionira sa jeftinom Altera Cyclone IV razvojnom pločicom i besplatnim programom Quartus Prime Lite. Druga opcija je program Icestudio s nekom od podržanih ploča (npr. iCEstick).
Ovo će biti moj slijedeći korak ukoliko se projekt općenito pokaže kao izvodljiv i funkcionalan u dijelu samih senzora.
Diskretna logika
S obzirom da sam ja „stara škola“ za sada je ideja ići jedan korak unatrag od FPGA te koristiti diskretne logičke integrirane krugove za hardversko kreiranje vlastitog namjenskog „FPGA“. No, upravo tu se krije i praktični problem. Naime, zahvaljujući sve većem razvoju programabilnih FPGA čipova, proizvodnja klasičnih logičnih čipova se značajno smanjila. Danas se već vrlo teško pronalaze neki jednostavni logički čipovi koji su bili vrlo rašireni prije 20 ili 30 godina.
Za potrebe projekta ovdje bi bio idealan logički čip koji sadrži RS-Latch krugove. Iako to nije jedina opcija svakako je najjednostavnija jer bi upotreba nekih drugih flip-flopova i memorija prilično zakomplicirala hardver i softver projekta. RS-Latch sadrži dva logička ulaza (Set i Reset) te jedan logički izlaz (Q).
Blok sheme jednih (od četiri) RS-Latcheva sadržanih u integriranim krugovima CD4033 i CD4044. Razlika između ova dva čipa je u reakciji na logičke razine na ulazima. Kod CD4043 (NOR Latch) ulazi su aktivni na visokoj razini (Active HIGH), dok su kod CD4044 (NAND Latch) ulazi aktivni na niskoj razini (Active LOW).
Gledano za našu primjenu, RS-Latch CD4044 radi na ovaj način:
- Svaki senzor (foto-dioda) je spojena preko otpornika na pozitivni pol napajanja (+5V) tako da u aktivnom stanju daje na izlazu logičku 0. Schmitt inverteri logičku 0 okreću u logičku 1. Te logičke jedinice sa senzora u mirnom stanju dovode se na pojedinačne SET ulaze RS-Latcheva. RESET pinovi svih RS-Latcheva su spojeni zajedno preko pull-up otpornika (logička 1). Ova RESET linija se spaja na MCU. Time su u mirnom stanju (stanju čekanja) na oba ulaza RS-Latcha (SET i RESET) logičke 1. Izlaz (Q) je pri tome logička 0.
- Kada projektil prekine jednu lasersku zraku, na senzoru će se pojaviti logička 1, a na izlazu iz invertera logička 0. Sada je SET ulaz na 0, a RESET ulaz je na 1. Ovo će uzrokovati promjenu stanja na izlazu iz 0 u 1. To stanje će se trajno zadržati, odnosno ostati će zapamćeno (memorirano) bez obzira kako se kasnije mijenjaju stanja na SET ulazu (ponovna promjena na 0 kada projektil proleti).
- Nakon što MCU pročita novo stanje, resetira sve RS-Latcheve tako da zajednički pin RESET kratkotrajno postavi na 0, a zatim opet vrati na 1.
Potreban nam je dakle jedan RS-Latch za svaki senzor. RS-Latch mijenja i zaključava izlazno stanje čim dijabola prvi put prekine jednu od laserskih zraka, pri čemu je posve nebitno da li će prekid biti kraći, duži, višestruki, sa većim ili manjim razmacima. MCU (Arduino) nakon toga ima sve vrijeme svijeta (i 500 ms ako treba) očitati svih 128 stanja na izlazima RS-Latcheva, nakon čega može promijeniti stanje na Reset pinu i sve Latcheve ponovno resetirati na 0 za novi ciklus detekcije.
Jedini brzi čipovi koji nam ovdje trebaju su dakle Schmitt inverteri SN74HC14 (30 ns) i RS-Latchevi koji po četiri komada dolaze u integriranom krugu CD4044. Vrijeme odziva (promjene stanja) ovih čipova je 20-350 ns, ovisno o naponu napajanja (3-15 V) i pinovima na kojima se promjena događa. To je dovoljno brzo za naše potrebe, no šteta što se više ne može nabaviti 74HC4044 inačica ovog čipa (High-speed CMOS) koja je deset puta brži od standardne CD CMOS serije.
3-state stanje izlaza
CD4044 je inače „3-state“ logički integrirani krug što znači da može imati tri izlazna stanja: logička 0, logička 1 i tzv. stanje visoke impedancije (High Z ili Hi-Z). U Hi-Z stanju izlazi iz logičkog čipa zauzimaju stanje visoke impedancije (velikog unutrašnjeg otpora) te se spojeni u strujni krug ponašaju praktično kao beskonačni otpor i električki ne utječu na krug (kao da nisu spojeni). Ovo je korisno ako se izlazi više logičkih krugova spajaju zajedno. Tada se preko pina Enable može uključiti samo onaj čip, odnosno samo onaj logički izlaz koji nam je u tom trenutku potreban. Za našu primjenu ova funkcija nije iskoristiva tako da će pin Enable uvijek biti uključen (na logičkoj 1).
Zabranjeno stanje ulaza
Na blok dijagramu i tablici istine također vidimo da postoje kritična (nestabilna, zabranjena, nepredvidljiva) logička stanja ulaza. Za CD4043 nastaje takvo stanje kada su oba ulaza na logičkoj 1, a kod CD4044 kada su oba ulaza na logičkoj 0. Ova stanja krše osnovnu logiku RS-Latcha.
Uzmimo za primjer CD4044 koji ćemo mi koristiti za projekt (kod CD4033 je pojava ista samo obrnuta glede logičkih stanja). Ako su oba ulaza 0 (S=0, R=0) izlaz (Q) ide u logičku 1 jer kod NAND RS-Latcha nula na bilo kojem ulazu “prisiljava” izlaz na 1. U ovom stanju čip ne “pamti” ništa, on samo slijedi ulaze. Problem nastaje u trenutku kada oba ulaza istovremeno pokušavamo vratiti u početno mirno stanje, odnosno na logičke 1. Na shemi u tablici istine vidimo da za oba ulaza 1 izlaz treba ostati 1 (No change). Međutim, da li će izlaz ostati 1 ili pasti na 0, u ovom konkretnom slučaju ovisi isključivo o mikroskopskim razlikama u brzini tranzistora unutar tog konkretnog primjerka čipa ili o tome koji je ulaz (makar i za nanosekundu) prvi dobio napon. To je prilično nepredvidljivo stanje i treba ga izbjegavati.
U konkretno našem slučaju, sustav ušao u ovo nestabilno stanje ako bi se poklopio trenutak kada projektil prekine lasersku zraku sa trenutkom kada Arduino resetira RS-Latcheve. U tom trenutku bi oba ulaza bila 0, što daje izlaz 1, međutim nakon Reseta pri povratku u normalan (mirni) rad (oba ulaza logička 1) došlo bi do te nepredvidive situacije gdje na izlazu može biti 0 ili 1. Tada bi se zabilježen pogodak mogao “izbrisati” sam od sebe ili bi moglo ostati “zakočena” u jedinici.
Mi ćemo ovo stanje svakako izbjeći samim time što će Reset biti moguć i izvršen samo u vremenu kada ne može biti prolaska projektila kroz zavjesu. To je vrijeme od 10 ms nakon detekcije prvog prekida zrake. Tih 10 ms je dovoljno da i najsporiji projektil odavno pređe zavjesu, a svakako da je iz zračne puške nemoguće ispaliti dva hica u tom kratkom vremenskom razmaku. Čak ni tipično automatsko vatreno oružje ne ispaljuje hice tolikom brzinom. Primjerice, čuveni AK-47 ispaljuje 600 metaka u minuti što znači da je vremenska razlika između dva metka 100 ms. Ova meta bi stoga bez problema mogla detektirati i takvu rafalnu paljbu čak i pri brzini zrna od tipičnih 720 m/s.
Multipleksiranje 128 bita podataka
Nakon što smo RS-Latch memorijama osigurali trajno pamćenje brzih senzorskih impulsa, brzina nam više nije prioritet za daljnju obradu podataka. Razmak između dva hica iz puške je barem 1 sekundu i nama za kompletnu obradu i prikaz pogotka definitivno ne treba brzina veća od brzine treptaja oka (100-400 ms) iako će vrijeme obrade sigurno biti i puno kraće od toga. Sada nam je umjesto brzine puno važnije multipleksiranje, odnosno kako svesti 128 podatkovnih linija na što je moguće manje poveznih žica prema mikrokontroleru (Arduinu).
Naravno da sam i ovdje pretražio tržište svih popularnih i jeftinih multipleksora, te je pobjedu na kraju odnio 16-kanalni analogni multipleksor i demultipleksor sadržan u čipu 74HC4067, a koji se vrlo prikladno može kupiti u obliku modula za cijenu od 0,6 eura po komadu. Ovaj čip ne samo što je najjeftiniji nego je i najprikladniji za naš projekt. Opcije koje uključuju komunikacijske protokole ili posmične registre (74HC165) samo bi zakomplicirale stvari.
Analogno ili digitalno multipleksiranje
Kad bi 74HC4067 koristili kao analogni multipleksor praktično bi nam bio dosta jedan jedini ovakav čip. Međutim, analogno multipleksiranje na jeftinim čipovima (10-bit) može dovesti do pogrešaka i svakako traži daleko više vremena za procesuiranja signala.
Za analogno multipleksiranje bi grupe od 8 izlaznih kanala sa senzora morali povezivati preko djelitelja napona sa otpornicima, tako da na svakom od 16 ulaznih kanala multipleksora imamo 8 različitih (analognih) nivoa napona sa pojedinih linija senzora. Tu bi svakako trebali paziti na raspored povezivanja kako bi se ispravno detektirale susjedne laserske linije jer multipleksor ne može razlikovati više od jednog analognog podatka na jednoj ulaznoj liniji. To znači da grupe od 8 senzora ne mogu činiti susjedni senzori, nego svaki 16 senzor dolazi na isti ulaz multipleksora. Sve ovo komplicira hardver i kasnije programiranje, uvelike povećava vrijeme procesuiranja signala, a u konačnici nema ni neke cjenovne uštede u dijelovima. Bolje je koristiti multipleksor 74HC4067 kao čisti digitalni 16-bitni ulaz.
74HC4067 možemo zamisliti kao rotacijsku sklopku s 16 položaja kojom upravlja digitalni signal. On omogućuje da se jedan zajednički pin (SIG – Signal) poveže s bilo kojim od 16 neovisnih kanala (C0 do C15) koji se odabiru preko 4 adresna pina (S0, S1, S2, S3). Nama će trebati 8 ovakvih čipova (svaki čita 16 senzora), a čipovi se pojedinačno redom aktiviraju pomoću pina EN (Enable). Kada je ovaj pin na LOW, čip radi. Kada ga stavite na HIGH, svi kanali su odspojeni (Hi-Z stanje). Ovdje nam je Hi-Z stanje itekako upotrebljivo jer izlaze svih 8 čipova (SIG) možemo spojiti zajedno na jedan I/O port Arduina. Adresne linije se također spajaju paralelno pa do Arduina ide svega 5 zajedničkih linija i 8 Enable linija od svakog čipa.
Konačni odabir elektroničkih komponenti (za sada)
- 22 x SN74HC14: Schmitt inverter (rješava problem različitih nivoa signala sa foto-dioda) – oko 3,5 eura
- 32 x CD4044: Memorija događaja (rješava titranje laserske zrake uslijed prolaza dijabole i kašnjenje signala između dviju laserskih ravnina) – oko 15 eura
- 8 x CD74HC4067: 16-bitni multipleksori (rješavaju problem čitanja velikog broja linija, 128 linija reducira se na njih 13 do Arduina) – oko 5 eura
- Bilo koji jeftini Arduino (glavni kontroler koji samo upravlja adresiranjem i očitavanjem) – oko 3 eura
Samo da ponovim, sva ova količina logičkih čipova, uključujući i sam MCU (Arduino) mogla bi se konfigurirati unutar jednog FPGA čipa.
Praktična izvedba
S obzirom da je ovdje riječ o razvojnom projektu (prototipu), sustav želim podijeliti na više jednakih zamjenjivih modula koje mogu lako nadograđivati, modificirati ili servisirati. U ovoj fazi svakako izbjegavam upotrebu SMD komponenti jer želim imati lak servisni i mjerni dostup svakoj razini elektronike.
Opet mala digresija, FPGA i slični kompleksni čipovi imaju implementirano JTAG sučelje kojim se preko 4 ili 5 pina može vršiti testiranje, programiranje i dijagnostika bilo kojeg logičkog segmenta i I/O porta čipa. Nema potrebe za mikro-pipalicama, mikroskopima i sličnim pomagalima kojima kod BGA čipova ionako možemo malo čemu pristupiti. Nije da svakako preporučujem FPGA čipove, samo kažem …
Uglavnom, kod mene svi čipovi idu u podnožja tako da ih mogu lako testirati i mijenjati u slučaju otkaza i to je najbolji „JTAG“ koji mogu izvesti za ovaj diskretni elektronički projekt
Projektiranje brze detektorske elektronike
Prva zamisao je bila na jedan modul smjestiti 12 senzorskih kanala, što uključuje 2 x SN74HC14 i 3 x CD4044. Problem je što bi to narušilo modularnost multipleksora CD74HC4067 koji ima 16 kanala (trebalo bi više poveznih pinova između modula). Stoga sam se radije odlučio na module koji prihvaćaju 16 senzorskih kanala, dakle 3 x SN74HC14, 4 x CD4044 i 1 x CD74HC4067. Ovdje dva invertera ostaju viška, no to je toliko jeftin čip da se time ne treba zamarati. U konačnici će nam umjesto 22 trebati 24 komada ovih čipova.
Elektronička shema jednog modula sa 16 kanala nacrtana u KiCad programu. Za čitavu mrežu senzora (2×64 komada) potrebno je 8 ovakvih modula.
Iako pločica modula sadrži praktično samo logičke čipove, zbog rasporeda njihovih pinova međusobno povezivanje je prilično isprepleteno. Vrlo teško je sve ovo povezati već na eksperimentalnoj ploči, a još teže bi bilo sve ovo zalemiti na nekoj univerzalnoj tiskanoj pločici. Stoga sam u KiCad programu nacrtao dvostranu tiskanu pločicu najmanjih mogućih (razumnih) dimenzija, tako da širina 4 modula ne prelazi 256 mm, kolika je i širina/visina same senzorske mreže.
16-kanalni moduli su širine 63 mm (tolerancija 2 mm) tako da širina modula ne prelazi širinu niza od 16 senzora.
KiCad
Ovdje mi nije namjera reklamirati, prezentirati ili preporučiti bilo koji od desetak popularnih programa za crtanje elektroničkih shema i kreiranje tiskanih pločica (PCB). KiCad koristim jer je besplatan i potpuno zadovoljava moje potrebe. Kroz karijeru sam koristio različite programe za istu namjenu. Iako svi rade vrlo slično, ipak je potrebno vrijeme da se upoznate sa menijima, opcijama i specifičnostima pojedinih programa. Tko dobro nauči rad i navikne se raditi u jednom programu, izbjegava prelaziti na neki drugi gdje je opet treba novo učenje i navikavanje.
Ipak, kroz vrijeme neki popularni programi postaju zastarjeli (nema novih nadogradnji i podrške), neki više nisu besplatni ili se jednostavno pojave bolji besplatni programi. Tako sam i ja nakon nekoliko programa trenutno na KiCadu.
Netko tko nije radio sa ovakvim programima može imati predodžbu da će isti jednim klikom miša iz elektroničke sheme nacrtati gotovu tiskanu pločicu, odnosno rutirati tiskane veze. Neki programi to čak i mogu (uz prethodni ručni razmještaj komponenti), međutim, to u praksi vrlo rijetko ispadne dovoljno dobro i optimalno, posebice ako shema spajanja zahtjeva puno tiskanih veza. Tako se i uz KiCad može koristi dodatni program ili integrirati dodatak za automatsko rutiranje (Freerouting plugin ili Replicate Layout plugin), no to može napraviti više zbrke neko koristi.
Zato u KiCadu uvijek koristim samo „polu-automatsko“ rutiranje gdje mi program pomaže da držim zadani razmak između veza i da mi općenito ne dozvoli povlačenje linija izvan zadanih postavki. Kod crtanja pojedinačne veze, program može sam predložiti put kojim veza može proći, no u praksi taj posao (logiku) najbolje obavlja ipak sam čovjek. Program je dobar u dijagnostici da li su sve veze ispravno provučene i odlično radi poslove poput popunjavanja zona za GND.
Ja sam za ovaj projekt čak morao ići obrnutim smjerom. Tiskanu pločicu nisam crtao iz elektroničke sheme, nego izravno. Razlog za to je što je pojedinačni čipovi sadrže puno istih nezavisnih logičkih sklopova (inverteri, SR-Latch) koji se mogu upotrijebiti za bilo koji kanal. Tako kod izravnog crtanja sheme mogu odabrati onaj sklop (pinove) koji najbolje odgovaraju fizičkom povezivanju, odnosno one koji su na najmanjem međusobnom razmaku i koji traže najmanje križanja i zaobilaženja kod povezivanja.
Velika pomoć kod rutiranja veza je iznimno dobar vizualni pogled na pločicu tijekom svih faza izrade, jednako što se tiče 2D prikaza po slojevima kao i 3D prikaza sa svih strana i kutova. Ako se netko još uvijek tvrdo drži „stare škole“ crtanja pločice po papirima, sad je stvarno krajnje vrijeme da pređe na elektroničke programe za PCB. Ti programi su tako dobro i jednostavno napravljeni da se mogu savladati za jedno poslijepodne, a najvažnije je što podržavaju izvoz podataka u različitim formatima za profesionalnu izradu tiskanih pločica, koja je u zadnje vrijeme postala vrlo jeftina.
Povratak na CPLD
Već smo rekli da bi za metu 2×64 senzora trebalo 22 x SN74HC14 (Schmitt inverter), 32 x CD4044 (RS Latch) i 8 x CD74HC4067 (16-bitni multipleksori). Ako ne postignemo dovoljno otvaranje senzora trebat ćemo Schmitt invertere zamijeniti brzim komparatorima (32 x MCP 6564). Ovo je prilična količina čipova koje je treba što kompaktnije posložiti na tiskane pločice unutar okvira mete. Iako sam uspio nacrtati pločice koje bi to podržavale, sada ipak želim razmotriti jednostavnije alternative u vidu FPGA i CPLD.
FPGA i CPLD
FPGA (Field-Programmable Gate Array) i CPLD (Complex Programmable Logic Device) su jednostavno rečeno „univerzalni“ logički čipovi koji omogućuju korisniku da ih sam programira na hardversku logiku koja mu je potrebna. To znači da jedan takav čip možemo konfigurirati da sadrži invertere, RS latcheve, multipleksore i sve druge logičke krugove koji su nam potrebni. Komparatore ne možemo konfigurirati jer to nisu digitalni nego analogni čipovi.
Pitanje je sada koju tehnologiju, FPGA ili CPLD, odabrati za naš projekt. FPGA nudi golem broj logičkih vrata, ugrađenu memoriju (RAM) i specijalizirane blokove za digitalnu obradu signala (DSP) te je primarno namijenjen za kompleksne zadatke poput obrade videa, umjetne inteligencije i mrežne infrastrukture. Nedostatak je što se arhitektura čipa temelji se na SRAM tehnologiji, što znači da je volatilan, odnosno gubi konfiguraciju čim nestane napajanja i mora je ponovno učitati iz vanjske memorije pri svakom pokretanju.
CPLD je jednostavniji čip koji se razvio iz rane programabilne logike (PAL/PLA) te se i koristi za kreiranje jednostavnijih logičkih krugova. Temelji se na Flash ili EEPROM memoriji, što ga čini nevolatilnim, odnosno zadržava program i nakon isključenja te je spreman za rad trenutno nakon paljenja. Zbog jednostavnijih internih veza, kašnjenje signala je fiksno i lako predvidljivo. Za naš konkretni projekt jasno je da je CPLD bolji, a također i jeftiniji izbor.
Nama treba CPLD koji podržava najmanje 128 I/O linija za senzore, te još desetak I/O linija za komunikaciju i eventualna proširenja. Također, umjesto čistog CPLD čipa, za samogradnju je puno bolja opcija odabrati neku CPLD razvojnu platformu koja već ima izvedene vanjske konektore, ugrađen regulator napona i oscilator i ostale popratne sklopove. Pretražio sam kinesku ponudu takvih CPLD platformi uspoređujući dva osnovna kriterija: broj dostupnih I/O linija i cijena samog CPLD-a.
EPM570 MAX II CPLD Development Module
Konačni izbor je razvojna platforma sa CPLD čipom EPM570 (EPM570T100C5N) iz Intel/Altera MAX II serije. Na platformi su dostupna 72 I/O pina i ugrađen je takt oscilator na 50 MHz. Sama pločica je dimenzija 9×6 cm i košta oko 16 eura. Može se kupiti i 1 euro jeftinija inačica sa EPM240 čipom. Razlika između EPM240 i EPM570 je samo u logičkom kapacitetu (240 prema 570 logičkih elemenata) dok su po fizičkom obliku i većini funkcija gotovo identični. Prednost pločice sa EPM240 je što ima 4 I/O pina više, no to nama ne igra ulogu jer je za mrežu 2×32 senzora u oba slučaja dovoljna jedna pločica, dok za mrežu 2×64 senzora svakako moramo koristiti dvije takve pločice. Razlike u brzini su također zanemarive, kod EPM240 je kašnjenje 4,7 ns, a kod EPM570 je kašnjenje od 5,4 ns. Ovo su dakle vrlo brzi čipovi, 4 do 5 puta brži od najbržih diskretnih logičkih čipova.
Čitav hardver za senzorsku mrežu 2×64 senzora može se svesti na dvije CPLD pločice EPM570 i jednu ESP32 (ili Arduino) mikrokontrolersku pločicu. Za senzorsku mrežu 2×32 senzora dovoljna je jedna CPLD EPM570 pločica.
Programiranje CPLD-a
CPLD u teoriji zvuči privlačno, no kako uopće programirati ovaj čip, odnosno kako ga konfigurirati na željene logičke krugove. Za programiranje EPM570 (kao i raznih drugih FPGA i CPLD čipova) namijenjen je programski softver Quartus II (Intel Quartus Prime), a programski jezik za opis hardvera (HDL) zove se Verilog. Quartus II omogućuje cijeli proces razvoja FPGA, od pisanja koda i crtanja logičkih shema do simulacije, optimizacije i konačnog prebacivanja dizajna na hardver. Softver također uključuje alate za analizu i sintezu (pretvaranje koda u logička vrata), analizu vremena (timing analysis) te programiranje samog uređaja.
Kad smo već kod programiranja, morate kupiti i namjenski USB Blaster Programmer koji košta oko 3 eura. Ovaj programator se s jedne strane spaja na USB port računala, a s druge strane na 10-pinski JTAG konektor na razvojnoj pločici EPM570. Jednostavnije ne može biti.
Verilog je kao što smo već spomenuli jezik za opis hardvera (HDL) koji se koristi za modeliranje i simulaciju elektroničkih sustava. Ovaj programski jezik se bitno razlikuje od standardnih programskih jezika (poput C-a) jer ne opisuje slijedne naredbe za MCU (softver) nego opisuje strukturu i ponašanje hardvera, odnosno kako su žice povezane i kako logička vrata međusobno komuniciraju. U tipičnom radnom procesu, Verilog se koristi za pisanje koda koji opisuje kako bi digitalni sklop trebao raditi, a zatim se koristi Quartus II kako bi taj kod kompajlirao i fizički implementirao u FPGA/CPLD čip.
Sve ovo na prvi pogled djeluje komplicirano, odnosno djeluje kao nešto čemu treba posvetiti ogromno vremena za učenje. Međutim, jednostavno programiranje kao ovo za naš projekt u potpunosti može za vas odraditi AI. Uz pomoć AI meni su bila dovoljna 2-3 sata da naučim rad u Quartus II do dovoljne razine da konfiguriran I/O pinove i programiram CPLD pomoću Verilog koda kojeg mi je u potpunosti generirala AI. Za programiranje svih onih logičkih čipova za svaki pojedinačni senzor (Schmitt inverteri, RS Latchevi, multipleksori) treba napisati svega 30-tak linija Verilog koda.
I to nije sve. Unutar CPLD također je sada programirana logika koja detektira promjenu stanja na bilo kojem senzoru kao prolazak metka. Time ESP32 ne mora stalno brzo skenirati sve senzonske linije ne bi li otkrio prolaz metka, već to za njega neusporedivo brže radi sam CPLD i informacije prema ESP32 šalje samo kada postoji neka promjena na senzorima. Ovime smo dobili izuzetno brz detektorski sustav kojeg ćemo u ESP32 morati znatno usporiti jer bi jedna dijabola (zbog svog oblika) mogla izazvati nekoliko brzih detekcija.
Praktično jedino „usko grlo“ u čitavom detektorskom sustavu su sada jedino sami senzori, koji moraju imati određenu vrijednost pull-down otpornika. Već smo rekli da taj otpornik mora biti što manje vrijednosti kako bi vrijeme reakcije senzora bilo brže. Izračunali smo da našu primjenu vrijednost otpornika ne bi smjela biti veća od 47 kΩ, no ako koristimo lasere, ta vrijednost može pasti i ispod 4 kΩ čime dobivamo i izuzetno brze senzore.




