Přidán text + organizace souborů + skript na generování tiskových souborů

This commit is contained in:
Tomáš Batelka 2024-12-30 21:59:39 +01:00
parent 9ddebfde03
commit 8acad6c9ad
33 changed files with 147 additions and 8 deletions

4
.gitignore vendored
View file

@ -9,4 +9,6 @@ Private
.DS_Store .DS_Store
tex/out/* tex/out/*
!tex/out/*.pdf !tex/out/*.pdf
__pycache__/

View file

@ -2,5 +2,8 @@
"latex-workshop.formatting.latex": "latexindent", "latex-workshop.formatting.latex": "latexindent",
"latex-workshop.latex.outDir": "%DIR%/out", "latex-workshop.latex.outDir": "%DIR%/out",
"files.autoSave": "afterDelay", "files.autoSave": "afterDelay",
"latex-workshop.synctex.afterBuild.enabled": true "latex-workshop.synctex.afterBuild.enabled": true,
"latex-workshop.view.outline.sync.viewer": true,
"editor.scrollbar.scrollByPage": true,
"editor.find.cursorMoveOnType": true
} }

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
3mf/base/Frame_Tip.3mf Normal file

Binary file not shown.

Binary file not shown.

View file

@ -4,9 +4,10 @@
```bash ```bash
├── .vscode # Konfigurace prostředí pro sazbu ├── .vscode # Konfigurace prostředí pro sazbu
├── 3mf # 3mf soubory vhodné ke slicování
├── cad # Zdrojové soubory CAD ├── cad # Zdrojové soubory CAD
├── step # STEP soubory vhodné ke slicování
├── README.md # Informace k projektu (tento soubor) ├── README.md # Informace k projektu (tento soubor)
├── scripts # Skripty
└── tex # Text práce └── tex # Text práce
├── generated # Generované stránky BP ├── generated # Generované stránky BP
├── images # Obrázky použité v BP ├── images # Obrázky použité v BP
@ -28,5 +29,16 @@ Práce je kompilovaná sázecím systémem Latex a modifikovaným balíčkem the
##### Závislosti ##### Závislosti
- texlive
- texlive-langczechslovak - texlive-langczechslovak
- texlive-langgreek - texlive-langgreek
### Skripty
#### Generování tiskových souborů
Pro generování tiskových souborů slouží skript `generate_3mf_files.py` spouštěný následujícím příkazem:
```sh
./generate_3mf_files.py
```

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

65
scripts/generate_3mf_files.py Executable file
View file

@ -0,0 +1,65 @@
#!/usr/bin/freecadcmd
import os
import FreeCAD
import Mesh
# Define the project root directory
project_root = os.path.abspath(
os.path.join(os.path.dirname(os.path.realpath(__file__)), os.pardir)
)
# Define the directories for CAD files and 3MF export files
printed_cad_dir = os.path.join(project_root, "cad", "printed")
printed_3mf_dir = os.path.join(project_root, "3mf")
# List to keep track of files that failed to export
failed_files = []
# Traverse the printed CAD directory and its subdirectories
for root, dirs, files in os.walk(printed_cad_dir):
for file in files:
if file.endswith(".FCStd"):
# Absolute path of the CAD file
file_path = os.path.join(root, file)
# Abslute path for the exported 3MF file
output_path = os.path.join(
printed_3mf_dir, os.path.relpath(file_path, printed_cad_dir)
).replace(".FCStd", ".3mf")
# Create the output directory if it doesn't already exist
os.makedirs(os.path.dirname(output_path), exist_ok=True)
FreeCAD.Console.PrintMessage(f"\nExporting {file_path}\n")
# Open the FreeCAD document and recompute it
doc = FreeCAD.openDocument(file_path)
FreeCAD.setActiveDocument(doc.Name)
FreeCAD.ActiveDocument.recompute()
# Get the body object from the document
body = doc.getObject("Body")
if body is None:
FreeCAD.Console.PrintError(f"No 'Body' found in {file}\n")
FreeCAD.closeDocument(doc.Name)
failed_files.append(file_path)
continue
# Try to export the body to a 3MF file
try:
Mesh.export([body], output_path)
except Exception as e:
FreeCAD.Console.PrintError(f"Error exporting {file}: {e}\n")
failed_files.append(file_path)
# Close the FreeCAD document
FreeCAD.closeDocument(doc.Name)
# Print the result of the export and the files that failed
if failed_files:
FreeCAD.Console.PrintError("\nThe following files failed to export:\n")
for file in failed_files:
FreeCAD.Console.PrintError(f" - {file}\n")
else:
FreeCAD.Console.PrintMessage("\nAll files have been exported successfully.\n")

View file

@ -37,4 +37,12 @@
title = {x-scara}, title = {x-scara},
year = {2023}, year = {2023},
note = {GitHub repository} note = {GitHub repository}
}
@misc{klipper_code_overview,
title = {Klipper Code Overview},
author = {{Klipper 3D}},
year = {2023},
url = {https://www.klipper3d.org/Code_Overview.html},
note = {Accessed: 2023-10-10}
} }

Binary file not shown.

View file

@ -10,25 +10,74 @@ Mnou vytvářené modely vychází z projektu x-scara. \cite{x-scara} Model je r
\subsection{Základna} \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 vodící tyči o průměru 8mm. 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. 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 vodící tyči o průměru 8mm. 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.
V zadní části zakladny je též prostor pro upevnění elektroniky. Za PMMA panelem jsou přimontovány dvě DIN lišty, na které jsou pomocí adaptérů upevněny jednotlivé elektronické prvky. Pro spojení hliníkových profilů jsem zvolil techniku "Blind Joint", která umožňuje pevné a levné 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.
V zadní části zakladny je též prostor pro upevnění elektroniky. Za akrylovým panelem jsou přimontovány dvě DIN lišty, na které jsou pomocí adaptérů upevněny jednotlivé elektronické prvky.
\section{Implementace kinematiky scara do Klippy} \section{Implementace kinematiky scara do Klippy}
Pro další výpočty je potřebné znát Elbow Crosstalk Ratio (převodový poměr ozubených řemenic v ose ramene vůči řemenici v ose kloubu). 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ážne 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 rozraní CFFI (C Foreign Function Interface). \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).
Pro další výpočty je potřebné znát Elbow Crosstalk Ratio (převodový poměr řemenice v ose ramene vůči řemenici v ose kloubu).
\begin{equation} \begin{equation}
ECR = \frac { n_S } { n_E } ECR = \frac { n_S } { n_E }
\end{equation} \end{equation}
\section{Přímá kinematika} \subsubsection{Přímá kinematika}
\begin{equation}
\phi_S = a
\end{equation}
\begin{equation}
\phi_E = b - \frac{a}{ECR}
\end{equation}
\begin{equation}
a\_sin = - \sin(\phi_S) \cdot L_1
\end{equation}
\begin{equation}
a\_cos = \cos(\phi_S) \cdot L_1
\end{equation}
\begin{equation}
b\_sin = - \sin(\phi_S + \phi_E) \cdot L_2
\end{equation}
\begin{equation}
b\_cos = \cos(\phi_S + \phi_E) \cdot L_2
\end{equation}
Nakonec 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 = a\_sin + b\_sin + x_{offset}
\end{equation}
\begin{equation}
y = a\_cos + b\_cos + y_{offset}
\end{equation}
\subsection{Inverzní kinematika} \subsubsection{Inverzní kinematika}
Nejprve je třeba kompenzovat offset polohy TCP v osách x a y. Nejprve je třeba kompenzovat offset polohy TCP v osách x a y.
\begin{equation}
x = - (raw_x - x_{offset})
\end{equation}
\begin{equation}
y = (raw_y - y_{offset})
\end{equation}
Dalším krokem je výpočet vzdálenosti od počátku. Dalším krokem je výpočet vzdálenosti od počátku.
\begin{equation} \begin{equation}
hypot = \sqrt{x^2 y^2} hypot = \sqrt{x^2 + y^2}
\end{equation} \end{equation}
Dále se vypočítají úhly ramen \(\phi_S\) (shoulder) a \(\phi_E\) (elbow). Dále se vypočítají úhly ramen \(\phi_S\) (shoulder) a \(\phi_E\) (elbow).