{"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-07-27T17:41:35","modified_gmt":"2026-07-27T16:41:35","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<ul>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/04\/02\/projekt-elektronicka-meta-uvod\/\">Uvod<\/a><\/li>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/04\/02\/projekt-elektronicka-meta-senzori\/\" target=\"_blank\" rel=\"noopener\">Senzori pozicije i brzine projektila<\/a><\/li>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/04\/02\/projekt-elektronicka-meta-detektorska-elektronika\/\">Brza detektorska elektronika (diskretna)<\/a><\/li>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/04\/03\/projekt-elektronicka-meta-cpld\/\">Brza detektorska elektronika (CPLD)<\/a><\/li>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/\" target=\"_blank\" rel=\"noopener\">Softver mete (CPLD, MCU, WiFi, LoRa)<\/a><\/li>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/04\/02\/projekt-elektronicka-meta-monitor\/\" target=\"_blank\" rel=\"noopener\">Monitor strijelca \u2013 CrowPanel ESP32-P4<\/a><\/li>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/04\/02\/projekt-elektronicka-meta-bezicni-link\/\" target=\"_blank\" rel=\"noopener\">Be\u017ei\u010dni link (LoRa)<\/a><\/li>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/06\/projekt-elektronicka-meta-napajanje\/\" target=\"_blank\" rel=\"noopener\">Napajanja<\/a><\/li>\n<li><a href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-mjerenje-brzine\/\" target=\"_blank\" rel=\"noopener\">Mjerenje brzine projektila na meti<\/a><\/li>\n<\/ul>\n<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\/#Spajanje_senzora_na_CPLD\" >Spajanje senzora na CPLD<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Raspodjela_zadataka_izmedu_CPLD_MCU_i_LORa\" >Raspodjela zadataka izme\u0111u CPLD, MCU i LORa<\/a><ul class='ez-toc-list-level-3' ><li class='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\/#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-8\" 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\" >\u00a0Brzo \u201chvatanje\u201d 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-9\" 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-10\" 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-11\" 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-12\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Sto_se_vrsi_na_MCU_spori_softverski_nivo_reda_ms\" >\u0160to se vr\u0161i na MCU (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-13\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Upravljanje_SPI_sabirnicom_i_iscitavane_podataka_sa_CPLD-a_96_Bita\" >Upravljanje SPI sabirnicom i i\u0161\u010ditavane podataka sa CPLD-a (96 Bita)<\/a><\/li><li class='ez-toc-page-1 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\/#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-15\" 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-16\" 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-17\" 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><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Odabir_MCU-a\" >Odabir MCU-a<\/a><ul class='ez-toc-list-level-3' ><li class='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><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\/#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-25\" 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-26\" 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-27\" 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-28\" 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-29\" 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><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-30\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Programiranje_MCU-a\" >Programiranje MCU-a<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-31\" 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-32\" href=\"https:\/\/www.crowave.com\/blog\/2026\/05\/07\/projekt-elektronicka-meta-software\/#Prvo_realno_testiranje_svjetlosne_zavjese\" >Prvo realno testiranje svjetlosne zavjese<\/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=\"Spajanje_senzora_na_CPLD\"><\/span><strong>Spajanje senzora na CPLD<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Prije razvijanja Veriloga trebalo je 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 pozitivnom ili negativnom logikom, a to je odluka da li \u0107u koristiti ulazne 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 if 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<hr \/>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Raspodjela_zadataka_izmedu_CPLD_MCU_i_LORa\"><\/span><strong>Raspodjela zadataka izme\u0111u CPLD, MCU i LORa<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>&nbsp;<\/p>\n<p>Jedna CPLD EPM570 plo\u010dica ima dostupnih 72 I\/O pinova. 64 pina moramo rezervirati za senzore, jedan pin rezerviramo za kronometar brzine, \u010dime nam ostaje 7 pinova za komunikaciju. Pinovi se vrlo lako definiraju u Pin Planneru ili preko gotove Tcl skripte koju mo\u017ee generirati AI (<em>View -&gt; Utility Windows -&gt; Tcl Console<\/em>).<\/p>\n<p>Tijekom razvoja projekta bilo je puno modifikacija u na\u010dinu spajanja dva CPLD EPM570, u na\u010dinu komunikacije sa MCU, raspodjeli zadataka koji \u0107e se obavljati na CPLD i MCU, kao i u samom odabiru MCU-a. Softver za CPLD i MCU je trebalo razvijati paralelno i paralelno rje\u0161avati probleme uo\u010dene tijekom testiranja.<\/p>\n<p>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 trebalo razvijati programski kod tako da paketi podataka budu optimalni za slanje. Kako se sustav razvijao i dodavala telemetrija i razne druge funkcije, paket podataka je porastao sa 19 bajta koji se \u0161alju po potrebi (kad metak aktivira zavjesu), na 33 bajta koji se \u0161alju svake sekunde. Tako\u0111er, LoRa komunikacija je dvosmjerna.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/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<h4><span class=\"ez-toc-section\" id=\"_Brzo_%E2%80%9Chvatanje%E2%80%9D_i_trajno_zakljucavanje_pogotka_sjene\"><\/span>\u00a0<strong>Brzo \u201chvatanje\u201d 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\u00d764 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_MCU_spori_softverski_nivo_reda_ms\"><\/span><strong>\u0160to se vr\u0161i na MCU (spori softverski nivo, reda ms)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Meta prema strijelcu \u0161alje podatak o X i Y koordinatama pogotka (potpuna i djelomi\u010dna detekcija samo jedna osi), podatak o brzini projektila na meti, podatak o neispravnim senzorima, podatak o brzini i smjeru vjetra na meti, te podatke o naponu baterije i temperaturama lasera i senzorske elektronike (alarm za pregrijavanje).<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Upravljanje_SPI_sabirnicom_i_iscitavane_podataka_sa_CPLD-a_96_Bita\"><\/span><strong>Upravljanje SPI sabirnicom i i\u0161\u010ditavane podataka sa CPLD-a (96 Bita)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>MCU 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 MCU mora prepoznati da li je promjenu stanja izazvao prolazak projektila ili neki drugi 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 200 ms ponovno \u010ditaju podaci sa CPLD-ova.<\/p>\n<p>Ukoliko je promjenu (sjenu) izazvao brzi projektil, drugo \u010ditanje podataka \u0107e se razlikovati od prvog (bit \u0107e pro\u010ditane sve nule). U tom slu\u010daju se \u0161alje <strong>paket tipa 1<\/strong>, po \u010demu CrowPanel zna da je pogodak regularan i crta zelenu to\u010dku na meti.\u00a0 Ukoliko pak drugo \u010ditanje bude isto kao i prvo, to zna\u010di da postoji neka trajna sjena, odnosno kvar. U tom slu\u010daju MCU \u0161alje <strong>paket tipa 3<\/strong>, kako bi se na CrowPanel 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>MCU 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, MCU 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>MCU 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, zajedno sa podacima o pogotku pakira u to\u010dnu definiranu strukturu od 33 bajta i preko LoRa podatke \u0161alje na CrowPanel.<\/p>\n<p>Telemetrijski podaci koji se osvje\u017eavaju svake sekunde \u0161alju sve podatke osim podatka za pogodak i brzinu projektila, te se \u0161alju kao <strong>paket tipa 2<\/strong>. \u010cim se dogodi pogodak, prioritetno se \u0161alje <strong>paket tipa 1 <\/strong>koji sadr\u017ei i podatke o pogotku.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/paket_meta-1.gif\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24180\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/paket_meta-1.gif\" alt=\"\" width=\"906\" height=\"354\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/paket_meta-1.gif 906w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/paket_meta-1-768x300.gif 768w\" sizes=\"auto, (max-width: 906px) 100vw, 906px\" \/><\/a><\/p>\n<p>Tijekom razvoja projekta paketi podataka koji se \u0161alju preko LoRa bili su definirani na razli\u010dite na\u010dine. Svakako je bio osnovni zahtjev da se podaci o vjetru, temperaturi i stanju baterije \u0161alju periodi\u010dki, dok su pogoci i kvarovi kriti\u010dni doga\u0111aji koji moraju trenutno i prioritetno u\u0107i u paket za slanje. Od samog po\u010detka poku\u0161avam na\u0107i balans izme\u0111u koli\u010dine podataka koji \u0107e se slati preko LoRa i prakti\u010dne potrebe za osvje\u017eavanjem pojedinih podataka. Ako \u017eelite primjerice slati podatke o vjetru svake sekunde, podatke o stanju baterije svake minute, podatak o temperaturi sistema svakih 15 sekundi, a podatke o pogotku \u010dim se dogode, onda morate definirati razli\u010dite veli\u010dine, tipove i strukture paketa za svaki navedeni slu\u010daj. To je na kraju dovelo do kompliciranog koda, kako na strani MCU mete tako i na strani CrowPanela. Stoga sam na kraju sam prihvatio najjednostavniji mogu\u0107i na\u010din slanja paketa, tako da se uvijek \u0161alje\u00a0 identi\u010dan puni paket od 33 bajta koji u sebi sadr\u017ei sve podatke odjednom, ali program mete njime upravlja na dva razli\u010dita na\u010dina:<\/p>\n<ul>\n<li>Periodi\u010dki na\u010din (paket tipa 2): MCU svake sekunde uzme trenutno stanje telemetrije (baterija, vjetar, temperature) i postavi vrijednosti na pripadaju\u0107e lokacije, dok lokacije za pogotke prebri\u0161e nulama.<\/li>\n<li>Prioritetni asinkroni upad (paket tipa 1 i 3): Onog trenutka kada CPLD detektira promjenu stanja senzora, MCU trenutno i bez \u010dekanja naredne sekunde izvr\u0161i provjeru ispravnosti (pogodak ili kvar), uzme sve meteo podatke, u njih &#8220;ubaci&#8221; koordinate pogotka (kvara) i brzinu projektila, te po\u0161alje paket tipa 1 ili 3.<\/li>\n<\/ul>\n<p><strong>\u00a0<\/strong><\/p>\n<p>&nbsp;<\/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>Strijelac prema meti mo\u017ee poslati pet naredbi: uklju\u010denje i isklju\u010denje rada lasera i\/ili kronometra (u\u0161teda energije), uklju\u010denje i isklju\u010denje ventilatora (hla\u0111enje, otpuhivanje ne\u010disto\u0107a sa optike), naredba za restart elektronike mete (u slu\u010daju softverskog smrzavanja), kontrola digitalnog potenciometra za ru\u010dno namje\u0161tanje ili automatsku kalibraciju snage lasera.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/paket_panel.gif\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24181\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/paket_panel.gif\" alt=\"\" width=\"731\" height=\"278\" \/><\/a><\/p>\n<p>U unutra\u0161njosti loop() petlje, MCU neprekidno provjerava dolazne podatke sa LoRa. Kada sa CrowPanela stigne paket koji po\u010dinje s 0xBB, MCU 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<hr \/>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Odabir_MCU-a\"><\/span><strong>Odabir MCU-a<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Projekt sam po\u010deo razvijati sa ESP32-WROOM-32D, zatim sam zbog pomanjkanja GPIO pinova pre\u0161ao na ESP32-S3-N16R8, a na kraju sam zbog stalne borbe sa Strapping, \u010disto ulaznim, interno zauzetim i sli\u010dnim problemati\u010dnim pinovima kao i zbog samog FreeRTOS-a pre\u0161ao na Raspberry Pi Pico 2 (RP2350).<\/p>\n<h3><\/h3>\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>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<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>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><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_pinout.gif\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24177\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_pinout.gif\" alt=\"\" width=\"928\" height=\"662\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_pinout.gif 928w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_pinout-768x548.gif 768w\" sizes=\"auto, (max-width: 928px) 100vw, 928px\" \/><\/a><\/p>\n<p>Ova tablica je ve\u0107 desetak puta mijenjana i nadogra\u0111ivana i sada je prilago\u0111ena Pico2 razvojnoj plo\u010dici. Prvi sistemi su uklju\u010divali CPLD-ove vezane u Daisy-Chain te zajedni\u010dke load, trigger i spi linije. Me\u0111utim, razvoj takvog sistema je bilo vrlo te\u0161ko pratiti i ispravljati od pogre\u0161aka glede sinkronizacije \u010ditanja podataka sa oba CPLD-a istovremeno. Stoga su ovdje dva CPLD-a podatkovno potpuno odvojena i dijele samo zajedni\u010dki clock i reset. Verilog je napisan kao \u010disti sustav za bilje\u017eenje promjena i mjerenje tikova brzine, a sva kontrola u\u010ditavanja, ra\u010dunanja, povezivanja i slanja podataka je preba\u010dena na MCU. Time kod razvoja projekta nije potrebno stalno mijenjati i prilago\u0111avati kodove paralelno na CPLD-ovima i na MCU.<\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_shema_full-scaled.png\" rel=\"lightbox[24110]\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-24184\" src=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_shema_full-scaled.png\" alt=\"\" width=\"1803\" height=\"2560\" srcset=\"http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_shema_full-scaled.png 1803w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_shema_full-768x1090.png 768w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_shema_full-1082x1536.png 1082w, http:\/\/crowave.com\/blog\/wp-content\/uploads\/2026\/05\/meta_shema_full-1443x2048.png 1443w\" sizes=\"auto, (max-width: 1803px) 100vw, 1803px\" \/><\/a><\/p>\n<p>Ovo je trenutna elektroni\u010dka shema mete koja uklju\u010duje:<\/p>\n<ul>\n<li>2 x 64 lasera sa pojedina\u010dnim pode\u0161avanjem struje i zajedni\u010dkim pode\u0161avanjem napona<\/li>\n<li>2 x 64 foto-senzora<\/li>\n<li>2 x CPLD EPM570 za brzu senzorsku elektroniku<\/li>\n<li>Raspberry Pico2 kao glavni MCU<\/li>\n<li>LoRa modul SX1262 za be\u017ei\u010dnu komunikaciju meta-strijelac<\/li>\n<li>2 x XIAO ESP32-C6 za ESP-NOW komunikaciju sa anemometrom<\/li>\n<li>SP3485 (RS-485\/UART konverter za anemometar)<\/li>\n<li>TP4056 (punja\u010d za Li-Ion bateriju) i SDB628 (Step Up konverter za napajanje anemometra)<\/li>\n<li>Magnetski izolator ADuM1400 i digitalni potenciometar TPL0501 za kontrolu napona DC\/DC konvertera sa LM5116 koji napaja lasere<\/li>\n<li>Digitalni temperaturni senzori DS18B20<\/li>\n<li>4-kanalni izolirani elektroni\u010dki releji (EL817\/IRF5305) za kontrolu raznih periferija<\/li>\n<\/ul>\n<p>Jo\u0161 je potrebno razviti svjetlosnu zavjesu za mjerenje brzine, te definirati na\u010din napajanja iste.<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Programiranje_MCU-a\"><\/span><strong>Programiranje MCU-a<\/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 MCU modula za stranu mete (predajnik) i stranu strijelca (prijemnik). Sustavi moraju me\u0111usobno komunicirati te se moraju i paralelno razvijati.<\/p>\n<p>Razvoj softvera je i\u0161ao postepeno, korak po korak, fazu po fazu. Tako su prvi kodovi 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 prve PCB-ove za metu koji su povezivali sve senzore sa CPLD-ovima, mogao sam nastaviti sa pro\u0161irenim i realnim testovima sustava. Ovo je naravno uklju\u010divalo puno probnih kodova prvo samo za Serial monitor, zatim sam napravio nekoliko LoRa simulatora paketa podataka, a tek tada sam mogao nastaviti sa stvarnom neovisnom komunikacijom izme\u0111u sustava mete i CrowPanela kod strijelca.<\/p>\n<p>S obzirom da je ovo prili\u010dno kompleksni sustav za razvoj od strane jednog hobiste, nemogu\u0107e je sve predvidjeti i planirati odmah u startu. Odre\u0111ene funkcije i kontrole dodavale su se naknadno, stalno je trebalo raditi izmjene i testirati razli\u010dite ideje. Gotovo svaka nadogradnja obi\u010dno generira nove softverske i hardverske probleme koje je onda treba sustavno rje\u0161avati.<\/p>\n<p>Generalno gledano, \u0161to se ti\u010de sustava mete, najve\u0107i problem je bio oko sinkronizacije \u010ditanja stanja svih 128 senzora i pravilnog pakiranja istih u zajedni\u010dki paket sa ostalim podacima. Ako se podaci izme\u0111u mete i strijelca ne \u0161alju po to\u010dnom protokolu, onda \u0107e biti pogre\u0161no pro\u010ditani ili uop\u0107e ne\u0107e biti pro\u010ditani. Drugi veliki problem je geometrijsko poravnanje i termi\u010dka nestabilnost lasera, a to je problem na kojem jo\u0161 moram raditi. Ipak, dosada\u0161nji testovi su pokazali da se ovo mo\u017ee napraviti u samogradnji dovoljno dobro da zadovoljavaju\u0107e funkcionira u praksi.<\/p>\n<p>Uglavnom, kad bi hardver i softver za metu do\u0161ao do odre\u0111ene faze razvoja i testiranja, trebalo se prebaciti na hardver i softver CrowPanela kako bi se testiralo mogu li se ti sustavi me\u0111usobno podr\u017eavati preko LoRa komunikacije. Softver za ove sustave ne mo\u017eete razvijati napamet. Svaku fazu je potrebno podr\u017eati pravilno izvedenim hardverom i za svaku fazu razvoja je potrebno detaljno testirati \u010ditav dotada\u0161nji sustav.<\/p>\n<p>Sada imam testiranih desetak ina\u010dica koda za MCU mete, no ni jedan kod jo\u0161 uvijek nije kona\u010dna ina\u010dica. S obzirom da je kod za CrowPanel daleko slo\u017eeniji od programskog koda mete, napravio sam LoRa simulator koji \u0161alje 33-bajtne pakete podataka sa nasumi\u010dnim vrijednostima. To su paketi podataka kakve treba slati MCU mete. Tek kada CrowPanel bude ispravno i stabilno radio sa simulatorom, mogu se vratiti na dovr\u0161avanje programskog koda za metu.<\/p>\n<p>&nbsp;<\/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 Pico2, 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_svjetlosne_zavjese\"><\/span><strong>Prvo realno testiranje svjetlosne zavjese<\/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<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; Uvod Senzori pozicije i brzine projektila Brza detektorska elektronika (diskretna) Brza detektorska elektronika (CPLD) Softver mete (CPLD, MCU, WiFi, LoRa) Monitor strijelca \u2013 CrowPanel ESP32-P4 Be\u017ei\u010dni link (LoRa) Napajanja Mjerenje brzine projektila na meti &nbsp; &nbsp; &nbsp; Tijek razvoja softvera za CPLD i MCU &nbsp; Programiranje CPLD-a Za programiranje EPM570 (kao i raznih drugih [&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":21,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/posts\/24110\/revisions"}],"predecessor-version":[{"id":24190,"href":"https:\/\/www.crowave.com\/blog\/wp-json\/wp\/v2\/posts\/24110\/revisions\/24190"}],"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}]}}