\documentclass[11pt]{article}
\usepackage{graphicx} % Required for inserting images
\usepackage{hyperref}
\usepackage[a4paper, margin=3.5cm]{geometry}
\usepackage[T1]{fontenc}    % Use T1 font encoding for accented characters
\usepackage[utf8]{inputenc} % Allow UTF-8 input
\usepackage[slovene]{babel} % Slovenski jezik
\usepackage{tikz} % Tekstovne slike
\usepackage{xcolor}
\usepackage{listings} % pisanje kode
\usepackage{amssymb}
\usepackage{verbatim}
\usepackage{adjustbox}
\usepackage{fancyvrb}
\usepackage{csquotes}
\usepackage{bytefield}

\begin{document}

\begin{titlepage}
    \centering
    \vspace*{3cm}
    {\Huge \textbf{Avto na Daljinsko Upravo}\par}
    \vspace{2cm}
    {\Large 
        Jonas Korene Novak, Matic Flegar \\
        jonas.korene.novak@studnets.vegova.si \\
        matic.flegar@students.vegova.si \\
        Vegova Ljubljana \\
       	Razred R3D \\
        \today
    \par}
    \vfill
    % no page number
    \thispagestyle{empty}
\end{titlepage}

\setcounter{page}{1} % start numbering at 1
\pagenumbering{arabic}

\tableofcontents
\newpage

\section{Uvod}
Za svoj zaključni projekt pri predmetu IOT, v 3. letniku izobraževalnega programa \textit{Tehnik Računalništva} na Vegovi, sva se odločila narediti enostavni \textbf{Avto na dalinjsko upravo}.

To poročilo bo, v sledečih poglavjih predstavilo postopek izdelave, težave, rešitve, in morebitno kaj več.

\section{Predstavitev in Analiza Projekta}
Najin izbran projekt je bil avto na daljinsko, saj se nama je zdelo zanimivo, kako lahko narediva avto ki se dobro upravlja, z opremo ki jo imava na voljo.

Za svoj projekt sva uporabila \textbf{Raspberry Pi Pico W} kot svoj mikrokontroller, že-narejen PCB od \textbf{Freenove 4WD Car Kita} in \textbf{DC Motorje} za pogon.

Na začetku sva hotela spisati kodo za MCU (\textit{Mikrokontroller - RPi Pico W}) v jeziku \textbf{C}, vendar sva zaradi hitre iteracije različic in male praktične razlike v hitrosti (saj hitrost procesiranja ni bila kritična) prepisala kodo v bolj berljivem \textbf{MicroPythonu}.

\section{Težave in Rešitve}
Med izvedbo projekta sva hitro naletela na eno težavo, in sicer, metodo upravljanja. Saj smo se to učili pri pouku, sva želela na začetku uporabiti \textbf{Web Interface} za upravljanje, serviran preko \textbf{HTTP-ja}, vendar je to razkrilo nekaj kritičnih težav:
\begin{enumerate}
	\item HTTP temelji na \textbf{TCP-ju} (ang. \textit{Transmission Control Protocol}). TCP je \textbf{povezaven protokol}, kar pomeni da morata klient (naš Web Interface) in strežnik (naš MCU) držati konstantno povezavo, kar pomeni za je čas za vzpostavljanje povezave daljši.
	\item (\textit{V kontekstu z točko 1}) TCP je \textbf{počasen}. TCP ima glavo veliko \textbf{od 20 do 60 bajtov}, ki jih morata klient in strežnik dekodirati, preurediti v primeru zamešanega zaporedja (kar sicer ni teževa na močnem klientu, vendar naš strežnik - Pico W, ni ravno hiter), itd.
	\item HTTP \textbf{ni narejen za take stvari}. HTTP je, kot ime pove, narejen za prenašanje \textbf{Hiperteksta} (ang. \textit{Hypertext}) (torej spletnih strani), ne pa podatkov za kontrolo avta.
\end{enumerate}

\noindent Zato sva se odločila \textbf{opustiti HTTP in TCP} in uporabiti \textbf{svoj binarni protokol}, ki temelji na \textbf{UDP} (ang. \textit{User Datagram Protocol}). UDP ima sicer tudi svoje težave, vendar je za najino uporabo bolj primeren.

UDP in svoj protokol nam sicer \textbf{odstrani garancijo} TCP-ja da bodo podatki pravilno dostavljeni od A do B, vendar za našo uporabo, kjer pošiljamo ~30 paketov na sekundo, je ena izguba vsakih par 100 paketov \textbf{zanemarljiva}. Dodatno nam uporaba svojega binarnega protokola tudi dopusti da imamo \textbf{popolno kontrolo} nad \textbf{vsebino paketa} in ne dobimo zraven še ogromno t.i. \textit{overheada} od HTTP-ja.

