\chapter{Praktická část}

\section{3D model}
Pro modelování dílů jsem se rozhodl použít CAD software FreeCAD. Pro tento CAD jsem se rozhodl proto, že je open source a~tedy dostupný pro každého, kdo jej chce používat. Software FreeCAD byl nedávno vydán ve verzi 1.0, což ve světě open-source mj. znamená připravenost pro použití v~praxi.

FreeCAD je univerzální parametrický modelovací systém vydaný pod licencí LGPL, tudíž jej lze libovolně šířit a~modifikovat. FreeCAD je také multiplatformní, tudíž jej lze používat v~operačních systémech Windows, Linux i~MacOS. FreeCAD je napsán v~jazyce C++ a~pro manipulaci s~geometrií využívá knihovny OpenCASCADE. FreeCAD lze jej rozšiřovat pomocí zásuvných modulů (pluginů). FreeCAD též umožňuje psaní vlastních skriptů v~jazyce Python a~nahrávání vlastních maker. \cite{FreeCAD_wiki}

Můj návrh tiskárny vychází z~projektu x-scara \cite{x-scara}. Ve svém návrhu jsem použil shodné rozměry hliníkových profilů, trapézových a~vodících tyčí. Vzhledem k~tomuto faktu se můj návrh projektu x-scara velmi podobá, ačkoliv můj návrh nevyužívá žádný díl z~tohoto projektu.

Model je rozdělen do tří dílčích částí. První je základna, druhou skříň s~elektronikou, třetí je rameno a~čtvrtou je nástroj -- tisková hlava.

Soubory ve formátu FCStd (zdrojové soubory modelů) jsou organizovány podle části, do které spadají. Pro generování tiskových souborů ve formátu 3MF (3D Manufacturing Format) vhodného pro slicer slouží python skript, který využívá FreeCAD API. Tento skript postupně otevře, přepočítá a~exportuje všechny díly. Skript exportuje pouze ty objekty, které jsou obsažené v~kontejneru Std Part. Jako název souboru se volí název dílu, který obsahuje i~počet výtisků konkrétního dílu. K~výrobě tištěných dílů pak postačí adresář 3mf a~soubory, které obsahuje.

\subsection{Základna}
Základna je složena ze hliníkových profilů 20x20mm a~20x40mm. Na základnu je upevněno rameno, které se díky lineárně valivým ložiskům pohybuje po třech vodících tyčích o~průměru 8mm. v~horní části základny je upevněn krokový motor, který pomocí trapézové tyče o~průměru 8mm pohybuje ramenem v~ose Z. Druhá strana trapézové tyče je uložena v~ložisku ve spodní části základny.

Pro spojení hliníkových profilů jsem zvolil metodu "Blind Joint", která umožňuje pevné spojení dvou hliníkových profilů. Tuto techniku jsem zvolil i~z důvodů snadnější montáže akrylové desky a~možnosti zapuštění elektroniky do rámu tiskárny.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.75\textwidth]{images/2_prakticka_cast/Base_Isometric.png}
    \caption[Náhled konstrukce základny]{Náhled konstrukce základny (v zadní části základny je umístěna skříň s~elektronikou)~\cite{freecad}}
    \label{fig:base}
\end{figure}

\subsection{Skříň s~elektronikou}

V zadní části základny je umístěna skříň s~elektronickými komponentami tiskárny. Ta je od prostoru tiskárny oddělena akrylovou deskou, která je upevněna přítlakem DIN lišt. Pro upevnění elektronických komponent slouží tři DIN lišty upevněné z~vnitřní části bočních hliníkových profilů. Elektronika je od okolí oddělena plastovými díly, které společně tvoří skříň, chránící před nechtěným dotykem. Uvnitř skříně najdeme upevněný zdroj, řídící desku, jednodeskový počítač Raspberry Pi a~sadu řadových svorek.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.75\textwidth]{images/2_prakticka_cast/Base_Rear.png}
    \caption[Náhled konstrukce skříně s~elektronikou]{Náhled konstrukce skříně s~elektronikou (pohled ze stran)~\cite{freecad}}
    \label{fig:base-rear}
\end{figure}

% cSpell:ignore PITFT, SHCS, IEC, C14
Po obvodu skříně jsou upevněny další části tiskárny. Jednou z~nich je dotykový displej BTT PITFT43, který je ke konstrukci skříně upevněn na pohyblivém pantu. Tento pant je realizován pomocí dílu upevněného ke skříni, zadní části krytu displeje, vložky pro jeho dotažení a~šroubu SHCS M3x60. V~přední části se také nachází kolébkový spínač pro spínání napájení celé tiskárny. Pod spínačem se nachází jeden z~ventilátorů jehož účelem je nasát chladný vzduch do skříně. Na opačné straně v~horní části je též upevněn ventilátor, který naopak odsává teplý vzduch. Na opačné straně displeji je též upevněn keystone s~RJ-45 konektorem pro připojení tiskárny do počítačové sítě. Pod ním se ještě nachází napájecí konektor IEC 60320 C14 s~tavnou pojistkou.

\begin{figure}[H]
    \centering
    \includegraphics[width=0.75\textwidth]{images/2_prakticka_cast/Base_Sides.png}
    \caption[Náhled konstrukce skříně s~elektronikou (ze stran)]{Náhled konstrukce skříně s~elektronikou (ze stran)~\cite{freecad}}
    \label{fig:base-sides}
\end{figure}


\section{Tisk}

Nastavení sliceru vychází z~nastavení doporučení projektu Voron. Jedná se tedy následující nastavení:

