{"id":24110,"date":"2026-05-07T17:21:01","date_gmt":"2026-05-07T16:21:01","guid":{"rendered":"https:\/\/www.crowave.com\/blog\/?p=24110"},"modified":"2026-05-07T17:21:01","modified_gmt":"2026-05-07T16:21:01","slug":"projekt-elektronicka-meta-software","status":"publish","type":"post","link":"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/","title":{"rendered":"Projekt elektroni\u010dka meta &#8211; Software"},"content":{"rendered":"<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_82_2 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Sadr\u017eaj stranice<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #81d742;color:#81d742\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #81d742;color:#81d742\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-1'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Tijek_razvoja_softvera_za_CPLD_i_MCU\" >Tijek razvoja softvera za CPLD i MCU<\/a><ul class='ez-toc-list-level-2' ><li class='ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Programiranje_CPLD-a\" >Programiranje CPLD-a<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Osnovne_upute_za_rad_sa_Quartus_programom\" >Osnovne upute za rad sa Quartus programom<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Programiranje_Verilog_koda_za_CPLD_MAX_II_EPM570\" >Programiranje Verilog koda za CPLD MAX II EPM570<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Arhitektura_Verilog_koda_za_elektronicku_metu\" >Arhitektura Verilog koda za elektroni\u010dku metu\u00a0<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Pozitivna_ili_negativna_senzorska_logika\" >Pozitivna ili negativna senzorska logika<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Optimizacija_upravljanja_RS_latchevima\" >Optimizacija upravljanja RS latchevima<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Optimizacija_koda_za_LoRa_Module\" >Optimizacija koda za LoRa Module<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Dvosmjerna_LoRa_komunikacija\" >Dvosmjerna LoRa komunikacija<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Odabir_GPIO_pinova_na_ESP32\" >Odabir GPIO pinova na ESP32<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Arduino_programi_za_ESP32\" >Arduino programi za ESP32<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prvi_testni_kodovi\" >Prvi testni kodovi<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prvi_kompletni_kodovi\" >Prvi kompletni kodovi<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#SPI_sabirnica\" >SPI sabirnica<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Daisy-Chain\" >Daisy-Chain<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Kontrolne_SPI_linije\" >Kontrolne SPI linije<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Signali_Alarma_Povratna_informacija\" >Signali Alarma (Povratna informacija)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Algoritam_prvog_koda_elektronicke_mete\" >Algoritam prvog koda elektroni\u010dke mete<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prva_PCB_i_prvi_testni_programi\" >Prva PCB i prvi testni programi<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Problem_Alarm_signala\" >Problem Alarm signala<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Konflikt_na_SPI_sabirnici\" >Konflikt na SPI sabirnici<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Opet_na_pocetak\" >Opet na po\u010detak<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Mali_pomak_na_bolje_pa_na_losije\" >Mali pomak na bolje, pa na lo\u0161ije<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-24\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Problem_je_bio_bizaran\" >Problem je bio bizaran<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-25\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prvo_realno_testiranje\" >Prvo realno testiranje<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n\n<p>&nbsp;<\/p>\n<hr \/>\n<h1><span class=\"ez-toc-section\" id=\"Tijek_razvoja_softvera_za_CPLD_i_MCU\"><\/span><strong>Tijek razvoja softvera za CPLD i MCU<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Programiranje_CPLD-a\"><\/span><strong>Programiranje CPLD-a<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Za programiranje EPM570 (kao i raznih drugih FPGA i CPLD \u010dipova) namijenjen je programski softver Quartus II (Intel Quartus Prime), a programski jezik za opis hardvera (HDL) zove se Verilog. Quartus II omogu\u0107uje cijeli proces razvoja FPGA, od pisanja koda i crtanja logi\u010dkih shema do simulacije, optimizacije i kona\u010dnog prebacivanja dizajna na hardver. Softver tako\u0111er uklju\u010duje alate za analizu i sintezu (pretvaranje koda u logi\u010dka vrata), analizu vremena (timing analysis) te programiranje samog ure\u0111aja.<\/p>\n<p>Za programiranje EPM570 morate kupiti i namjenski USB Blaster Programmer koji ko\u0161ta oko 3 eura. Ovaj programator se s jedne strane spaja na USB port ra\u010dunala, a s druge strane na 10-pinski JTAG konektor na razvojnoj plo\u010dici EPM570. Jednostavnije ne mo\u017ee biti.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/crowave.com\/blog\/wp-content\/uploads\/2025\/12\/meta_6_05.jpg\" rel=\"lightbox[23688]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-23779 size-full\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2025\/12\/meta_6_05.jpg\" alt=\"\" width=\"500\" height=\"482\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Verilog je kao \u0161to smo ve\u0107 spomenuli jezik za opis hardvera (HDL) koji se koristi za modeliranje i simulaciju elektroni\u010dkih 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\u0161anje hardvera, odnosno kako su \u017eice povezane i kako logi\u010dka vrata me\u0111usobno komuniciraju. U tipi\u010dnom 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\u010dki implementirao u FPGA\/CPLD \u010dip.<\/p>\n<p>Sve ovo na prvi pogled djeluje komplicirano, odnosno djeluje kao ne\u0161to \u010demu treba posvetiti ogromno vremena za u\u010denje. Me\u0111utim, jednostavno programiranje kao ovo za na\u0161 projekt u potpunosti mo\u017ee za vas odraditi AI. Uz pomo\u0107 AI meni su bila dovoljna 2-3 sata da nau\u010dim rad u Quartus II do dovoljne razine da konfiguriran I\/O pinove i programiram CPLD pomo\u0107u Verilog koda kojeg mi je u potpunosti generirala AI.<\/p>\n<p>Za programiranje svih onih diskretnih logi\u010dkih \u010dipova za svaki pojedina\u010dni senzor (Schmitt inverteri, RS Latchevi, multipleksori) treba napisati svega 30-tak linija Verilog koda. Osim toga, unutar CPLD tako\u0111er 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\u0107 to za njega neusporedivo br\u017ee radi sam CPLD i informacije prema ESP32 \u0161alje samo kada postoji neka promjena na senzorima.<\/p>\n<p>Ovime smo dobili izuzetno brz detektorski sustav kojeg \u0107emo u ESP32 u jednom dijelu morati i znatno usporiti jer bi jedna dijabola (zbog svog oblika) mogla izazvati nekoliko brzih detekcija.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Osnovne_upute_za_rad_sa_Quartus_programom\"><\/span><strong>Osnovne upute za rad sa Quartus programom<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_02.png\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24024\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_02.png\" alt=\"\" width=\"1365\" height=\"720\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_02.png 1365w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_02-768x405.png 768w\" sizes=\"auto, (max-width: 1365px) 100vw, 1365px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Su\u010delje programa Quartus za programiranje na\u0161eg CPLD-a EPM570. Evo kratkih uputa kako se vr\u0161i samo programiranje kad imate gotovu datoteku s programom (.pof):<\/p>\n<ul>\n<li>Kreiranje novog projekta (New Project)<\/li>\n<li>Odabir EPM570 ure\u0111aja u projektu (<strong>Assignments<\/strong> -&gt; <strong>Device)<\/strong>\n<ul>\n<li><strong>Family<\/strong> -&gt; <strong>MAX II<\/strong><\/li>\n<li><strong>Available devices -&gt; <\/strong><em>EPM570T100C5<\/em><\/li>\n<\/ul>\n<\/li>\n<li>Postavljanje USB Blastera u Programatoru<strong> (Tools<\/strong> -&gt; <strong>Programmer)<\/strong>\n<ul>\n<li><strong>Hardware Setup<\/strong><\/li>\n<li><em>Currently selected hardware<\/em> -&gt; <strong>USB-Blaster<\/strong><\/li>\n<li><strong>Auto Detect<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>Programiranje\n<ul>\n<li><strong>Add File -&gt; <\/strong><strong>odabir<\/strong> .pof datoteke<\/li>\n<li><strong>Program\/Configure -&gt; \u010dekiraj polje (ozna\u010di kva\u010dicu)<\/strong><\/li>\n<li><strong>Start<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Programiranje je dakle vrlo jednostavno i ne razlikuje se puno od programiranja u mnogim drugim sli\u010dnim programatorima. A sada evo jednostavnog vodi\u010da kako napraviti datoteku s programom (.pof) za EPM570T100C5 plo\u010dicu koriste\u0107i Verilog jezik, koji ste napisali sami ili uz pomo\u0107 AI:<\/p>\n<ul>\n<li>Izrada projekta u Quartusu<strong> (File<\/strong> -&gt; <strong>New Project Wizard)<\/strong>\n<ul>\n<li>Odredite mapu gdje \u0107e projekt biti spremljen i naziv projekta -&gt; <strong>Next<\/strong><\/li>\n<li><strong>Family &amp; Device Settings<\/strong>\n<ul>\n<li><strong>Family -&gt; <\/strong><strong>MAX II<\/strong><\/li>\n<li><strong>Available devices -&gt; <\/strong><em>EPM570T100C5<\/em><\/li>\n<\/ul>\n<\/li>\n<li><strong>Finish<\/strong><\/li>\n<\/ul>\n<\/li>\n<li>Pisanje koda\n<ul>\n<li><strong>File<\/strong> -&gt; <strong>New<\/strong> -&gt; <strong>Verilog HDL File <\/strong>(kreiranje datoteke sa programom)<\/li>\n<li>Nakon \u0161to je kod napisan (ili kopiran) datoteka se sprema (<strong>File -&gt; Save<\/strong>) pod istim nazivom kako je odabrano u nazivu projekta s time da \u0107e ekstenzija datoteke biti <strong>.v<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Vidimo da je i ovo posve jednostavno, no CPLD jo\u0161 uvijek ne zna na kojim I\/O pinovima je fizi\u010dki spojeni vanjski hardver. To mu morate re\u0107i:<\/p>\n<ul>\n<li>Dodjela pinova (Pin Planner)\n<ul>\n<li>Prvo se klikne na ikonu <strong>Start Compilation<\/strong> (ili pritisne Ctrl+L) da Quartus analizira kod<\/li>\n<li>Nakon \u0161to analiza uspje\u0161no zavr\u0161i, ide se na <strong>Assignments<\/strong> -&gt; <strong>Pin Planner<\/strong><\/li>\n<li>U donjoj tablici vidjet \u0107e se nazivi kojima treba odrediti I\/O pinove i ostale atribute poput ulaznog Schmitt trigera za senzorske pinove<\/li>\n<li>Nakon definiranja pinova Pin Planner se zatvara (automatski sprema unose) i ponovno se pokrene <strong>Start Compilation<\/strong><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_03.png\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24025\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_03.png\" alt=\"\" width=\"1365\" height=\"719\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_03.png 1365w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_03-768x405.png 768w\" sizes=\"auto, (max-width: 1365px) 100vw, 1365px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Nakon \u0161to imamo spremljenu programsku datoteku, programiranje se vr\u0161i kako smo opisali na po\u010detku:<\/p>\n<ul>\n<li>Spojite USB Blaster na PC i na JTAG konektor plo\u010dice. Uklju\u010dite napajanje plo\u010dice.<\/li>\n<li>Idite na Tools -&gt; Programmer.<\/li>\n<li>Provjerite pi\u0161e li gore desno USB-Blaster. Ako ne, kliknite Hardware Setup i odaberite ga.<\/li>\n<li>Kliknite Auto Detect. Trebao bi se pojaviti EPM570 na slici.<\/li>\n<li>Ako datoteka nije automatski u\u010ditana, kliknite na nju (ili Add File) i odaberite .pof datoteku iz mape output_files.<\/li>\n<li>Ozna\u010dite kva\u010dicu pod Program\/Configure i kliknite Start.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Napomena: Ako se bilo \u0161to mijenjate u programu ili Pin Planneru, morate ponovno pokrenuti kompilaciju (plava strelica Start Compilation \u00a0u glavnom prozoru Quartusa). Tek tada \u0107e te promjene biti upisane .pof datoteku koju \u0161aljete na \u010dip.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Programiranje_Verilog_koda_za_CPLD_MAX_II_EPM570\"><\/span><strong>Programiranje Verilog koda za CPLD MAX II EPM570<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Iako u osnovnim uputama za Quartus sve izgleda jednostavno, tijekom programiranja i definiranja pinova mo\u017ee se dogoditi niz gre\u0161aka i problema koje je onda potrebno sustavno rje\u0161avati. Tako je bilo i tijekom kreiranja programa za na\u0161u elektroni\u010dku metu. Program ima svoje \u201emu\u0161ice\u201c i neke radnje je potrebno vr\u0161iti po to\u010dno odre\u0111enom protokolu i hijerarhiji.<\/p>\n<p>U Verilogu i Quartusu, hijerarhija nije samo na\u010din organizacije koda, ve\u0107 temelj na\u010dina na koji softver vidi hardver. Stoga su mi se \u010desto doga\u0111ale frustriraju\u0107e situacije gdje prvi put neka naredba ili radnja prvi put pro\u0111e bez problema, a nakon modifikacija ili promjena u kodu (ili \u010dak kod izrade nove verzije programskog koda) iste naredbe vi\u0161e ne prolaze.<\/p>\n<p>Quartus uvijek tra\u017ei jedan Top-Level Entity. Ako napravite novi modul ili promijenite ime postoje\u0107eg, a niste ga u postavkama postavili kao &#8220;Top-Level&#8221; (Hierarchy -&gt; Set as Top-Level Entity), Quartus \u0107e uporno kompajlirati staru verziju ili javiti gre\u0161ku jer ne vidi put do va\u0161ih novih naredbi. Quartus poku\u0161ava u\u0161tedjeti vrijeme tako da ne kompajlira sve ispo\u010detka. Ako promijenite ne\u0161to duboko u hijerarhiji (npr. u nekom malom modulu koji se poziva unutar pet drugih), Quartus ponekad ne prepozna tu promjenu ispravno. Na primjer, ako dodate novu programsku datoteku u mapu projekta, ali ju ne dodate u &#8220;Files&#8221; listu unutar Quartusa, on \u0107e koristiti staru verziju datoteke koju jo\u0161 uvijek ima u memoriji, dok vi gledate u novi kod i pitate se za\u0161to nema promjena.<\/p>\n<p>Za razliku od klasi\u010dnog programiranja, u Verilogu svaki put kad pozovete modul, vi stvarate fizi\u010dku kopiju tog hardvera. Ako promijenite logiku unutar modula, to utje\u010de na svaki dio projekta gdje se taj modul koristi. Ako imate gre\u0161ku u hijerarhiji (npr. krivo spojene \u017eice\/portove izme\u0111u modula), program \u0107e mo\u017eda pro\u0107i analizu, ali \u0107e pasti na &#8220;Fitteru&#8221; (smje\u0161tanju na \u010dip) jer fizi\u010dki ne mo\u017ee povezati te dijelove.<\/p>\n<p>Iako je moj programski kod relativno jednostavan (da ne ka\u017eem malen) tijekom razvoja i testiranja radio sam dosta promjena i preinaka. Prvi put je sve pro\u0161lo \u201eod prve\u201c, a \u0161to sam vi\u0161e kasnije modificirao Verilog kod to sam i sve vi\u0161e vremena tro\u0161io na tra\u017eenje na\u010dina kako da Quartus i u potpunosti prihvati taj novi kod.<\/p>\n<p>Nakon \u0161to nekoliko desetaka puta izmijenite raspored pinova i promijenite osnovni Verilog kod, stvari po\u010dinju sjedati na mjesto i nau\u010dite kako i gdje najbolje raditi promjene tako da programiranje svaki puta pro\u0111e ispravno.<\/p>\n<p>Meni je Verilog kod 99% pisao AI, me\u0111utim, prvi kod posve sigurno nikad ne\u0107e raditi dobro. Bilo je potrebno nekoliko desetaka izmjena koda, a tako\u0111er i nekih izmjena na hardveru, kako bi dobio stabilan sustav detekcije.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Arhitektura_Verilog_koda_za_elektronicku_metu\"><\/span><strong>Arhitektura Verilog koda za elektroni\u010dku metu\u00a0<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Prvo sam radio program za kontrolu samo 64 senzora preko jednog EPM570 i ESP32, no na puno stvari se ipak trebalo gledati unaprijed, dakle za budu\u0107u kontrolu svih 128 (2&#215;64) senzora.<\/p>\n<p>Arhitektura prvog rje\u0161enja je bila slijede\u0107a:<\/p>\n<ul>\n<li>64 interna Schmitt triggera (<em>Assignment Editor -&gt; Input Termination -&gt; Schmitt Trigger<\/em>).<\/li>\n<li>64 RS Latcha (svaki ulaz ima svoj registar koji se postavlja na 1 \u010dim senzor okine)<\/li>\n<li>Reset linija (ESP32 \u0107e poslati jedan signal na EPM570 koji istovremeno bri\u0161e svih 64 latch-eva nakon \u010ditanja)<\/li>\n<li>SPI-like Protokol &#8211; Umjesto sporog I2C-a, koristi se jednostavan Shift Register (posmi\u010dni registar). ESP32 \u0107e slati &#8220;Clock&#8221; impulse, a EPM570 \u0107e izbacivati bit po bit (64 bita u nizu).<\/li>\n<\/ul>\n<p>EPM570 plo\u010dica ima dostupnih 72 I\/O pinova. 64 pina ide na senzore, 6 pinova je komunikacija sa ESP32, a 2 pina ostaju slobodna (kasnije \u0107emo iskoristiti jo\u0161 jedan pin za Alarm). Ru\u010dni unos 70 pina u Pin Planneru bi bio dugotrajan pa sam koristio Tcl skriptu koju mi je generirao AI (<em>View -&gt; Utility Windows -&gt; Tcl Console<\/em>). U\u010ditavanjem ove skripte svi pinovi se definiraju istog trenutka.<\/p>\n<p>Naravno, ne mo\u017eete puno toga provjeriti ako ne pi\u0161ete paralelno kodove za EPM570 i ESP32. Tako\u0111er, s obzirom da \u0107e se podaci be\u017ei\u010dno slati preko LoRa Modula (usko grlo), onda je ve\u0107 na samom po\u010detku potrebno razvijati kod tako da paketi podataka koji se \u0161alju budu \u0161to manji. Na ovo se ne mo\u017ee puno utjecati jer se mora slati 64\/128 bita podataka, me\u0111utim, sustav se mo\u017ee optimizirati tako da potreba za slanjem tih podataka bude minimalna, odnosno samo kad se dogodi neka promjena (kad metak aktivira zavjesu).<\/p>\n<p>Osnovna arhitektura sustava, kako smo i prikazali u uvodnoj objavi, izgleda ovako:<\/p>\n<ul>\n<li>Na Meti: EPM570 (detekcija) -&gt; ESP32 (obrada) -&gt; LoRa Modul (slanje)<\/li>\n<li>Kod Strijelca: LoRa Modul (Prijem) -&gt; ESP32 (obrada) -&gt; Elecrow CrowPanel 7.0&#8243; ESP32 Display (prikaz rezultata)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Pozitivna_ili_negativna_senzorska_logika\"><\/span><strong>Pozitivna ili negativna senzorska logika<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nakon \u0161to opisani sustav proradio, trebalo se kona\u010dno odlu\u010diti o senzorskoj logici, odnosno da li \u0107e aktivno stanje slati logi\u010dku nulu ili logi\u010dku jedinicu. Odlu\u010dio sam da senzori rade u negativnoj logici (1 = mirno, 0 = metak). Sve bi zapravo isto funkcioniralo i u suprotnoj logici, no ako se otpornici nalaze na masi (umjesto na plus polu napajanja) onda oni stalno dr\u017ee I\/O linije EPM570 na masi (pull-down) \u0161to doprinosi stabilnosti I\/O ulaza kad su laseri isklju\u010deni. U slu\u010daju pozitivne logike morali bi uklju\u010diti interne pull-up otpornike unutar EPM570 tako da pinove dr\u017ee u nekom odre\u0111enom stanju kad su senzori isklju\u010deni.<\/p>\n<p>Trebalo je dakle prilagoditi Verilog kod tako da reagira na padaju\u0107i brid, odnosno da detektira logi\u010dku nulu kao prolaz projektila. Me\u0111utim, postoji jo\u0161 jedan problem sa tom pozitivnom ili negativnom logikom, a to je odluka da li \u0107u koristiti interne Schmitt triggere ili ne. Uobi\u010dajeno bi ih bilo dobro koristiti ali kako smo ve\u0107 opisivali u objavi o senzorima, za male kalibre od 4,5 mm sigurnija detekcija bi bila bez Schmitt triggera (zbog ve\u0107eg naponskog praga promjene stanja u logi\u010dku nulu).<\/p>\n<p>Ako ne koristim interne Schmitt triggere (koji su tako\u0111er i inverteri) onda negativnu logiku sa senzora mogu promijeniti u pozitivnu kori\u0161tenjem <em>if<\/em> naredbe u Verilogu koja provjerava da li je senzor 0. Me\u0111utim, puno bolji je drugi na\u010din uz upotrebu internih invertera gdje se na samom po\u010detku invertira cijeli 128-bitni bus u pozitivnu logiku (1 = pogodak, 0 = mirno stanje) te interni RS latchevi rade dalje s \u010distom pozitivnom logikom. Ovo je bio tako\u0111er jedan od razloga za\u0161to sam se odlu\u010dio na pull-down senzorski otpornik jer sam svakako \u017eelio koristiti interne Schmitt triggere.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Optimizacija_upravljanja_RS_latchevima\"><\/span><strong>Optimizacija upravljanja RS latchevima<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Kad smo ve\u0107 spomenuli RS latcheve, kako \u0161to smo opisali u objavi o senzorima, oni slu\u017ee za ispravnu detekciju nepravilnih impulsa koje ostavlja projektil prolaze\u0107i kroz 4 svjetlosne zavjese (dvije horizontalno i dvije vertikalno). Oblik dijabole (pje\u0161\u010dani sat) i zra\u010dni vrtlozi iza nje mogu uzrokovati &#8220;titranje&#8221; signala (opti\u010dki bounce). Tako\u0111er, zbog dvije dvostruke zavjese s razmakom od 7,2 mm zna\u010di da \u0107e ista dijabola aktivirati senzore u najmanje dva vala.<\/p>\n<p>RS Latch pristup unutar EPM570 je savr\u0161eno rje\u0161enje za ovaj problem, me\u0111utim mora se implementirati na razini svakog pojedina\u010dnog bita. U Verilog kodu svaki od 128 senzora ima svoj neovisni RS latch:<\/p>\n<ul>\n<li>Prvi kontakt (glava dijabole): Senzor pada na 0, latch ska\u010de na 1 i ostaje na 1.<\/li>\n<li>Prolazak &#8220;struka&#8221; dijabole: Senzor se na trenutak vrati na 1 (svjetlo pro\u0111e), ali latch to ignorira jer je ve\u0107 &#8220;zaklju\u010dan&#8221;.<\/li>\n<li>Prolazak druge zavjese (7,2 mm kasnije): \u010cak i ako isti senzor ponovno padne na 0 zbog drugog reda zavjese, latch je ve\u0107 na 1 od prvog reda.<\/li>\n<\/ul>\n<p>EPM570 \u0107e dakle zabilje\u017eiti &#8220;sjenu&#8221; (siluetu) dijabole kao uniju svih pogo\u0111enih senzora u oba dvostruka reda, bez obzira na titranje signala. Me\u0111utim, ovdje moramo biti sigurni da je dijabola potpuno napustila sve zavjese prije nego \u0161to se RS latchevi resetiraju za \u010dekanje nove dijabole. Stoga je potrebno dodati softverski delay na ESP32 strani:<\/p>\n<ul>\n<li>Metak prolazi -&gt; EPM570 digne <em>trigger_alarm<\/em>.<\/li>\n<li>ESP32 detektira alarm -&gt; Odmah o\u010dita 128 bita (to traje &lt; 1ms).<\/li>\n<li>ESP32 \u0161alje podatke preko LoRa-e.<\/li>\n<li>Wait (100 ms): ESP32 \u010deka da metak fizi\u010dki napusti prostor mete, 100 ms je vi\u0161e nego dovoljno i za najsporije projektile, a s druge strane \u010dak ni rafalna paljba ne \u0161alje dva projektila za redom tom brzinom.<\/li>\n<li>Reset: ESP32 \u0161alje kratki impuls na <em>pinRESET<\/em>.<\/li>\n<\/ul>\n<p>U ESP32 je dakle dodan kod za \u010dekanje od 100 ms, a u Verilog je dodan kod koji osigurava da jednom postavljeni bit (pogodak) ne mo\u017ee biti poni\u0161ten ni\u010dim osim hardverskim resetom.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Optimizacija_koda_za_LoRa_Module\"><\/span><strong>Optimizacija koda za LoRa Module<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>S obzirom da LoRa Modul ne mo\u017ee slati podatke velikom brzinom i\u0161ao sam na novo rje\u0161enje. Meta ne\u0107e neprestano slati 128 bita podataka o stanju senzora, nego \u0107e podatke slati samo ako primijeti da je do\u0161lo do promjene u stanju senzora. Detekcija prolaska metka se dakle ne\u0107e vr\u0161iti na prijemnoj strani, nego ve\u0107 u elektronici same mete. Evo nove arhitekture:<\/p>\n<ul>\n<li>Strana mete: EPM570 (Brza detekcija): EPM570 neprestano skenira senzore (50 MHz). \u010cim se bilo koji bit promijeni iz 0 u 1, on podi\u017ee signal <em>trigger_alarm<\/em> prema ESP32.<\/li>\n<li>Strana mete: ESP32 \u010deka <em>trigger_alarm<\/em> i \u010dim on okine trenutno o\u010dita 64\/128 bita iz EPM570 preko SPI sabirnice. Tek tada \u0161alje taj 128-bitni paket preko LoRa-e prijemniku kod strijelca.<\/li>\n<li>Strana strijelca: ESP32 prima gotov rezultat pogodaka i iscrtava ga na 7&#8243; ekranu.<\/li>\n<\/ul>\n<p>Kad bi slali 128 bita podataka neprestano preko LoRa-e, zagu\u0161ili bi frekvenciju i tro\u0161iti bateriju, a postoji \u0161ansa da u trenutku prolaska metka LoRa modul upravo zavr\u0161ava slanje prethodnog (praznog) paketa i propusti trenutak pogotka. Budu\u0107i da LoRa sada \u0161alje samo stvarne pogotke, komunikacija je \u010dista, brza i nema ka\u0161njenja (latencije) uzrokovanog nepotrebnim slanjem nula.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Dvosmjerna_LoRa_komunikacija\"><\/span><strong>Dvosmjerna LoRa komunikacija<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Slijede\u0107a ideja bila je uvo\u0111enje dvosmjerne LoRa komunikacije za test provjere ispravnosti svih senzora. Prijemnik (CrowPanel) \u0161alje upit, a Predajnik (Meta) vra\u0107a trenutni 128-bitni status svih senzora. Evo kako bi trebala raditi ta funkcija &#8220;Provjera ispravnosti&#8221; za sve senzore.<\/p>\n<ul>\n<li>Na CrowPanelu se pritisne tipka &#8220;Test Mete&#8221;.<\/li>\n<li>LoRa (Strijelac -&gt; Meta) \u0161alje kratki paket <em>REQ_STATUS<\/em>.<\/li>\n<li>ESP32 (Meta) ne \u010dita latcheve (koji su mo\u017eda prazni), nego privremeno o\u010dita izravno stanje 128 pinova senzora i \u0161alje tih 128 bita natrag preko LoRa-e.<\/li>\n<li>Na CrowPanelu, ako se primi 128 jedinica (u binarnom obliku), sustav javlja &#8220;Meta OK&#8221;. Ako je neka nula, javlja &#8220;Senzor X u kvaru\/zasjenjen&#8221;.<\/li>\n<\/ul>\n<p>Da bi se podr\u017eao i &#8220;pogodak&#8221; i &#8220;provjera ispravnosti&#8221;, dodan je jo\u0161 jedan mod \u010ditanja u Shift Registar pomo\u0107u novog kontrolnog pina <em>mode_select<\/em>:<\/p>\n<ul>\n<li>mode_select = 0: load_data \/ kopira latcheve (pogodak)<\/li>\n<li>mode_select = 1: load_data \/ kopira trenutno stanje senzora (provjera)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Odabir_GPIO_pinova_na_ESP32\"><\/span><strong>Odabir GPIO pinova na ESP32<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>ESP32 razvojna plo\u010dica (DevKit) koju ja koristim (ESP32-WROOM-32D) ima na vanjske konektore izvedena ukupno 30 pina. Me\u0111utim, ne mogu se ba\u0161 svi GPIO pinovi koristiti kao ulazno\/izlazni pinovi bez ograni\u010denja. Neki od pinova su samo za napajanje i reset, neki od pinova su samo ulazni, a neki prilikom prvog pokretanja modula (uklju\u010divanja napajanja i u\u010ditavanja programa) moraju imati to\u010dno odre\u0111ena stanja (HIGH ili LOW). Ako su u krivom stanju dok se ESP32 pali, program se ne\u0107e pokrenuti ili \u0107e se ESP32 smrznuti, u\u0107i u beskona\u010dne petlje i sli\u010dno.<\/p>\n<p>Tako\u0111er, kod Arduina ESP32 kao i ATmega kontrolera postoje standardni (default) pinovi rezervirani za odre\u0111ene komunikacijske protokole. Kod klasi\u010dnih 8-bitnih ATmega kontrolera, hardverski moduli su fiksno vezani za odre\u0111ene pinove. Ako \u017eelite koristiti hardverski SPI ili I2C, morate koristiti ba\u0161 te pinove. ESP32 je mnogo fleksibilniji zahvaljuju\u0107i GPIO matrici koja omogu\u0107uje da se gotovo svaka hardverska funkcija dodijeli bilo kojem pinu. Ipak, postoje &#8220;uobi\u010dajeni&#8221; pinovi koji su tvorni\u010dki predefinirani.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_01.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24023\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_01.jpg\" alt=\"\" width=\"1186\" height=\"699\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_01.jpg 1186w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_01-768x453.jpg 768w\" sizes=\"auto, (max-width: 1186px) 100vw, 1186px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>S obzirom da imam vi\u0161e ESP32-WROOM-32D modula s kojima uobi\u010dajeno radim projekte, napravio sam si mali vodi\u010d prema kojem vidim koji su pinovi \u201esigurni\u201c za kori\u0161tenje, a koje treba izbjegavati ako imamo vi\u0161ka sigurnih pinova.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li><span style=\"color: #ff0000;\"><strong>GPIO 1 (TX0<\/strong> &#8211; Transmit) &#8211; Preko njega ESP32 \u0161alje podatke na Serial Monitor. Ovaj pin treba izbjegavati za drugo kori\u0161tenje.<\/span><\/li>\n<li><span style=\"color: #ff0000;\"><strong>GPIO 2<\/strong> \u2013 Kod po\u010detnog paljenja uvijek mora biti na LOW ili ostavljen nepovezan (standardni na\u010din rada i na\u010din programiranja). Ako je ovaj pin povu\u010den na HIGH tijekom paljenja, ESP32 \u0107e poku\u0161ati u\u0107i u nepostoje\u0107i mod rada ili \u0107e se &#8220;zamrznuti&#8221; i programski kod se uop\u0107e ne\u0107e pokrenuti. Obi\u010dno je na njega spojena ugra\u0111ena LED dioda.<\/span><\/li>\n<li><span style=\"color: #ff0000;\"><strong>GPIO 3 (RX0<\/strong> &#8211; Receive) &#8211; Preko njega ESP32 prima novi program s ra\u010dunala. Ovaj pin treba izbjegavati za drugo kori\u0161tenje.<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 4<\/strong> &#8211; Samostalan i stabilan pin op\u0107e namjene<\/span><\/li>\n<li><span style=\"color: #ff0000;\"><strong>GPIO 5<\/strong> &#8211; Kod po\u010detnog paljenja mora biti na HIGH (standardni na\u010din rada). Ako je ovaj pin povu\u010den na LOW tijekom paljenja, ESP32 poku\u0161ava u\u0107i u mod za &#8220;SDIO slave&#8221; (komunikacija s SD karticama na poseban na\u010din). To obi\u010dno uzrokuje da se ESP32 uop\u0107e ne pokrene ili u\u0111e u &#8220;boot loop&#8221;. Budu\u0107i da ovaj pin ima interni pull-up otpornik, on \u0107e sam oti\u0107i u HIGH, me\u0111utim treba paziti da ga spojeni izlaz ne povu\u010de na LOW.<\/span><\/li>\n<li><span style=\"color: #ff0000;\"><strong>GPIO 12<\/strong> &#8211; Kod po\u010detnog paljenja mora biti na LOW. Ako je <strong data-sfc-root=\"c\" data-sfc-cb=\"\" data-complete=\"true\">HIGH<\/strong> kod paljenja, mo\u017ee do\u0107i do problema s naponom flash memorije (poku\u0161at \u0107e raditi na 1,8V umjesto 3,3V), \u0161to \u0107e sprije\u010diti podizanje sustava.<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 13<\/strong> &#8211; samostalan pin op\u0107e namjene, dio JTAG su\u010delja za debugiranje<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 14<\/strong> &#8211; samostalan pin op\u0107e namjene<\/span><\/li>\n<li><span style=\"color: #ff0000;\"><strong>GPIO 15<\/strong> &#8211; Kod po\u010detnog paljenja mora biti na HIGH. \u0160alje debug poruke na Serial portu pri paljenju. Budu\u0107i da ovaj pin ima interni pull-up otpornik, on \u0107e sam oti\u0107i u HIGH, me\u0111utim treba paziti da ga spojeni izlaz ne povu\u010de na LOW. U tom slu\u010daju \u0107e se sprije\u010diti ispis na Serial monitoru, no obi\u010dno se normalan start ipak pokrene.<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 16<\/strong> &#8211; samostalan pin op\u0107e namjene, obi\u010dno se koristi za UART2, na WROOM-32U ili modulima s PSRAM-om su zauzeti (nisu dostupni)<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 17<\/strong> &#8211; samostalan pin op\u0107e namjene, obi\u010dno se koristi za UART2, na WROOM-32U ili modulima s PSRAM-om su zauzeti (nisu dostupni)<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 18<\/strong> &#8211; samostalan pin op\u0107e namjene, obi\u010dno se koristi za VSPI (SCK)<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 19<\/strong> &#8211; samostalan pin op\u0107e namjene, obi\u010dno se koristi za VSPI (MISO)<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 21<\/strong> &#8211; samostalan pin op\u0107e namjene, obi\u010dno se koristi za I2C (SDA)<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 22<\/strong> &#8211; samostalan pin op\u0107e namjene, obi\u010dno se koristi za I2C (SCL)<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 23<\/strong> &#8211; samostalan pin op\u0107e namjene, obi\u010dno se koristi za VSPI (MOSI)<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 25<\/strong> &#8211; samostalan pin op\u0107e namjene, podr\u017eava DAC1<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 26<\/strong> &#8211; samostalan pin op\u0107e namjene, podr\u017eava DAC2<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 27<\/strong> &#8211; samostalan pin op\u0107e namjene<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 32<\/strong> &#8211; samostalan pin op\u0107e namjene, podr\u017eava ADC1<\/span><\/li>\n<li><span style=\"color: #00ff00;\"><strong>GPIO 33<\/strong> &#8211; samostalan pin op\u0107e namjene, podr\u017eava ADC1<\/span><\/li>\n<li><span style=\"color: #00ffff;\"><strong>GPIO 34<\/strong> &#8211; Isklju\u010divo ulazni pin (nema interni pull-up otpornik i ne mo\u017ee biti izlaz), podr\u017eava ADC1<\/span><\/li>\n<li><span style=\"color: #00ffff;\"><strong>GPIO 35<\/strong> &#8211; Isklju\u010divo ulazni pin (nema interni pull-up otpornik i ne mo\u017ee biti izlaz), podr\u017eava ADC1<\/span><\/li>\n<li><span style=\"color: #00ffff;\"><strong>GPIO 36 (VP &#8211; <\/strong>Voltage Positive<strong>) &#8211; <\/strong>Isklju\u010divo ulazni pin. Pin povezan s <strong data-sfc-root=\"c\" data-sfc-cb=\"\" data-complete=\"true\" data-processed=\"true\">ADC1<\/strong> (najstabilnijim analognim digitalnim pretvara\u010dem) i \u010desto se koristi za senzore vrlo slabog signala. Pin je povezan na pozitivni ulaz internog poja\u010dala niskog \u0161uma (Low Noise Amplifier &#8211; LNA).<\/span><\/li>\n<li><span style=\"color: #00ffff;\"><strong>GPIO 39 (VN<\/strong> &#8211; Voltage Negative) &#8211; Isklju\u010divo ulazni pin. On je povezan na negativni ulaz istog poja\u010dala kao GPIO 36.<\/span><\/li>\n<li><span style=\"color: #ffcc00;\">EN (Enable \/ Reset) \u2013 Ovaj pin nije GPIO nego Reset pin za upravljanje radom cijelog \u010dipa. Interno je povu\u010den na &#8220;HIGH&#8221; (3,3V) kako bi \u010dip radio. Ako se kratko spoji na GND (LOW), ESP32 \u0107e se ponovno pokrenuti (restartati).<\/span><\/li>\n<li><span style=\"color: #ffcc00;\">VIN &#8211; napajanje 5 V (ulaz internog regulatora 3,3 V)<\/span><\/li>\n<li><span style=\"color: #ffcc00;\">3V3 &#8211; napajanje 3,3 V (izlaz internog regulatora 3,3 V)<\/span><\/li>\n<li><span style=\"color: #ffcc00;\">GND &#8211; zajedni\u010dka masa<\/span><\/li>\n<\/ul>\n<p>GPIO pinovi: 0, 2, 4, 12, 13, 14, 15, 25, 26, 27 se mogu koristiti za ADC2 ulaze ali samo ako se ne koristi Wi-Fi (ina\u010de ne rade pouzdano). GPIO pinovi: GPIO 0, 2, 4, 12, 13, 14, 15, 25, 26, 27, 32, 33, 34, 35 podr\u017eavaju RTC (Real-Time Clock \/ Deep Sleep). Ovi pinovi su povezani s &#8220;Low Power&#8221; koprocesorom i mogu probuditi ESP32 iz Deep Sleep moda ili raditi dok je glavni procesor isklju\u010den. GPIO pinovi: 34 i 35 su odli\u010dni za analogne senzore jer su samo ulazni i nemaju interne smetnje od izlaznih krugova. Ina\u010de je za signale koji su samo ulazni dobro koristiti isklju\u010divo ulazne pinove (34, 35, 36, 39) jer su stabilniji od ulazno\/izlaznih pinova.<\/p>\n<p>Za elektroni\u010dku metu GPIO pinove sam definirao na slijede\u0107i na\u010din:<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_05.gif\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24027\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_05.gif\" alt=\"\" width=\"783\" height=\"343\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_05.gif 783w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_05-768x336.gif 768w\" sizes=\"auto, (max-width: 783px) 100vw, 783px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2><\/h2>\n<h2><span class=\"ez-toc-section\" id=\"Arduino_programi_za_ESP32\"><\/span><strong>Arduino programi za ESP32<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Ve\u0107 smo vidjeli kod razvoja Verilog koda da nije mogu\u0107e potpuno odvojeno programiranje EPM570 modula i ESP32 modula za stranu mete (predajnik) i stranu strijelca (prijemnik). Sustavi moraju me\u0111usobno komunicirati te se moraju i paralelno razvijati.<\/p>\n<p>AI je kreirala prve programske kodove za EPM570 i ESP32 prema mojim zahtjevima. Odmah je implementirano i be\u017ei\u010dno slanje preko LoRa modula. Arduino kodovi za oba ESP32 imaju Debug logove i Serial print naredbe kako bi se mogao provjeriti rad programa jer nije realno o\u010dekivati da \u0107e sve proraditi od prve.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Prvi_testni_kodovi\"><\/span><strong>Prvi testni kodovi<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Prvi kodovi su uklju\u010divali samo komunikaciju izme\u0111u jednog EPM570 CPLD-a i jednog ESP32. Nakon malo dora\u0111ivanja, komunikacija je proradila i to je svakako bio razlog za optimizam. Me\u0111utim, u toj fazi svjetlosna zavjesa jo\u0161 uvijek nije bila kompletirana. Mogao sam raditi samo simulaciju okidanja senzora, a i to se moglo izvesti samo probno, na nekoliko senzora. Jednostavno je nemogu\u0107e \u201eu zraku\u201c stabilno povezivati i simulirati sve 64 senzorske linije. Brzina CPLD-a je 50 MHz i bilo kakve nepotrebno duge \u017eice, parazitski kapaciteti i sli\u010dne pojave mogu izazvati la\u017ena i nasumi\u010dna okidanja. Kod ovakvih sustava, testiranje koje mo\u017eete napraviti na testnim plo\u010dicama i sa priru\u010dnim napajanjima su vrlo ograni\u010dena.<\/p>\n<p>Prvi testovi su poslu\u017eili samo kao zeleno svjetlo za izradu profesionalne tiskane plo\u010dice koja \u0107e elektri\u010dki uredno povezati oba CPLD-a, ESP32 i Lo-Ra modul. Tek tada se mo\u017ee i\u0107i u pro\u0161irivanje programskih kodova i vr\u0161enje testova \u010ditavog sustava.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Prvi_kompletni_kodovi\"><\/span><strong>Prvi kompletni kodovi<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Elektroni\u010dka meta je prili\u010dno slo\u017een projekt gdje je potrebno paralelno razvijati i stalno me\u0111usobno prilago\u0111avati pojedine hardverske i softverske dijelove. Sam sistem lasera i foto-senzora je sustav kod kojeg treba rje\u0161avati niz prakti\u010dnih problema. To su problemi svjetlosnih polusjena koji mogu dovesti do nedovoljnog pada napona za promjenu logi\u010dkog stanja, problemi temperaturne ovisnosti i drugih nestabilnosti ja\u010dine zra\u010denja lasera, problemi same geometrije svjetlosnih linija \u00a0i tako dalje. Neke problemi se mogu rije\u0161iti ili barem ubla\u017eiti softverski, neke probleme je treba rje\u0161avati isklju\u010divo hardverski.<\/p>\n<p>Zbog visoke frekvencije rada detektorskog sustava potrebno je izraditi kvalitetne tiskane plo\u010dice, a njih nije ba\u0161 tako jednostavno i jeftino mijenjati kako se nai\u0111e na neki problem. Stoga je puno stvari treba predvidjeti unaprijed, a ako negdje postoje dvojbe, onda svakako treba ostaviti prostora i osmisliti plo\u010dice za \u0161to lak\u0161u prenamjenu i mogu\u0107nost testiranja \u0161to vi\u0161e mogu\u0107nosti.<\/p>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"SPI_sabirnica\"><\/span><strong>SPI sabirnica<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Osnovno je naravno bilo definirati pinove koje \u0107emo koristiti na EPM570 i ESP32 ali i ostaviti prostora za pro\u0161irenje ili preinaku dizajna.<\/p>\n<p>U prvoj ina\u010dici programa sva \u010detiri modula na meti (LoRa, ESP32 i oba CPLD-a) dijele tri osnovne linije za SPI sabirnicu:<\/p>\n<ul>\n<li>ESP32 GPIO 18 (SCK) ide na LoRa SCK i na oba EPM570 PIN 96<\/li>\n<li>ESP32 GPIO 19 (MISO) ide na LoRa MISO I na EPM570-Y PIN 95 (izlaz zadnjeg u nizu)<\/li>\n<li>ESP32 GPIO 13 (MOSI) ide na LoRa MOSI I na EPM570-X PIN 1 (ulaz prvog u nizu)<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Daisy-Chain\"><\/span><strong>Daisy-Chain<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Prva ideja je bila povezati dva EPM570 u Daisy-chain kako bi zajedno radili kao jedan niz od 128 bita (kao jedan modul).<\/p>\n<p>Daisy-Chain izme\u0111u dva EPM570 je ostvaren preko pinova 1 i 95: EPM570-X PIN 95 (Izlaz) spaja se na EPM570-Y PIN 1 (Ulaz). Ovime ESP32 \u0161alje podatke u EPM570-X, EPM570-X ih proslje\u0111uje u EPM570-Y, a EPM570-Y ih vra\u0107a u ESP32.<\/p>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Kontrolne_SPI_linije\"><\/span><strong>Kontrolne SPI linije<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>S obzirom da na istu SPI sabirnicu ESP32 imamo spojena dva ure\u0111aja (EPM570 i Lo-Ra), moramo uvesti kontrolne linije (selektore) preko kojih \u0107e ESP32 odre\u0111ivati s kime kada komunicira:<\/p>\n<ul>\n<li>ESP32 GPIO 27 ide na LoRa CS. Kad je LOW, ESP32 komunicira sa LoRa modulom.<\/li>\n<li>ESP32 GPIO 5 ide na oba EPM570 PIN 97 (Load). Kad se po\u0161alje impuls oba EPM570 &#8220;uslikaju&#8221; stanje senzora u shift registre.<\/li>\n<li>ESP32 GPIO 17 ide na oba EPM570 PIN 98 (Reset). Kad se po\u0161alje impuls oba EPM570 bri\u0161u sve pogotke\/latcheve.<\/li>\n<\/ul>\n<p><strong>\u00a0<\/strong><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Signali_Alarma_Povratna_informacija\"><\/span><strong>Signali Alarma (Povratna informacija)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Ve\u0107 smo rekli da zbog Lo-Ra modula ESP32 ne\u0107e slati podatke o stanju senzora neprekidno ve\u0107 samo kada se dogodi neka promjena (preleti metak). \u0160tovi\u0161e, ni EPM570 ne\u0107e slati stalno podatke na ESP32 da se bespotrebno ne zagu\u0161uje SPI sabirnica, ve\u0107 samo kad se dogodi neka promjena.<\/p>\n<p>Stoga smo predvidjeli slobodne pinove 100 na modulima EPM570 koji \u0161alju signal Alarma prema ESP32 samo kad se detektira pogodak u metu.<\/p>\n<p>U kasnijoj verziji sam se odlu\u010dio razdvojiti Alarm linije tako da ESP32 vidi koji mu je to\u010dno EPM570 poslao Alarm. To \u0107e omogu\u0107iti bolju dijagnostiku ukoliko se dogodi da metak aktivira jednu zavjesu (npr. X), a nekako se ne detektiran provu\u010de se kroz drugu (Y). U takvom slu\u010daju \u0107e na displeju biti iscrtana horizontalna ili vertikalna crta, odnosno biti \u0107e prikazana barem ta jedna os detekcije.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Algoritam_prvog_koda_elektronicke_mete\"><\/span><strong>Algoritam prvog koda elektroni\u010dke mete<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>Metak sije\u010de zraku te EPM570 X i Y podi\u017eu ALARM (GPIO 34 i 35) na visoki nivo.<\/li>\n<li>ESP32 to vidi, spusti LOAD (GPIO 5) da &#8220;zamrzne&#8221; stanje 128 senzora.<\/li>\n<li>ESP32 pro\u010dita 16 bajtova preko SPI-ja (prvih 8 je X, drugih 8 je Y).<\/li>\n<li>ESP32 po\u0161alje podatke preko LoRa modula (koriste\u0107i isti SPI, ali uz CS LoRa pin).<\/li>\n<li>ESP32 po\u0161alje RESET (GPIO 17) i meta je spremna za novi metak.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2><\/h2>\n<h2><span class=\"ez-toc-section\" id=\"Prva_PCB_i_prvi_testni_programi\"><\/span><strong>Prva PCB i prvi testni programi<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Sa ovom po\u010detnom arhitekturom mogao sam izraditi prve tiskane plo\u010dice (PCB) za EPM570, ESP32 i Lo-Ra modul.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_15.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24120\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_15.jpg\" alt=\"\" width=\"1300\" height=\"328\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_15.jpg 1300w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_15-768x194.jpg 768w\" sizes=\"auto, (max-width: 1300px) 100vw, 1300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_16.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24121\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_16.jpg\" alt=\"\" width=\"1300\" height=\"320\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_16.jpg 1300w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_16-768x189.jpg 768w\" sizes=\"auto, (max-width: 1300px) 100vw, 1300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_17.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24122\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_17.jpg\" alt=\"\" width=\"1300\" height=\"391\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_17.jpg 1300w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_17-768x231.jpg 768w\" sizes=\"auto, (max-width: 1300px) 100vw, 1300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>U ovoj fazi za testiranje koristim stvarnu be\u017ei\u010dnu Lo-Ra vezu izme\u0111u dva ESP32, no prijemni ESP32 (strana strijelca) je i dalje na Arduino Serial monitoru.<\/p>\n<p>Prvi testni programi su pokazivali niz problema sa stabilno\u0161\u0107u detekcije stanja svih 128 senzora. Bilo je puno la\u017enih i nepotpunih detekcija, onda bi se detekcije stabilizirale ali X i Y osi nisu radile sinkronizirano. Sama laserska zavjesa je radila dobro, osim \u0161to je jedan laser bio neispravan. Zato sam prvo \u017eelio uvesti mogu\u0107nost \u201emaskiranja\u201c neispravne opti\u010dke linije jer je to uvijek mogu\u0107 scenarij i u praksi.<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Problem_Alarm_signala\"><\/span><strong>Problem Alarm signala<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>U po\u010detnom EPM570 kodu logika ALARM signala je radila &#8220;wired-OR&#8221;. Ako bilo koji od 128 senzora ne radi (daje logi\u010dku 0 jer je laser pomaknut, prljav ili pregorio), RS-latch za taj kanal \u0107e se okinuti, a CPLD \u0107e dr\u017eati ALARM liniju visokom. Budu\u0107i da je ALARM stalno HIGH, ESP32 &#8220;misli&#8221; da se stalno doga\u0111a pogodak ili ostaje zaglavljen u petlji.<\/p>\n<p>Stoga je u EPM570 dodan kod za maskiranje neispravnih senzora, odnosno mogu\u0107nost da EPM570 ignorira senzore koji nisu osvijetljeni pri po\u010detnoj inicijalizaciji. Umjesto jednostavnog OR-a svih senzora, ALARM bi se trebao aktivirati samo na prijelaz iz 1 u 0, i to samo za kanale koji su prethodno bili &#8220;zdravi&#8221;.<\/p>\n<p>U ESP32 kod je tako\u0111er ugra\u0111ena inicijalizacijska sekvenca. ESP32 prvo mora okinuti RESET na EPM570, pri\u010dekati par milisekundi da se optika smiri, a tek onda po\u010deti pratiti ALARM.<\/p>\n<p>Nekoliko desetaka Verilog i Arduino kodova usmjerenih na ovaj problem nije uspjelo rije\u0161iti problem nestabilnih i la\u017enih detekcija. Sumnja je pala na mogu\u0107i konflikt na SPI sabirnici.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Konflikt_na_SPI_sabirnici\"><\/span><strong>Konflikt na SPI sabirnici<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Budu\u0107i da CPLD nema svoj CS (Chip Select) pin, on &#8220;slu\u0161a&#8221; i &#8220;odgovara&#8221; na svaku SPI komunikaciju, uklju\u010duju\u0107i i onu namijenjenu LoRa modulu. Kada LoRa zavr\u0161i slanje, on komunicira preko SPI-ja. CPLD to vidi kao clock signale i &#8220;ispuca&#8221; svoje podatke ili sme\u0107e u shift registre, \u0161to mo\u017ee uzrokovati da ALARM ostane aktivan (HIGH).<\/p>\n<p>Modifikacijom koda se osiguralo da ESP32 ne reagira na ALARM dok god traje LoRa sesija i odmah nakon nje.<\/p>\n<p>Ovo i dalje nije rije\u0161ilo problem nestabilnih (random) i la\u017enih detekcija.<\/p>\n<p>AI je sugerirao na lo\u0161e o\u017ei\u010denje i samooscilacije sustava, predlagao je pull-down otpornike i filtre na SPI linijama. Me\u0111utim, imam puno iskustva u VF tehnici i znam da sam dizajnirao plo\u010dice i napravio o\u017ei\u010denja po svim standardima. Provjerio sam osciloskopom signale na SPI linijama i digitalni signali su bili prakti\u010dno savr\u0161eni (\u010disti pravokutni signali o\u0161trih bridova, bez istitravanja i drugih \u0161umova). AI je dalje predlagala zamjenu redoslijeda senzora, \u0161to je besmisleno i sigurno ne\u0107e rije\u0161iti problem. Prijedlozi su bili i EMI izolacija LoRa modula koji vjerojatno unosi smetnje u EPM570, me\u0111utim, moja mjerenja analizatorom spektra su pokazala \u010dist signal bez izra\u017eenih EMI smetnji iz LoRa modula.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Opet_na_pocetak\"><\/span><strong>Opet na po\u010detak<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>S obzirom da AI izmjene kodova nisu davala nikakva pobolj\u0161anja, krenuo sam sa kodovima ispo\u010detka. Prvo samo jednostavno snimanje stanja senzora na TX ESP32 bez LoRa komunikacije. Za ovaj test je izba\u010dena ALARM logika i fokus je bio na to da EPM570 radi kao obi\u010dni skener ulaza, koji svaku sekundu \u0161alje sliku svih 128 senzora.<\/p>\n<p>\u010citanje je prolazilo \u201eu paketima\u201c, odnosno uredno bi se i\u0161\u010ditao niz od nekoliko senzora, zatim nekoliko senzora prolazi bez detekcije, pa se opet nastavlja niz urednog \u010ditanja nekoliko senzora. Kako da ne\u0161to stvara svojevrsne prekide ili pomake u \u010ditanju senzora.<\/p>\n<p>AI ponovno ukazuje na mogu\u0107e smetnje i inducirane \u0161umove na SPI linijama, preduga\u010dke tiskane veze i sli\u010dne hardverske probleme. Meni je ovo lako izmjeriti i to definitivno nije problem. AI dalje smatra da dolazi do konflikta sa LoRa modulom, me\u0111utim, on je isklju\u010den. Sugerira dodavanje logi\u010dkih vrata na SPI linije kako se bolje razdvojile komunikacije ESP32 sa EPM570 i LoRa.<\/p>\n<p>Ne \u017eelim raditi nepotrebne hardverske zahvate jer vidim na osciloskopu da su digitalni signali sami po sebi \u010disti i da dolaze u paketima kako i treba za ESP sabirnicu. Tra\u017eim od AI da softverski maksimalno uspori sve procese \u010ditanja i detekcije, te da maksimalno minimalizira sve linije kodova koje nisu nu\u017eno potrebne za obi\u010dno \u010ditanje stanja senzora.<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Mali_pomak_na_bolje_pa_na_losije\"><\/span><strong>Mali pomak na bolje, pa na lo\u0161ije<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nakon usporavanja \u010ditavog sustava i novih ESP32 i EPM570 kodova detekcija radi ispravno, me\u0111utim, radi samo jednom nakon Reseta, a potom dalje vi\u0161e ne radi. Sve sugerira da je problem u RS latch logici unutar EPM570 ili u na\u010dinu na koji se podaci prebacuju iz latcha u shift registar, dakle u osnovnom Verilog kodu. Mogu\u0107 je i nedostatak sinkronizacije u smislu da se latchevi unutar EPM570 aktiviraju na 50MHz, a \u010ditanje je sada na sporom SPI clocku.<\/p>\n<p>AI je izmijenila Verilog kod tako da linija Load istovremeno puni shift registar i resetira latcheve za idu\u0107i ciklus. To bi trebalo rije\u0161iti problem sinkronizacije.<\/p>\n<p>Nakon ovoga, detekcija se opet posve pokvarila te nije radila ni ono jednom nakon Reseta. AI novim kodom poku\u0161ava stvoriti jo\u0161 \u201esigurniju\u201c arhitekturu tako da potpuno razdvaja 50 MHz domenu (detekcija) od SPI domene (prijenos). LOAD signal \u0107e samo jednom &#8220;okinuti&#8221; prijenos iz latcheva u shift registar, ali ne\u0107e automatski brisati latcheve (to \u0107e raditi ru\u010dno preko pinRESET).<\/p>\n<p>Sada dobivam podatke u gotovo svakom \u010ditanju, me\u0111utim oni su i dalje &#8220;potrgani&#8221;, razbacani i posve ne sinkronizirani.<\/p>\n<p>AI opet predla\u017ee pull-up otpornike na SPI linijama, stabiliziranje napajanja, dodavanje kondenzatora, filtara i feritnih prstena, optimizaciju o\u017ei\u010denja, zvjezdasto spajanje masa hardvera elektroni\u010dke mete i PC-a na kojem imam Arduino, magnetske izolatore za SPI lije i sli\u010dne hardverske zahvate. U svoj hardver sam bio siguran, no ipak sam probao sam pull-up otpornicima. To nije popravilo stanje.<\/p>\n<p>U slijede\u0107im kodovima AI poku\u0161ava popraviti nedostatak sinkronizacije LOAD i SPI u vo\u0111enjem \u201ehard reseta\u201c, preciznih tajminga i dodatnih shift funkcija koje bi trebale &#8220;zaklju\u010dati&#8221; X i Y linije na njihova mjesta. Mijenja Master-Slave SPI logiku, Load signal definira kao &#8220;Master Sync&#8221; koji prisilno resetira shift registre u oba EPM570 na po\u010detnu poziciju (bit 0) prije svakog \u010ditanja. Definira se promjena stanje izlaznog pina na padaju\u0107u ivicu clocka kako bi podatak bio &#8220;miran&#8221; i spreman kada ga ESP32 poku\u0161a pro\u010ditati na uzlaznu ivicu. Onda se pre\u0161lo na &#8220;Bit-Banging&#8221; metodu gdje se svakim taktom clocka (SCK) upravlja \u201eru\u010dno\u201c, \u010dime bi se trebali eliminirati problemi s faznim pomakom, SPI modovima i Daisy-chain ka\u0161njenjem. Sve ovo (i mnogi drugi) su bili poku\u0161aji \u010dime bi se trebao rije\u0161iti problem &#8220;\u0161etanja&#8221;, &#8220;trganja&#8221; i lo\u0161e sinkronizacije podataka.<\/p>\n<p>Rezultati promjena bi nekad bili bolji, nekad lo\u0161iji, no ni jednom zadovoljavaju\u0107e stabilni.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Problem_je_bio_bizaran\"><\/span><strong>Problem je bio bizaran<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nakon vjerojatno 50-tak promjena kodova, snimanja signala, mjerenja \u0161umova, provjeravanja LoRa modula, pull-up otpornika i niza raznih ideja, ispalo je da je cijelo vrijeme problem u krivo iniciranom pinu za liniju Load. Umjesto pinLOAD = 4, u kodu za ESP32 (meta) cijelo vrijeme je stajalo pinLOAD = 5.<\/p>\n<p>Vratio sam se na po\u010detak i uvjerio se da sam dao to\u010dne rasporede pinova, \u0161tovi\u0161e i moj po\u010detni program ima uredno definiran pinLOAD = 4. Prvi kod koji je AI izbacio ve\u0107 je imao pogre\u0161nu inicijaciju pina LOAD. Nije mi palo na pamet to provjeravati. Kasnije sam uglavnom samo mijenjao \u201evoid loop\u201c funkciju i uop\u0107e nisam obra\u0107ao pa\u017enju na \u201econst int\u201c konstante.<\/p>\n<p>\u010cim sam promijenio pinLOAD = 4, \u010ditanje svih 128 senzora se odvijalo savr\u0161eno, bez ijedne gre\u0161ke. Eko komentara AI na taj previd: \u201eIsprika na previdu, vjerojatno sam u nekom od prethodnih primjera pomije\u0161ao pinove. Ako je tvoj LOAD fizi\u010dki spojen na GPIO 4, to je sasvim u redu i nema potrebe za mijenjanjem o\u017ei\u010denja za taj pin.\u201c<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Prvo_realno_testiranje\"><\/span><strong>Prvo realno testiranje<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>O\u010dito da \u0107e ove \u201eizmasakrirane\u201c podatke sada jo\u0161 trebati dora\u0111ivati da se iz njih izvu\u010de maksimum, no napravio sam prvo \u201esobno\u201c testiranje detekcije sa zra\u010dnim pi\u0161toljima na dijabole 4,5 mm i kuglice 6 mm.<\/p>\n<p>O\u010dekivano, dijabole od 4,5 mm u cca 40% slu\u010daja ne prekinu obje zavjese, odnosno dijabola se provu\u010de izme\u0111u dvije laserske zrake bez da ih dovoljno zakloni. Kuglice od 6 mm imaju detekciju od 100%, a vjerujem da bi tako bilo i za kalibar 5,5 mm.<\/p>\n<p>Sada ve\u0107 imam ideju kako pobolj\u0161ati svjetlosnu zavjesu tako da detektira kalibar 4,5 mm, no ako u tome i ne uspijem, ovo je ipak \u201elong range\u201c meta predvi\u0111ena za kalibre 5,5 mm i ve\u0107e.<\/p>\n<p>U svakom slu\u010daju, kad se oporavim od ovih programiranja, idem na optimizaciju koda i nadogradnju sa dodatnim funkcijama. To \u0107e u prvom redu biti slanje stanja baterija, a zatim i meteorolo\u0161kih podataka te podataka o brzini projektila na meti. Kad uspijem termi\u010dki stabilizirati lasere, onda se kod pro\u0161iruje na automatsku kalibraciju, detekciju kvara i sli\u010dno.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_01.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24117\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_01.jpg\" alt=\"\" width=\"1300\" height=\"1710\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_01.jpg 1300w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_01-768x1010.jpg 768w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_01-1168x1536.jpg 1168w\" sizes=\"auto, (max-width: 1300px) 100vw, 1300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_13.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24118\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_13.jpg\" alt=\"\" width=\"1300\" height=\"911\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_13.jpg 1300w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_13-768x538.jpg 768w\" sizes=\"auto, (max-width: 1300px) 100vw, 1300px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_14.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24119\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_14.jpg\" alt=\"\" width=\"1300\" height=\"748\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_14.jpg 1300w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_82_14-768x442.jpg 768w\" sizes=\"auto, (max-width: 1300px) 100vw, 1300px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<div id=\"s3gt_translate_tooltip_mini\" class=\"s3gt_translate_tooltip_mini_box\" style=\"background: initial !important; border: initial !important; border-radius: initial !important; border-spacing: initial !important; border-collapse: initial !important; direction: ltr !important; flex-direction: initial !important; font-weight: initial !important; height: initial !important; letter-spacing: initial !important; min-width: initial !important; max-width: initial !important; min-height: initial !important; max-height: initial !important; margin: auto !important; outline: initial !important; padding: initial !important; position: absolute; table-layout: initial !important; text-align: initial !important; text-shadow: initial !important; width: initial !important; word-break: initial !important; word-spacing: initial !important; overflow-wrap: initial !important; box-sizing: initial !important; display: initial !important; color: inherit !important; font-size: 13px !important; font-family: X-LocaleSpecific, sans-serif, Tahoma, Helvetica !important; line-height: 13px !important; vertical-align: top !important; white-space: inherit !important; left: 547px; top: 1684px;\">\n<div id=\"s3gt_translate_tooltip_mini_logo\" class=\"s3gt_translate_tooltip_mini\" title=\"Translate selected text\"><\/div>\n<div id=\"s3gt_translate_tooltip_mini_sound\" class=\"s3gt_translate_tooltip_mini\" title=\"Play\"><\/div>\n<div id=\"s3gt_translate_tooltip_mini_copy\" class=\"s3gt_translate_tooltip_mini\" title=\"Copy text to Clipboard\"><\/div>\n<style type=\"text\/css\" media=\"print\">#s3gt_translate_tooltip_mini { display: none !important; }<\/style>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; &nbsp; &nbsp; Tijek razvoja softvera za CPLD i MCU &nbsp; Programiranje CPLD-a Za programiranje EPM570 (kao i raznih drugih FPGA i CPLD \u010dipova) namijenjen je programski softver Quartus II (Intel Quartus Prime), a programski jezik za opis hardvera (HDL) zove se Verilog. Quartus II omogu\u0107uje cijeli proces razvoja FPGA, od pisanja koda i crtanja [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-24110","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-nekategorizirano","7":"czr-hentry"},"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/posts\/24110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/comments?post=24110"}],"version-history":[{"count":6,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/posts\/24110\/revisions"}],"predecessor-version":[{"id":24123,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/posts\/24110\/revisions\/24123"}],"wp:attachment":[{"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/media?parent=24110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/categories?post=24110"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/tags?post=24110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}