\bigskip
\newpage

\noindent Končno primerjavo lahko vidite tukaj:

\begin{center}
\begin{tabular}{|l|l|l|}
\hline
\textbf{Feature} & \textbf{TCP + HTTP} & \textbf{UDP + Bin. Protokol} \\
\hline
Tip Povezave & Povezljiv & Nepovezljiv \\
\hline
Zanosljivost & Garantiran Prenos & \textit{Best-Effort} Prenos \\
\hline
Hitrost & Počasen & Hiter \\
\hline
Preverjanje Napak & Da & Samo osnovni checksum \\
\hline
Vrstni Red Paketov & Garantiran & Ni Garantiran \\
\hline
Velikost Glave & 20\textit{B} do 60\textit{B} & 8\textit{B} \\
\hline
Izkoriščenost Paketa & Mala & Popolna \\
\hline
\end{tabular}
\end{center}

\section{Končna Izvedba Projekta}

\subsection{Strojna Oprema}
\begin{itemize}
	\item \textbf{MCU} - Raspberry Pi Pico W
	\item \textbf{PCB} - Freenove 4WD Car PCB
	\item \textbf{Pogon} - DC Motorji in Mecanum Kolesa
	\item \textbf{Napajanje} - \textit{2x} N18650CP Baterija
\end{itemize}

\noindent Komponente so povezane med sabo več ali manj, direktno.

\subsection{Programska Oprema - Definicije}

\subsubsection{Definirani Pini}
\begin{verbatim}
PIN_MOTOR_PWM_RIGHT3 = 9
PIN_MOTOR_PWM_RIGHT4 = 8
PIN_MOTOR_PWM_LEFT1  = 18
PIN_MOTOR_PWM_LEFT2  = 19
PIN_MOTOR_PWM_LEFT3  = 21
PIN_MOTOR_PWM_LEFT4  = 20
\end{verbatim}

\subsubsection{Definirani Paketi}

\vspace{0.25cm}

\noindent\begin{bytefield}[bitwidth=1.1em]{32}
\bitheader{0-31} \\
\begin{rightwordgroup}{Kontrolni Paket}
\bitbox{8}{0x00} &
\bitbox{24}{NEUPORABLJENO} \\
\bitbox{32}{Left X} \\
\bitbox{32}{Left Y} \\
\bitbox{32}{Right X} \\
\bitbox{32}{Right Y}
\end{rightwordgroup}
\end{bytefield}

\vspace{0.75cm}

\noindent\begin{bytefield}[bitwidth=1.1em]{32}
\bitheader{0-31} \\
\begin{rightwordgroup}{Adv. Paket}
\bitbox{8}{0x01} &
\bitbox{24}{NEUPORABLJENO} \\
\bitbox{32}{IPv4 MCU-ja}
\end{rightwordgroup}
\end{bytefield}


\subsection{Programska Oprema}
Spisana v MicroPythonu, koda deluje v večih korakih.

\begin{enumerate}

\item Program se zažene preko funkcije \texttt{main()}.

\item Funkcija \texttt{main()} požene asinhroni strežnik z:
\begin{verbatim}
asyncio.run(run_server())
\end{verbatim}

\item Funkcija \texttt{run\_server()} najprej inicializira Wi-Fi povezavo:
\begin{enumerate}
    \item Aktivira WLAN v načinu odjemalca.
    \item Poskuša povezati napravo na podano SSID omrežje.
    \item Čaka največ 10 sekund na uspešno povezavo.
    \item Če povezava ne uspe, se program zaključi.
\end{enumerate}

\item Po uspešni povezavi program inicializira motorje:
\begin{enumerate}
    \item Ustvari PWM izhode za vse štiri motorje.
    \item Vsak motor ima:
    \begin{itemize}
        \item PWM za vožnjo naprej,
        \item PWM za vožnjo nazaj.
    \end{itemize}
\end{enumerate}

\item Program nato ustvari UDP socket:
\begin{enumerate}
    \item Omogoči broadcast komunikacijo.
    \item Veže socket na naslov \texttt{0.0.0.0:8888}.
    \item Socket nastavi v neblokirni način.
\end{enumerate}

\item Zažene se asinhrona naloga za periodično oglaševanje IP naslova:
\begin{enumerate}
    \item Vsako sekundo naprava pošlje broadcast UDP paket.
    \item Paket vsebuje:
    \begin{itemize}
        \item tip paketa \texttt{0x01},
        \item lokalni IP naslov naprave.
    \end{itemize}
