{"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-06-21T15:06:39","modified_gmt":"2026-06-21T14:06:39","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\/#Raspored_funkcija\" >Raspored funkcija<\/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\/#Sto_se_vrsi_na_CPLD-ovima_brzi_hardverski_nivo_reda_ns\" >\u0160to se vr\u0161i na CPLD-ovima (brzi hardverski nivo, reda ns)<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Brzo_%E2%80%9Chvatanje%E2%80%9D_i_trajno_zakljucavanje_pogotka_sjene\" >Brzo &#8220;hvatanje&#8221; i trajno zaklju\u010davanje pogotka (sjene)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Automatska_selekcija_geometrijske_plohe_START_okidac_za_mjerenje_brzine_projektila\" >Automatska selekcija geometrijske plohe (START okida\u010d) za mjerenje brzine projektila<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Kronometar_visoke_rezolucije_mjerenje_vremena_leta\" >Kronometar visoke rezolucije (mjerenje vremena leta)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Paralelno-serijska_SPI_pretvorba_96_bita\" >Paralelno-serijska SPI pretvorba (96 bita)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Sto_se_vrsi_na_ESP-32_spori_softverski_nivo_reda_ms\" >\u0160to se vr\u0161i na ESP-32 (spori softverski nivo, reda ms)<\/a><ul class='ez-toc-list-level-4' ><li class='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\/#Ocjena_ispravnosti_detekcije\" >Ocjena ispravnosti detekcije<\/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\/#Fizikalni_proracun_brzine_projektila\" >Fizikalni prora\u010dun brzine projektila<\/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\/#Prikupljanje_telemetrije_i_bezicno_odasiljanje_LoRa_upravljanje\" >Prikupljanje telemetrije i be\u017ei\u010dno oda\u0161iljanje (LoRa upravljanje)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prihvat_naredbi_sa_CrowPanela_Ventilator_Kalibracija_Reset\" >Prihvat naredbi sa CrowPanela (Ventilator, Kalibracija, Reset)<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#ESP32-WROOM-32D_vs_ESP32-S3-WROOM-1\" >ESP32-WROOM-32D vs ESP32-S3-WROOM-1<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Kriticni_%E2%80%9CStrapping%E2%80%9D_pinovi_na_ESP32-WROOM-32D\" >Kriti\u010dni &#8220;Strapping&#8221; pinovi na ESP32-WROOM-32D:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-21\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Kriticni_%E2%80%9CStrapping%E2%80%9D_pinovi_na_ESP32-S3\" >Kriti\u010dni &#8220;Strapping&#8221; pinovi na ESP32-S3:<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-22\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Wi-Fi_komunikacija\" >Wi-Fi komunikacija<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-23\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Raspoloziva_memorija\" >Raspolo\u017eiva memorija<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-24\" 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-25\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prvi_testni_kodovi\" >Prvi testni kodovi<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-26\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prve_PCB\" >Prve PCB\u00a0<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-27\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prvo_realno_testiranje\" >Prvo realno testiranje<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-28\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Raspberry_Pi_Pico_2_RP2350\" >Raspberry Pi Pico 2 (RP2350)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-29\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Cetiri_opcije_razmjene_podataka_izmedu_CPLD-ova_i_Raspberry_Pi_Pico_2\" >\u010cetiri opcije razmjene podataka izme\u0111u CPLD-ova i Raspberry Pi Pico 2<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Opcija_1_%E2%80%9CPjesacki%E2%80%9D_Sinkroni_Takt_s_Pico_2\" >Opcija 1: &#8220;Pje\u0161a\u010dki&#8221; Sinkroni Takt s Pico 2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-31\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Opcija_2_Dvostruki_Hardverski_SPI_Dual-SPI_Transakcija\" >Opcija 2: Dvostruki Hardverski SPI (Dual-SPI Transakcija)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-32\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Opcija_3_PIO_Programmable_IO_%E2%80%93_Specificni_alat_Pico_2_platforme\" >Opcija 3: PIO (Programmable I\/O) \u2013 Specifi\u010dni alat Pico 2 platforme<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-33\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Opcija_4_Pulsno-kodirani_PWM_Jedna_zica_bez_SPI_sata\" >Opcija 4: Pulsno-kodirani PWM (Jedna \u017eica bez SPI sata)<\/a><\/li><\/ul><\/li><\/ul><\/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<hr \/>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Raspored_funkcija\"><\/span><strong>Raspored funkcija<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Tijekom razvoja i testiranja projekta doga\u0111ale su se razli\u010dite nadogradnje sustava kao i promjene osnovnog funkcioniranja detektorske elektronike. Uvedena je dvosmjerna LoRa komunikacija, a funkcije su u kona\u010dnici raspore\u0111ene na CPLD-ove i ESP-32 na ovaj na\u010din:<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<h3><span class=\"ez-toc-section\" id=\"Sto_se_vrsi_na_CPLD-ovima_brzi_hardverski_nivo_reda_ns\"><\/span><strong>\u0160to se vr\u0161i na CPLD-ovima (brzi hardverski nivo, reda ns)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>CPLD moduli (za X-os i Y-os identi\u010dno) rade na taktu od 50 MHz (20 ns) i izvr\u0161avaju tri kriti\u010dne funkcije koje se ne smiju oslanjati na (spori) softver:<\/p>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Brzo_%E2%80%9Chvatanje%E2%80%9D_i_trajno_zakljucavanje_pogotka_sjene\"><\/span><strong>Brzo &#8220;hvatanje&#8221; i trajno zaklju\u010davanje pogotka (sjene)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Projektil koji leti visokom podzvu\u010dnom ili nadzvu\u010dnom brzinom presijeca laserske zrake foto-re\u0161etke u iznimno kratkom vremenu (par mikrosekundi). CPLD provjerava stanje svih 64 senzora svakih 20 ns. Ako projektil baci sjenu na senzor makar i na jedan jedini takt oscilatora, CPLD tu sjenu trajno zaklju\u010dava (latcha) u registar. Ta sjena ostaje zapam\u0107ena sve dok je ESP32 ne pro\u010dita i zatim namjerno obri\u0161e preko reset linije.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Automatska_selekcija_geometrijske_plohe_START_okidac_za_mjerenje_brzine_projektila\"><\/span><strong>Automatska selekcija geometrijske plohe (START okida\u010d) za mjerenje brzine projektila<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Senzorske re\u0161etke za X i Y os ne le\u017ee u istoj ravnini. Laseri za svaku os (2&#215;64 komada) raspore\u0111eni su u dvije ravnine me\u0111usobno razmaknute 7,2 mm. To zna\u010di da su 32 senzora svake osi u jednoj plohi, a druga 32 senzora u drugoj plohi. Tre\u0107a svjetlosna zavjesa koja slu\u017ei samo za mjerenje brzine (STOP zavjesa) nalazi se 100 mm iza prvih zavjesa (START zavjese), odnosno 107,2 mm iza prve zavjese i 100 mm iza druge zavjese.\u00a0 Kod mjerenja brzine ovo mo\u017ee biti problem jer za svaku os mo\u017ee biti aktivirana prva ili druga zavjesa, a razlika od 7,2 mm na ukupnoj udaljenosti izme\u0111u START i STOP zavjese unosi preveliku pogre\u0161ku u mjerenju.<\/p>\n<p>Sustav za mjerenje brzine stoga mora registrirati na kojoj zavjesi se dogodio START prekid i na osnovu toga prilagoditi ra\u010dun za mjerenje brzine.<\/p>\n<p>Prva zavjesa sadr\u017ei neparne senzore za X-os u rasponu 1-63 i parne senzore za Y-os u rasponu 2-64. Druga zavjesa sadr\u017ei parne senzore za X-os u rasponu 2-64 i neparne senzore za Y-os u rasponu 1-63. CPLD preko parnih i neparnih logi\u010dkih maski prepoznaje je li projektil aktiviralo Plohu A (parni senzori sa geometrijskom bazom 107,2 mm) ili Plohu B (neparni senzori sa geometrijskom bazom 100,0 mm).<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Kronometar_visoke_rezolucije_mjerenje_vremena_leta\"><\/span><strong>Kronometar visoke rezolucije (mjerenje vremena leta)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>U trenutku kad prva ploha (A ili B) detektira sjenu, CPLD u roku od 20 ns pokre\u0107e unutra\u0161nji 32-bitni broja\u010d. Broja\u010d broji impulse oscilatora sve dok projektil ne presije\u010de tre\u0107u zavjesu (STOP). Rezultat je odre\u0111eni broj taktova (tikova) koji predstavlja \u010disto vrijeme leta projektila izme\u0111u START i STOP zavjesa, izmjereno s to\u010dno\u0161\u0107u od \u00b120 ns.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Paralelno-serijska_SPI_pretvorba_96_bita\"><\/span><strong>Paralelno-serijska SPI pretvorba (96 bita)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>CPLD na kraju pakira sve podatke (64 bita sjena + 1 bit odabira plohe + 31 bit tajmera = 96 bita) u jedan veliki paket. Kada ESP32 podigne load_data, CPLD te podatke zaklju\u010da u pomi\u010dni registar (shift_reg), te ih preko jedne linije (spi_out) \u0161alje u ESP32 u ritmu frekvencije takta (spi_clk).<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Sto_se_vrsi_na_ESP-32_spori_softverski_nivo_reda_ms\"><\/span><strong>\u0160to se vr\u0161i na ESP-32 (spori softverski nivo, reda ms)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nakon \u0161to CPLD odradi brzo (ns) hvatanje stanja, ESP32 se budi i preuzima ra\u010dunakni i komunikacijski dio posla kroz svoj programski k\u00f4d.<\/p>\n<p><strong>\u00a0<\/strong><strong>Upravljanje SPI sabirnicom i i\u0161\u010ditavane podataka sa CPLD-a (96 Bita)<\/strong><\/p>\n<p>ESP-32 na znak CPLD-a da je do\u0161lo do promjene stanja (alarm) po\u010dinje proces \u010ditanja podataka sa CPLD-a.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Ocjena_ispravnosti_detekcije\"><\/span><strong>Ocjena ispravnosti detekcije<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>U prvom koraku ESP-32 mora prepoznati da li je promjenu stanja izazvao prolazak projektila ili neki drug kvar na senzorima (trajna sjena uslijed otkaza senzorske linije, uslijed pada nekog predmeta na senzore i sli\u010dno). Stoga, nakon \u0161to pro\u010dita 64 bita podataka o senzorima sa svakog CPLD-a, ESP-32 radi logi\u010dku provjeru tih podataka. Provjera se radi na na\u010din da se nakon svakog \u010ditanja novih podataka, CPLD-ovi resetiraju, a zatim se nakon 100 ms ponovno \u010ditaju podaci sa CPLD-ova. Ukoliko je promjenu (sjenu) izazvao brzi projektil, drugo \u010ditanje podataka \u0107e se razlikovati od prvog (bit \u0107e pro\u010ditane sve nule). Ukoliko pak drugo \u010ditanje bude isto kao i prvo, to zna\u010di da postoji neka trajna sjena, odnosno kvar. U tom slu\u010daju ESP-32 automatski a\u017eurira masku kvarova i \u0161alje paket tipa 4 (Kvar) na CrowPanel kod strijelca, kako bi se na ekranu detektirao kvar.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Fizikalni_proracun_brzine_projektila\"><\/span><strong>Fizikalni prora\u010dun brzine projektila <\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>ESP32 iz CPLD-a dobiva samo sirove tikove (broj impulsa u odre\u0111enom vremenu) i zastavice (da li je aktivirana prva ili druga START zavjesa). Stoga, za to\u010dan izra\u010dun brzine, ESP-32 prvo provjerava koja je START baza okinuta te na temelju toga postavlja bazu za duljinu na 0,1000 m ili na 0,1072 m. Nakon toga pretvara broj tikova u sekunde kako bi se dobila vremenska baza (vrijeme = broj tikova x 0,00000002 s). Iz ovih podataka ra\u010duna brzinu (brzina = duljina \/ vrijeme). S obzirom da podaci dolaze sa oba CPLD-a neovisno, ESP-32 izra\u010dunava brzinu na oba CPLD-a, a zatim ra\u010duna srednju vrijednost kako bi mjerenje bilo to\u010dnije. Na kraju ESP-32 taj prosjek pretvara u format formule kako bi ga spakirao u 32-bitnu varijablu za LoRa slanje.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Prikupljanje_telemetrije_i_bezicno_odasiljanje_LoRa_upravljanje\"><\/span><strong>Prikupljanje telemetrije i be\u017ei\u010dno oda\u0161iljanje (LoRa upravljanje)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>ESP32 periodi\u010dki (svake sekunde) o\u010ditava vanjske senzore za brzinu i smjer vjetra (anemometre), senzore za temperature sistema (DS18B20), te na ADC ulazu mjeri napon akumulatora. Sve te podatke pakira u to\u010dnu definiranu strukturu od 32 bajta i preko LoRa podatke \u0161alje na CrowPanel.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Prihvat_naredbi_sa_CrowPanela_Ventilator_Kalibracija_Reset\"><\/span><strong>Prihvat naredbi sa CrowPanela (Ventilator, Kalibracija, Reset)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>U unutra\u0161njosti loop() petlje, ESP32 neprekidno provjerava dolazne podatke sa LoRa. Kada sa CrowPanela stigne paket koji po\u010dinje s 0xBB, ESP32 provjerava Checksum i na osnovu toga inicira paljenje odre\u0111enih elektroni\u010dkih releja ili pokre\u0107e automatsku kalibraciju lasera preko digitalnog potenciometra.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_lora_04.gif\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24153\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_lora_04.gif\" alt=\"\" width=\"911\" height=\"330\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_lora_04.gif 911w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_lora_04-768x278.gif 768w\" sizes=\"auto, (max-width: 911px) 100vw, 911px\" \/><\/a><\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_lora_05.gif\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24154\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_lora_05.gif\" alt=\"\" width=\"739\" height=\"256\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"ESP32-WROOM-32D_vs_ESP32-S3-WROOM-1\"><\/span><strong>ESP32-WROOM-32D vs ESP32-S3-WROOM-1<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>&nbsp;<\/p>\n<p>Projekt sam po\u010deo razvijati za ESP32-WROOM-32D, no pokazalo se da ipak trebam MCU sa vi\u0161e GPIO pinova. Stoga sam pre\u0161ao na prvi ja\u010di ESP-32 razvojni model naziva ESP32-S3-WROOM-1.<\/p>\n<p>Razlika izme\u0111u ESP32-32D i naprednijeg ESP32-S3 je prili\u010dno velika. Iako oba \u010dipa dolaze iz iste tvornice (Espressif) i imaju dvojezgrene procesore na 240 MHz, ESP32-32D koristi stariji Xtensa LX6, dok ESP32-S3 koristi napredniji Xtensa LX7 procesor. Ovaj procesor je razvijen s potpuno novom arhitekturom, ve\u0107im brojem pinova i namjenskim hardverom za grafiku, umjetnu inteligenciju i be\u017ei\u010dnu stabilnost.<\/p>\n<p>Glavna prednost LX7 za moj projekt je ugradnja vektorskih uputa (vektorska pro\u0161irenja). To zna\u010di da S3 mo\u017ee unutar samo jednog takta procesora izvr\u0161iti te\u0161ke matemati\u010dke operacije nad vi\u0161e brojeva odjednom, \u0161to je po\u017eeljno primjerice za moj prora\u010dun brzine iz CPLD tikova.<\/p>\n<p>Ipak, glavni razlog prelaska na ESP32-S3 je taj \u0161to ESP32-32D ima premali broj iskoristivih GPIO pinova. Fizi\u010dki ih na modulu ima 25, me\u0111utim, 4 pina su samo ulazna i ne mogu generirati nikakav izlazni napon. Tako\u0111er, 6 pinova su strapping pinovi koji moraju prilikom boota biti u odre\u0111enom logi\u010dkom stanju, ina\u010de procesor ulazi u neki drugi mod rada ili je boot blokiran na druga\u010diji na\u010din. To zna\u010di da je kod ESP32-32D plo\u010dice na raspolaganju svega 15 \u201e\u010distih\u201c GPIO pinova. ESP32-S3 pak ima na modulu 36 GPIO pinova, od \u010dega je 5 pinova strapping, a jo\u0161 dva su rezervirana za Flash i PSRAM. To zna\u010di da je na raspolaganju 29 \u201e\u010distih\u201c GPIO pinova ili 14 vi\u0161e nego kod ESP32-32D.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/esp32_32d.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24161\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/esp32_32d.jpg\" alt=\"\" width=\"800\" height=\"457\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/esp32_32d.jpg 800w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/esp32_32d-768x439.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><em><span style=\"color: #00ffff;\">&#8220;Sigurni&#8221; GPIO pinovi na ESP32-WROOM-32D.<\/span><\/em><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/esp32_s3.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24162\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/esp32_s3.jpg\" alt=\"\" width=\"1300\" height=\"654\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/esp32_s3.jpg 1300w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/esp32_s3-768x386.jpg 768w\" sizes=\"auto, (max-width: 1300px) 100vw, 1300px\" \/><\/a><em><span style=\"color: #00ffff;\">&#8220;Sigurni&#8221; GPIO pinovi na ESP32-S3-WROOM-1.<\/span><\/em><\/p>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Kriticni_%E2%80%9CStrapping%E2%80%9D_pinovi_na_ESP32-WROOM-32D\"><\/span><strong>Kriti\u010dni &#8220;Strapping&#8221; pinovi na ESP32-WROOM-32D:<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li><strong>GPIO 1<\/strong> (TX0 \u2013 Transmit) \u2013 Preko njega ESP32 \u0161alje podatke na Serial Monitor. Ovaj pin treba izbjegavati za drugo kori\u0161tenje.<\/li>\n<li><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 \u201czamrznuti\u201d i programski kod se uop\u0107e ne\u0107e pokrenuti. Obi\u010dno je na njega spojena ugra\u0111ena LED dioda.<\/li>\n<li><strong>GPIO 3<\/strong> (RX0 \u2013 Receive) \u2013 Preko njega ESP32 prima novi program s ra\u010dunala. Ovaj pin treba izbjegavati za drugo kori\u0161tenje.<\/li>\n<li><strong>GPIO 5<\/strong> \u2013 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 \u201cSDIO slave\u201d (komunikacija s SD karticama na poseban na\u010din). To obi\u010dno uzrokuje da se ESP32 uop\u0107e ne pokrene ili u\u0111e u \u201cboot loop\u201d. 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.<\/li>\n<li><strong>GPIO 12<\/strong> \u2013 Kod po\u010detnog paljenja mora biti na LOW. Ako je HIGH 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.<\/li>\n<li><strong>GPIO 15<\/strong> \u2013 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.<\/li>\n<li><strong>GPIO 34, 35, 36, 39<\/strong> \u2013 isklju\u010divo ulazni pinovi<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Kriticni_%E2%80%9CStrapping%E2%80%9D_pinovi_na_ESP32-S3\"><\/span><strong>Kriti\u010dni &#8220;Strapping&#8221; pinovi na ESP32-S3:<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<ul>\n<li><strong>GPIO 0<\/strong>: Kod po\u010detnog paljenja mora biti na HIGH. Kontrolira ho\u0107e li se \u010dip pokrenuti u normalnom radnom na\u010dinu (HIGH) ili u modu za flashanje koda s ra\u010dunala (LOW). Na plo\u010di obi\u010dno postoji vanjski otpornik (Pull-up) koji ga dr\u017ei na HIGH, me\u0111utim treba paziti da ga spojeni izlaz ne povu\u010de na LOW.<\/li>\n<li><strong>GPIO 3<\/strong>: Odre\u0111uje na\u010din rada JTAG debuggera pri podizanju sustava.<\/li>\n<li><strong>GPIO 45<\/strong>: Izuzetno opasan pin! Kontrolira napon napajanja same unutra\u0161nje Flash\/PSRAM memorije (odabir izme\u0111u 3.3V i 1.8V). Ako ga vanjski \u010dip pri paljenju povu\u010de na HIGH, procesor \u0107e postaviti pogre\u0161an napon i trajno izgubiti vezu s vlastitom memorijom programskim kodom.<\/li>\n<li><strong>GPIO 46<\/strong>: Mora strogo biti LOW (uzemljen) u trenutku paljenja kako bi \u010dip uop\u0107e dopustio podizanje sustava iz ROM memorije. Ako je u trenutku paljenja na HIGH, boot proces propada.<\/li>\n<li><strong>GPIO 15<\/strong> (ili u nekim dokumentacijama ozna\u010den i kroz OTP postavke): Mo\u017ee utjecati na slanje kontrolnih logova pri podizanju sustava.<\/li>\n<li><strong>GPIO 47 i 48<\/strong> &#8211; Iako tehni\u010dki nisu strapping pinovi, kod velikog broja tvorni\u010dkih ESP32-S3 modula (pogotovo onih koji imaju ugra\u0111en ultra-brzi Octal PSRAM) ovi pinovi su interno \u010dvrsto o\u017ei\u010deni za rad same memorije unutar metalnog ku\u0107i\u0161ta. Njihovo kori\u0161tenje u kodu kao obi\u010dni ulaz ili izlaz trenutno uzrokuje hardverski krah (Crash\/Panic). Zato ih je najbolje izbjegavati za bilo kakvo spajanje.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Wi-Fi_komunikacija\"><\/span><strong>Wi-Fi komunikacija<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u0160to se ti\u010de be\u017ei\u010dne Wi-Fi komunikacije, ESP32-WROOM-32D podr\u017eava stariji Wi-Fi 4 (802.11 b\/g\/n) i Bluetooth 4.2 \/ BLE standard. PCB antena je integrirana na plo\u010dici i iznimno je osjetljiva na polo\u017eaj unutar metalnog ili plasti\u010dnog ku\u0107i\u0161ta mete. ESP32-S3 donosi moderniji Wi-Fi 4 sa stabilnijim protokolima i napredni Bluetooth 5.0 \/ BLE 5.0 s pro\u0161irenim dometom (Long Range). Modul dolazi s ugra\u0111enim IPEX\/U.FL konektorom za vanjsku antenu omogu\u0107uje da se koaksijalnim kabelom izvu\u010de antena izvan metalnog ku\u0107i\u0161ta mete. Wi-Fi planiram koristiti za be\u017ei\u010dno spajanje anemometara.<\/p>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Raspoloziva_memorija\"><\/span><strong>Raspolo\u017eiva memorija<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u0160to se ti\u010de memorija, ESP32-WROOM-32D ima 520 KB unutra\u0161njeg SRAM-a, a ESP32-S3 ima 512 KB SRAM-a. Iako na papiru ima 8 KB manje od starog ESP32 (512 naspram 520), ova memorija kod S3 modela je konstruirana na potpuno novoj arhitekturi i izravno je povezana s unutra\u0161njom Cache memorijom. To zna\u010di da procesor mo\u017ee komunicirati s radnim prostorom i vanjskim PSRAM-om neusporedivo br\u017ee i bez stvaranja uskih grla, \u0161to u mojem konkretnom slu\u010daju osigurava da paralelno \u010ditanje 96 bita s CPLD-a prolazi puno br\u017ee. Tako\u0111er, memorija od 520 KB unutar ESP32-WROOM-32D je rascjepkana na tri bloka: SRAM0, SRAM1 (koji slu\u017ee za sustav i drajvere) te SRAM2 (oko 328 KB) koji je zapravo jedini stvarno slobodan prostor za odvijanje programskog koda.<\/p>\n<p>ESP32-WROOM-32D ima 448 KB ROM memorije, a ESP32-S3 ima 384 KB ROM memorije. ROM memorija kod ESP32-S3 je smanjena jer su drajveri optimiziraniji i zauzimanju manje memorije. Ovdje je zapravo bitan dodatni unutra\u0161nji RTC RAM za Deep Sleep mod (\u010duvanje podataka u modu za u\u0161tedu energije) koji je kod ESP32-S3 dvostruko ve\u0107i, 16 KB u odnosu na 8 KB kod ESP32-WROOM-32D.<\/p>\n<p>Neki ESP-32 moduli imaju dodatni vanjski PSRAM memorijski \u010dip (WROVER modeli). Za stranu mete (TX k\u00f4d), gdje nema te\u0161ke LVGL grafike, velikih jezi\u010dnih matrica niti slikovnih buffer-a, vanjski PSRAM \u010dip nije potreban. \u010cistih 512 KB unutra\u0161njeg SRAM-a unutar samog ESP32-S3 \u010dipa je i vi\u0161e nego dovoljno za paralelno \u010ditanje CPLD-a i slanje LoRa paketa. Ipak spomenuti \u0107emo da i ovdje postoje razlike kod dvije razvojne plo\u010dice koje uspore\u0111ujemo. Kod starijeg ESP32 \u010dipa, veza izme\u0111u procesora i vanjskog PSRAM-a izvedena je preko standardne Quad SPI (4-bitne) sabirnice sa tipi\u010dnim radnim taktom od 40 MHz ili maksimalno 80 MHz, ali uz velika unutra\u0161nja ka\u0161njenja (latenciju). Kod S3 modela uveden je napredni Octal SPI (8-bitni) podsustav. Sabirnica radi na stabilnih 80 MHz do 120 MHz, no koristi DDR (Double Data Rate) tehnologiju. To zna\u010di da se podaci \u0161alju i na uzlazni i na silazni rub takta, \u010dime se efektivna brzina u praksi penje na ekvivalent od 240 MHz. Kod ESP32-32D Flash i PSRAM dijele istu unutra\u0161nju sabirnicu, dok ESP32-S3 ima potpuno odvojen Cache sustav za Flash i PSRAM. To zna\u010di da bi za na\u0161u primjenu mogao istovremeno \u010ditati balisti\u010dke podatke iz Flasha i pisati po PSRAM-u, bez ikakvog me\u0111usobnog \u010dekanja ili zagu\u0161enja sabirnice.<\/p>\n<p>Razlika u cijeni izme\u0111u ESP32-32D i ESP32-S3 je nekoliko eura (4 eura naspram 8 eura) pa ako radite ne\u0161to ozbiljniji projekt ili vam treba ESP32 plo\u010dica za razli\u010dite eksperimente, onda je svakako noviji ESP32-S3 bolji izbor.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/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\/05\/meta_gpio.gif\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24164\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_gpio.gif\" alt=\"\" width=\"923\" height=\"592\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_gpio.gif 923w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_gpio-768x493.gif 768w\" sizes=\"auto, (max-width: 923px) 100vw, 923px\" \/><\/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>Trebalo je desetak ve\u0107ih dorada i nadogradnji koda, nekoliko izmjena hardvera te nekoliko desetaka rje\u0161avanja raznih bugova da se dobije prvi funkcionalni programi.<\/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>Op\u0107enito gledano, bilo je vi\u0161e &#8220;prvih testnih kodova&#8221; koji su profunkcionirali u raznim fazama razvoja projekta. Prvi kodovi su uklju\u010divali samo komunikaciju izme\u0111u jednog EPM570 CPLD-a i jednog ESP32. 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>Tek kada sam napravio PCB-ove za metu (iako sam znao da to nije kona\u010dna verzija istih) mogao sam nastaviti sa pro\u0161irenim i detaljnijim testovima.<\/p>\n<p>U po\u010detku sam bilje\u017eio kronologiju razvoja softvera, me\u0111utim, gotovo svaka nadogradnja je \u00a0generirala razli\u010dite softverske i hardverske probleme koje je trebalo sustavno rje\u0161avati. Pojedina\u010dno opisivanje svakog takvog problema bilo bi preop\u0161irno, no to su sigurno posve o\u010dekivani problemi sa kojima se susre\u0107e svaki programer sli\u010dnih kodova. U kona\u010dnici sam do\u0161ao do stabilnih ina\u010dica koda za CPLD-ove (Verilog), koda za ESP32-S3 (Arduino) na meti i koda za ESP32-P4 za monitor strijelca koji sadr\u017ei preko 5000 linija \u010distog koda. Vjerojatno \u0107e i dalje trebati manje dorade ovih kodova, no mogu re\u0107i da sustav ve\u0107 i sada radi posve funkcionalno i ispunjava sve postavljene zahtjeve.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<h2><span class=\"ez-toc-section\" id=\"Prve_PCB\"><\/span><strong>Prve PCB\u00a0<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\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 style=\"text-align: center;\"><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><span style=\"color: #00ffff;\"><em>Tiskane plo\u010dice (PCB) za EPM570 vjerojatno \u0107e zadr\u017eati ovakav dizajn i u finalnoj ina\u010dici razvoja.<\/em><\/span><\/p>\n<p>&nbsp;<\/p>\n<p style=\"text-align: center;\"><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><em><span style=\"color: #00ffff;\">Tiskane plo\u010dice za povezivanje dva EPM570 i LoRa modula sa ESP32-32D. S obzirom da sam morao zamijeniti LoRa SX1278 (Ra-2) sa LoRa SX1262 te pro\u0161iriti broj GPIO pinova i pre\u0107i na ESP32-S3, ova tiskana plo\u010dica \u0107e se bitno mijenjati.\u00a0 <\/span>\u00a0<\/em><\/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>Kad su programi bili dovoljno razvijeni i PCB kompletirane, 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. Problem je u tome \u0161to sve laserske zrake trebaju biti cijelom du\u017einom na me\u0111usobnom razmaku od to\u010dno 4 mm i svi laseri moraju biti temperaturno stabilizirani tako da daju konstantnu snagu. Ovo tehni\u010dki nije lako posti\u0107i, no radim na tome.<\/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>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 i 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<hr \/>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Raspberry_Pi_Pico_2_RP2350\"><\/span><strong>Raspberry Pi Pico 2 (RP2350)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Nakon \u0161to je hardver mete (CPLD \u2013 ESP32) testiran i dobro radio na Serial monitoru, te nakon \u0161to je CrowPanel bio programiran i dobro je radio sa simulatorom, trebalo je napokon spojiti ta dva sustava tako da detektorski hardver mete samostalno preko LoRa sustava radi sa CrowPanelom kod strijelca.<\/p>\n<p>Ve\u0107 sam spomenuo da kod ESP32 na meti imam problem nedostatka GPIO pinova jer CPLD-ovi tra\u017ee 9 pinova, LoRa tra\u017ei 7 pinova, a tu je i puno periferije (temperaturni senzori, anemometar, \u010detiri releja, napon baterije). Stoga sam sa ESP32-WROOM-32D pre\u0161ao na ESP32-S3-WROOM-1. Me\u0111utim, ovaj prelazak na noviji i napredniji ESP32 nije donio o\u010dekivane rezultate. Sa ESP32-S3 nikako nisam mogao dobiti sinkronizirano \u010ditanje podataka sa CPLD-a.<\/p>\n<p>Zapravo, u jednom trenutku sam preko SPI sabirnice \u010dak i uspio natjerati ESP32 da sinkronizirano \u010dita podatke, no iz nekog razloga odbijao je \u010ditati podatke brzih projektila, odnosno sjena je morala trajati barem 100 ms da bi podatak bio pro\u010ditan. U daljnjem razvoju koda uspio bi posti\u0107i trenutno \u010ditanje svih sjena, uklju\u010duju\u0107i i vrlo kratke sjene brzih projektila, no i\u0161\u010ditani podaci ne bi bili sinkronizirani.<\/p>\n<p>O\u010dito je negdje postojao problem u tajmingu, \u0161to je \u010dudno, jer CPLD \u010duva podatke u latch-u i ESP32 ima sve vrijeme svijeta da ih na miru pro\u010dita. Stoga sam u slijede\u0107em koraku potpuno odustao od \u010ditanja podataka preko SPI protokola i pre\u0161ao na primitivno robusni princip pulsno-kodiranog prijenosa duljine niza (Pulse-Distance \/ Width Modulation).<\/p>\n<p>Ovaj sistem se vi\u0161e ne oslanja na takt (clock) koji generira ESP32, nego CPLD unutar sebe ima svoj neovisni, stabilni generator takta (npr. unutra\u0161njih 50 MHz podijeljenih na sporih i stabilnih 100 kHz). CPLD \u0161alje to\u010dno 64 impulsa za redom (svaki impuls predstavlja jedan senzor), gdje mijenja \u0161irinu (trajanje) samog impulsa ovisno o tome je li senzor prekinut ili ispravan. ESP stoga samo mjeri duljinu trajanja svakog impulsa i prevodi ga u stanje senzora:<\/p>\n<ul>\n<li>Kratki impuls (npr. 10 mikrosekundi): Ozna\u010dava da je senzor ISPRAVAN \/ SVIJETLI (0).<\/li>\n<li>Dugi impuls (npr. 30 mikrosekundi): Ozna\u010dava da je senzor PREKINUT \/ SJENA \/ KVAR (1).<\/li>\n<\/ul>\n<p>Ovdje dakle ne bi trebalo biti problema sa pomakom i de-sinkronizacijom \u010ditanja bitova kao kod klasi\u010dnog SPI protokola. Ipak, nakon nekoliko razli\u010ditih poku\u0161aja i modifikacija Verilog i Arduino kodova kojima se mijenjao na\u010din \u010ditanja podataka sa oba CPLD-a, sinkronizirano \u010ditanje podataka jednostavno nisam uspio dobiti.<\/p>\n<p>Na kraju sam razdvojio i LOAD pinove oba CPLD-a tako da se podaci mogu \u010ditati posve neovisno sa jednog ili drugog CPLD-a. Me\u0111utim, ni ovime nisam uspio posti\u0107i sinkronizaciju. Iz ispisa Serial monitora bilo je o\u010dito da ne\u0161to uzrokuje pomak ili zastoj uslijed \u010ditanja nizova od 64 bita tako da pro\u010ditani bitovi nisu ni cjeloviti ni na ispravnim pozicijama, niti pripadaju istom latch stanju.<\/p>\n<p>Jedino \u0161to je preostalo kao mogu\u0107i problem, to je sam ESP32-S3 i njegovi FreeRTOS operativni sustav. Pretpostavljam da FreeRTOS drajver i scheduler nasilno prekidaju kontinuirano izvr\u0161enje k\u00f4da za \u010ditanje stanja senzora (loop) kako bi odradili neko svoje unutra\u0161nje odr\u017eavanje \u010dipa. CPLD uredno \u0161alje niz od 64 bajta, no negdje usred tog slanja FreeRTOS odlu\u010di na kratko zaustaviti proces \u010ditanja podataka da bi odradio ne\u0161to drugo. Kad se ponovno vrati na \u010ditanje, dio podataka je ve\u0107 pobjegao u prazno i daljnje \u010ditanje je posve nesinkronizirano.<\/p>\n<p>Stoga sam odlu\u010dio pre\u0107i na mikrokontroler koji nema operativni sustav i izvr\u0161ava program u \u010distom hardveru (tzv. Bare-Metal ili &#8220;goli hardver&#8221;). Dobar kandidat za to je Raspberry Pi Pico ili ne\u0161to napredniji Pico 2. Za\u0161to mislim da bi to moglo biti rje\u0161enje?<\/p>\n<p>FreeRTOS je operativni sustav za mikrokontrolere u realnom vremenu. On omogu\u0107uje ESP32 \u010dipu da radi multitasking, odnosno da prividno vrti vi\u0161e programa (taskova) istovremeno. ESP32 ima dvije jezgre. FreeRTOS neprekidno, svakih nekoliko mikrosekundi, ska\u010de s jednog zadatka na drugi (tzv. Scheduler). On ka\u017ee: &#8220;Sada \u0107u 1 milisekundu odr\u017eavati Wi-Fi vezu, pa \u0107u 1 milisekundu \u010ditati temperaturu, pa \u0107u 1 milisekundu provjeravati LoRa-u, pa se vra\u0107am na Wi-Fi&#8221;. Cijena tog multitaskinga je gubitak kontrole nad vremenom. Budu\u0107i da operativni sustav u pozadini neprekidno donosi odluke i prekida rad koda radi nekih drugih unutra\u0161njih potreba ili prioriteta, onda ni\u0161ta ne mo\u017ee jam\u010diti da petlja \u010ditanja podataka sa CPLD-a ne\u0107e biti prekinuta usred \u010ditanja i mjerenja impulsa zbog nekog drugog taskinga.<\/p>\n<p>Raspberry Pi Pico 2 u standardnom Arduino okru\u017eenju radi u Bare-Metal na\u010dinu rada. To zna\u010di da operativni sustav ne postoji. Program se u\u010ditava izravno na silicij procesora i kontrolira sve, odnosno ima apsolutnu kontrolu nad svakim tranzistorom i pinom na \u010dipu. Nema unutra\u0161njeg potprograma koji radi paralelno sa u\u010ditanim programskim kodom. Stoga bi Pico trebao biti pouzdanije rje\u0161enje za vremenski kriti\u010dne i precizne sustave, trebao bi biti pouzdaniji glede ru\u0161enja i svakako za projekte s brzim softverskim bit-bangingom, kao \u0161to je ovaj na\u0161.<\/p>\n<p>S druge strane,\u00a0 na strani strijelca CrowPanel ESP32-P4 je svakako bio dobro rje\u0161enje jer tamo itekako treba multitasking, odnosno istovremeno crtanje LVGL grafike, generiranje audio najava te asinkrono primanje LoRa i WiFi paketa. FreeRTOS odlu\u010duje kako \u0107e vremenski rasporediti multitasking, a sitna mikro-ka\u0161njenja nastala u tom procesu ne smetaju odvijanju nijednog zadatka i nisu primjetna za operatera.<\/p>\n<p>Istra\u017eio sam literaturu mo\u017ee li se u ESP32-S3 arhitekturi prisilno &#8220;ugasiti&#8221; scheduler FreeRTOS-a i blokirati apsolutno sve asinkrone prekide unutar jezgre dok se \u010dita PWM niz sa CPLD-a. \u010cini se da je u teoriji mogu\u0107e napraviti takvo blokiranje, no ono je ipak ograni\u010deno. FreeRTOS po svojoj arhitekturi ne trpi dugotrajno i prisilno oduzimanje kontrole i mo\u017ee se sru\u0161iti ili prekinuti brojanje ako mu se nametnu duga\u010dka blokiraju\u0107a vremena. To zna\u010di da moram brzinu \u010ditanja CPLD-a \u0161to je mogu\u0107e vi\u0161e pove\u0107ati (npr. sa 100 kHz na 1 MHz), \u0161to pove\u0107ava mogu\u0107nost pogre\u0161ke.<\/p>\n<p>Tako\u0111er, kada u kodu napi\u0161emo portENTER_CRITICAL(), mi procesoru ka\u017eemo da ignorira standardne softverske i drajverske prekide. Me\u0111utim, unutar ESP32-S3 \u010dipa postoje NMI (Ne-maskiraju\u0107i prekidi) koji kontroliraju kriti\u010dni hardver, poput rada same Flash memorije iz koje se k\u00f4d izvr\u0161ava i hardverskog Watchdog tajmera. Ako PWM petlja s CPLD-a traje du\u017ee od 1 milisekunde, hardverski Watchdog \u0107e se aktivirati na razini \u010distog hardvera, zaobi\u0107i softverski nametnutu kriti\u010dnu zonu, nasilno prekinuti petlju i sru\u0161iti\/resetirati \u010dip.<\/p>\n<p>Nadalje, ESP32-S3 ima dvije jezgre. \u010cak i ako prvu jezgru (Core 0) zaklju\u010dam u kriti\u010dnu zonu da u miru \u010dita PWM impulse, druga jezgra (Core 1) i dalje neprekidno radi u pozadini i izvr\u0161ava radijske LoRa naredbe ili sustavne drajvere. Budu\u0107i da obje jezgre koriste istu unutra\u0161nju sabirnicu (Crossbar) za pristup GPIO pinovima i RAM memoriji, u trenutku kada druga jezgra zatra\u017ei pristup sabirnici, hardverski arbitar \u010dipa \u0107e na nekoliko nanosekundi &#8220;usporiti&#8221; prvu jezgru. Za obi\u010dne programe to je nevidljivo, ali za funkciju pulseIn() to zna\u010di da je brojanje ciklusa na sekundu blago usporilo, \u0161to trenutno kvari izmjerene mikrosekunde i stvara nesinkrone blokove podataka.<\/p>\n<p>\u010cini se da daljnje \u017eongliranje i borba s unutra\u0161njim preklapanjima ESP32-S3 \u010dipa, &#8220;strapping&#8221; zamkama pri paljenju, nepredvidljivim FreeRTOS mikroprekidima i vje\u010dnim krpanjem polariteta u Verilogu samo tro\u0161ili va\u0161e vrijeme i energiju, te svakako ne vodi stabilnom i pouzdanom sustavu.<\/p>\n<p>U slo\u017eenim projektima poput ovog, kada se do\u0111e do to\u010dke gdje softver mora silom i kriti\u010dnim zonama ispravljati hardverske nesavr\u0161enosti \u010dipa, jedini ispravan rez je promjena platforme.<\/p>\n<p>Raspberry Pi Pico 2 (RP2350) dolazi sa 26 GPIO pinova koji su potpuno samostalni, \u010disti i jednaki. Nema &#8220;strapping&#8221; pinova koji ru\u0161e \u010dip ako CPLD dr\u017ei napon pri paljenju. Nema unutra\u0161njih JTAG ili PSRAM preklapanja na razini silicija. Treba se samo dr\u017eati rasporeda predefiniranih hardverskih pinova SPI i UART komunikacije, a svi ostali GPIO pinovi mogu se odabrati onako kako najbolje pa\u0161u za PCB dizajn.\u00a0 Hardverski odvojena komunikacija: LoRa modul, digitalni potenciometar i serijski prijam vjetra radit \u0107e preko svojih zasebnih hardverskih krugova (SPI0, SPI1 i UART1), ostavljaju\u0107i procesor potpuno slobodnim za balistiku.<\/p>\n<p>Sa Pico 2 dobivam potpunu kontrolu nad vremenom (Bare-Metal) budu\u0107i da nema FreeRTOS-a koji asinkrono ska\u010de s taska na task. Kada Pico 2 krene \u010ditati pulseve s CPLD-a, on mjeri vrijeme u nanosekundu to\u010dno svaki put. Nema teoretske \u0161anse da pozadinski procesi prekinu ili &#8220;osakate&#8221; sliku laserske zavjese. Ako ovo ne\u0107e raditi, onda polako ostajem bez ideja.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/raspberry_pi_pico2.jpg\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24172\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/raspberry_pi_pico2.jpg\" alt=\"\" width=\"800\" height=\"522\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/raspberry_pi_pico2.jpg 800w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/raspberry_pi_pico2-768x501.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/a><\/p>\n<p>Kao \u0161to se vidi na shemi, kod Raspberry Pi Pico 2 na vanjske su konektore dovedeni samo oni pinovi koji se ne koriste za nikakve unutra\u0161nje procese. Svih 26 pinova se stoga mo\u017ee koristiti bez ograni\u010denja za digitalni ulaz ili izlaz, od \u010dega su pinovi 26, 27 i 28 tako\u0111er i analogni (ADC).<\/p>\n<p><strong>RUN \/ RESET (Fizi\u010dki pin 30)<\/strong><\/p>\n<p>Ovo je hardverski ulaz za resetiranje mikrokontrolera. Radi na principu niske razine napona (Active-Low). U normalnom radu ovaj pin je unutra\u0161nje povu\u010den na 3,3 V (HIGH). Ako se preko vanjske sklopke ili otvorenog kolektora kratko spoji na masu (GND), procesor RP2350 \u0107e se trenutno ponovno pokrenuti (resetirati) kao da ste ugasili i upalili struju. Ovo je u osnovi pin za spajanje Reset tipkala.<\/p>\n<p><strong>ADC VREF (Fizi\u010dki pin 35)<\/strong><\/p>\n<p>Ovo je analogni referentni napon za ugra\u0111eni ADC pretvara\u010d. Tvorni\u010dki je na samoj plo\u010dici preko malog otpornika povezan na unutra\u0161njih stabilnih 3,3 V. Ako se \u017eeli posebno precizno mjerenje analognih napona, na ovaj pin se mo\u017ee dovesti vanjski posebno stabiliziran napon (referenca) od to\u010dno 3,0V ili 3,3V.<\/p>\n<p><strong>EN \/ 3V3_EN (Fizi\u010dki pin 37)<\/strong><\/p>\n<p>Ovo je Enable pin ugra\u0111enog regulatora napona. Ovaj pin izravno kontrolira ho\u0107e li ugra\u0111eni naponski regulstor na plo\u010dici proizvoditi 3,3 V. Ako ovaj pin spoji na masu (GND), cijeli unutra\u0161nji regulator se gasi, plo\u010dica ostaje bez struje i prelazi u stanje ultra-niske potro\u0161nje (ispod 10 \u00b5A), bez obzira \u0161to je napajanje i dalje fizi\u010dki spojeno na VSYS.<\/p>\n<p><strong>VSYS (Fizi\u010dki pin 39)<\/strong><\/p>\n<p>Ovo je glavni ulazni pin za vanjsko napajanje plo\u010dice. Prihva\u0107a \u0161irok raspon ulaznih napona od 1,8 V do 5,5V. Ugra\u0111eni \u010dip (RT6150 buck-boost) \u0107e taj napon automatski i stabilno pretvoriti u to\u010dno 3,3V za rad cijelog sustava.<\/p>\n<p><strong>VBUS (Fizi\u010dki pin 40)<\/strong><\/p>\n<p>Ovo je fizi\u010dki napon izravno s USB-C utora plo\u010dice. Kada je Pico 2 spojen na ra\u010dunalo preko USB kabela, na ovom pinu se nalazi \u010distih 5 V s ra\u010dunala. Na samoj plo\u010dici se izme\u0111u VSYS i VBUS nalazi ugra\u0111ena Schottky dioda koja sprje\u010dava da struja s USB-a pote\u010de natrag u vanjsko napajanje, \u0161to omogu\u0107ava da se istovremeno programira plo\u010dica i dr\u017ei spojeno vanjsko napajanje bez ikakvih kratkih spojeva.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Cetiri_opcije_razmjene_podataka_izmedu_CPLD-ova_i_Raspberry_Pi_Pico_2\"><\/span><strong>\u010cetiri opcije razmjene podataka izme\u0111u CPLD-ova i Raspberry Pi Pico 2<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Raspberry Pi Pico 2 (RP2350) nudi hardverske mogu\u0107nosti koje ESP32 uop\u0107e fizi\u010dki nema. Budu\u0107i da CPLD radi na 50 MHz i u nanosekundi puni svoje unutra\u0161nje registre pozicije i brzine projektila, na raspolaganju imamo \u010detiri opcije za komunikaciju:<\/p>\n<p><strong>\u00a0<\/strong><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Opcija_1_%E2%80%9CPjesacki%E2%80%9D_Sinkroni_Takt_s_Pico_2\"><\/span><strong>Opcija 1: &#8220;Pje\u0161a\u010dki&#8221; Sinkroni Takt s Pico 2 <\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Ovo je najjednostavnija opcija koja u potpunosti zaobilazi komplicirane protokole i koristi obi\u010dne digitalne pinove. CPLD samo \u010duva podatke i digne alarm. Pico 2 reagira, a procesor ru\u010dno (kroz softversku petlju) \u0161alje to\u010dno 96 impulsa sata na clock liniju CPLD-a te s MISO linija u\u010ditava bit po bit podataka. Budu\u0107i da sam u novom dizajnu fizi\u010dki razdvojio linije za Load podataka, Pico 2 ima apsolutnu kontrolu nad vremenom. On mo\u017ee najprije u miru o\u010ditati X os, zatim aktivirati load za Y os i o\u010ditati Y os. Podaci se ne mogu preliti jer se CPLD shift-registar ne mo\u017ee pomaknuti ni za jedan bit dok mu Pico 2 namjerno ne po\u0161alje impuls sata. Brzina ovakvog prijenosa je oko 200 kHz do 500 kHz \u0161to zna\u010di da \u010ditanje traje svega nekoliko mikrosekundi.<\/p>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Opcija_2_Dvostruki_Hardverski_SPI_Dual-SPI_Transakcija\"><\/span><strong>Opcija 2: Dvostruki Hardverski SPI (Dual-SPI Transakcija)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Pico 2 ima dva potpuno neovisna hardverska SPI kontrolera u siliciju (SPI0 i SPI1). Za LoRa modul smo odredili SPI0, a za digitalni potenciometar SPI1. Ako bi za CPLD-ove htjeli tako\u0111er koristiti klasi\u010dni hardverski SPI, morali bi ih staviti na sabirnicu SPI1 zajedno s digitalnim potenciometrom i dijeliti istu liniju sata. Me\u0111utim, CPLD-ovi nemaju klasi\u010dni CS (Chip Select) pin koji bi stavio njihove MISO linije u stanje visoke impedancije (isklju\u010dio ih s mre\u017ee) kada \u010ditamo potenciometar, \u0161to bi stvorilo elektri\u010dni konflikt na \u017eicama.<\/p>\n<p>Stoga bi za digitalni potenciometar (koji se rijetko koristi) morali odabrati drugu grupu pinova, tako da SPI1 konfiguriramo za CPLD-ove. Budu\u0107i da Pico 2 dopu\u0161ta paralelno mapiranje, mo\u017eemo iskoristiti Dual-MISO opciju gdje procesor preko unutra\u0161njih silicijskih filtara u istoj nanosekundi u\u010ditava i bit s X \u010dipa i bit s Y \u010dipa preko istog hardverskog sata. Ovdje nema softverskih petlji \u0161to je prednost za sinkronizaciju, a brzina prijenosa je vrlo visoka, od 1 MHz do 10 MHz.<\/p>\n<p>Ve\u0107ina poku\u0161aja do sada je i\u0161la upravo u smjeru SPI komunikacije, me\u0111utim, uskla\u0111ivanje rada tri SPI ure\u0111aja od kojih jedan nema CS, na arhitekturi koja podr\u017eava samo dva hardverska SPI-a, mo\u017ee stvoriti razne nepredvidljive probleme. LoRa i CPLD-ovi su va\u017eni elementi sistema koji stalno rade i bolje je da ne dijele svoju SPI liniju sa drugim periferijama.<\/p>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Opcija_3_PIO_Programmable_IO_%E2%80%93_Specificni_alat_Pico_2_platforme\"><\/span><strong>Opcija 3: PIO (Programmable I\/O) \u2013 Specifi\u010dni alat Pico 2 platforme<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Ovo je hardverska tehnologija koju ima isklju\u010divo Raspberry Pi obitelj (RP2040 i novi RP2350), a ESP32 je nema. Pico 2 unutar sebe ima minijaturne, neovisne hardverske automate (PIO blokove) koji se programiraju u posebnom, kratkom strojnom jeziku (PIO assembly). Za na\u0161 slu\u010daj, u jedan slobodan PIO automat u\u010ditaju se 4 linije koda: &#8220;\u010dekaj alarm -&gt; spusti LOAD -&gt; generiraj 96 impulsa sata i u\u010ditaj MISO -&gt; spremi u DMA&#8221;.<\/p>\n<p>Prednost za sinkronizaciju je ta \u0161to \u010dim metak proleti i CPLD digne alarm, PIO automat u istom tom djeli\u0107u nanosekunde u \u010distom hardveru povla\u010di podatke iz CPLD-a, bez da glavna loop() petlja ili procesor Pico 2 plo\u010dice uop\u0107e imaju veze sa tim. Podaci se automatski sla\u017eu u memorijski prsten (FIFO buffer). Glavni procesor mo\u017ee slati LoRa telemetriju, obra\u0111ivati temperaturu ili raditi bilo koju drugu operaciju, za vrijeme dok je podatak o pogotku posve neovisno u\u010ditan i spremljen u pozadini na razini \u010distog hardvera. Brzina ovakvog prijenos se fleksibilna, mo\u017ee i\u0107i i do 20-30 MHz.<\/p>\n<p>&nbsp;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Opcija_4_Pulsno-kodirani_PWM_Jedna_zica_bez_SPI_sata\"><\/span><strong>Opcija 4: Pulsno-kodirani PWM (Jedna \u017eica bez SPI sata)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Ovo je koncept koji sam tako\u0111er isprobao sa ESP32, a koji u potpunosti bri\u0161e sat (clock) s plo\u010dice. CPLD unutar sebe ima svoj spori generator takta (npr. 100 kHz) i nakon zabilje\u017eenog hica samostalno preko MISO \u017eice \u0161alje 96 impulsa: kratki impuls = 0 (svjetlo), dugi impuls = 1 (sjena\/tajmer).<\/p>\n<p>Budu\u0107i da sat ne postoji na tiskanoj plo\u010dici, eliminiran je glavni uzrok &#8220;shifta&#8221; bitova. Najve\u0107a prednost za Pico 2 je \u0161to on unutar svog unutra\u0161njeg silicija ima namjenski hardverski blok za mjerenje \u0161irine impulsa (PWM Input Capture drajver). Pico 2 u pozadini mjeri mikrosekunde svakog impulsa bez optere\u0107enja drugih procesa.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>Kada stigne Pico 2 svakako \u0107u testirati sve opcije osim SPI-a. Opcijom 1 (Pje\u0161a\u010dki sinkroni takt) je najlak\u0161a za dijagnostiku preko Serial monitora. Budu\u0107i da su Load linije razdvojene, Pico 2 \u0107e imati apsolutnu kontrolu nad CPLD kontejnerima. To \u0107e odmah pokazati jesu li spojevi na PCB-u ispravni i dobivamo li \u010diste nule i jedinice bez gre\u0161ke.<\/p>\n<p>Najvi\u0161e pak obe\u0107ava Opcija 3 (PIO drajver). Kao \u0161to smo ve\u0107 opisali, ovdje imamo potpunu autonomiju jer PIO automat ima svoj vlastiti strojni k\u00f4d (PIO Assembly) i izvr\u0161ava se na razini hardvera, potpuno odvojeno od glavnog ARM procesora i loop() petlje.<\/p>\n<p>\u010cim CPLD podigne alarm, PIO automat to detektira u roku od jedne nanosekunde. On potpuno samostalno spu\u0161ta load_data liniju, generira to\u010dno 96 o\u0161trih impulsa sata brzinom od npr. 2 MHz i u\u010ditava bitove s MISO \u017eica direktno u svoj unutra\u0161nji hardverski FIFO me\u0111uspremnik (red \u010dekanja u hardveru). Jednom kada tih 96 bita upadne u hardverski FIFO \u010dipa, oni su sigurni od bilo kakvih korupcija. Glavni procesor mo\u017ee u tom trenutku slati LoRa pakete, obra\u0111ivati temperaturu, vjetar ili sekundu-dvije raditi bilo \u0161to drugo, podatak o pogotku i preciznim ticks-ovima brzine \u010deka sinkroniziran u izvornom obliku.<\/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":24024,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[54],"tags":[],"class_list":{"0":"post-24110","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-samogradnja","8":"czr-hentry"},"jetpack_featured_media_url":"https:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/04\/meta_8_02.png","_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":16,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/posts\/24110\/revisions"}],"predecessor-version":[{"id":24174,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/posts\/24110\/revisions\/24174"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/media\/24024"}],"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}]}}