\begin{itemize}
    \item Výška vrstvy: \textbf{0,2mm}
    \item Šířka extruze: \textbf{0,4mm}
    \item Výplň: \textbf{40\%}
    \item Typ výplně: mřížka, \textbf{gyroid}, plástev, trojúhelníky nebo kubický
    \item Počet stěn: \textbf{4}
    \item Plných vrstev: \textbf{5 vrchních}, \textbf{5 spodních}
  \end{itemize}

Doporučenými materiály pro tisk jsou: \textbf{ASA}, ABS nebo PETG.

\section{Implementace kinematiky SCARA do Klippy}
% cSpell:disable-next-line
Klippy je část firmwaru Klipper, která běží na počítači uvnitř 3D tiskárny, ke kterému je připojena řídící deska. Kód je napsán převážně v~jazyce Python, přičemž některé funkce jsou implementovány v~jazyce C. Volání těchto funkcí je realizováno použitím rozhraní CFFI (C Foreign Function Interface). Klippy slouží k~interpreataci výrobních instrukcí -- GCode, které jsou přeloženy na volání iterních metod. Tyto volání jsou odesílány po sběrnici USB do řídící desky, která například generuje pulzy pro krokové motory nebo spíná topná tělesa. \cite{klipper_code_overview}

\subsection{Přímá a~inverzní kinematika}
Kinematické transformace se používají k~převodu natočení kloubů na souřadnice koncového bodu (přímá transformace) a~naopak (inverzní transformace). Pro výpočet transformace je třeba znát délky ramen \(L_1\) a~\(L_2\), offsety ramen \(x_{offset}\) a~\(y_{offset}\) a~Elbow Crosstalk Ratio (ECR).

Elbow Crosstalk Ratio (převodový poměr řemenice v~ose ramene vůči řemenici v~ose kloubu) získáme dosazením počtu zubů řemenice ramene \(n_S\) a~počtu zubů řemenice v~kloubu \(n_E\).

\begin{equation}
    ECR = \frac { n_S } { n_E }
\end{equation}

\subsubsection{Přímá kinematika}

Protože rotace motoru v~ose ramene ovlivňuje rotaci motoru v~ose kloubu, je třeba tento vliv kompenzovat. Tím dostaneme úhel \(\Phi_E\), který je potřeba pro výpočet skutečné polohy nástroje. Pro výpočet známe úhel motoru ramene \(\Phi_{S_M}\) a~úhel motoru kloubu \(\Phi_{S_E}\).

\begin{equation}
    \Phi_S = \Phi_{S_M}
\end{equation}

\begin{equation}
    \Phi_E = \Phi_{E_M}  - \frac{ \Phi_{S_M} } { ECR }
\end{equation}

Pro další výpočty potřeba převést úhly motorů \(\Phi_{S_M}\) (shoulder) a~\(\Phi_E\) (elbow) na radiány, protože goniometrické funkce v~knihovně math programovacího jazyka Python pracuje s~úhly v~radiánech. V~kódu pak lze pro převod použít metodu \texttt{math.radians()}.

\begin{equation}
    \phi_S = \Phi_S \cdot \frac { \pi } { 180 } [\si{\radian}]
\end{equation}

\begin{equation}
    \phi_E = \Phi_E \cdot \frac { \pi } { 180 } [\si{\radian}]
\end{equation}

Poté je potřeba přičíst odsazení souřadného systému nástroje vůči souřadnému systému báze (konkrétně odsazení kloubu ramene vůči počátku tiskové podložky). 

\begin{equation}
    x = \sin(\phi_S) \cdot L_1 + \sin(\phi_S + \phi_E) \cdot L_2
\end{equation}

\begin{equation}
    y = \cos(\phi_S) \cdot L_1 + \cos(\phi_S + \phi_E) \cdot L_2
\end{equation}

Nakonec je potřeba přepočítat souřadnice nástroje vůči středu tiskové podložky na souřadnice vůči počátku tiskárny.

\begin{equation}
    x_{raw} = - x + x_{offset}
\end{equation}

\begin{equation}
    y_{raw} = y + y_{offset}
\end{equation}

\subsubsection{Inverzní kinematika}
Nejprve je potřeba převést absolutní souřadnice nástroje vůči počátku tiskárny na souřadnice vztažené k~středu tiskové podložky.

\begin{equation}
    x = - (x_{raw} - x_{offset})
\end{equation}

\begin{equation}
    y = (y_{raw} - y_{offset})
\end{equation}

Dalším krokem je výpočet vzdálenosti od počátku.

\begin{equation}
    % cSpell:disable-next-line
    hypot = \sqrt{x^2 + y^2}
\end{equation}

Dále se vypočítají úhly ramen \(\phi_S\) (shoulder) a~\(\phi_E\) (elbow).

\begin{equation}
    % cSpell:disable-next-line
    \phi_S = arctan2 \left( x, y \right) - arccos \left( \frac { x^2 + y^2 + L_1^2 - L_2^2 } { 2 \cdot L_1 \cdot hypot } \right) [\si{\radian}]
\end{equation}

kde \(L_1\) a~\(L_2\) jsou délky ramen.

\begin{equation}
    \phi_E = \frac { \phi_S } { ECR } + arccos \left( \frac { x^2 + y^2 + L_1^2 + L_2^2 } { 2 \cdot L_1 \cdot L_2 } \right) [\si{\radian}]
\end{equation}
    
kde \(ECR\) je Elbow Crosstalk Ratio, \(L_1\) a~\(L_2\) jsou délky ramen.

Následně stačí převést úhel v~radiánech na stupně.

\begin{equation}
    \Phi_S = \phi_S \cdot \frac { 180 } { \pi } [\si{\degree}]
\end{equation}

\begin{equation}
    \Phi_E = \phi_E \cdot \frac { 180 } { \pi } [\si{\degree}]
\end{equation}

% \section{Konfigurace tiskárny}

% \section{Kalibrace tiskárny}