\end{enumerate}

\item Glavna zanka strežnika začne poslušati UDP pakete:
\begin{enumerate}
    \item Program neprestano kliče \texttt{recvfrom()}.
    \item Če ni podatkov:
    \begin{itemize}
        \item program kratko počaka,
        \item nato nadaljuje poslušanje.
    \end{itemize}
\end{enumerate}

\item Ko UDP paket prispe:
\begin{enumerate}
    \item Program prebere prvi bajt kot tip paketa.
    \item Če tip paketa ni podprt:
    \begin{itemize}
        \item izpiše opozorilo,
        \item paket ignorira.
    \end{itemize}
\end{enumerate}

\item Če je paket tipa \texttt{INPUT\_PACKET\_TYPE}:
\begin{enumerate}
    \item Program preveri velikost paketa.
    \item Paket mora vsebovati:
    \begin{itemize}
        \item 1 bajt tipa,
        \item 4 vrednosti \texttt{float32}.
    \end{itemize}
\end{enumerate}

\item Program dekodira vhodne osi joysticka:
\begin{enumerate}
    \item Poskusi interpretacijo:
    \begin{itemize}
        \item little-endian,
        \item big-endian.
    \end{itemize}

    \item Preveri, ali so vrednosti smiselne:
    \begin{itemize}
        \item niso NaN,
        \item niso neskončne,
        \item niso izven dovoljenega območja.
    \end{itemize}
\end{enumerate}

\item Po uspešnem dekodiranju program pridobi:
\begin{itemize}
    \item \texttt{left\_x},
    \item \texttt{left\_y},
    \item \texttt{right\_x},
    \item \texttt{right\_y}.
\end{itemize}

\item Program izvede ``tank drive'' logiko:
\begin{enumerate}
    \item Leva palica določa hitrost leve strani vozila.
    \item Desna palica določa hitrost desne strani vozila.
    \item Y os se obrne.
    \item Na vhod se uporabi deadzone filter.
    \item Vrednosti se omejijo na območje od -1 do 1.
    \item Pretvorijo se v hitrost motorjev od -100 do 100.
\end{enumerate}

\item Funkcija \texttt{set\_motor\_speed()}:
\begin{enumerate}
    \item določi smer vrtenja,
    \item izračuna PWM intenziteto,
    \item aktivira forward ali reverse PWM.
\end{enumerate}

\item Program neprestano nadaljuje sprejemanje novih UDP ukazov.

\item Če pride do prekinitve programa:
\begin{enumerate}
    \item ustavi IP broadcast nalogo,
    \item vse motorje nastavi na hitrost 0,
    \item deaktivira PWM izhode,
    \item zapre UDP socket,
    \item program se zaključi.
\end{enumerate}

\end{enumerate}

\section{Zaključek}

Pri izdelavi projekta \textit{Avto na Daljinsko Upravo} sva pridobila veliko praktičnega znanja iz področij programiranja mikrokontrolerjev, omrežne komunikacije in načrtovanja lastnih protokolov. Med delom sva se srečala z različnimi tehničnimi težavami, predvsem pri izbiri komunikacijskega protokola in optimizaciji odzivnosti upravljanja vozila.

S primerjavo različnih pristopov sva ugotovila, da je za sistem, kjer je pomembna hitrost in nizka zakasnitev, uporaba UDP protokola bistveno primernejša od HTTP komunikacije preko TCP-ja. Prav tako sva spoznala prednosti uporabe lastnega binarnega protokola, saj omogoča manjši \textit{overhead}, hitrejšo obdelavo podatkov in večjo kontrolo nad vsebino paketov.

Projekt nama je omogočil tudi boljše razumevanje delovanja PWM signalov, asinhronega programiranja v MicroPythonu ter komunikacije med klientom in strežnikom v realnem času. Poleg tehničnega znanja sva izboljšala tudi sposobnost odpravljanja napak, testiranja in sodelovanja pri razvoju večjega projekta.

Končni rezultat je funkcionalen daljinsko voden avtomobil, ki se odziva hitro in stabilno, hkrati pa predstavlja dobro osnovo za nadaljnje nadgradnje, kot so dodajanje senzorjev, kamere, avtonomne vožnje ali naprednejših načinov upravljanja.

S projektom sva uspešno dosegla zastavljene cilje ter pridobila veliko uporabnih izkušenj, ki nama bodo koristile pri nadaljnjem izobraževanju in prihodnjih projektih.

\end{document}