whopsie only copied the linkfile main
authorNils <forssennils@gmail.com>
Tue, 4 Jun 2024 21:08:20 +0000 (23:08 +0200)
committerNils <forssennils@gmail.com>
Tue, 4 Jun 2024 21:08:20 +0000 (23:08 +0200)
86 files changed:
hardcopy/docs/.gitignore [new file with mode: 0644]
hardcopy/docs/anvhandl/.gitkeep [new file with mode: 0644]
hardcopy/docs/anvhandl/anvhandl_v1_1.pdf [new file with mode: 0644]
hardcopy/docs/designspec/.gitkeep [new file with mode: 0644]
hardcopy/docs/designspec/Designspecifikaiton_v_1_0.pdf [new file with mode: 0644]
hardcopy/docs/designspec/Designspecifikation_v_0_1.pdf [new file with mode: 0644]
hardcopy/docs/efterstudie/.gitkeep [new file with mode: 0644]
hardcopy/docs/efterstudie/efterstudie_v1_0.pdf [new file with mode: 0644]
hardcopy/docs/kandidatrapport/.gitkeep [new file with mode: 0644]
hardcopy/docs/kandidatrapport/kandidatrapport_v1_1.pdf [new file with mode: 0644]
hardcopy/docs/kappa/.gitkeep [new file with mode: 0644]
hardcopy/docs/kappa/Kappa_G8_v1_0.pdf [new file with mode: 0644]
hardcopy/docs/kappa/Kappa_G8_v1_1.pdf [new file with mode: 0644]
hardcopy/docs/kravspec/.gitkeep [new file with mode: 0644]
hardcopy/docs/kravspec/Kravspec_0.1.pdf [new file with mode: 0644]
hardcopy/docs/kravspec/Kravspec_1.0.pdf [new file with mode: 0644]
hardcopy/docs/kravspec/Kravspecifikation_1_1.pdf [new file with mode: 0644]
hardcopy/docs/projektplan/.gitkeep [new file with mode: 0644]
hardcopy/docs/projektplan/Projektplan_0.1.pdf [new file with mode: 0644]
hardcopy/docs/projektplan/Projektplan_v1_0.pdf [new file with mode: 0644]
hardcopy/docs/readme.md [new file with mode: 0644]
hardcopy/docs/skrivuppgift/kommunikation/.gitkeep [new file with mode: 0644]
hardcopy/docs/skrivuppgift/kommunikation/G08-skrivuppgift-kommunikation-v01.pdf [new file with mode: 0644]
hardcopy/docs/skrivuppgift/kommunikation/G08-skrivuppgift-kommunikation-v10.pdf [new file with mode: 0644]
hardcopy/docs/skrivuppgift/konstruktion/.gitkeep [new file with mode: 0644]
hardcopy/docs/skrivuppgift/regler/.gitkeep [new file with mode: 0644]
hardcopy/docs/skrivuppgift/regler/reglerforstudie.pdf [new file with mode: 0644]
hardcopy/docs/skrivuppgift/sensor/.gitkeep [new file with mode: 0644]
hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.1.pdf [new file with mode: 0644]
hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.2.pdf [new file with mode: 0644]
hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.3.pdf [new file with mode: 0644]
hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.4.pdf [new file with mode: 0644]
hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v1.0.pdf [new file with mode: 0644]
hardcopy/docs/statusrapport/.gitkeep [new file with mode: 0644]
hardcopy/docs/statusrapport/statusrapport.md [new file with mode: 0644]
hardcopy/docs/systemskiss/.gitkeep [new file with mode: 0644]
hardcopy/docs/systemskiss/Systemskis_v1_0.pdf [new file with mode: 0644]
hardcopy/docs/systemskiss/Systemskiss_v0_1.pdf [new file with mode: 0644]
hardcopy/docs/tekdok/.gitkeep [new file with mode: 0644]
hardcopy/docs/tekdok/TekniskDokumentation_v1_0.pdf [new file with mode: 0644]
hardcopy/docs/tekdok/Teknisk_dokumentation_v1_1.pdf [new file with mode: 0644]
hardcopy/docs/tidplan/.gitkeep [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV13.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV14.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV14_2.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV15.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV16.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV16_2.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV17.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV18.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV19.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV20.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV21.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV22.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/TidplanV23.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/Tidplan_0_1.xlsx [new file with mode: 0644]
hardcopy/docs/tidplan/Tidplan_v1_0.xlsx [new file with mode: 0644]
hardcopy/docs/tidrapport/Tidrapport.md [new file with mode: 0644]
hardcopy/hardware/.gitignore [new file with mode: 0644]
hardcopy/hardware/README.md [new file with mode: 0644]
hardcopy/hardware/schematic.kicad_pcb [new file with mode: 0644]
hardcopy/hardware/schematic.kicad_prl [new file with mode: 0644]
hardcopy/hardware/schematic.kicad_pro [new file with mode: 0644]
hardcopy/hardware/schematic.kicad_sch [new file with mode: 0644]
hardcopy/hardware/schematic_print_v0_1.pdf [new file with mode: 0644]
hardcopy/hardware/schematic_print_v0_2.pdf [new file with mode: 0644]
hardcopy/styrmodul/.gitignore [new file with mode: 0644]
hardcopy/styrmodul/README.md [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul.atsln [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul.atsuo [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/I2C.c [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/I2C.h [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/Styrmodul.componentinfo.xml [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/Styrmodul.cproj [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/lowpass.c [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/lowpass.h [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/main.c [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/motor.c [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/motor.h [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/purepursuit.c [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/purepursuit.h [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/trig_lookup.c [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/uart.c [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/uart.h [new file with mode: 0644]
hardcopy/styrmodul/Styrmodul/vector.h [new file with mode: 0644]
hardcopy/styrmodul/gen_trig_table.py [new file with mode: 0644]

diff --git a/hardcopy/docs/.gitignore b/hardcopy/docs/.gitignore
new file mode 100644 (file)
index 0000000..eda5d3d
--- /dev/null
@@ -0,0 +1,347 @@
+# Created by https://www.toptal.com/developers/gitignore/api/macos,latex
+# Edit at https://www.toptal.com/developers/gitignore?templates=macos,latex
+
+### LaTeX ###
+## Core latex/pdflatex auxiliary files:
+*.aux
+*.lof
+*.log
+*.lot
+*.fls
+*.out
+*.toc
+*.fmt
+*.fot
+*.cb
+*.cb2
+.*.lb
+
+## Intermediate documents:
+*.dvi
+*.xdv
+*-converted-to.*
+# these rules might exclude image files for figures etc.
+# *.ps
+# *.eps
+# *.pdf
+
+## Generated if empty string is given at "Please type another file name for output:"
+# .pdf # Uncomment this line if laTeX is used.
+
+## Bibliography auxiliary files (bibtex/biblatex/biber):
+*.bbl
+*.bcf
+*.blg
+*-blx.aux
+*-blx.bib
+*.run.xml
+
+## Build tool auxiliary files:
+*.fdb_latexmk
+*.synctex
+*.synctex(busy)
+*.synctex.gz
+*.synctex.gz(busy)
+*.pdfsync
+
+## Build tool directories for auxiliary files
+# latexrun
+latex.out/
+
+## Auxiliary and intermediate files from other packages:
+# algorithms
+*.alg
+*.loa
+
+# achemso
+acs-*.bib
+
+# amsthm
+*.thm
+
+# beamer
+*.nav
+*.pre
+*.snm
+*.vrb
+
+# changes
+*.soc
+
+# comment
+*.cut
+
+# cprotect
+*.cpt
+
+# elsarticle (documentclass of Elsevier journals)
+*.spl
+
+# endnotes
+*.ent
+
+# fixme
+*.lox
+
+# feynmf/feynmp
+*.mf
+*.mp
+*.t[1-9]
+*.t[1-9][0-9]
+*.tfm
+
+#(r)(e)ledmac/(r)(e)ledpar
+*.end
+*.?end
+*.[1-9]
+*.[1-9][0-9]
+*.[1-9][0-9][0-9]
+*.[1-9]R
+*.[1-9][0-9]R
+*.[1-9][0-9][0-9]R
+*.eledsec[1-9]
+*.eledsec[1-9]R
+*.eledsec[1-9][0-9]
+*.eledsec[1-9][0-9]R
+*.eledsec[1-9][0-9][0-9]
+*.eledsec[1-9][0-9][0-9]R
+
+# glossaries
+*.acn
+*.acr
+*.glg
+*.glo
+*.gls
+*.glsdefs
+*.lzo
+*.lzs
+*.slg
+*.slo
+*.sls
+
+# uncomment this for glossaries-extra (will ignore makeindex's style files!)
+# *.ist
+
+# gnuplot
+*.gnuplot
+*.table
+
+# gnuplottex
+*-gnuplottex-*
+
+# gregoriotex
+*.gaux
+*.glog
+*.gtex
+
+# htlatex
+*.4ct
+*.4tc
+*.idv
+*.lg
+*.trc
+*.xref
+
+# hyperref
+*.brf
+
+# knitr
+*-concordance.tex
+# TODO Uncomment the next line if you use knitr and want to ignore its generated tikz files
+# *.tikz
+*-tikzDictionary
+
+# listings
+*.lol
+
+# luatexja-ruby
+*.ltjruby
+
+# makeidx
+*.idx
+*.ilg
+*.ind
+
+# minitoc
+*.maf
+*.mlf
+*.mlt
+*.mtc[0-9]*
+*.slf[0-9]*
+*.slt[0-9]*
+*.stc[0-9]*
+
+# minted
+_minted*
+*.pyg
+
+# morewrites
+*.mw
+
+# newpax
+*.newpax
+
+# nomencl
+*.nlg
+*.nlo
+*.nls
+
+# pax
+*.pax
+
+# pdfpcnotes
+*.pdfpc
+
+# sagetex
+*.sagetex.sage
+*.sagetex.py
+*.sagetex.scmd
+
+# scrwfile
+*.wrt
+
+# svg
+svg-inkscape/
+
+# sympy
+*.sout
+*.sympy
+sympy-plots-for-*.tex/
+
+# pdfcomment
+*.upa
+*.upb
+
+# pythontex
+*.pytxcode
+pythontex-files-*/
+
+# tcolorbox
+*.listing
+
+# thmtools
+*.loe
+
+# TikZ & PGF
+*.dpth
+*.md5
+*.auxlock
+
+# titletoc
+*.ptc
+
+# todonotes
+*.tdo
+
+# vhistory
+*.hst
+*.ver
+
+# easy-todo
+*.lod
+
+# xcolor
+*.xcp
+
+# xmpincl
+*.xmpi
+
+# xindy
+*.xdy
+
+# xypic precompiled matrices and outlines
+*.xyc
+*.xyd
+
+# endfloat
+*.ttt
+*.fff
+
+# Latexian
+TSWLatexianTemp*
+
+## Editors:
+# WinEdt
+*.bak
+*.sav
+
+# Texpad
+.texpadtmp
+
+# LyX
+*.lyx~
+
+# Kile
+*.backup
+
+# gummi
+.*.swp
+
+# KBibTeX
+*~[0-9]*
+
+# TeXnicCenter
+*.tps
+
+# auto folder when using emacs and auctex
+./auto/*
+*.el
+
+# expex forward references with \gathertags
+*-tags.tex
+
+# standalone packages
+*.sta
+
+# Makeindex log files
+*.lpz
+
+# xwatermark package
+*.xwm
+
+# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib
+# option is specified. Footnotes are the stored in a file with suffix Notes.bib.
+# Uncomment the next line to have this generated file ignored.
+#*Notes.bib
+
+### LaTeX Patch ###
+# LIPIcs / OASIcs
+*.vtc
+
+# glossaries
+*.glstex
+
+### macOS ###
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### macOS Patch ###
+# iCloud generated files
+*.icloud
+
+# End of https://www.toptal.com/developers/gitignore/api/macos,latex
\ No newline at end of file
diff --git a/hardcopy/docs/anvhandl/.gitkeep b/hardcopy/docs/anvhandl/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/anvhandl/anvhandl_v1_1.pdf b/hardcopy/docs/anvhandl/anvhandl_v1_1.pdf
new file mode 100644 (file)
index 0000000..a462e83
Binary files /dev/null and b/hardcopy/docs/anvhandl/anvhandl_v1_1.pdf differ
diff --git a/hardcopy/docs/designspec/.gitkeep b/hardcopy/docs/designspec/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/designspec/Designspecifikaiton_v_1_0.pdf b/hardcopy/docs/designspec/Designspecifikaiton_v_1_0.pdf
new file mode 100644 (file)
index 0000000..b14405a
Binary files /dev/null and b/hardcopy/docs/designspec/Designspecifikaiton_v_1_0.pdf differ
diff --git a/hardcopy/docs/designspec/Designspecifikation_v_0_1.pdf b/hardcopy/docs/designspec/Designspecifikation_v_0_1.pdf
new file mode 100644 (file)
index 0000000..53c3a99
Binary files /dev/null and b/hardcopy/docs/designspec/Designspecifikation_v_0_1.pdf differ
diff --git a/hardcopy/docs/efterstudie/.gitkeep b/hardcopy/docs/efterstudie/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/efterstudie/efterstudie_v1_0.pdf b/hardcopy/docs/efterstudie/efterstudie_v1_0.pdf
new file mode 100644 (file)
index 0000000..0328e3b
Binary files /dev/null and b/hardcopy/docs/efterstudie/efterstudie_v1_0.pdf differ
diff --git a/hardcopy/docs/kandidatrapport/.gitkeep b/hardcopy/docs/kandidatrapport/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/kandidatrapport/kandidatrapport_v1_1.pdf b/hardcopy/docs/kandidatrapport/kandidatrapport_v1_1.pdf
new file mode 100644 (file)
index 0000000..8769461
Binary files /dev/null and b/hardcopy/docs/kandidatrapport/kandidatrapport_v1_1.pdf differ
diff --git a/hardcopy/docs/kappa/.gitkeep b/hardcopy/docs/kappa/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/kappa/Kappa_G8_v1_0.pdf b/hardcopy/docs/kappa/Kappa_G8_v1_0.pdf
new file mode 100644 (file)
index 0000000..9ce51dc
Binary files /dev/null and b/hardcopy/docs/kappa/Kappa_G8_v1_0.pdf differ
diff --git a/hardcopy/docs/kappa/Kappa_G8_v1_1.pdf b/hardcopy/docs/kappa/Kappa_G8_v1_1.pdf
new file mode 100644 (file)
index 0000000..f4d1110
Binary files /dev/null and b/hardcopy/docs/kappa/Kappa_G8_v1_1.pdf differ
diff --git a/hardcopy/docs/kravspec/.gitkeep b/hardcopy/docs/kravspec/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/kravspec/Kravspec_0.1.pdf b/hardcopy/docs/kravspec/Kravspec_0.1.pdf
new file mode 100644 (file)
index 0000000..c96b60d
Binary files /dev/null and b/hardcopy/docs/kravspec/Kravspec_0.1.pdf differ
diff --git a/hardcopy/docs/kravspec/Kravspec_1.0.pdf b/hardcopy/docs/kravspec/Kravspec_1.0.pdf
new file mode 100644 (file)
index 0000000..32a47ca
Binary files /dev/null and b/hardcopy/docs/kravspec/Kravspec_1.0.pdf differ
diff --git a/hardcopy/docs/kravspec/Kravspecifikation_1_1.pdf b/hardcopy/docs/kravspec/Kravspecifikation_1_1.pdf
new file mode 100644 (file)
index 0000000..fecaf39
Binary files /dev/null and b/hardcopy/docs/kravspec/Kravspecifikation_1_1.pdf differ
diff --git a/hardcopy/docs/projektplan/.gitkeep b/hardcopy/docs/projektplan/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/projektplan/Projektplan_0.1.pdf b/hardcopy/docs/projektplan/Projektplan_0.1.pdf
new file mode 100644 (file)
index 0000000..03ce182
Binary files /dev/null and b/hardcopy/docs/projektplan/Projektplan_0.1.pdf differ
diff --git a/hardcopy/docs/projektplan/Projektplan_v1_0.pdf b/hardcopy/docs/projektplan/Projektplan_v1_0.pdf
new file mode 100644 (file)
index 0000000..01963b0
Binary files /dev/null and b/hardcopy/docs/projektplan/Projektplan_v1_0.pdf differ
diff --git a/hardcopy/docs/readme.md b/hardcopy/docs/readme.md
new file mode 100644 (file)
index 0000000..a6ccbc0
--- /dev/null
@@ -0,0 +1,3 @@
+Använd respektive underkatalog för inlämning av olika dokument i projektet.
+
+Underkatalogen tidrapport innehåller en fil Tidrapport.md som ska uppdateras med en tidrapport enligt instruktioner i filen.
\ No newline at end of file
diff --git a/hardcopy/docs/skrivuppgift/kommunikation/.gitkeep b/hardcopy/docs/skrivuppgift/kommunikation/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/skrivuppgift/kommunikation/G08-skrivuppgift-kommunikation-v01.pdf b/hardcopy/docs/skrivuppgift/kommunikation/G08-skrivuppgift-kommunikation-v01.pdf
new file mode 100644 (file)
index 0000000..780224e
Binary files /dev/null and b/hardcopy/docs/skrivuppgift/kommunikation/G08-skrivuppgift-kommunikation-v01.pdf differ
diff --git a/hardcopy/docs/skrivuppgift/kommunikation/G08-skrivuppgift-kommunikation-v10.pdf b/hardcopy/docs/skrivuppgift/kommunikation/G08-skrivuppgift-kommunikation-v10.pdf
new file mode 100644 (file)
index 0000000..ba11c9b
Binary files /dev/null and b/hardcopy/docs/skrivuppgift/kommunikation/G08-skrivuppgift-kommunikation-v10.pdf differ
diff --git a/hardcopy/docs/skrivuppgift/konstruktion/.gitkeep b/hardcopy/docs/skrivuppgift/konstruktion/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/skrivuppgift/regler/.gitkeep b/hardcopy/docs/skrivuppgift/regler/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/skrivuppgift/regler/reglerforstudie.pdf b/hardcopy/docs/skrivuppgift/regler/reglerforstudie.pdf
new file mode 100644 (file)
index 0000000..e49bf0f
Binary files /dev/null and b/hardcopy/docs/skrivuppgift/regler/reglerforstudie.pdf differ
diff --git a/hardcopy/docs/skrivuppgift/sensor/.gitkeep b/hardcopy/docs/skrivuppgift/sensor/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.1.pdf b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.1.pdf
new file mode 100644 (file)
index 0000000..918ce73
Binary files /dev/null and b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.1.pdf differ
diff --git a/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.2.pdf b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.2.pdf
new file mode 100644 (file)
index 0000000..d00e59b
Binary files /dev/null and b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.2.pdf differ
diff --git a/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.3.pdf b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.3.pdf
new file mode 100644 (file)
index 0000000..9a01ec8
Binary files /dev/null and b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.3.pdf differ
diff --git a/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.4.pdf b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.4.pdf
new file mode 100644 (file)
index 0000000..80bc101
Binary files /dev/null and b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v0.4.pdf differ
diff --git a/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v1.0.pdf b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v1.0.pdf
new file mode 100644 (file)
index 0000000..8a2a536
Binary files /dev/null and b/hardcopy/docs/skrivuppgift/sensor/G08-skrivuppgift-sensor-v1.0.pdf differ
diff --git a/hardcopy/docs/statusrapport/.gitkeep b/hardcopy/docs/statusrapport/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/statusrapport/statusrapport.md b/hardcopy/docs/statusrapport/statusrapport.md
new file mode 100644 (file)
index 0000000..ca802ff
--- /dev/null
@@ -0,0 +1,66 @@
+### Vilken funktionalitet har roboten idag?
+Roboten kan nästan utföra en komplett körning av uppdraget som uppfyller alla krav. Vi har genomfört tester där vi kommit väldigt nära det som i slutändan ska åstadkommas. Roboten kan autonomt utforska och navigera i labyrinten. Vi kan också plocka upp och leverera förnödenheter autonomt, men detta lyckas vi inte alltid med.
+
+Sensormodulen fungerar bra. 
+
+Användargränssnittet och den trådlösa kopplingen fungerar överlag bra. Väggar, undersökta rutor och planerad färdväg visas. 
+
+Roboten kan startas och stoppas med fysiska knappar.
+
+Sensordata visas på LCD-skärm.
+
+
+### Vilken funktionalitet återstår?
+Användargränssnittet kan förbättras en del med tydligare separation av reglerparametrar och sensordata.
+
+Lidarn ger ibland upp. Likaså LCD-skärmen.
+
+Nu sker uppstart av systemet via ssh-inloggning till roboten. Vi vill göra det enklare att få igång systemet vid uppstart. Detta kommer att kräva en del tänkande och testande.
+
+Driftsäkerheten överlag måste förbättras. 
+
+
+### Hur mycket tid har ni kvar av budgeterade timmar?
+467 timmar.
+
+
+
+### Hur många timmar har respektive projektmedlem kvar att leverera (för att nå målet på 230 timmar) och hur ska dessa timmar fördelas över de kvarvarande veckorna? Redovisa i en tabell i statusrapporten hur många timmar detta blir per person och vecka. 
+| Person    | Timmar totalt | Timmar v.18 | Timmar v.19 | Timmar v.20 | Timmar v.21 | Timmar v.22 |
+| :-------: | :-----------: | :---------: | :---------: | :---------: | :---------: | :---------: | 
+| AB        |            71 |          17 |          20 |          20 |           8 |           6 | 
+| AW        |            61 |          17 |          16 |          16 |           6 |           6 | 
+| CC        |            67 |          17 |          20 |          20 |           4 |           6 | 
+| DS        |            82 |          17 |          24 |          24 |           8 |           9 | 
+| HL        |            58 |          17 |          16 |          16 |           4 |           5 | 
+| MF        |            66 |          17 |          20 |          20 |           4 |           5 | 
+| NF        |            62 |          17 |          18 |          18 |           4 |           5 | 
+
+
+
+### Redovisa också vilka aktiviteter som respektive person ska arbeta med.
+
+| Person    | Saker att göra |
+| :-------: | :------------- |
+| AB        | Reglering, Automatisk påslagning, Skriva dokument (fokus på teknisk dokumentation) |
+| AW        | Fixa buggar i användargrännssnittet, Skriva dokument, Planera |
+| CC        | Fixa LCD-buggar, Skriva dokument |
+| DS        | Reglering, Skriva dokument (fokus på användarhandledning) |
+| HL        | Automatisk påslagning, Förbättra körplaneringen, Fixa Lidarbuggar, Skriva dokument (fokus på teknisk dokumentation) |
+| MF        | Fixa LCD-buggar, Skriva dokument (fokus på kandidatrapporten) |
+| NF        | Fixa LCD-buggar, Skriva dokument |
+
+### Är arbetsbelastningen jämn i gruppen? 
+Ja. 
+
+
+### Om ej, ange orsak och vilken åtgärd ni vidtar.
+
+
+
+### Beskriv eventuella tekniska problem.
+Lidar och LCD-skärm. Driftosäkerhet överlag.
+
+
+### Beskriv eventuella samarbetsproblem.
+Inga samarbetsproblem.
\ No newline at end of file
diff --git a/hardcopy/docs/systemskiss/.gitkeep b/hardcopy/docs/systemskiss/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/systemskiss/Systemskis_v1_0.pdf b/hardcopy/docs/systemskiss/Systemskis_v1_0.pdf
new file mode 100644 (file)
index 0000000..6eb9f31
Binary files /dev/null and b/hardcopy/docs/systemskiss/Systemskis_v1_0.pdf differ
diff --git a/hardcopy/docs/systemskiss/Systemskiss_v0_1.pdf b/hardcopy/docs/systemskiss/Systemskiss_v0_1.pdf
new file mode 100644 (file)
index 0000000..ef63c98
Binary files /dev/null and b/hardcopy/docs/systemskiss/Systemskiss_v0_1.pdf differ
diff --git a/hardcopy/docs/tekdok/.gitkeep b/hardcopy/docs/tekdok/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/tekdok/TekniskDokumentation_v1_0.pdf b/hardcopy/docs/tekdok/TekniskDokumentation_v1_0.pdf
new file mode 100644 (file)
index 0000000..4363cdb
Binary files /dev/null and b/hardcopy/docs/tekdok/TekniskDokumentation_v1_0.pdf differ
diff --git a/hardcopy/docs/tekdok/Teknisk_dokumentation_v1_1.pdf b/hardcopy/docs/tekdok/Teknisk_dokumentation_v1_1.pdf
new file mode 100644 (file)
index 0000000..d71c00c
Binary files /dev/null and b/hardcopy/docs/tekdok/Teknisk_dokumentation_v1_1.pdf differ
diff --git a/hardcopy/docs/tidplan/.gitkeep b/hardcopy/docs/tidplan/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/hardcopy/docs/tidplan/TidplanV13.xlsx b/hardcopy/docs/tidplan/TidplanV13.xlsx
new file mode 100644 (file)
index 0000000..aa422a8
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV13.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV14.xlsx b/hardcopy/docs/tidplan/TidplanV14.xlsx
new file mode 100644 (file)
index 0000000..110aa9a
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV14.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV14_2.xlsx b/hardcopy/docs/tidplan/TidplanV14_2.xlsx
new file mode 100644 (file)
index 0000000..d6c3c71
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV14_2.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV15.xlsx b/hardcopy/docs/tidplan/TidplanV15.xlsx
new file mode 100644 (file)
index 0000000..f04bf70
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV15.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV16.xlsx b/hardcopy/docs/tidplan/TidplanV16.xlsx
new file mode 100644 (file)
index 0000000..05fd61a
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV16.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV16_2.xlsx b/hardcopy/docs/tidplan/TidplanV16_2.xlsx
new file mode 100644 (file)
index 0000000..5404984
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV16_2.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV17.xlsx b/hardcopy/docs/tidplan/TidplanV17.xlsx
new file mode 100644 (file)
index 0000000..97fcfb4
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV17.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV18.xlsx b/hardcopy/docs/tidplan/TidplanV18.xlsx
new file mode 100644 (file)
index 0000000..684ca49
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV18.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV19.xlsx b/hardcopy/docs/tidplan/TidplanV19.xlsx
new file mode 100644 (file)
index 0000000..eb71d43
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV19.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV20.xlsx b/hardcopy/docs/tidplan/TidplanV20.xlsx
new file mode 100644 (file)
index 0000000..fed6432
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV20.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV21.xlsx b/hardcopy/docs/tidplan/TidplanV21.xlsx
new file mode 100644 (file)
index 0000000..fcb827e
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV21.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV22.xlsx b/hardcopy/docs/tidplan/TidplanV22.xlsx
new file mode 100644 (file)
index 0000000..0948da0
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV22.xlsx differ
diff --git a/hardcopy/docs/tidplan/TidplanV23.xlsx b/hardcopy/docs/tidplan/TidplanV23.xlsx
new file mode 100644 (file)
index 0000000..1c7a29d
Binary files /dev/null and b/hardcopy/docs/tidplan/TidplanV23.xlsx differ
diff --git a/hardcopy/docs/tidplan/Tidplan_0_1.xlsx b/hardcopy/docs/tidplan/Tidplan_0_1.xlsx
new file mode 100644 (file)
index 0000000..41c92b2
Binary files /dev/null and b/hardcopy/docs/tidplan/Tidplan_0_1.xlsx differ
diff --git a/hardcopy/docs/tidplan/Tidplan_v1_0.xlsx b/hardcopy/docs/tidplan/Tidplan_v1_0.xlsx
new file mode 100644 (file)
index 0000000..f12590d
Binary files /dev/null and b/hardcopy/docs/tidplan/Tidplan_v1_0.xlsx differ
diff --git a/hardcopy/docs/tidrapport/Tidrapport.md b/hardcopy/docs/tidrapport/Tidrapport.md
new file mode 100644 (file)
index 0000000..39f1964
--- /dev/null
@@ -0,0 +1,241 @@
+Denna fil är skriven med [MarkDown](https://www.markdownguide.org/basic-syntax/)
+
+Uppdatera tidrapporten **senast** kl 16 varje måndag, enligt [Leveranser](https://liuonline.sharepoint.com/sites/Lisam_TSEA56_2024VT_G1/SitePages/Leveranser.aspx)  
+Glöm inte att även uppdatera tidplanen.
+
+# Tidrapport Grupp 8
+
+
+
+## T o m Vecka 12 (Grupp XX)(rapporteras måndag v 13)
+1. Vilka framsteg har gjorts sedan förra tidrapporten?
+
+Vi har tjuvstartat lite med mjukvaran. 
+
+2. Finns det några problem?
+
+Nej, inte än...
+
+3. Vad ska göras kommande vecka?
+
+Användargränssnittet ska vara mer eller mindre klart.
+Styrmodulen ska kunna styra och till viss del reglera motorhastighet.
+Kommunikation mellan styrmodul och sensormodul via I2C.
+Sensormodulen ska kunna läsa ut hastighet i m/s från odometrarna. 
+
+
+## Vecka 13 (Grupp XX)(rapporteras tisdag v 14)
+1. Vilka framsteg har gjorts sedan förra tidrapporten?
+
+Hämtat ut komponenter. 
+Styrmodulen kan styra motorer och gripklo utan reglering.
+Sensormodulen kan läsa odometervärden. 
+Alla moduler på roboten kan kommunicera via I2C.
+Användargränssnittet är 88% klart. 
+Lidardrivern fungerar och skickar datan över ROS.
+
+2. Finns det några problem?
+
+Svårt med två masters på en I2C-buss. Lösningen blir att göra en separat uart-buss kanal mellan styr- och sensormodulen för regleringsdata.
+Flyttal är jobbigt på AVR. 
+
+3. Vad ska göras kommande vecka?
+
+
+Kommunikationen mellan alla moduler ska fungera bra. Rätt enhet.
+Manuell styrning ska fungera. 
+Motorerna ska kunna regleras. 
+Roboten ska kunna hitta sin position. 
+Lidardata ska visualiseras i användargränssnittet. 
+Börja jobba med gyrot. 
+
+
+## Vecka 14 (Grupp XX)(rapporteras måndag v 15)
+1. Vilka framsteg har gjorts sedan förra tidrapporten?
+
+Kommunikationen mellan alla moduler fungerar bra. 
+Grundläggande reglering är på plats. 
+Gyrot fungerar!
+Lidardata visualiseras nu i gränssnittet.
+Positionering med lidar fungerar. 
+Smågrejer med knappar osv. 
+
+
+2. Finns det några problem?
+
+Vår Raspberry pi har en tendens att dö vid batteridrift. 
+Debuggern får AVR-programmen att sluta fungera.
+AVR-programmeraren fungerar lite till och från.
+Nivåskiftaren har bara 5 utgångar och vi behöver 6. Vi borde dock kunna kringå den. 
+
+
+3. Vad ska göras kommande vecka?
+
+(1) Gyrodata till styrmodulen via uart. 
+(2) Skärmen ska fungera och integreras i ROS.
+(3) Börja kika på tejpsensorn.
+(1) Hjulens hastighet ska regleras ordentligt. 
+(2) Manuell körning ska fungera. 
+(1) Kartläggning ska fungera i manuell körning.
+(1) Kunna välja målpunkt i användargränssnittet.  
+
+
+
+## Vecka 15 (Grupp XX)(rapporteras måndag v 16)
+1. Vilka framsteg har gjorts sedan förra tidrapporten?
+
+Tejpsensorn fungerar! 
+Manuell styrning fungerar klockrent!
+Även semiautonomt funkar bra (klicka på kartan och den åker dit). 
+Kartläggningen har testats och fungerar bra. 
+Reglering av hastighet fungerar bra. 
+Displayen fungerar. 
+Fysiska knappar borde fungera men borde fungera. 
+
+
+2. Finns det några problem?
+
+Odometerskivan har hamnat snett och gett dåliga värden. Printat en ny som ska testas. 
+Ytterst få grupprum på campus har fungerande TV...
+
+
+3. Vad ska göras kommande vecka?
+
+Lägga fokus på det autonoma. 
+Fixa regleringen en gång för alla. 
+Plocka upp förnnödenheter.
+Designa förnödenheter och bestämma placering i förhållande till tejpen.
+Börja kika på alla dokument.
+Användargränssnittet ska visa planerad färdväg. 
+
+Plocka upp förnödenheter autonomt. 
+Positionsreglering fungerar. 
+Användargränssnittet ska visa planerad färdväg. 
+
+
+## Vecka 16 (Grupp XX)(rapporteras måndag v 17)
+1. Den gångna veckan har vi ...
+Reglering fungerar bra förutom när den får trasig gyrodata. 
+Autonom upplockning fungerar bra.
+Förnödenheternas utformning är snart klar.
+Kikat lite på alla dokument.  
+
+2. Just nu har vi inga problem
+Gyrodatan levereras ibland konstigt till styrmodulen. Svårt att reglera då. 
+Att autonomt plocka upp förnödenheter har tagit betydligt mer tid än planerat, men det ser ut att lösa sig nu. 
+
+3. Kommande vecka tänker vi ...
+Testa mycket, förbereda oss för beställarmöte.
+
+Lagra data på fil - Axel
+Gyrofel - Alexander och Nils
+Fixa så att man kan ändra alla reglerparametrar - Alexander
+Färdigställa förnödenheter - Nils
+Jobba med dokument - Daniel, Cornelia, Max, Axel
+Finslipa körning och state machine - Herman + övriga där det behövs
+
+
+
+## Vecka 17 (Grupp XX)(rapporteras måndag v 18)
+1. Den gångna veckan har vi ...
+Vi har börjat skriva lite på kandidatrapporten och den tekniska dokumentationen.
+Förbättrat regleringen avsevärt. 
+Testat en massa.
+Fått till upplockandet av förnödenheterna.
+Fixat buggar i användargränssnittet, och så att man kan ladda ner historik
+
+
+2. Just nu har vi inga problem
+Okej.
+
+3. Kommande vecka tänker vi ...
+Fixa automatisk uppstart av programmet. 
+Förbättra körningen så att vi kan ta kurvor ordentligt. 
+BP5a.
+Öka hastigheten. 
+Finslipa upplockningen av förnödenheter. 
+Skriva dokument.
+
+
+## Vecka 18 (Grupp XX)(rapporteras måndag v 19)
+1. Den gångna veckan har vi ...  
+Haft ett lyckat beställarmöte.  
+Skrivit rapporter och dokumentation.  
+Ökat hastigheten på körningen.  
+Ökat pålitligheten för lidarn.  
+
+2. Just nu har vi inga problem  
+Okej. 
+
+3. Kommande vecka tänker vi ...  
+Skriva dokument.  
+Fixa automatisk uppstart.  
+Fortsätta finslipa upplockningne av förnödenheter.  
+Testa körningen mer. 
+Fixa LCD-skärmens pålitlighet.
+
+
+## Vecka 19 (Grupp XX)(rapporteras måndag v 20)
+1. Den gångna veckan har vi ...
+Förbättrat driftsäkerheten.  
+Fixat automatisk uppstart.  
+Förbättrat LCD-skärmens pålitlighet.  
+Testat körningen och ökat hastigheten.  
+Skrivit dokument.  
+
+
+2. Just nu har vi inga problem
+Okej.  
+
+3. Kommande vecka tänker vi ...
+(Redan haft ett mycket lyckat BP5b)  
+Skriva dokument.  
+Lämna in dokument.  
+Fixa presentation.
+
+
+## Vecka 20 (Grupp XX)(rapporteras måndag v 21)
+1. Den gångna veckan har vi ...  
+Genomfört ett lyckat BP5b.  
+Skrivit dokument.  
+Lämnat in dokument.  
+Börjat fixa med presentation och opponering.  
+
+2. Just nu har vi inga problem  
+Okej.
+
+3. Kommande vecka tänker vi ...  
+Fixa presentation och opponering.  
+Skriva lite på efterstudien.  
+Eventuellt göra mindre justeringar av roboten för tävling/uppvisning. 
+
+
+
+## Vecka 21 (Grupp XX)(rapporteras måndag v 22)
+1. Den gångna veckan har vi ...  
+Fixat inför opponeringen och framläggningen  
+Jobbat med projekt "secret"  
+
+
+2. Just nu har vi inga problem  
+Okej
+
+
+3. Kommande vecka tänker vi ...
+Presentera och opponera  
+"Demoa" och tävla.  
+
+
+## Vecka 22 (Grupp XX)(rapporteras måndag v 23)
+1. Den gångna veckan har vi ...  
+Haft framläggning och opposition  
+Tävlat  
+
+
+2. Just nu har vi inga problem  
+Okej  
+
+
+3. Kommande vecka tänker vi ...  
+Äta glass  
+Bada
\ No newline at end of file
diff --git a/hardcopy/hardware/.gitignore b/hardcopy/hardware/.gitignore
new file mode 100644 (file)
index 0000000..a7331db
--- /dev/null
@@ -0,0 +1,2 @@
+fp-info-cache
+*backups*
diff --git a/hardcopy/hardware/README.md b/hardcopy/hardware/README.md
new file mode 100644 (file)
index 0000000..9932598
--- /dev/null
@@ -0,0 +1,93 @@
+# Hardware
+
+
+
+## Getting started
+
+To make it easy for you to get started with GitLab, here's a list of recommended next steps.
+
+Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
+
+## Add your files
+
+- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
+- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
+
+```
+cd existing_repo
+git remote add origin https://gitlab.liu.se/da-proj/TSEA56/2024/g08/hardware.git
+git branch -M main
+git push -uf origin main
+```
+
+## Integrate with your tools
+
+- [ ] [Set up project integrations](https://gitlab.liu.se/da-proj/TSEA56/2024/g08/hardware/-/settings/integrations)
+
+## Collaborate with your team
+
+- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
+- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
+- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
+- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
+- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
+
+## Test and Deploy
+
+Use the built-in continuous integration in GitLab.
+
+- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
+- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
+- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
+- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
+- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
+
+***
+
+# Editing this README
+
+When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
+
+## Suggestions for a good README
+
+Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+
+## Name
+Choose a self-explaining name for your project.
+
+## Description
+Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+
+## Badges
+On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+
+## Visuals
+Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
+
+## Installation
+Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
+
+## Usage
+Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
+
+## Support
+Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
+
+## Roadmap
+If you have ideas for releases in the future, it is a good idea to list them in the README.
+
+## Contributing
+State if you are open to contributions and what your requirements are for accepting them.
+
+For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
+
+You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+
+## Authors and acknowledgment
+Show your appreciation to those who have contributed to the project.
+
+## License
+For open source projects, say how it is licensed.
+
+## Project status
+If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
diff --git a/hardcopy/hardware/schematic.kicad_pcb b/hardcopy/hardware/schematic.kicad_pcb
new file mode 100644 (file)
index 0000000..2b8ba10
--- /dev/null
@@ -0,0 +1,2 @@
+(kicad_pcb (version 20221018) (generator pcbnew)
+)
\ No newline at end of file
diff --git a/hardcopy/hardware/schematic.kicad_prl b/hardcopy/hardware/schematic.kicad_prl
new file mode 100644 (file)
index 0000000..b15b8db
--- /dev/null
@@ -0,0 +1,77 @@
+{
+  "board": {
+    "active_layer": 0,
+    "active_layer_preset": "All Layers",
+    "auto_track_width": true,
+    "hidden_netclasses": [],
+    "hidden_nets": [],
+    "high_contrast_mode": 0,
+    "net_color_mode": 1,
+    "opacity": {
+      "images": 0.6,
+      "pads": 1.0,
+      "tracks": 1.0,
+      "vias": 1.0,
+      "zones": 0.6
+    },
+    "selection_filter": {
+      "dimensions": true,
+      "footprints": true,
+      "graphics": true,
+      "keepouts": true,
+      "lockedItems": false,
+      "otherItems": true,
+      "pads": true,
+      "text": true,
+      "tracks": true,
+      "vias": true,
+      "zones": true
+    },
+    "visible_items": [
+      0,
+      1,
+      2,
+      3,
+      4,
+      5,
+      8,
+      9,
+      10,
+      11,
+      12,
+      13,
+      15,
+      16,
+      17,
+      18,
+      19,
+      20,
+      21,
+      22,
+      23,
+      24,
+      25,
+      26,
+      27,
+      28,
+      29,
+      30,
+      32,
+      33,
+      34,
+      35,
+      36,
+      39,
+      40
+    ],
+    "visible_layers": "fffffff_ffffffff",
+    "zone_display_mode": 0
+  },
+  "meta": {
+    "filename": "schematic.kicad_prl",
+    "version": 3
+  },
+  "project": {
+    "files": []
+  }
+}
diff --git a/hardcopy/hardware/schematic.kicad_pro b/hardcopy/hardware/schematic.kicad_pro
new file mode 100644 (file)
index 0000000..6858fe5
--- /dev/null
@@ -0,0 +1,485 @@
+{
+  "board": {
+    "3dviewports": [],
+    "design_settings": {
+      "defaults": {
+        "board_outline_line_width": 0.09999999999999999,
+        "copper_line_width": 0.19999999999999998,
+        "copper_text_italic": false,
+        "copper_text_size_h": 1.5,
+        "copper_text_size_v": 1.5,
+        "copper_text_thickness": 0.3,
+        "copper_text_upright": false,
+        "courtyard_line_width": 0.049999999999999996,
+        "dimension_precision": 4,
+        "dimension_units": 3,
+        "dimensions": {
+          "arrow_length": 1270000,
+          "extension_offset": 500000,
+          "keep_text_aligned": true,
+          "suppress_zeroes": false,
+          "text_position": 0,
+          "units_format": 1
+        },
+        "fab_line_width": 0.09999999999999999,
+        "fab_text_italic": false,
+        "fab_text_size_h": 1.0,
+        "fab_text_size_v": 1.0,
+        "fab_text_thickness": 0.15,
+        "fab_text_upright": false,
+        "other_line_width": 0.15,
+        "other_text_italic": false,
+        "other_text_size_h": 1.0,
+        "other_text_size_v": 1.0,
+        "other_text_thickness": 0.15,
+        "other_text_upright": false,
+        "pads": {
+          "drill": 0.762,
+          "height": 1.524,
+          "width": 1.524
+        },
+        "silk_line_width": 0.15,
+        "silk_text_italic": false,
+        "silk_text_size_h": 1.0,
+        "silk_text_size_v": 1.0,
+        "silk_text_thickness": 0.15,
+        "silk_text_upright": false,
+        "zones": {
+          "min_clearance": 0.5
+        }
+      },
+      "diff_pair_dimensions": [],
+      "drc_exclusions": [],
+      "meta": {
+        "version": 2
+      },
+      "rule_severities": {
+        "annular_width": "error",
+        "clearance": "error",
+        "connection_width": "warning",
+        "copper_edge_clearance": "error",
+        "copper_sliver": "warning",
+        "courtyards_overlap": "error",
+        "diff_pair_gap_out_of_range": "error",
+        "diff_pair_uncoupled_length_too_long": "error",
+        "drill_out_of_range": "error",
+        "duplicate_footprints": "warning",
+        "extra_footprint": "warning",
+        "footprint": "error",
+        "footprint_type_mismatch": "ignore",
+        "hole_clearance": "error",
+        "hole_near_hole": "error",
+        "invalid_outline": "error",
+        "isolated_copper": "warning",
+        "item_on_disabled_layer": "error",
+        "items_not_allowed": "error",
+        "length_out_of_range": "error",
+        "lib_footprint_issues": "warning",
+        "lib_footprint_mismatch": "warning",
+        "malformed_courtyard": "error",
+        "microvia_drill_out_of_range": "error",
+        "missing_courtyard": "ignore",
+        "missing_footprint": "warning",
+        "net_conflict": "warning",
+        "npth_inside_courtyard": "ignore",
+        "padstack": "warning",
+        "pth_inside_courtyard": "ignore",
+        "shorting_items": "error",
+        "silk_edge_clearance": "warning",
+        "silk_over_copper": "warning",
+        "silk_overlap": "warning",
+        "skew_out_of_range": "error",
+        "solder_mask_bridge": "error",
+        "starved_thermal": "error",
+        "text_height": "warning",
+        "text_thickness": "warning",
+        "through_hole_pad_without_hole": "error",
+        "too_many_vias": "error",
+        "track_dangling": "warning",
+        "track_width": "error",
+        "tracks_crossing": "error",
+        "unconnected_items": "error",
+        "unresolved_variable": "error",
+        "via_dangling": "warning",
+        "zones_intersect": "error"
+      },
+      "rules": {
+        "max_error": 0.005,
+        "min_clearance": 0.0,
+        "min_connection": 0.0,
+        "min_copper_edge_clearance": 0.0,
+        "min_hole_clearance": 0.25,
+        "min_hole_to_hole": 0.25,
+        "min_microvia_diameter": 0.19999999999999998,
+        "min_microvia_drill": 0.09999999999999999,
+        "min_resolved_spokes": 2,
+        "min_silk_clearance": 0.0,
+        "min_text_height": 0.7999999999999999,
+        "min_text_thickness": 0.08,
+        "min_through_hole_diameter": 0.3,
+        "min_track_width": 0.0,
+        "min_via_annular_width": 0.09999999999999999,
+        "min_via_diameter": 0.5,
+        "solder_mask_clearance": 0.0,
+        "solder_mask_min_width": 0.0,
+        "solder_mask_to_copper_clearance": 0.0,
+        "use_height_for_length_calcs": true
+      },
+      "teardrop_options": [
+        {
+          "td_allow_use_two_tracks": true,
+          "td_curve_segcount": 5,
+          "td_on_pad_in_zone": false,
+          "td_onpadsmd": true,
+          "td_onroundshapesonly": false,
+          "td_ontrackend": false,
+          "td_onviapad": true
+        }
+      ],
+      "teardrop_parameters": [
+        {
+          "td_curve_segcount": 0,
+          "td_height_ratio": 1.0,
+          "td_length_ratio": 0.5,
+          "td_maxheight": 2.0,
+          "td_maxlen": 1.0,
+          "td_target_name": "td_round_shape",
+          "td_width_to_size_filter_ratio": 0.9
+        },
+        {
+          "td_curve_segcount": 0,
+          "td_height_ratio": 1.0,
+          "td_length_ratio": 0.5,
+          "td_maxheight": 2.0,
+          "td_maxlen": 1.0,
+          "td_target_name": "td_rect_shape",
+          "td_width_to_size_filter_ratio": 0.9
+        },
+        {
+          "td_curve_segcount": 0,
+          "td_height_ratio": 1.0,
+          "td_length_ratio": 0.5,
+          "td_maxheight": 2.0,
+          "td_maxlen": 1.0,
+          "td_target_name": "td_track_end",
+          "td_width_to_size_filter_ratio": 0.9
+        }
+      ],
+      "track_widths": [],
+      "via_dimensions": [],
+      "zones_allow_external_fillets": false
+    },
+    "layer_presets": [],
+    "viewports": []
+  },
+  "boards": [],
+  "cvpcb": {
+    "equivalence_files": []
+  },
+  "erc": {
+    "erc_exclusions": [],
+    "meta": {
+      "version": 0
+    },
+    "pin_map": [
+      [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        0,
+        0,
+        0,
+        0,
+        2
+      ],
+      [
+        0,
+        2,
+        0,
+        1,
+        0,
+        0,
+        1,
+        0,
+        2,
+        2,
+        2,
+        2
+      ],
+      [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        0,
+        1,
+        0,
+        1,
+        2
+      ],
+      [
+        0,
+        1,
+        0,
+        0,
+        0,
+        0,
+        1,
+        1,
+        2,
+        1,
+        1,
+        2
+      ],
+      [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        1,
+        0,
+        0,
+        0,
+        0,
+        2
+      ],
+      [
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        2
+      ],
+      [
+        1,
+        1,
+        1,
+        1,
+        1,
+        0,
+        1,
+        1,
+        1,
+        1,
+        1,
+        2
+      ],
+      [
+        0,
+        0,
+        0,
+        1,
+        0,
+        0,
+        1,
+        0,
+        0,
+        0,
+        0,
+        2
+      ],
+      [
+        0,
+        2,
+        1,
+        2,
+        0,
+        0,
+        1,
+        0,
+        2,
+        2,
+        2,
+        2
+      ],
+      [
+        0,
+        2,
+        0,
+        1,
+        0,
+        0,
+        1,
+        0,
+        2,
+        0,
+        0,
+        2
+      ],
+      [
+        0,
+        2,
+        1,
+        1,
+        0,
+        0,
+        1,
+        0,
+        2,
+        0,
+        0,
+        2
+      ],
+      [
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2,
+        2
+      ]
+    ],
+    "rule_severities": {
+      "bus_definition_conflict": "error",
+      "bus_entry_needed": "error",
+      "bus_to_bus_conflict": "error",
+      "bus_to_net_conflict": "error",
+      "conflicting_netclasses": "error",
+      "different_unit_footprint": "error",
+      "different_unit_net": "error",
+      "duplicate_reference": "error",
+      "duplicate_sheet_names": "error",
+      "endpoint_off_grid": "warning",
+      "extra_units": "error",
+      "global_label_dangling": "warning",
+      "hier_label_mismatch": "error",
+      "label_dangling": "error",
+      "lib_symbol_issues": "warning",
+      "missing_bidi_pin": "warning",
+      "missing_input_pin": "warning",
+      "missing_power_pin": "error",
+      "missing_unit": "warning",
+      "multiple_net_names": "warning",
+      "net_not_bus_member": "warning",
+      "no_connect_connected": "warning",
+      "no_connect_dangling": "warning",
+      "pin_not_connected": "error",
+      "pin_not_driven": "error",
+      "pin_to_pin": "warning",
+      "power_pin_not_driven": "error",
+      "similar_labels": "warning",
+      "simulation_model_issue": "error",
+      "unannotated": "error",
+      "unit_value_mismatch": "error",
+      "unresolved_variable": "error",
+      "wire_dangling": "error"
+    }
+  },
+  "libraries": {
+    "pinned_footprint_libs": [],
+    "pinned_symbol_libs": []
+  },
+  "meta": {
+    "filename": "schematic.kicad_pro",
+    "version": 1
+  },
+  "net_settings": {
+    "classes": [
+      {
+        "bus_width": 12,
+        "clearance": 0.2,
+        "diff_pair_gap": 0.25,
+        "diff_pair_via_gap": 0.25,
+        "diff_pair_width": 0.2,
+        "line_style": 0,
+        "microvia_diameter": 0.3,
+        "microvia_drill": 0.1,
+        "name": "Default",
+        "pcb_color": "rgba(0, 0, 0, 0.000)",
+        "schematic_color": "rgba(0, 0, 0, 0.000)",
+        "track_width": 0.25,
+        "via_diameter": 0.8,
+        "via_drill": 0.4,
+        "wire_width": 6
+      }
+    ],
+    "meta": {
+      "version": 3
+    },
+    "net_colors": null,
+    "netclass_assignments": null,
+    "netclass_patterns": []
+  },
+  "pcbnew": {
+    "last_paths": {
+      "gencad": "",
+      "idf": "",
+      "netlist": "",
+      "specctra_dsn": "",
+      "step": "",
+      "vrml": ""
+    },
+    "page_layout_descr_file": ""
+  },
+  "schematic": {
+    "annotate_start_num": 0,
+    "drawing": {
+      "dashed_lines_dash_length_ratio": 12.0,
+      "dashed_lines_gap_length_ratio": 3.0,
+      "default_line_thickness": 6.0,
+      "default_text_size": 50.0,
+      "field_names": [],
+      "intersheets_ref_own_page": false,
+      "intersheets_ref_prefix": "",
+      "intersheets_ref_short": false,
+      "intersheets_ref_show": false,
+      "intersheets_ref_suffix": "",
+      "junction_size_choice": 3,
+      "label_size_ratio": 0.375,
+      "pin_symbol_size": 25.0,
+      "text_offset_ratio": 0.15
+    },
+    "legacy_lib_dir": "",
+    "legacy_lib_list": [],
+    "meta": {
+      "version": 1
+    },
+    "net_format_name": "",
+    "ngspice": {
+      "fix_include_paths": true,
+      "meta": {
+        "version": 0
+      },
+      "model_mode": 0,
+      "workbook_filename": ""
+    },
+    "page_layout_descr_file": "",
+    "plot_directory": "",
+    "spice_current_sheet_as_root": false,
+    "spice_external_command": "spice \"%I\"",
+    "spice_model_current_sheet_as_root": true,
+    "spice_save_all_currents": false,
+    "spice_save_all_voltages": false,
+    "subpart_first_id": 65,
+    "subpart_id_separator": 0
+  },
+  "sheets": [
+    [
+      "76bf3bf1-1372-4c7f-8be5-873185dd5bdd",
+      ""
+    ]
+  ],
+  "text_variables": {}
+}
diff --git a/hardcopy/hardware/schematic.kicad_sch b/hardcopy/hardware/schematic.kicad_sch
new file mode 100644 (file)
index 0000000..8578c40
--- /dev/null
@@ -0,0 +1,5034 @@
+(kicad_sch (version 20230121) (generator eeschema)
+
+  (uuid 76bf3bf1-1372-4c7f-8be5-873185dd5bdd)
+
+  (paper "A4")
+
+  (lib_symbols
+    (symbol "Connector:AVR-JTAG-10" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+      (property "Reference" "J" (at -8.89 13.97 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "AVR-JTAG-10" (at 1.27 13.97 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "" (at -3.81 3.81 90)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" " ~" (at -32.385 -13.97 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "AVR JTAG Connector" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Atmel 10-pin JTAG connector" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "IDC?Header*2x05* Pin?Header*2x05*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "AVR-JTAG-10_0_1"
+        (rectangle (start -2.667 12.7) (end -2.413 11.938)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -0.127 -11.938) (end 0.127 -12.7)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -0.127 12.7) (end 0.127 11.938)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 10.16 -4.953) (end 9.398 -5.207)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 10.16 -2.413) (end 9.398 -2.667)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 10.16 0.127) (end 9.398 -0.127)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 10.16 2.667) (end 9.398 2.413)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 10.16 5.207) (end 9.398 4.953)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 10.16 7.747) (end 9.398 7.493)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 10.16 12.7) (end -10.16 -12.7)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+      )
+      (symbol "AVR-JTAG-10_1_1"
+        (pin passive line (at 12.7 2.54 180) (length 2.54)
+          (name "TCK" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 0 -15.24 90) (length 2.54) hide
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "10" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 0 -15.24 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -2.54 180) (length 2.54)
+          (name "TDO" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -2.54 15.24 270) (length 2.54)
+          (name "VREF" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 0 180) (length 2.54)
+          (name "TMS" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 7.62 180) (length 2.54)
+          (name "~{SRST}" (effects (font (size 1.27 1.27))))
+          (number "6" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 0 15.24 270) (length 2.54)
+          (name "VCC" (effects (font (size 1.27 1.27))))
+          (number "7" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 5.08 180) (length 2.54)
+          (name "~{TRST}" (effects (font (size 1.27 1.27))))
+          (number "8" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 12.7 -5.08 180) (length 2.54)
+          (name "TDI" (effects (font (size 1.27 1.27))))
+          (number "9" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Connector:DIN41612_02x05_AB_EvenPins" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "J" (at 1.27 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "DIN41612_02x05_AB_EvenPins" (at 1.27 -7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "connector" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "DIN41612 connector, double row (AB) even pins only, 02x05, script generated (kicad-library-utils/schlib/autogen/connector/)" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "DIN41612*2x*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "DIN41612_02x05_AB_EvenPins_1_1"
+        (rectangle (start -1.27 -4.953) (end 0 -5.207)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -2.413) (end 0 -2.667)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 0.127) (end 0 -0.127)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 2.667) (end 0 2.413)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 5.207) (end 0 4.953)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 6.35) (end 3.81 -6.35)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+        (rectangle (start 3.81 -4.953) (end 2.54 -5.207)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 3.81 -2.413) (end 2.54 -2.667)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 3.81 0.127) (end 2.54 -0.127)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 3.81 2.667) (end 2.54 2.413)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 3.81 5.207) (end 2.54 4.953)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (pin passive line (at -5.08 -5.08 0) (length 3.81)
+          (name "Pin_a10" (effects (font (size 1.27 1.27))))
+          (number "a10" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 5.08 0) (length 3.81)
+          (name "Pin_a2" (effects (font (size 1.27 1.27))))
+          (number "a2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 2.54 0) (length 3.81)
+          (name "Pin_a4" (effects (font (size 1.27 1.27))))
+          (number "a4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 0 0) (length 3.81)
+          (name "Pin_a6" (effects (font (size 1.27 1.27))))
+          (number "a6" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -2.54 0) (length 3.81)
+          (name "Pin_a8" (effects (font (size 1.27 1.27))))
+          (number "a8" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 7.62 -5.08 180) (length 3.81)
+          (name "Pin_b10" (effects (font (size 1.27 1.27))))
+          (number "b10" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 7.62 5.08 180) (length 3.81)
+          (name "Pin_b2" (effects (font (size 1.27 1.27))))
+          (number "b2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 7.62 2.54 180) (length 3.81)
+          (name "Pin_b4" (effects (font (size 1.27 1.27))))
+          (number "b4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 7.62 0 180) (length 3.81)
+          (name "Pin_b6" (effects (font (size 1.27 1.27))))
+          (number "b6" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 7.62 -2.54 180) (length 3.81)
+          (name "Pin_b8" (effects (font (size 1.27 1.27))))
+          (number "b8" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Connector:Raspberry_Pi_2_3" (pin_names (offset 1.016)) (in_bom yes) (on_board yes)
+      (property "Reference" "J" (at -17.78 31.75 0)
+        (effects (font (size 1.27 1.27)) (justify left bottom))
+      )
+      (property "Value" "Raspberry_Pi_2_3" (at 10.16 -31.75 0)
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "raspberrypi gpio" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "expansion header for Raspberry Pi 2 & 3" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "PinHeader*2x20*P2.54mm*Vertical* PinSocket*2x20*P2.54mm*Vertical*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "Raspberry_Pi_2_3_0_1"
+        (rectangle (start -17.78 30.48) (end 17.78 -30.48)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+      )
+      (symbol "Raspberry_Pi_2_3_1_1"
+        (rectangle (start -16.891 -17.526) (end -17.78 -18.034)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 -14.986) (end -17.78 -15.494)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 -12.446) (end -17.78 -12.954)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 -9.906) (end -17.78 -10.414)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 -7.366) (end -17.78 -7.874)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 -4.826) (end -17.78 -5.334)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 0.254) (end -17.78 -0.254)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 2.794) (end -17.78 2.286)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 5.334) (end -17.78 4.826)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 10.414) (end -17.78 9.906)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 12.954) (end -17.78 12.446)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 15.494) (end -17.78 14.986)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 20.574) (end -17.78 20.066)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -16.891 23.114) (end -17.78 22.606)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -10.414 -29.591) (end -9.906 -30.48)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -7.874 -29.591) (end -7.366 -30.48)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -5.334 -29.591) (end -4.826 -30.48)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -5.334 30.48) (end -4.826 29.591)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -2.794 -29.591) (end -2.286 -30.48)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -2.794 30.48) (end -2.286 29.591)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -0.254 -29.591) (end 0.254 -30.48)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 2.286 -29.591) (end 2.794 -30.48)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 2.286 30.48) (end 2.794 29.591)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 4.826 -29.591) (end 5.334 -30.48)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 4.826 30.48) (end 5.334 29.591)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 7.366 -29.591) (end 7.874 -30.48)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 -20.066) (end 16.891 -20.574)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 -17.526) (end 16.891 -18.034)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 -12.446) (end 16.891 -12.954)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 -9.906) (end 16.891 -10.414)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 -7.366) (end 16.891 -7.874)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 -4.826) (end 16.891 -5.334)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 -2.286) (end 16.891 -2.794)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 2.794) (end 16.891 2.286)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 5.334) (end 16.891 4.826)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 7.874) (end 16.891 7.366)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 12.954) (end 16.891 12.446)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 15.494) (end 16.891 14.986)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 20.574) (end 16.891 20.066)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (rectangle (start 17.78 23.114) (end 16.891 22.606)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (pin power_in line (at 2.54 33.02 270) (length 2.54)
+          (name "3V3" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 20.32 0) (length 2.54)
+          (name "GPIO15/RXD" (effects (font (size 1.27 1.27))))
+          (number "10" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 12.7 0) (length 2.54)
+          (name "GPIO17" (effects (font (size 1.27 1.27))))
+          (number "11" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 10.16 0) (length 2.54)
+          (name "GPIO18/PWM0" (effects (font (size 1.27 1.27))))
+          (number "12" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 -17.78 0) (length 2.54)
+          (name "GPIO27" (effects (font (size 1.27 1.27))))
+          (number "13" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at -5.08 -33.02 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "14" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 -5.08 0) (length 2.54)
+          (name "GPIO22" (effects (font (size 1.27 1.27))))
+          (number "15" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 -7.62 0) (length 2.54)
+          (name "GPIO23" (effects (font (size 1.27 1.27))))
+          (number "16" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 5.08 33.02 270) (length 2.54)
+          (name "3V3" (effects (font (size 1.27 1.27))))
+          (number "17" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 -10.16 0) (length 2.54)
+          (name "GPIO24" (effects (font (size 1.27 1.27))))
+          (number "18" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 -10.16 180) (length 2.54)
+          (name "MOSI0/GPIO10" (effects (font (size 1.27 1.27))))
+          (number "19" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at -5.08 33.02 270) (length 2.54)
+          (name "5V" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at -2.54 -33.02 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "20" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 -7.62 180) (length 2.54)
+          (name "MISO0/GPIO9" (effects (font (size 1.27 1.27))))
+          (number "21" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 -12.7 0) (length 2.54)
+          (name "GPIO25" (effects (font (size 1.27 1.27))))
+          (number "22" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 -12.7 180) (length 2.54)
+          (name "SCLK0/GPIO11" (effects (font (size 1.27 1.27))))
+          (number "23" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 -5.08 180) (length 2.54)
+          (name "~{CE0}/GPIO8" (effects (font (size 1.27 1.27))))
+          (number "24" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 0 -33.02 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "25" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 -2.54 180) (length 2.54)
+          (name "~{CE1}/GPIO7" (effects (font (size 1.27 1.27))))
+          (number "26" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 22.86 180) (length 2.54)
+          (name "ID_SD/GPIO0" (effects (font (size 1.27 1.27))))
+          (number "27" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 20.32 180) (length 2.54)
+          (name "ID_SC/GPIO1" (effects (font (size 1.27 1.27))))
+          (number "28" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 5.08 180) (length 2.54)
+          (name "GCLK1/GPIO5" (effects (font (size 1.27 1.27))))
+          (number "29" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 15.24 180) (length 2.54)
+          (name "SDA/GPIO2" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 2.54 -33.02 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "30" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 2.54 180) (length 2.54)
+          (name "GCLK2/GPIO6" (effects (font (size 1.27 1.27))))
+          (number "31" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 -17.78 180) (length 2.54)
+          (name "PWM0/GPIO12" (effects (font (size 1.27 1.27))))
+          (number "32" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 -20.32 180) (length 2.54)
+          (name "PWM1/GPIO13" (effects (font (size 1.27 1.27))))
+          (number "33" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 5.08 -33.02 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "34" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 5.08 0) (length 2.54)
+          (name "GPIO19/MISO1" (effects (font (size 1.27 1.27))))
+          (number "35" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 15.24 0) (length 2.54)
+          (name "GPIO16" (effects (font (size 1.27 1.27))))
+          (number "36" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 -15.24 0) (length 2.54)
+          (name "GPIO26" (effects (font (size 1.27 1.27))))
+          (number "37" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 2.54 0) (length 2.54)
+          (name "GPIO20/MOSI1" (effects (font (size 1.27 1.27))))
+          (number "38" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 7.62 -33.02 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "39" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at -2.54 33.02 270) (length 2.54)
+          (name "5V" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 0 0) (length 2.54)
+          (name "GPIO21/SCLK1" (effects (font (size 1.27 1.27))))
+          (number "40" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 12.7 180) (length 2.54)
+          (name "SCL/GPIO3" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at -10.16 -33.02 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "6" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 20.32 7.62 180) (length 2.54)
+          (name "GCLK0/GPIO4" (effects (font (size 1.27 1.27))))
+          (number "7" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -20.32 22.86 0) (length 2.54)
+          (name "GPIO14/TXD" (effects (font (size 1.27 1.27))))
+          (number "8" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at -7.62 -33.02 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "9" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Connector_Generic:Conn_01x03" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "J" (at 0 5.08 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "Conn_01x03" (at 0 -5.08 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "connector" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Generic connector, single row, 01x03, script generated (kicad-library-utils/schlib/autogen/connector/)" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "Conn_01x03_1_1"
+        (rectangle (start -1.27 -2.413) (end 0 -2.667)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 0.127) (end 0 -0.127)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 2.667) (end 0 2.413)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 3.81) (end 1.27 -3.81)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+        (pin passive line (at -5.08 2.54 0) (length 3.81)
+          (name "Pin_1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 0 0) (length 3.81)
+          (name "Pin_2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -2.54 0) (length 3.81)
+          (name "Pin_3" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Connector_Generic:Conn_01x04" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "J" (at 0 5.08 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "Conn_01x04" (at 0 -7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "connector" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Generic connector, single row, 01x04, script generated (kicad-library-utils/schlib/autogen/connector/)" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "Conn_01x04_1_1"
+        (rectangle (start -1.27 -4.953) (end 0 -5.207)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -2.413) (end 0 -2.667)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 0.127) (end 0 -0.127)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 2.667) (end 0 2.413)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 3.81) (end 1.27 -6.35)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+        (pin passive line (at -5.08 2.54 0) (length 3.81)
+          (name "Pin_1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 0 0) (length 3.81)
+          (name "Pin_2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -2.54 0) (length 3.81)
+          (name "Pin_3" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -5.08 0) (length 3.81)
+          (name "Pin_4" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Connector_Generic:Conn_01x05" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "J" (at 0 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "Conn_01x05" (at 0 -7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "connector" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Generic connector, single row, 01x05, script generated (kicad-library-utils/schlib/autogen/connector/)" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "Conn_01x05_1_1"
+        (rectangle (start -1.27 -4.953) (end 0 -5.207)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -2.413) (end 0 -2.667)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 0.127) (end 0 -0.127)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 2.667) (end 0 2.413)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 5.207) (end 0 4.953)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 6.35) (end 1.27 -6.35)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+        (pin passive line (at -5.08 5.08 0) (length 3.81)
+          (name "Pin_1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 2.54 0) (length 3.81)
+          (name "Pin_2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 0 0) (length 3.81)
+          (name "Pin_3" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -2.54 0) (length 3.81)
+          (name "Pin_4" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -5.08 0) (length 3.81)
+          (name "Pin_5" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Connector_Generic:Conn_01x06" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "J" (at 0 7.62 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "Conn_01x06" (at 0 -10.16 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "connector" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Generic connector, single row, 01x06, script generated (kicad-library-utils/schlib/autogen/connector/)" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "Conn_01x06_1_1"
+        (rectangle (start -1.27 -7.493) (end 0 -7.747)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -4.953) (end 0 -5.207)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -2.413) (end 0 -2.667)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 0.127) (end 0 -0.127)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 2.667) (end 0 2.413)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 5.207) (end 0 4.953)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 6.35) (end 1.27 -8.89)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+        (pin passive line (at -5.08 5.08 0) (length 3.81)
+          (name "Pin_1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 2.54 0) (length 3.81)
+          (name "Pin_2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 0 0) (length 3.81)
+          (name "Pin_3" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -2.54 0) (length 3.81)
+          (name "Pin_4" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -5.08 0) (length 3.81)
+          (name "Pin_5" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -7.62 0) (length 3.81)
+          (name "Pin_6" (effects (font (size 1.27 1.27))))
+          (number "6" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Connector_Generic:Conn_01x16" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "J" (at 0 20.32 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "Conn_01x16" (at 0 -22.86 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "connector" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Generic connector, single row, 01x16, script generated (kicad-library-utils/schlib/autogen/connector/)" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "Connector*:*_1x??_*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "Conn_01x16_1_1"
+        (rectangle (start -1.27 -20.193) (end 0 -20.447)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -17.653) (end 0 -17.907)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -15.113) (end 0 -15.367)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -12.573) (end 0 -12.827)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -10.033) (end 0 -10.287)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -7.493) (end 0 -7.747)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -4.953) (end 0 -5.207)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 -2.413) (end 0 -2.667)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 0.127) (end 0 -0.127)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 2.667) (end 0 2.413)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 5.207) (end 0 4.953)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 7.747) (end 0 7.493)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 10.287) (end 0 10.033)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 12.827) (end 0 12.573)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 15.367) (end 0 15.113)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 17.907) (end 0 17.653)
+          (stroke (width 0.1524) (type default))
+          (fill (type none))
+        )
+        (rectangle (start -1.27 19.05) (end 1.27 -21.59)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+        (pin passive line (at -5.08 17.78 0) (length 3.81)
+          (name "Pin_1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -5.08 0) (length 3.81)
+          (name "Pin_10" (effects (font (size 1.27 1.27))))
+          (number "10" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -7.62 0) (length 3.81)
+          (name "Pin_11" (effects (font (size 1.27 1.27))))
+          (number "11" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -10.16 0) (length 3.81)
+          (name "Pin_12" (effects (font (size 1.27 1.27))))
+          (number "12" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -12.7 0) (length 3.81)
+          (name "Pin_13" (effects (font (size 1.27 1.27))))
+          (number "13" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -15.24 0) (length 3.81)
+          (name "Pin_14" (effects (font (size 1.27 1.27))))
+          (number "14" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -17.78 0) (length 3.81)
+          (name "Pin_15" (effects (font (size 1.27 1.27))))
+          (number "15" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -20.32 0) (length 3.81)
+          (name "Pin_16" (effects (font (size 1.27 1.27))))
+          (number "16" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 15.24 0) (length 3.81)
+          (name "Pin_2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 12.7 0) (length 3.81)
+          (name "Pin_3" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 10.16 0) (length 3.81)
+          (name "Pin_4" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 7.62 0) (length 3.81)
+          (name "Pin_5" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 5.08 0) (length 3.81)
+          (name "Pin_6" (effects (font (size 1.27 1.27))))
+          (number "6" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 2.54 0) (length 3.81)
+          (name "Pin_7" (effects (font (size 1.27 1.27))))
+          (number "7" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 0 0) (length 3.81)
+          (name "Pin_8" (effects (font (size 1.27 1.27))))
+          (number "8" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -5.08 -2.54 0) (length 3.81)
+          (name "Pin_9" (effects (font (size 1.27 1.27))))
+          (number "9" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Device:C" (pin_numbers hide) (pin_names (offset 0.254)) (in_bom yes) (on_board yes)
+      (property "Reference" "C" (at 0.635 2.54 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "C" (at 0.635 -2.54 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "" (at 0.9652 -3.81 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "cap capacitor" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Unpolarized capacitor" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "C_*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "C_0_1"
+        (polyline
+          (pts
+            (xy -2.032 -0.762)
+            (xy 2.032 -0.762)
+          )
+          (stroke (width 0.508) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy -2.032 0.762)
+            (xy 2.032 0.762)
+          )
+          (stroke (width 0.508) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "C_1_1"
+        (pin passive line (at 0 3.81 270) (length 2.794)
+          (name "~" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 0 -3.81 90) (length 2.794)
+          (name "~" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Device:R" (pin_numbers hide) (pin_names (offset 0)) (in_bom yes) (on_board yes)
+      (property "Reference" "R" (at 2.032 0 90)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "R" (at 0 0 90)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at -1.778 0 90)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "R res resistor" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Resistor" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "R_*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "R_0_1"
+        (rectangle (start -1.016 -2.54) (end 1.016 2.54)
+          (stroke (width 0.254) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "R_1_1"
+        (pin passive line (at 0 3.81 270) (length 1.27)
+          (name "~" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 0 -3.81 90) (length 1.27)
+          (name "~" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Device:R_Potentiometer" (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "RV" (at -4.445 0 90)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "R_Potentiometer" (at -2.54 0 90)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "resistor variable" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Potentiometer" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "Potentiometer*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "R_Potentiometer_0_1"
+        (polyline
+          (pts
+            (xy 2.54 0)
+            (xy 1.524 0)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 1.143 0)
+            (xy 2.286 0.508)
+            (xy 2.286 -0.508)
+            (xy 1.143 0)
+          )
+          (stroke (width 0) (type default))
+          (fill (type outline))
+        )
+        (rectangle (start 1.016 2.54) (end -1.016 -2.54)
+          (stroke (width 0.254) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "R_Potentiometer_1_1"
+        (pin passive line (at 0 3.81 270) (length 1.27)
+          (name "1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 3.81 0 180) (length 1.27)
+          (name "2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 0 -3.81 90) (length 1.27)
+          (name "3" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Logic_LevelTranslator:FXMA108" (in_bom yes) (on_board yes)
+      (property "Reference" "U" (at -6.35 13.97 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "FXMA108" (at 7.62 13.97 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "Package_DFN_QFN:WQFN-20-1EP_2.5x4.5mm_P0.5mm_EP1x2.9mm" (at 0 -17.78 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "http://www.onsemi.com/pub/Collateral/FXMA108-D.pdf" (at 0 1.27 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "Level shifter translator bidirectional" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Dual-Supply, 8-Bit Signal Translator with Configurable Voltage Supplies and Signals Levels, 3-State Outputs and Auto Direction Sensing, WQFN-20" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "WQFN*1EP*2.5x4.5mm*P0.5mm*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "FXMA108_1_1"
+        (rectangle (start -7.62 12.7) (end 7.62 -12.7)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+        (pin power_in line (at -2.54 15.24 270) (length 2.54)
+          (name "VCCA" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 0 -15.24 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "10" (effects (font (size 1.27 1.27))))
+        )
+        (pin input line (at -10.16 10.16 0) (length 2.54)
+          (name "~{OE}" (effects (font (size 1.27 1.27))))
+          (number "11" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 10.16 -10.16 180) (length 2.54)
+          (name "B7" (effects (font (size 1.27 1.27))))
+          (number "12" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 10.16 -7.62 180) (length 2.54)
+          (name "B6" (effects (font (size 1.27 1.27))))
+          (number "13" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 10.16 -5.08 180) (length 2.54)
+          (name "B5" (effects (font (size 1.27 1.27))))
+          (number "14" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 10.16 -2.54 180) (length 2.54)
+          (name "B4" (effects (font (size 1.27 1.27))))
+          (number "15" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 10.16 0 180) (length 2.54)
+          (name "B3" (effects (font (size 1.27 1.27))))
+          (number "16" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 10.16 2.54 180) (length 2.54)
+          (name "B2" (effects (font (size 1.27 1.27))))
+          (number "17" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 10.16 5.08 180) (length 2.54)
+          (name "B1" (effects (font (size 1.27 1.27))))
+          (number "18" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 10.16 7.62 180) (length 2.54)
+          (name "B0" (effects (font (size 1.27 1.27))))
+          (number "19" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -10.16 7.62 0) (length 2.54)
+          (name "A0" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 2.54 15.24 270) (length 2.54)
+          (name "VCCB" (effects (font (size 1.27 1.27))))
+          (number "20" (effects (font (size 1.27 1.27))))
+        )
+        (pin no_connect line (at 2.54 -12.7 90) (length 2.54) hide
+          (name "NC" (effects (font (size 1.27 1.27))))
+          (number "21" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -10.16 5.08 0) (length 2.54)
+          (name "A1" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -10.16 2.54 0) (length 2.54)
+          (name "A2" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -10.16 0 0) (length 2.54)
+          (name "A3" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -10.16 -2.54 0) (length 2.54)
+          (name "A4" (effects (font (size 1.27 1.27))))
+          (number "6" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -10.16 -5.08 0) (length 2.54)
+          (name "A5" (effects (font (size 1.27 1.27))))
+          (number "7" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -10.16 -7.62 0) (length 2.54)
+          (name "A6" (effects (font (size 1.27 1.27))))
+          (number "8" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at -10.16 -10.16 0) (length 2.54)
+          (name "A7" (effects (font (size 1.27 1.27))))
+          (number "9" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "MCU_Microchip_ATmega:ATmega1284P-P" (in_bom yes) (on_board yes)
+      (property "Reference" "U" (at -12.7 49.53 0)
+        (effects (font (size 1.27 1.27)) (justify left bottom))
+      )
+      (property "Value" "ATmega1284P-P" (at 2.54 -49.53 0)
+        (effects (font (size 1.27 1.27)) (justify left top))
+      )
+      (property "Footprint" "Package_DIP:DIP-40_W15.24mm" (at 0 0 0)
+        (effects (font (size 1.27 1.27) italic) hide)
+      )
+      (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8272-8-bit-AVR-microcontroller-ATmega164A_PA-324A_PA-644A_PA-1284_P_datasheet.pdf" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "AVR 8bit Microcontroller MegaAVR PicoPower" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "20MHz, 128kB Flash, 16kB SRAM, 4kB EEPROM, JTAG, DIP-40" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "DIP*W15.24mm*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "ATmega1284P-P_0_1"
+        (rectangle (start -12.7 -48.26) (end 12.7 48.26)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+      )
+      (symbol "ATmega1284P-P_1_1"
+        (pin bidirectional line (at 15.24 20.32 180) (length 2.54)
+          (name "PB0" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 0 50.8 270) (length 2.54)
+          (name "VCC" (effects (font (size 1.27 1.27))))
+          (number "10" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 0 -50.8 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "11" (effects (font (size 1.27 1.27))))
+        )
+        (pin output line (at -15.24 33.02 0) (length 2.54)
+          (name "XTAL2" (effects (font (size 1.27 1.27))))
+          (number "12" (effects (font (size 1.27 1.27))))
+        )
+        (pin input line (at -15.24 38.1 0) (length 2.54)
+          (name "XTAL1" (effects (font (size 1.27 1.27))))
+          (number "13" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -25.4 180) (length 2.54)
+          (name "PD0" (effects (font (size 1.27 1.27))))
+          (number "14" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -27.94 180) (length 2.54)
+          (name "PD1" (effects (font (size 1.27 1.27))))
+          (number "15" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -30.48 180) (length 2.54)
+          (name "PD2" (effects (font (size 1.27 1.27))))
+          (number "16" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -33.02 180) (length 2.54)
+          (name "PD3" (effects (font (size 1.27 1.27))))
+          (number "17" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -35.56 180) (length 2.54)
+          (name "PD4" (effects (font (size 1.27 1.27))))
+          (number "18" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -38.1 180) (length 2.54)
+          (name "PD5" (effects (font (size 1.27 1.27))))
+          (number "19" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 17.78 180) (length 2.54)
+          (name "PB1" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -40.64 180) (length 2.54)
+          (name "PD6" (effects (font (size 1.27 1.27))))
+          (number "20" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -43.18 180) (length 2.54)
+          (name "PD7" (effects (font (size 1.27 1.27))))
+          (number "21" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -2.54 180) (length 2.54)
+          (name "PC0" (effects (font (size 1.27 1.27))))
+          (number "22" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -5.08 180) (length 2.54)
+          (name "PC1" (effects (font (size 1.27 1.27))))
+          (number "23" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -7.62 180) (length 2.54)
+          (name "PC2" (effects (font (size 1.27 1.27))))
+          (number "24" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -10.16 180) (length 2.54)
+          (name "PC3" (effects (font (size 1.27 1.27))))
+          (number "25" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -12.7 180) (length 2.54)
+          (name "PC4" (effects (font (size 1.27 1.27))))
+          (number "26" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -15.24 180) (length 2.54)
+          (name "PC5" (effects (font (size 1.27 1.27))))
+          (number "27" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -17.78 180) (length 2.54)
+          (name "PC6" (effects (font (size 1.27 1.27))))
+          (number "28" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 -20.32 180) (length 2.54)
+          (name "PC7" (effects (font (size 1.27 1.27))))
+          (number "29" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 15.24 180) (length 2.54)
+          (name "PB2" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 2.54 50.8 270) (length 2.54)
+          (name "AVCC" (effects (font (size 1.27 1.27))))
+          (number "30" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 0 -50.8 90) (length 2.54) hide
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "31" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at -15.24 27.94 0) (length 2.54)
+          (name "AREF" (effects (font (size 1.27 1.27))))
+          (number "32" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 25.4 180) (length 2.54)
+          (name "PA7" (effects (font (size 1.27 1.27))))
+          (number "33" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 27.94 180) (length 2.54)
+          (name "PA6" (effects (font (size 1.27 1.27))))
+          (number "34" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 30.48 180) (length 2.54)
+          (name "PA5" (effects (font (size 1.27 1.27))))
+          (number "35" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 33.02 180) (length 2.54)
+          (name "PA4" (effects (font (size 1.27 1.27))))
+          (number "36" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 35.56 180) (length 2.54)
+          (name "PA3" (effects (font (size 1.27 1.27))))
+          (number "37" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 38.1 180) (length 2.54)
+          (name "PA2" (effects (font (size 1.27 1.27))))
+          (number "38" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 40.64 180) (length 2.54)
+          (name "PA1" (effects (font (size 1.27 1.27))))
+          (number "39" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 12.7 180) (length 2.54)
+          (name "PB3" (effects (font (size 1.27 1.27))))
+          (number "4" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 43.18 180) (length 2.54)
+          (name "PA0" (effects (font (size 1.27 1.27))))
+          (number "40" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 10.16 180) (length 2.54)
+          (name "PB4" (effects (font (size 1.27 1.27))))
+          (number "5" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 7.62 180) (length 2.54)
+          (name "PB5" (effects (font (size 1.27 1.27))))
+          (number "6" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 5.08 180) (length 2.54)
+          (name "PB6" (effects (font (size 1.27 1.27))))
+          (number "7" (effects (font (size 1.27 1.27))))
+        )
+        (pin bidirectional line (at 15.24 2.54 180) (length 2.54)
+          (name "PB7" (effects (font (size 1.27 1.27))))
+          (number "8" (effects (font (size 1.27 1.27))))
+        )
+        (pin input line (at -15.24 43.18 0) (length 2.54)
+          (name "~{RESET}" (effects (font (size 1.27 1.27))))
+          (number "9" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Regulator_Linear:LM7805_TO220" (pin_names (offset 0.254)) (in_bom yes) (on_board yes)
+      (property "Reference" "U" (at -3.81 3.175 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Value" "LM7805_TO220" (at 0 3.175 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" (at 0 5.715 0)
+        (effects (font (size 1.27 1.27) italic) hide)
+      )
+      (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" (at 0 -1.27 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "Voltage Regulator 1A Positive" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Positive 1A 35V Linear Regulator, Fixed Output 5V, TO-220" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_fp_filters" "TO?220*" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "LM7805_TO220_0_1"
+        (rectangle (start -5.08 1.905) (end 5.08 -5.08)
+          (stroke (width 0.254) (type default))
+          (fill (type background))
+        )
+      )
+      (symbol "LM7805_TO220_1_1"
+        (pin power_in line (at -7.62 0 0) (length 2.54)
+          (name "VI" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_in line (at 0 -7.62 90) (length 2.54)
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+        (pin power_out line (at 7.62 0 180) (length 2.54)
+          (name "VO" (effects (font (size 1.27 1.27))))
+          (number "3" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "Switch:SW_Push" (pin_numbers hide) (pin_names (offset 1.016) hide) (in_bom yes) (on_board yes)
+      (property "Reference" "SW" (at 1.27 2.54 0)
+        (effects (font (size 1.27 1.27)) (justify left))
+      )
+      (property "Value" "SW_Push" (at 0 -1.524 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 5.08 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "~" (at 0 5.08 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "switch normally-open pushbutton push-button" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Push button switch, generic, two pins" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "SW_Push_0_1"
+        (circle (center -2.032 0) (radius 0.508)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0 1.27)
+            (xy 0 3.048)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 2.54 1.27)
+            (xy -2.54 1.27)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (circle (center 2.032 0) (radius 0.508)
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (pin passive line (at -5.08 0 0) (length 2.54)
+          (name "1" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+        (pin passive line (at 5.08 0 180) (length 2.54)
+          (name "2" (effects (font (size 1.27 1.27))))
+          (number "2" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "power:+3.3V" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes)
+      (property "Reference" "#PWR" (at 0 -3.81 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Value" "+3.3V" (at 0 3.556 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "global power" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Power symbol creates a global label with name \"+3.3V\"" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "+3.3V_0_1"
+        (polyline
+          (pts
+            (xy -0.762 1.27)
+            (xy 0 2.54)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0 0)
+            (xy 0 2.54)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0 2.54)
+            (xy 0.762 1.27)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "+3.3V_1_1"
+        (pin power_in line (at 0 0 90) (length 0) hide
+          (name "+3.3V" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "power:+5V" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes)
+      (property "Reference" "#PWR" (at 0 -3.81 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Value" "+5V" (at 0 3.556 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "global power" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Power symbol creates a global label with name \"+5V\"" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "+5V_0_1"
+        (polyline
+          (pts
+            (xy -0.762 1.27)
+            (xy 0 2.54)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0 0)
+            (xy 0 2.54)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0 2.54)
+            (xy 0.762 1.27)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "+5V_1_1"
+        (pin power_in line (at 0 0 90) (length 0) hide
+          (name "+5V" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "power:GND" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes)
+      (property "Reference" "#PWR" (at 0 -6.35 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Value" "GND" (at 0 -3.81 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "global power" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Power symbol creates a global label with name \"GND\" , ground" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "GND_0_1"
+        (polyline
+          (pts
+            (xy 0 0)
+            (xy 0 -1.27)
+            (xy 1.27 -1.27)
+            (xy 0 -2.54)
+            (xy -1.27 -1.27)
+            (xy 0 -1.27)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "GND_1_1"
+        (pin power_in line (at 0 0 270) (length 0) hide
+          (name "GND" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+    (symbol "power:VCC" (power) (pin_names (offset 0)) (in_bom yes) (on_board yes)
+      (property "Reference" "#PWR" (at 0 -3.81 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Value" "VCC" (at 0 3.81 0)
+        (effects (font (size 1.27 1.27)))
+      )
+      (property "Footprint" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "Datasheet" "" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_keywords" "global power" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (property "ki_description" "Power symbol creates a global label with name \"VCC\"" (at 0 0 0)
+        (effects (font (size 1.27 1.27)) hide)
+      )
+      (symbol "VCC_0_1"
+        (polyline
+          (pts
+            (xy -0.762 1.27)
+            (xy 0 2.54)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0 0)
+            (xy 0 2.54)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+        (polyline
+          (pts
+            (xy 0 2.54)
+            (xy 0.762 1.27)
+          )
+          (stroke (width 0) (type default))
+          (fill (type none))
+        )
+      )
+      (symbol "VCC_1_1"
+        (pin power_in line (at 0 0 90) (length 0) hide
+          (name "VCC" (effects (font (size 1.27 1.27))))
+          (number "1" (effects (font (size 1.27 1.27))))
+        )
+      )
+    )
+  )
+
+  (junction (at 213.36 95.25) (diameter 0) (color 0 0 0 0)
+    (uuid 09bc88a3-3e76-43a5-84c7-4086837993df)
+  )
+  (junction (at 186.69 20.32) (diameter 0) (color 0 0 0 0)
+    (uuid 249d779f-6fcd-4c63-8b44-e9f7062de590)
+  )
+  (junction (at 210.82 95.25) (diameter 0) (color 0 0 0 0)
+    (uuid 40d5e4e0-4fda-4e62-be8e-33966ee24b88)
+  )
+  (junction (at 220.98 95.25) (diameter 0) (color 0 0 0 0)
+    (uuid 4926824f-3150-40c2-a41b-9da6f2aaea73)
+  )
+  (junction (at 105.41 25.4) (diameter 0) (color 0 0 0 0)
+    (uuid 4dd99f3e-1413-4f9a-93b4-ee5951dc5756)
+  )
+  (junction (at 82.55 157.48) (diameter 0) (color 0 0 0 0)
+    (uuid 53cb1ca0-0db1-4a76-a065-4b42c0df5893)
+  )
+  (junction (at 123.19 21.59) (diameter 0) (color 0 0 0 0)
+    (uuid 6375f7e3-bdff-4727-8c2a-a1203bbf7f4c)
+  )
+  (junction (at 252.73 33.02) (diameter 0) (color 0 0 0 0)
+    (uuid 707257c4-6c6f-40e7-a6b1-e1a2a401afaf)
+  )
+  (junction (at 215.9 95.25) (diameter 0) (color 0 0 0 0)
+    (uuid 8d91281e-0892-4c0b-96bd-807afefede11)
+  )
+  (junction (at 215.9 29.21) (diameter 0) (color 0 0 0 0)
+    (uuid 980551b6-5b01-4afa-b6b9-a5cbf69e9d55)
+  )
+  (junction (at 218.44 95.25) (diameter 0) (color 0 0 0 0)
+    (uuid b1749d74-1758-4e8c-8d31-ec40948f6ddd)
+  )
+  (junction (at 173.99 27.94) (diameter 0) (color 0 0 0 0)
+    (uuid b2d6583c-5a7f-478a-afe7-3cf1f4097820)
+  )
+  (junction (at 275.59 95.25) (diameter 0) (color 0 0 0 0)
+    (uuid c087aa81-b762-477a-a223-da1fe3686466)
+  )
+  (junction (at 29.21 24.13) (diameter 0) (color 0 0 0 0)
+    (uuid c3a2564a-dbb8-4744-82a2-3b425a406908)
+  )
+  (junction (at 161.29 20.32) (diameter 0) (color 0 0 0 0)
+    (uuid c9a79451-a8f4-46c3-acc3-bf6b290b6bd7)
+  )
+  (junction (at 223.52 95.25) (diameter 0) (color 0 0 0 0)
+    (uuid d94f8a63-c2fc-44bc-abca-2b4d42615474)
+  )
+  (junction (at 208.28 95.25) (diameter 0) (color 0 0 0 0)
+    (uuid dd36143c-cb85-4137-9d21-e2b2fd69d625)
+  )
+  (junction (at 46.99 21.59) (diameter 0) (color 0 0 0 0)
+    (uuid dd7ba072-7e7c-4d8a-9cd1-64147dcc9fd6)
+  )
+  (junction (at 223.52 29.21) (diameter 0) (color 0 0 0 0)
+    (uuid df302b79-5106-4656-ad21-aaf05a79da82)
+  )
+  (junction (at 29.21 157.48) (diameter 0) (color 0 0 0 0)
+    (uuid ef2a0b4e-0318-48d8-91e3-9fc77d957d5a)
+  )
+  (junction (at 157.48 144.78) (diameter 0) (color 0 0 0 0)
+    (uuid f5d896d5-12ce-4e0b-aed2-f9637668facd)
+  )
+
+  (bus_entry (at 279.4 106.68) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid 4ea2be60-918d-43fe-817c-c5d8f3214303)
+  )
+  (bus_entry (at 73.66 74.93) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid 7f59b5a2-f5c0-4d08-bf1f-13cef3c58ab9)
+  )
+  (bus_entry (at 279.4 104.14) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid 9d42266c-4998-4467-a9e5-ca6c740d724d)
+  )
+  (bus_entry (at 154.94 74.93) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid a3242f9a-2dee-4d92-b458-8ae35cee6f52)
+  )
+  (bus_entry (at 73.66 77.47) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid b12a77ee-1aa5-40e9-be01-e02e62702f64)
+  )
+  (bus_entry (at 279.4 39.37) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid cef1f7bf-e7b1-4177-aee6-28340c03b2ad)
+  )
+  (bus_entry (at 279.4 41.91) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid e2f0efc7-cb91-47da-b979-8be57775cc40)
+  )
+  (bus_entry (at 154.94 77.47) (size 2.54 2.54)
+    (stroke (width 0) (type default))
+    (uuid ef4abe54-e79a-4d22-ba4d-a1203650dc57)
+  )
+
+  (wire (pts (xy 59.69 87.63) (xy 62.23 87.63))
+    (stroke (width 0) (type default))
+    (uuid 0145ac58-3251-43f3-a807-f76e206c3cb8)
+  )
+  (wire (pts (xy 217.17 127) (xy 220.98 127))
+    (stroke (width 0) (type default))
+    (uuid 0344c7eb-8907-44c2-ba3c-34b4ea53f493)
+  )
+  (wire (pts (xy 250.19 33.02) (xy 252.73 33.02))
+    (stroke (width 0) (type default))
+    (uuid 08368736-cde1-46b6-a527-103cad85d007)
+  )
+  (wire (pts (xy 135.89 85.09) (xy 147.32 85.09))
+    (stroke (width 0) (type default))
+    (uuid 0e106346-005e-487d-9448-e99e67061864)
+  )
+  (wire (pts (xy 105.41 25.4) (xy 105.41 29.21))
+    (stroke (width 0) (type default))
+    (uuid 0e161db0-d063-41ba-95ec-e932d9b73f04)
+  )
+  (wire (pts (xy 59.69 80.01) (xy 73.66 80.01))
+    (stroke (width 0) (type default))
+    (uuid 0e7245bc-fc64-4e80-83de-572c8e50fc9b)
+  )
+  (wire (pts (xy 250.19 124.46) (xy 256.54 124.46))
+    (stroke (width 0) (type default))
+    (uuid 10e0a456-dfd0-466d-91b0-bd23b1005234)
+  )
+  (wire (pts (xy 135.89 110.49) (xy 142.24 110.49))
+    (stroke (width 0) (type default))
+    (uuid 10ed2ecc-5c7b-4dfe-ae84-f9917570142c)
+  )
+  (wire (pts (xy 142.24 177.8) (xy 163.83 177.8))
+    (stroke (width 0) (type default))
+    (uuid 117b13d2-7d95-4b0e-a2a3-27b71a3418fb)
+  )
+  (wire (pts (xy 59.69 74.93) (xy 73.66 74.93))
+    (stroke (width 0) (type default))
+    (uuid 11ea3153-7348-4cf4-aba4-b7ddb1dce447)
+  )
+  (wire (pts (xy 273.05 102.87) (xy 273.05 106.68))
+    (stroke (width 0) (type default))
+    (uuid 13a506a9-e1e7-4f06-aa4a-ad22314d75c9)
+  )
+  (wire (pts (xy 26.67 157.48) (xy 29.21 157.48))
+    (stroke (width 0) (type default))
+    (uuid 157d5348-2058-4586-b52e-29b73a57c294)
+  )
+  (wire (pts (xy 73.66 99.06) (xy 59.69 99.06))
+    (stroke (width 0) (type default))
+    (uuid 17f86434-ac35-4723-a0e0-b78cba88f2ce)
+  )
+  (wire (pts (xy 182.88 69.85) (xy 198.12 69.85))
+    (stroke (width 0) (type default))
+    (uuid 181801b7-680a-4f9b-8177-788d369f90d9)
+  )
+  (wire (pts (xy 135.89 157.48) (xy 163.83 157.48))
+    (stroke (width 0) (type default))
+    (uuid 185698d1-d671-4e74-8309-5e6c4a49373f)
+  )
+  (wire (pts (xy 29.21 20.32) (xy 29.21 24.13))
+    (stroke (width 0) (type default))
+    (uuid 19b96aa8-7c54-4463-a6f6-19960c436d6e)
+  )
+  (wire (pts (xy 59.69 99.06) (xy 59.69 97.79))
+    (stroke (width 0) (type default))
+    (uuid 1af9d381-f2ad-4f1d-a481-99946490874d)
+  )
+  (wire (pts (xy 254 127) (xy 256.54 127))
+    (stroke (width 0) (type default))
+    (uuid 1fe1b7ae-adfa-43eb-bef6-85c985e31789)
+  )
+  (wire (pts (xy 190.5 74.93) (xy 198.12 74.93))
+    (stroke (width 0) (type default))
+    (uuid 201768ef-1436-4748-b24c-69ad9ca548a9)
+  )
+  (wire (pts (xy 208.28 95.25) (xy 210.82 95.25))
+    (stroke (width 0) (type default))
+    (uuid 2073a4f1-a1fe-4435-ac18-e5b9389378ae)
+  )
+  (wire (pts (xy 213.36 95.25) (xy 215.9 95.25))
+    (stroke (width 0) (type default))
+    (uuid 20d5fefd-8ca0-41a3-b9a8-7b62c87ba7fd)
+  )
+  (wire (pts (xy 29.21 156.21) (xy 29.21 157.48))
+    (stroke (width 0) (type default))
+    (uuid 21bbb3b9-abda-4034-b3ef-ecbbc03c080f)
+  )
+  (wire (pts (xy 161.29 20.32) (xy 166.37 20.32))
+    (stroke (width 0) (type default))
+    (uuid 23dda5ad-f9e5-4b5e-986d-6c3a70cc48c5)
+  )
+  (wire (pts (xy 163.83 45.72) (xy 167.64 45.72))
+    (stroke (width 0) (type default))
+    (uuid 240d0db4-68c4-4c1a-922e-a7315b4e95c7)
+  )
+  (wire (pts (xy 29.21 24.13) (xy 29.21 29.21))
+    (stroke (width 0) (type default))
+    (uuid 268a7fe9-ecba-47d5-a3c7-d1ff9d2ad518)
+  )
+  (wire (pts (xy 146.05 105.41) (xy 135.89 105.41))
+    (stroke (width 0) (type default))
+    (uuid 26938f91-b7d5-43dd-b225-a10600aaa4a8)
+  )
+  (wire (pts (xy 182.88 128.27) (xy 186.69 128.27))
+    (stroke (width 0) (type default))
+    (uuid 28579abc-718a-4dc3-81ff-01c53171c390)
+  )
+  (bus (pts (xy 281.94 44.45) (xy 281.94 106.68))
+    (stroke (width 0) (type default))
+    (uuid 2d257f63-7f57-4934-b10d-25c222e89b31)
+  )
+  (bus (pts (xy 157.48 80.01) (xy 157.48 144.78))
+    (stroke (width 0) (type default))
+    (uuid 2fe9729c-3521-4dd3-9581-6c1ae92d2c04)
+  )
+
+  (wire (pts (xy 59.69 57.15) (xy 97.79 57.15))
+    (stroke (width 0) (type default))
+    (uuid 3078e949-9ba3-4c98-9b91-d6f51ba6a1a5)
+  )
+  (wire (pts (xy 41.91 170.18) (xy 53.34 170.18))
+    (stroke (width 0) (type default))
+    (uuid 3225f937-f78b-4dd4-9451-d0e401cf5a1d)
+  )
+  (wire (pts (xy 59.69 59.69) (xy 93.98 59.69))
+    (stroke (width 0) (type default))
+    (uuid 336476e6-ff44-4a0a-9acb-8321b098defa)
+  )
+  (wire (pts (xy 233.68 160.02) (xy 240.03 160.02))
+    (stroke (width 0) (type default))
+    (uuid 3494bfec-87a7-40e2-ab82-466815749813)
+  )
+  (wire (pts (xy 213.36 29.21) (xy 215.9 29.21))
+    (stroke (width 0) (type default))
+    (uuid 35b57651-33aa-4ea1-8a24-d6caf27a7386)
+  )
+  (wire (pts (xy 41.91 172.72) (xy 49.53 172.72))
+    (stroke (width 0) (type default))
+    (uuid 35e8acbf-1456-445c-948f-4cdd378b181b)
+  )
+  (wire (pts (xy 59.69 100.33) (xy 69.85 100.33))
+    (stroke (width 0) (type default))
+    (uuid 36766d55-6afa-4c45-b53e-c1416a905e91)
+  )
+  (wire (pts (xy 135.89 74.93) (xy 154.94 74.93))
+    (stroke (width 0) (type default))
+    (uuid 3b0a1ca0-0ff2-4892-bf13-4f9f0219b6ab)
+  )
+  (bus (pts (xy 76.2 144.78) (xy 157.48 144.78))
+    (stroke (width 0) (type default))
+    (uuid 3ff47538-cf23-4a74-8f20-7006dc591baa)
+  )
+
+  (wire (pts (xy 238.76 41.91) (xy 252.73 41.91))
+    (stroke (width 0) (type default))
+    (uuid 4070e972-eee3-4aaf-b82e-161b884bdf8e)
+  )
+  (wire (pts (xy 95.25 175.26) (xy 99.06 175.26))
+    (stroke (width 0) (type default))
+    (uuid 414cdf2a-7068-4790-a4a3-7b383554bf8d)
+  )
+  (wire (pts (xy 59.69 67.31) (xy 82.55 67.31))
+    (stroke (width 0) (type default))
+    (uuid 4156c3f0-c4a0-476e-815c-224178a4c3c3)
+  )
+  (wire (pts (xy 215.9 95.25) (xy 218.44 95.25))
+    (stroke (width 0) (type default))
+    (uuid 4240ebe8-029a-4ed1-8a91-c5af0dc6e768)
+  )
+  (wire (pts (xy 273.05 41.91) (xy 279.4 41.91))
+    (stroke (width 0) (type default))
+    (uuid 42957440-b843-4abe-b1e9-0a21ac5fcfbd)
+  )
+  (wire (pts (xy 146.05 180.34) (xy 163.83 180.34))
+    (stroke (width 0) (type default))
+    (uuid 4a796956-10e4-44a3-a5c7-c48088bed685)
+  )
+  (wire (pts (xy 105.41 19.05) (xy 105.41 25.4))
+    (stroke (width 0) (type default))
+    (uuid 4fbd8ed8-8d5a-4a73-9f20-3493bcfb8874)
+  )
+  (wire (pts (xy 252.73 33.02) (xy 252.73 36.83))
+    (stroke (width 0) (type default))
+    (uuid 523f4ee3-ac37-4550-8157-670fa9ca85df)
+  )
+  (wire (pts (xy 135.89 82.55) (xy 151.13 82.55))
+    (stroke (width 0) (type default))
+    (uuid 53a57f17-cc80-4e82-a811-84ccab51ccca)
+  )
+  (wire (pts (xy 41.91 165.1) (xy 57.15 165.1))
+    (stroke (width 0) (type default))
+    (uuid 53d66b1f-b0c3-4c5a-a1dc-7b52f7a26615)
+  )
+  (wire (pts (xy 161.29 27.94) (xy 173.99 27.94))
+    (stroke (width 0) (type default))
+    (uuid 558dd405-4970-459d-b426-6d2d99ca5400)
+  )
+  (bus (pts (xy 76.2 77.47) (xy 76.2 80.01))
+    (stroke (width 0) (type default))
+    (uuid 57b10da0-2631-4b7c-baeb-f72826a5cc44)
+  )
+  (bus (pts (xy 281.94 41.91) (xy 281.94 44.45))
+    (stroke (width 0) (type default))
+    (uuid 61991ec9-0dff-4d70-bb4a-70ef5ba6b54c)
+  )
+
+  (wire (pts (xy 154.94 160.02) (xy 163.83 160.02))
+    (stroke (width 0) (type default))
+    (uuid 65ac6cf1-5c00-4dfe-bbae-26a621172cbb)
+  )
+  (wire (pts (xy 59.69 82.55) (xy 69.85 82.55))
+    (stroke (width 0) (type default))
+    (uuid 6623f640-7657-40cf-a4d8-e7dbcdf98985)
+  )
+  (wire (pts (xy 273.05 95.25) (xy 275.59 95.25))
+    (stroke (width 0) (type default))
+    (uuid 6886ca5d-0926-4ef4-b866-833de7c3c369)
+  )
+  (wire (pts (xy 135.89 52.07) (xy 139.7 52.07))
+    (stroke (width 0) (type default))
+    (uuid 6ce563f3-5e2d-438c-b5c7-6a65cb349f40)
+  )
+  (wire (pts (xy 153.67 185.42) (xy 163.83 185.42))
+    (stroke (width 0) (type default))
+    (uuid 7173166a-7ce8-49c9-8927-8d7c7855e6f3)
+  )
+  (wire (pts (xy 59.69 105.41) (xy 62.23 105.41))
+    (stroke (width 0) (type default))
+    (uuid 73f6e9ab-120b-4719-a048-657cc1759286)
+  )
+  (wire (pts (xy 135.89 77.47) (xy 154.94 77.47))
+    (stroke (width 0) (type default))
+    (uuid 7b3a9159-4d39-47c3-99cc-04addd962c45)
+  )
+  (wire (pts (xy 179.07 67.31) (xy 198.12 67.31))
+    (stroke (width 0) (type default))
+    (uuid 7cdd41cd-1fd4-43b8-a7df-abf720f15e08)
+  )
+  (wire (pts (xy 269.24 127) (xy 271.78 127))
+    (stroke (width 0) (type default))
+    (uuid 82df5823-56fc-4eb8-b3f5-5c7b48839ca3)
+  )
+  (bus (pts (xy 76.2 80.01) (xy 76.2 144.78))
+    (stroke (width 0) (type default))
+    (uuid 83485a95-ebe7-4473-a40f-b66981b270e4)
+  )
+
+  (wire (pts (xy 59.69 29.21) (xy 63.5 29.21))
+    (stroke (width 0) (type default))
+    (uuid 91fd7e98-347a-4882-b5c1-174df3b5262d)
+  )
+  (wire (pts (xy 120.65 21.59) (xy 123.19 21.59))
+    (stroke (width 0) (type default))
+    (uuid 97866cf2-6517-41c3-9ccc-da8dc8732fca)
+  )
+  (wire (pts (xy 233.68 124.46) (xy 241.3 124.46))
+    (stroke (width 0) (type default))
+    (uuid 983d5b1c-62e8-4e14-8d7d-4ecc4a348000)
+  )
+  (wire (pts (xy 82.55 156.21) (xy 82.55 157.48))
+    (stroke (width 0) (type default))
+    (uuid 986036c3-ad7b-461e-8d2b-6f8ecd31b14a)
+  )
+  (wire (pts (xy 95.25 165.1) (xy 110.49 165.1))
+    (stroke (width 0) (type default))
+    (uuid 9b7ec3c6-ce7b-4002-ac93-183f11ded006)
+  )
+  (wire (pts (xy 59.69 85.09) (xy 66.04 85.09))
+    (stroke (width 0) (type default))
+    (uuid 9bf4380e-a6dc-4528-a5a2-b51a3290314b)
+  )
+  (wire (pts (xy 41.91 175.26) (xy 45.72 175.26))
+    (stroke (width 0) (type default))
+    (uuid 9cf92362-6386-46e2-b296-b8ee4b63f278)
+  )
+  (wire (pts (xy 181.61 20.32) (xy 186.69 20.32))
+    (stroke (width 0) (type default))
+    (uuid 9f8087ab-4662-4331-bd8c-cc5806cbe66a)
+  )
+  (wire (pts (xy 173.99 27.94) (xy 186.69 27.94))
+    (stroke (width 0) (type default))
+    (uuid a129ba35-020b-4d50-9425-dbcbe1191ef1)
+  )
+  (wire (pts (xy 44.45 21.59) (xy 46.99 21.59))
+    (stroke (width 0) (type default))
+    (uuid a25d013a-ca6a-4d78-83d0-308287f1ad36)
+  )
+  (wire (pts (xy 59.69 62.23) (xy 90.17 62.23))
+    (stroke (width 0) (type default))
+    (uuid a2600b1c-21b2-4706-97f8-e9da03424d1b)
+  )
+  (wire (pts (xy 149.86 182.88) (xy 163.83 182.88))
+    (stroke (width 0) (type default))
+    (uuid a2b6fdd1-dc38-4e63-b427-f072bcf748aa)
+  )
+  (wire (pts (xy 26.67 24.13) (xy 29.21 24.13))
+    (stroke (width 0) (type default))
+    (uuid a337749b-6156-4b5d-88ac-9f879be642cf)
+  )
+  (wire (pts (xy 59.69 69.85) (xy 78.74 69.85))
+    (stroke (width 0) (type default))
+    (uuid aa1a4d41-5de0-4e2d-bf10-04aa7ebf1197)
+  )
+  (wire (pts (xy 238.76 39.37) (xy 252.73 39.37))
+    (stroke (width 0) (type default))
+    (uuid aadfa806-631f-4a01-9bb8-29e2b6ed844e)
+  )
+  (bus (pts (xy 157.48 77.47) (xy 157.48 80.01))
+    (stroke (width 0) (type default))
+    (uuid ac792d5a-bcd5-4469-a2c7-4ebd0864ae85)
+  )
+
+  (wire (pts (xy 193.04 160.02) (xy 199.39 160.02))
+    (stroke (width 0) (type default))
+    (uuid ad9fe05a-c304-40a8-9a1e-715a61542489)
+  )
+  (bus (pts (xy 281.94 109.22) (xy 281.94 144.78))
+    (stroke (width 0) (type default))
+    (uuid adba9033-9641-4f94-8160-86f4e8440ede)
+  )
+
+  (wire (pts (xy 95.25 172.72) (xy 102.87 172.72))
+    (stroke (width 0) (type default))
+    (uuid b1739d78-ac52-4343-8cb8-c60e99a728ee)
+  )
+  (wire (pts (xy 95.25 170.18) (xy 106.68 170.18))
+    (stroke (width 0) (type default))
+    (uuid b1dc0757-9358-4d03-a0e8-02d0322ed156)
+  )
+  (wire (pts (xy 101.6 25.4) (xy 105.41 25.4))
+    (stroke (width 0) (type default))
+    (uuid b3a7a438-1bad-4504-b6ba-b85959c6c8b1)
+  )
+  (wire (pts (xy 210.82 95.25) (xy 213.36 95.25))
+    (stroke (width 0) (type default))
+    (uuid b454f830-7117-43a4-a678-1c2fa7d82912)
+  )
+  (wire (pts (xy 220.98 29.21) (xy 223.52 29.21))
+    (stroke (width 0) (type default))
+    (uuid bf5a3089-9e34-4173-86a7-3f6ce582a39f)
+  )
+  (wire (pts (xy 59.69 54.61) (xy 101.6 54.61))
+    (stroke (width 0) (type default))
+    (uuid bfb97078-fabe-4110-b853-77b2049dc5b0)
+  )
+  (wire (pts (xy 59.69 64.77) (xy 86.36 64.77))
+    (stroke (width 0) (type default))
+    (uuid c24e130c-d8bf-492e-a40b-bc9997ff9c04)
+  )
+  (wire (pts (xy 215.9 25.4) (xy 215.9 29.21))
+    (stroke (width 0) (type default))
+    (uuid c70a6b67-70e9-4eee-91d0-001fd2888d8e)
+  )
+  (wire (pts (xy 213.36 124.46) (xy 220.98 124.46))
+    (stroke (width 0) (type default))
+    (uuid c806b00b-4967-4b60-a8e0-bd1f40f8f928)
+  )
+  (wire (pts (xy 273.05 106.68) (xy 279.4 106.68))
+    (stroke (width 0) (type default))
+    (uuid c908620d-abdc-411b-8540-69626010a8ec)
+  )
+  (wire (pts (xy 123.19 17.78) (xy 123.19 21.59))
+    (stroke (width 0) (type default))
+    (uuid c94e85ae-92b0-48b7-a68f-c76f03258055)
+  )
+  (bus (pts (xy 281.94 106.68) (xy 281.94 109.22))
+    (stroke (width 0) (type default))
+    (uuid cb44788c-4a7b-4aed-b196-4e204ca2c71a)
+  )
+
+  (wire (pts (xy 135.89 80.01) (xy 154.94 80.01))
+    (stroke (width 0) (type default))
+    (uuid cb94d789-3817-4c87-8032-39522d84b096)
+  )
+  (wire (pts (xy 233.68 127) (xy 237.49 127))
+    (stroke (width 0) (type default))
+    (uuid d0423f12-e36f-42da-aa0f-cf0f588a4a4b)
+  )
+  (wire (pts (xy 186.69 72.39) (xy 198.12 72.39))
+    (stroke (width 0) (type default))
+    (uuid d055e106-c55a-4ca9-8b45-711ef8dba211)
+  )
+  (wire (pts (xy 59.69 52.07) (xy 105.41 52.07))
+    (stroke (width 0) (type default))
+    (uuid d7e72773-65f7-473f-b410-aaa1e731a205)
+  )
+  (wire (pts (xy 46.99 17.78) (xy 46.99 21.59))
+    (stroke (width 0) (type default))
+    (uuid d8c9e8e6-13e0-4a27-ae51-797ab2f1b71f)
+  )
+  (wire (pts (xy 194.31 77.47) (xy 198.12 77.47))
+    (stroke (width 0) (type default))
+    (uuid dba71331-1334-4c88-ae0c-090358514adb)
+  )
+  (bus (pts (xy 157.48 144.78) (xy 281.94 144.78))
+    (stroke (width 0) (type default))
+    (uuid dc2dd6e7-ab05-47a8-aa95-6f08bde2efde)
+  )
+
+  (wire (pts (xy 135.89 102.87) (xy 149.86 102.87))
+    (stroke (width 0) (type default))
+    (uuid dfe3b1b3-6217-4660-aeae-b88d4fd376ae)
+  )
+  (wire (pts (xy 275.59 102.87) (xy 275.59 104.14))
+    (stroke (width 0) (type default))
+    (uuid e8663d38-36ed-44a8-b280-560fe57afbbb)
+  )
+  (wire (pts (xy 275.59 104.14) (xy 279.4 104.14))
+    (stroke (width 0) (type default))
+    (uuid e9bc3504-1b67-443d-a67b-8add316a4507)
+  )
+  (wire (pts (xy 80.01 157.48) (xy 82.55 157.48))
+    (stroke (width 0) (type default))
+    (uuid ea68849b-22a4-46fa-a9a4-a4397f8d3177)
+  )
+  (wire (pts (xy 154.94 165.1) (xy 163.83 165.1))
+    (stroke (width 0) (type default))
+    (uuid eba6bf66-969a-4936-a140-cac9d1c3de02)
+  )
+  (wire (pts (xy 223.52 95.25) (xy 226.06 95.25))
+    (stroke (width 0) (type default))
+    (uuid edfb4f76-eaa3-4b13-b886-7c38fa9f7c6a)
+  )
+  (wire (pts (xy 220.98 95.25) (xy 223.52 95.25))
+    (stroke (width 0) (type default))
+    (uuid ee013c1a-291f-455f-9b7d-42b693449ac3)
+  )
+  (wire (pts (xy 269.24 124.46) (xy 275.59 124.46))
+    (stroke (width 0) (type default))
+    (uuid ee1a9677-febd-4f9e-861f-f677e14a93d8)
+  )
+  (wire (pts (xy 179.07 125.73) (xy 186.69 125.73))
+    (stroke (width 0) (type default))
+    (uuid eed1f8b5-abb6-4bb4-a3ff-94110e8153e9)
+  )
+  (wire (pts (xy 273.05 39.37) (xy 279.4 39.37))
+    (stroke (width 0) (type default))
+    (uuid efe67566-30be-43a8-bfb0-97b0c301d5b5)
+  )
+  (wire (pts (xy 135.89 87.63) (xy 143.51 87.63))
+    (stroke (width 0) (type default))
+    (uuid f0afb167-d990-47b9-b7a2-14cf33782c1f)
+  )
+  (wire (pts (xy 223.52 25.4) (xy 223.52 29.21))
+    (stroke (width 0) (type default))
+    (uuid f13233b1-d771-4480-b928-b3d1490a221b)
+  )
+  (wire (pts (xy 218.44 95.25) (xy 220.98 95.25))
+    (stroke (width 0) (type default))
+    (uuid f716e845-e451-47ea-8991-07504c49b38c)
+  )
+  (wire (pts (xy 135.89 67.31) (xy 139.7 67.31))
+    (stroke (width 0) (type default))
+    (uuid f77ab260-1acb-43d5-91a1-b15ba18250cd)
+  )
+  (wire (pts (xy 175.26 123.19) (xy 186.69 123.19))
+    (stroke (width 0) (type default))
+    (uuid f8b2e8ff-b3f1-480f-bc93-ef4996d5983e)
+  )
+  (wire (pts (xy 59.69 102.87) (xy 66.04 102.87))
+    (stroke (width 0) (type default))
+    (uuid fc1084b6-e4b2-4590-b87a-38c11e6da2c2)
+  )
+  (wire (pts (xy 59.69 77.47) (xy 73.66 77.47))
+    (stroke (width 0) (type default))
+    (uuid fd2a52de-3f5a-42d4-850a-d1c1c502bc33)
+  )
+
+  (rectangle (start 210.82 101.6) (end 246.38 111.76)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 2d18288b-fa6e-4098-b2da-4ec1c95aeb07)
+  )
+  (rectangle (start 64.77 151.13) (end 113.03 194.31)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 31956d12-a003-4d17-a426-b1f3f6ce3230)
+  )
+  (rectangle (start 247.65 20.32) (end 278.13 68.58)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 40fd3bb2-685a-4ae7-88f8-427a34dacbbe)
+  )
+  (rectangle (start 158.75 38.1) (end 189.23 62.23)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 42df9707-44f3-431a-8f26-ac5b5ac9910e)
+  )
+  (rectangle (start 184.15 146.05) (end 220.98 165.1)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 47af6b2a-0889-454d-a7ea-6e61c6dd1ff2)
+  )
+  (rectangle (start 158.75 13.97) (end 189.23 34.29)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 4a826914-524a-4879-944e-925a0867a8dd)
+  )
+  (rectangle (start 210.82 113.03) (end 243.84 142.24)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 71d96b03-da36-4ca2-8756-28eaec5e7031)
+  )
+  (rectangle (start 224.79 146.05) (end 261.62 165.1)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid 7bbad9e1-c828-481e-94ee-01dfbbcd4821)
+  )
+  (rectangle (start 172.72 115.57) (end 207.01 142.24)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid b4b4c61c-4f71-4a94-8644-927c0c3999b1)
+  )
+  (rectangle (start 116.84 148.59) (end 173.99 196.85)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid c93d08fd-b5b9-42ca-9c6b-dafae2cf19d6)
+  )
+  (rectangle (start 247.65 113.03) (end 278.13 142.24)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid d6d58377-cf9f-40ca-a867-e9b13f64005f)
+  )
+  (rectangle (start 13.97 151.13) (end 59.69 194.31)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid f4dba22f-3969-461f-a554-7ce28d8c4b52)
+  )
+  (rectangle (start 267.97 90.17) (end 280.67 107.95)
+    (stroke (width 0) (type default))
+    (fill (type none))
+    (uuid fc135435-2a58-410d-896e-dc8969172ffe)
+  )
+
+  (text "SDA" (at 274.32 39.37 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 172e78e5-0926-4ca0-8572-d439d6099622)
+  )
+  (text "Kopplingsschema\n" (at 186.69 190.5 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 2a08c8d0-93d8-46a3-a5c2-90c2797ffc6d)
+  )
+  (text "SCL" (at 274.32 41.91 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 40186075-4d4a-42a6-a795-232ac3e4e0ad)
+  )
+  (text "SCL" (at 240.03 41.91 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 5786379c-846b-4c1c-bb61-8cbce6dfe328)
+  )
+  (text "SDA" (at 240.03 39.37 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 63590d9b-facb-4f50-81b9-46b44aa61f25)
+  )
+  (text "Pull-up I2C" (at 266.7 90.17 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 74acc51a-a298-417d-ba36-054ba3510821)
+  )
+  (text "SDA" (at 68.58 77.47 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 802d18ea-268a-4881-a206-4e5acdf65066)
+  )
+  (text "SCL" (at 144.78 74.93 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 87594ab5-4fe8-4908-8944-5ed7bb1637ab)
+  )
+  (text "SCL" (at 68.58 74.93 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid 983ce975-6a57-471c-a1c7-1cc9c768516a)
+  )
+  (text "0.1\n" (at 269.24 194.31 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid bd88dd6f-5b87-4846-bb9a-e42ebd199ea8)
+  )
+  (text "2024-02-26" (at 207.01 194.31 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid e1d0f6d4-9926-4249-803b-904c753b91dd)
+  )
+  (text "SDA" (at 144.78 77.47 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid ee6acc72-cf9b-4ebb-acd9-9a3bd01dd0ef)
+  )
+  (text "Kopplingsschema för robotens delsystem; Sensormodul,\nStyrmodul och Kommunikationsmodul samt kringutrustning.\n"
+    (at 177.8 171.45 0)
+    (effects (font (size 1.27 1.27)) (justify left bottom))
+    (uuid fee229e0-ef1d-4458-acea-8ed547c9ad26)
+  )
+
+  (global_label "MUX_A2" (shape input) (at 97.79 57.15 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 044bd5ea-49ab-4f34-8d86-b9e65ee95348)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 97.79 67.3129 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_DB5" (shape input) (at 190.5 74.93 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 0a2d0b8f-2c3a-4d18-be6e-7c300075242e)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 190.5 86.121 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TDO_2" (shape input) (at 102.87 172.72 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 0c5f4d1f-4f3b-4c11-ad17-10f8f01f4ad3)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 102.87 186.6324 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Button_2_P" (shape input) (at 167.64 48.26 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 0d223ebb-4cb1-4d3e-ba4b-9a3927a8be45)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 167.64 61.7489 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TDO_2" (shape input) (at 151.13 82.55 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 111db7c7-0eeb-41e6-b186-5a31bb480108)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 151.13 96.4624 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_DB6" (shape input) (at 194.31 77.47 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 1290a551-6216-4d82-ba1d-d43b9a1bce67)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 194.31 88.661 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TMS_2" (shape input) (at 99.06 175.26 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 17e48ab5-f1c9-4b90-8e9f-ea5c133a7dd8)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 99.06 189.2328 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Dir_Motor_L" (shape input) (at 250.19 124.46 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 180611bf-5fd3-4446-87af-8d8c312a9e68)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 250.19 138.2514 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_DB7" (shape input) (at 198.12 80.01 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 1944934c-7902-4167-a5cb-23b521674655)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 198.12 91.201 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TDO" (shape input) (at 69.85 82.55 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 1c0299d5-d801-47fe-9986-62ec4536d6be)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 69.85 94.2853 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "MUX_A3" (shape input) (at 237.49 127 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 1f613ec8-faa1-4f87-bd6d-00edfdfc234a)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 237.49 137.1629 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "PWM_Motor_R" (shape input) (at 142.24 110.49 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 204a8844-1c83-4a0e-8064-37ca2fc8dfcc)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 142.24 126.0351 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_RESET" (shape input) (at 57.15 165.1 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 24e21995-d331-473e-a692-fc35509d326b)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 57.15 179.0123 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_DB4" (shape input) (at 186.69 72.39 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 25aa1efc-d948-4b4f-ae28-088424629ceb)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 186.69 83.581 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "SPI_CS" (shape input) (at 90.17 62.23 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 29b23289-e745-4d0d-9a68-e2fe0123ceca)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 90.17 71.6672 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Reflex_out" (shape input) (at 63.5 29.21 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid 33108f54-9dbc-40d1-bbff-152f3630a7d1)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 76.2633 29.21 0)
+      (effects (font (size 1.27 1.27)) (justify left) hide)
+    )
+  )
+  (global_label "PWM_Gripklo" (shape input) (at 226.06 109.22 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 34c68f8c-66d5-4b7d-8d87-2b02a30827fc)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 211.3615 109.22 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "PWM_Motor_R" (shape input) (at 271.78 127 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 379dbf19-adf4-458d-a70d-5f51c8208f56)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 271.78 142.5451 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Button_1_P" (shape input) (at 163.83 45.72 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 37ee2fc4-660f-41de-9c21-ab185ee9190e)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 163.83 59.2089 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Button_2_P" (shape input) (at 69.85 100.33 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 49877b09-4a37-4216-94cb-5e896aa06e7e)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 69.85 113.8189 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Dir_Motor_R" (shape input) (at 146.05 105.41 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 4ffed45c-5d6f-4fcc-8fae-e0a1958a821a)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 146.05 119.4433 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_RS" (shape input) (at 179.07 67.31 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 50eb8464-812c-4155-ae6a-38683a49da6e)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 179.07 77.231 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_RESET_2" (shape input) (at 105.41 19.05 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid 538204f5-8c0e-4ff2-9f35-91af3891c97f)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 121.4994 19.05 0)
+      (effects (font (size 1.27 1.27)) (justify left) hide)
+    )
+  )
+  (global_label "Odo_R" (shape input) (at 233.68 160.02 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 573e2c08-d079-406e-bff6-c11d21589746)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 224.9081 160.02 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TCK" (shape input) (at 53.34 170.18 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 5f2420a9-6335-4ab0-b982-450513a3b7ec)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 53.34 181.8548 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TCK_2" (shape input) (at 154.94 80.01 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 63653edf-7cc5-43a4-8635-c71095fe576f)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 154.94 93.8619 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "MUX_A0" (shape input) (at 105.41 52.07 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 63ff223c-6944-4a96-bff6-095a609180db)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 105.41 62.2329 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "MUX_A3" (shape input) (at 93.98 59.69 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 66ab4e47-8cbe-42c6-83b3-b368c300fb56)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 93.98 69.8529 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "SPI_MOSI" (shape input) (at 86.36 64.77 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 67bf9c6c-8389-4dcb-ab18-184950238518)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 86.36 76.3239 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TDI_2" (shape input) (at 95.25 177.8 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 6a74f199-35a3-4ff5-be01-473d44bf3931)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 95.25 190.9867 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Dir_Motor_R" (shape input) (at 275.59 124.46 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 6aff117f-c82c-4101-8692-663cbf88010d)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 275.59 138.4933 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Dir_Motor_L" (shape input) (at 149.86 102.87 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 6d9c5b7b-b6d1-42af-869f-0a4a6995f825)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 149.86 116.6614 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "SPI_MISO" (shape input) (at 182.88 128.27 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 762c2a55-5143-4e70-a416-28c5a4f0bf08)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 182.88 139.8239 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "SPI_CS" (shape input) (at 179.07 125.73 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 7803baf1-0cb2-449e-a4d6-251207db1b45)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 179.07 135.1672 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Odo_L" (shape input) (at 62.23 105.41 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 7a2151f9-be4d-4aa7-abd6-856affc4cf9d)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 62.23 113.94 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "SPI_CLK" (shape input) (at 175.26 123.19 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 7a71351c-726e-4536-a71f-478d77ce6897)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 175.26 133.7158 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_DB7" (shape input) (at 149.86 182.88 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 7d3cc68c-3dd6-42f6-9bc2-bafc1f35431d)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 149.86 194.071 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_RESET_2" (shape input) (at 110.49 165.1 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 8103f8d7-a360-4de9-b533-9a709fba3378)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 110.49 181.1894 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "PWM_Gripklo" (shape input) (at 139.7 52.07 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid 8477cd01-c853-4ff1-9573-fd1f6af94ec1)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 154.3985 52.07 0)
+      (effects (font (size 1.27 1.27)) (justify left) hide)
+    )
+  )
+  (global_label "JTAG_TCK" (shape input) (at 73.66 80.01 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 84c9c0e4-dec7-4ef9-b382-1ffc0765478b)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 73.66 91.6848 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_RESET" (shape input) (at 29.21 20.32 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid 8a0e2a04-48f3-4820-b9fe-2d7c443bdc2b)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 43.1223 20.32 0)
+      (effects (font (size 1.27 1.27)) (justify left) hide)
+    )
+  )
+  (global_label "Button_1_P" (shape input) (at 73.66 99.06 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 8bdc0957-35bd-4040-90e0-90551f34182e)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 73.66 112.5489 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "MUX_A0" (shape input) (at 213.36 124.46 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 8eaa08e6-06c1-448a-b873-2bf4e92c647a)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 213.36 134.6229 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "SPI_MISO" (shape input) (at 82.55 67.31 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 8f96b507-df45-4861-a6f1-4695a37e3cc7)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 82.55 78.8639 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Odo_R" (shape input) (at 66.04 102.87 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 8fde10c0-88ee-492d-87dd-6a525b2d3c61)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 66.04 111.6419 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Reflex_EN" (shape input) (at 220.98 129.54 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 91df1910-055a-476c-b881-2ad88a61eb46)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 220.98 141.7591 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TMS" (shape input) (at 45.72 175.26 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 95d73771-dc82-44ba-9427-b75426c88464)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 45.72 187.0557 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "MUX_A1" (shape input) (at 101.6 54.61 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid 96f08045-6d39-45b4-952e-feeecb6d52bc)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 101.6 64.7729 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "PWM_Motor_L" (shape input) (at 254 127 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid a57ed603-7687-489b-bf30-e1fd137f5f57)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 254 142.3032 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TCK_2" (shape input) (at 106.68 170.18 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid a6a9b2ac-6905-4196-a15a-dba71689b91e)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 106.68 184.0319 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TDO" (shape input) (at 49.53 172.72 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid a9c94737-7ea0-4113-a782-355809f3948e)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 49.53 184.4553 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Reflex_out" (shape input) (at 233.68 129.54 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid abb24cb9-9415-47d5-81cd-99bb44de21a5)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 233.68 142.3033 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "SPI_CLK" (shape input) (at 78.74 69.85 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid b18f0881-e38b-48ee-a76e-1f68187a9bd7)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 78.74 80.3758 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TDI" (shape input) (at 41.91 177.8 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid b43a3a09-b4b0-410b-a45b-9435cf7a83a1)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 41.91 188.8096 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "PWM_Motor_L" (shape input) (at 139.7 67.31 0) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify left))
+    (uuid b4e37b38-7ecb-42f7-9470-427f1dec0651)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 155.0032 67.31 0)
+      (effects (font (size 1.27 1.27)) (justify left) hide)
+    )
+  )
+  (global_label "LCD_DB7" (shape input) (at 146.05 180.34 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid b7ad3c8e-9d29-4a7d-86a9-6537b1df199f)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 146.05 191.531 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TDI" (shape input) (at 62.23 87.63 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid ba0887b4-84e0-4266-adaa-3c1bc89e07ed)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 62.23 98.6396 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "MUX_A2" (shape input) (at 217.17 127 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid be3a0138-4f0b-4a0b-83e3-b0939b2509b8)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 217.17 137.1629 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "MUX_A1" (shape input) (at 241.3 124.46 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid c2811584-0ea2-4f44-b940-3285f2a7d182)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 241.3 134.6229 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "Odo_L" (shape input) (at 193.04 160.02 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid c4a9360c-904d-4a2d-aa57-accc27f6f272)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 184.51 160.02 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TMS_2" (shape input) (at 147.32 85.09 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid c6d81c53-a3ae-43fe-84d1-bba82a969556)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 147.32 99.0628 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TDI_2" (shape input) (at 143.51 87.63 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid cd7d0dbc-abf8-4723-964e-7dbd85a7bcda)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 143.51 100.8167 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_DB7" (shape input) (at 153.67 185.42 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid d582db2e-272b-45c5-b77f-462536f0a576)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 153.67 196.611 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_DB7" (shape input) (at 142.24 177.8 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid e77ff3bd-ade6-48d4-a499-69aff31b5aef)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 142.24 188.991 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_RS" (shape input) (at 154.94 160.02 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid e97f8236-d3f9-44d5-b55d-e93678fe4636)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 145.019 160.02 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_EN" (shape input) (at 154.94 165.1 180) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid f26ec61c-3db5-4125-8a40-c81d90be35ea)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 145.019 165.1 0)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "SPI_MOSI" (shape input) (at 186.69 130.81 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid f2b491e6-cafc-411c-95d1-26e093270123)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 186.69 142.3639 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "JTAG_TMS" (shape input) (at 66.04 85.09 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid f3865237-d03c-4438-acd1-195e900bc84c)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 66.04 96.8857 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+  (global_label "LCD_EN" (shape input) (at 182.88 69.85 270) (fields_autoplaced)
+    (effects (font (size 1.27 1.27)) (justify right))
+    (uuid fcd0bb5a-8054-4dec-9dd4-2a945f743fb5)
+    (property "Intersheetrefs" "${INTERSHEET_REFS}" (at 182.88 79.771 90)
+      (effects (font (size 1.27 1.27)) (justify right) hide)
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 191.77 152.4 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 0b0e74be-6da7-496c-bf65-009dc00b686d)
+    (property "Reference" "#PWR051" (at 191.77 156.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 191.77 148.59 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 191.77 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 191.77 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid c75a48ff-83ed-49f0-98c0-f449507e6738))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR051") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 199.39 154.94 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 0ff401f0-a122-4fde-8f77-5b7e2e9c1b77)
+    (property "Reference" "#PWR052" (at 193.04 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 195.58 155.575 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 199.39 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 199.39 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid af252752-b618-4904-a569-f9a19984a316))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR052") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 269.24 119.38 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 13876a4c-4b2b-420f-9549-8fee4d29a196)
+    (property "Reference" "#PWR036" (at 275.59 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 273.05 120.015 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 269.24 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 269.24 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 48038a3e-1be1-482e-b505-8adf0679088b))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR036") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 163.83 162.56 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 16ddd524-17d0-46a3-9afb-3120ed574154)
+    (property "Reference" "#PWR044" (at 157.48 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 160.02 163.195 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 163.83 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 163.83 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 52918205-59f8-4e15-a333-4c91191c8d6a))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR044") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 256.54 121.92 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 22d6961d-6ab8-40d6-837f-b8db74a43a87)
+    (property "Reference" "#PWR035" (at 260.35 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 252.73 122.555 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 256.54 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 256.54 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 75181aa3-5ac7-48d7-8c90-82b9d0f9a1da))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR035") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 186.69 20.32 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 22e5c50f-c6ce-4491-8a23-5ee0550914a0)
+    (property "Reference" "#PWR012" (at 186.69 24.13 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 186.69 16.51 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 186.69 20.32 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 186.69 20.32 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6a39c133-87df-451d-966e-cb15301d5d82))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR012") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 215.9 25.4 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 26eac541-8598-48df-8224-37d2d7cd3d93)
+    (property "Reference" "#PWR016" (at 215.9 29.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 215.9 21.59 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 215.9 25.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 215.9 25.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid acbee1d9-ca9b-4177-bf03-b1c69c71f942))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR016") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 250.19 33.02 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 2935491f-e33d-46dc-a14d-30cb6420cbf9)
+    (property "Reference" "#PWR022" (at 250.19 39.37 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 250.19 38.1 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 250.19 33.02 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 250.19 33.02 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid a3fc81d2-8c6a-48f6-a542-3e6cf1084bf2))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR022") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 167.64 40.64 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 293e8893-a083-463f-8421-7460bc0c2169)
+    (property "Reference" "#PWR02" (at 161.29 40.64 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 163.83 41.275 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 167.64 40.64 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 167.64 40.64 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 0c21ff33-5024-43be-81f7-3246945ef940))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR02") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+3.3V") (at 260.35 31.75 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 3078cf2c-ce32-4f18-b343-a57a8d4c6df2)
+    (property "Reference" "#PWR018" (at 260.35 35.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+3.3V" (at 260.35 27.94 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 260.35 31.75 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 260.35 31.75 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid c9553be4-25cd-49b8-a786-a29cd77c7dfa))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR018") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector_Generic:Conn_01x03") (at 231.14 106.68 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 315b1c88-67c5-40fa-989d-87e34d31a684)
+    (property "Reference" "J7" (at 233.68 106.045 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "PWM_gripklo" (at 233.68 108.585 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 231.14 106.68 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 231.14 106.68 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 06ea1b09-f2b0-40c8-92b9-ebabfbcb1892))
+    (pin "2" (uuid 385b9850-0a7a-4052-b8a0-f2eb609aba62))
+    (pin "3" (uuid 11c2612f-650f-4784-ba32-29a6e844aa71))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J7") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Logic_LevelTranslator:FXMA108") (at 262.89 46.99 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 3241c8bd-a9c1-454d-9679-433a4efff75b)
+    (property "Reference" "Nivå_shiftare" (at 264.8459 62.23 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "Alt. FXMA108\n" (at 264.8459 64.77 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DFN_QFN:WQFN-20-1EP_2.5x4.5mm_P0.5mm_EP1x2.9mm" (at 262.89 64.77 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "http://www.onsemi.com/pub/Collateral/FXMA108-D.pdf" (at 262.89 45.72 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 675ecfd8-11dc-4678-abb1-4b51859479d2))
+    (pin "10" (uuid f702c777-279e-44a3-8311-1190ea78cd64))
+    (pin "11" (uuid 6ab6a3e6-625f-4299-b423-0eda548ae472))
+    (pin "12" (uuid 94f0f195-c146-47db-8eaf-5095556de77a))
+    (pin "13" (uuid 0d6e9dac-f652-4a9c-a8c6-63db548d42ba))
+    (pin "14" (uuid d2ce81a4-1a46-4311-800a-430983e3d532))
+    (pin "15" (uuid da4ccc43-fafc-470a-a0da-b1ac82445c9f))
+    (pin "16" (uuid 544cf34c-5a9f-4c46-9b87-8cbf734d5a90))
+    (pin "17" (uuid fdcd2ae8-b0cb-4e11-801e-2a7c7f73c175))
+    (pin "18" (uuid 832fc137-8f5f-49bd-a4d1-34bdf996409c))
+    (pin "19" (uuid 754e4682-28bd-4ad5-b697-b069bfab82b3))
+    (pin "2" (uuid ce8b4ea3-e332-46df-b838-fc6146594516))
+    (pin "20" (uuid 2965779c-9f9c-45c0-a83c-ba31d8df0efa))
+    (pin "21" (uuid aca1d57e-9863-48dd-992d-523d477acbe3))
+    (pin "3" (uuid 58b90cec-1cd8-490b-8ec0-9bdc1f0b7c4b))
+    (pin "4" (uuid e9b5c4dd-55b1-47f0-97ef-cf9b79e066c0))
+    (pin "5" (uuid 83788b52-df10-4c47-8f0b-8868d71733b7))
+    (pin "6" (uuid b8894cd7-6f69-4b2b-a5b6-f4148ffc11b0))
+    (pin "7" (uuid e90f8e9a-e956-4454-8562-e0a64a91bb9a))
+    (pin "8" (uuid 279e9cbc-82da-4396-ac9f-73566ff8e875))
+    (pin "9" (uuid 1d530972-b6f9-42a6-adeb-1e8e3a30bfa2))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "Nivå_shiftare") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 163.83 190.5 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 39fcc722-ae67-41c4-a771-555c7680cf78)
+    (property "Reference" "#PWR045" (at 157.48 190.5 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 160.02 191.135 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 163.83 190.5 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 163.83 190.5 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid c9eb813d-c0e6-46c3-8e26-7ba01809934b))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR045") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 16.51 24.13 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no)
+    (uuid 3a0c5b30-0f5f-4b3a-b6fc-5c26097964d8)
+    (property "Reference" "#PWR03" (at 16.51 30.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 16.51 27.94 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 16.51 24.13 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 16.51 24.13 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid ef3fabf8-f9f3-4c93-8110-949346eee1b0))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR03") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 120.65 123.19 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 3be143d6-7035-437c-af24-2d2987a2246e)
+    (property "Reference" "#PWR010" (at 120.65 129.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 120.65 128.27 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 120.65 123.19 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 120.65 123.19 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid f6a3816f-6ff6-4df4-b46c-8bbde672f856))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR010") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:R") (at 273.05 99.06 0) (mirror y) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 4086adf6-304f-46e1-838b-6f58ad481d44)
+    (property "Reference" "R8" (at 270.51 98.425 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "R" (at 270.51 100.965 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 274.828 99.06 90)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 273.05 99.06 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 7ed733c8-b6fd-46e0-81e5-f86d5c851da1))
+    (pin "2" (uuid 8e3bbedb-400e-4dc7-a92b-e7786830237c))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "R8") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 262.89 62.23 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 42f1579f-071f-4bea-8b1f-a3bad8fd0478)
+    (property "Reference" "#PWR020" (at 262.89 68.58 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 262.89 67.31 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 262.89 62.23 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 262.89 62.23 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6e03a498-14cd-4388-a991-1f2d172640f7))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR020") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector:Raspberry_Pi_2_3") (at 218.44 62.23 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 44cd7a3c-d2c3-4339-b1a6-82dd12d555da)
+    (property "Reference" "Kommunikationsmodul" (at 225.4759 27.94 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "Raspberry_Pi_2_3" (at 225.4759 30.48 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 218.44 62.23 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/rpi_SCH_3bplus_1p0_reduced.pdf" (at 218.44 62.23 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 7b3fc103-bdce-4c4e-9545-52fc6ae31018))
+    (pin "10" (uuid 63b55549-b772-464f-aef6-1c727e50524b))
+    (pin "11" (uuid df2e1354-fb2b-49db-b06b-6ca3d7e7f6d4))
+    (pin "12" (uuid dd5ca2b3-7eec-4ed3-b717-99136be7cf63))
+    (pin "13" (uuid 1ef2199b-dce7-4a46-9e3c-f3bbae24c2b3))
+    (pin "14" (uuid 26ce46e5-4e01-411e-8f80-b3bc344780cf))
+    (pin "15" (uuid ea28aa17-4b76-47c9-981f-00db365daac9))
+    (pin "16" (uuid dc131352-abb3-4faa-99e9-11374beb94e9))
+    (pin "17" (uuid 39b8ede7-9d90-4f68-9ab6-e54cf2d2ebdd))
+    (pin "18" (uuid 478a8d9f-5f28-45db-b9c7-c294d351bc5a))
+    (pin "19" (uuid aff5c3a3-37c5-4071-8dde-05c7f98b2c39))
+    (pin "2" (uuid 96955059-c7e9-4fa5-b126-8e92d48c1dfd))
+    (pin "20" (uuid c25082a3-f887-4afa-afb4-42560103bb48))
+    (pin "21" (uuid 9e256c9f-5e09-4426-825f-a3eafec74f0a))
+    (pin "22" (uuid 3277dd71-4b05-4b6c-9498-8022ea416329))
+    (pin "23" (uuid f4f2f3bf-b07b-4e37-b96c-51bc4ec7d7ba))
+    (pin "24" (uuid dce9e2c0-3f20-4243-ad09-268e2866bb92))
+    (pin "25" (uuid f613a275-08e3-4e74-9212-ba47d6ab0d74))
+    (pin "26" (uuid 4053c8bc-d3ae-4dd2-bbbd-36727823b3c4))
+    (pin "27" (uuid e67c54b0-441b-45a8-aa78-e54e327493b2))
+    (pin "28" (uuid c83ed396-b42e-40e5-866f-78a05e97d094))
+    (pin "29" (uuid fa331e6f-c682-4902-8304-8c510c5e1eb2))
+    (pin "3" (uuid 3404d367-5806-4629-9310-d7f01aad3441))
+    (pin "30" (uuid 48decd04-c81f-4d27-961c-40206b0c70cd))
+    (pin "31" (uuid 9a5a3cdb-d002-4f0b-8fd6-9eeb8b38f6f4))
+    (pin "32" (uuid e2f753b1-0c60-4149-a7ef-bcb921065543))
+    (pin "33" (uuid 0c431ad3-8796-4031-8906-2aa40105a7e8))
+    (pin "34" (uuid 56761691-eed1-40f1-a094-0fd9fdffb930))
+    (pin "35" (uuid 54f6631b-1238-4cb7-a3e2-4e7300b86177))
+    (pin "36" (uuid 40c2a3ff-6ff6-44d6-8952-7092b73d8f3d))
+    (pin "37" (uuid 76fdbf1a-4557-4085-b44d-dbb1cda1020f))
+    (pin "38" (uuid e2dd306e-3d5e-4913-ae27-bc4ede088a6c))
+    (pin "39" (uuid fa789585-fb3d-431d-97a3-d73e49b490a3))
+    (pin "4" (uuid c15365e0-1670-4b65-8ee5-2f7c08386a0f))
+    (pin "40" (uuid 0d2a943c-8851-4e1f-9db5-10771b3b7331))
+    (pin "5" (uuid 8deb8ac7-bc26-4bf2-8786-927bee19e606))
+    (pin "6" (uuid faad3af5-609d-43d5-b815-73c20fdcead6))
+    (pin "7" (uuid ad715887-7f82-4615-98c3-c2fc0174d4b8))
+    (pin "8" (uuid 68ad87db-0f7e-49a1-b68a-96e8c1d5abab))
+    (pin "9" (uuid e136d9b4-33e9-4e24-b3c4-14bbb153de47))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "Kommunikationsmodul") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 46.99 17.78 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no)
+    (uuid 46d6f789-ca0d-4944-8f16-18d16702934c)
+    (property "Reference" "#PWR04" (at 46.99 21.59 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 46.99 13.97 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 46.99 17.78 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 46.99 17.78 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 28f11f83-a0e5-4cac-b1bb-aaa21cf48a63))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR04") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 173.99 27.94 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 479cc283-1cde-43c6-b5be-639c303f1272)
+    (property "Reference" "#PWR011" (at 173.99 34.29 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 173.99 33.02 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 173.99 27.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 173.99 27.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 8b4b0be2-f3c1-4a33-872b-028166f092dd))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR011") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector_Generic:Conn_01x05") (at 204.47 157.48 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 479d7fd3-83ea-439e-bdda-387c7e273467)
+    (property "Reference" "J9" (at 207.01 156.845 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "Odo_L_kontakt" (at 207.01 159.385 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 204.47 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 204.47 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 30ba412a-73fc-4fa4-8fad-a17f4660bfda))
+    (pin "2" (uuid cd5c57d0-8c79-4bb2-8f68-7f49ac03b953))
+    (pin "3" (uuid fe66e50e-fe98-4e00-a147-bb9429036449))
+    (pin "4" (uuid 92d98312-1c3a-4720-bf46-92857d81908b))
+    (pin "5" (uuid 20fb95ae-7cb9-4379-a457-ce7ea2b52c15))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J9") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector:DIN41612_02x05_AB_EvenPins") (at 261.62 124.46 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 4a46f6e1-4cd8-44f6-acc2-cf71eb912292)
+    (property "Reference" "J5" (at 262.89 114.3 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "Motor_kontakt" (at 262.89 116.84 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 261.62 124.46 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 261.62 124.46 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "a10" (uuid 732e1326-61b1-494d-a067-8d3176d80332))
+    (pin "a2" (uuid 557f8cae-b144-47b2-9050-ac1992e97f6d))
+    (pin "a4" (uuid d9f71d0a-a6b5-4839-bb72-16c5455896a1))
+    (pin "a6" (uuid 53e8c000-89cc-4717-a279-cff87b5d755e))
+    (pin "a8" (uuid 4458860c-b880-483f-a1cb-d77256d3c196))
+    (pin "b10" (uuid b26b8cae-eb1c-4100-94c0-a9344a46fbd8))
+    (pin "b2" (uuid cec9f61b-9de8-46e6-b902-ef074e36c41a))
+    (pin "b4" (uuid 02f21ad3-d79d-4d5b-8552-3b4b8a719680))
+    (pin "b6" (uuid a9cddf5b-1997-4553-a2dd-55dd8ed1c3aa))
+    (pin "b8" (uuid 03936493-a765-4d65-87c4-3f232901e8d3))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J5") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 240.03 157.48 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 4ac1d857-446d-4b08-8a64-f78f1cea9dd0)
+    (property "Reference" "#PWR049" (at 243.84 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 236.22 158.115 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 240.03 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 240.03 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid d7420626-06eb-4064-8c97-aaf82dda8729))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR049") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:VCC") (at 161.29 20.32 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 4c09ecd3-4488-4638-9820-d1c24555704d)
+    (property "Reference" "#PWR01" (at 161.29 24.13 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "VCC" (at 161.29 16.51 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 161.29 20.32 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 161.29 20.32 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 04e47e52-b019-455f-b1e1-d2440d712164))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR01") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 233.68 121.92 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 50b5797d-903c-4e63-8b0f-7eb09677b408)
+    (property "Reference" "#PWR031" (at 229.87 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 237.49 122.555 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 233.68 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 233.68 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 595e122a-eae7-4d47-a2b8-904a674d1600))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR031") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+3.3V") (at 223.52 25.4 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 50c16bcb-e354-43cb-9579-e4ecbb4c515b)
+    (property "Reference" "#PWR017" (at 223.52 29.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+3.3V" (at 223.52 21.59 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 223.52 25.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 223.52 25.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid a1a8e1e8-a773-495b-9d12-34237369b5ba))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR017") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 208.28 95.25 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 51c02644-6022-4b5c-a4f5-0fcb0272f06b)
+    (property "Reference" "#PWR027" (at 208.28 101.6 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 208.28 100.33 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 208.28 95.25 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 208.28 95.25 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 41a7d6d3-569a-4075-950f-a31705a95d70))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR027") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:R") (at 252.73 29.21 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 5280bb6c-fa0c-4c80-845b-85ba8e314fa4)
+    (property "Reference" "R3" (at 255.27 28.575 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "R" (at 255.27 31.115 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Resistor_SMD:R_0201_0603Metric" (at 250.952 29.21 90)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 252.73 29.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 2d3aa34e-b21f-46df-a20d-a522a862c4dd))
+    (pin "2" (uuid e9073432-60a3-4462-ad0f-22dc322c5eab))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "R3") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 91.44 25.4 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 55e6ca1c-4dda-49c7-a1fc-cb82332986bf)
+    (property "Reference" "#PWR07" (at 91.44 31.75 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 91.44 30.48 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 91.44 25.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 91.44 25.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 979e8a59-22ba-4709-ad0c-38bc3fbe277f))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR07") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 186.69 118.11 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 5a102df0-38ce-4834-8b4e-fa898445294c)
+    (property "Reference" "#PWR024" (at 180.34 118.11 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 182.88 118.745 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 186.69 118.11 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 186.69 118.11 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 7533c7c7-df45-45a8-9a17-8ef9e97e3665))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR024") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 29.21 187.96 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 5d5481ca-50a6-4ad8-8bae-bda81fb77146)
+    (property "Reference" "#PWR014" (at 29.21 194.31 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 29.21 193.04 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 29.21 187.96 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 29.21 187.96 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 2e87b1a5-a6d9-4f97-9c2a-229a88fb3b5c))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR014") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 167.64 43.18 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 5eaa6baa-5c6b-476c-a55e-91541bdbbbd2)
+    (property "Reference" "#PWR05" (at 171.45 43.18 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 163.83 43.815 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 167.64 43.18 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 167.64 43.18 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 3208862d-b87b-43d2-b5ee-d5a5422ac205))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR05") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:R") (at 236.22 152.4 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 5ef214ee-3a35-4861-86ad-4446ec1aada2)
+    (property "Reference" "R6" (at 236.22 147.32 90)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "R" (at 236.22 149.86 90)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 236.22 154.178 90)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 236.22 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid aa74cbe4-bcb3-4242-8570-4681c50b58e9))
+    (pin "2" (uuid e159a706-ec37-440c-9822-1a331d2a1d6a))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "R6") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector:AVR-JTAG-10") (at 82.55 172.72 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no)
+    (uuid 6166f72c-e7c1-4d8a-9e93-571ef481d9ec)
+    (property "Reference" "J1" (at 71.12 185.42 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "JTAG_kontakt_2" (at 80.01 187.96 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_IDC:IDC-Header_2x05-1MP_P2.54mm_Latch6.5mm_Vertical" (at 78.74 168.91 90)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" " ~" (at 50.165 186.69 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6ed18abf-eb27-474e-8900-282a2ce9ec58))
+    (pin "10" (uuid 388cc3fa-d53a-424c-9639-68f1818de1a6))
+    (pin "2" (uuid 0bd83ed1-100a-4774-9d06-cad02c1d8d96))
+    (pin "3" (uuid 08d61796-7151-492a-94c3-1b63d251bf5d))
+    (pin "4" (uuid 47e9c6df-986e-4c0e-bcf8-c5fffc762d08))
+    (pin "5" (uuid 474fed63-49e8-4df5-8606-707cf973cea3))
+    (pin "6" (uuid eeae6598-d59d-4fe1-a598-4dd208b45bd9))
+    (pin "7" (uuid 59f9bb7a-4c86-49f5-8212-4c19fc8ed777))
+    (pin "8" (uuid c5af6ed5-b271-428b-a3dc-7379e65d3c95))
+    (pin "9" (uuid 319318f5-2a80-4ee0-a8f4-98f52dc7db22))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J1") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:R_Potentiometer") (at 132.08 157.48 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 642b419a-755a-4a38-aa69-b8d446d1a2b1)
+    (property "Reference" "RV1" (at 129.54 156.845 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "Kontrast_Pot" (at 129.54 159.385 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 132.08 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 132.08 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 1f80db5c-e6e2-46c4-80f8-a43e26dc2c90))
+    (pin "2" (uuid 52b55cc8-28ff-4e6b-a753-68fee6a6d22f))
+    (pin "3" (uuid b665e1ec-71cf-4d05-9f1e-a6e21379d84d))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "RV1") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 132.08 153.67 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 653c7719-857d-4e1a-90b6-c387d1bf8338)
+    (property "Reference" "#PWR043" (at 132.08 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 132.08 149.86 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 132.08 153.67 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 132.08 153.67 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid e4799866-25c3-41c1-a6ad-76fed74738b8))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR043") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:R") (at 275.59 99.06 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 669902c0-53ff-4082-a0fb-e21a9e59acb3)
+    (property "Reference" "R9" (at 278.13 98.425 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "R" (at 278.13 100.965 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 273.812 99.06 90)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 275.59 99.06 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid c0ff0220-948d-4d3e-821f-007435fc6cd3))
+    (pin "2" (uuid fb07a2ba-8467-46e1-82b8-998c9a4da450))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "R9") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Switch:SW_Push") (at 21.59 24.13 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 6978ca8a-0131-4067-a388-3959b53b6c80)
+    (property "Reference" "Reset_1" (at 21.59 17.78 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "Tryckknapp" (at 21.59 20.32 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Button_Switch_SMD:SW_DIP_SPSTx01_Slide_6.7x4.1mm_W6.73mm_P2.54mm_LowProfile_JPin" (at 21.59 19.05 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 21.59 19.05 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid ca3f3494-a389-480f-868f-8ff327a76ebe))
+    (pin "2" (uuid 286c55e0-b203-4117-9b57-d46bc0a144d5))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "Reset_1") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 226.06 106.68 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 7096b056-90c2-4e66-bfa3-c4ac208ea573)
+    (property "Reference" "#PWR032" (at 229.87 106.68 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 222.25 107.315 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 226.06 106.68 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 226.06 106.68 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 30f5fd71-2c25-4c19-bff3-cba6612402b1))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR032") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 240.03 154.94 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 73957a4c-4c58-4f6d-80fd-6ae3afdfdfe6)
+    (property "Reference" "#PWR047" (at 233.68 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 236.22 155.575 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 240.03 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 240.03 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 24629295-11d7-4295-9513-435a9749532b))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR047") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 275.59 95.25 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 73c1e39a-94d5-4499-bbff-8514e986d07a)
+    (property "Reference" "#PWR025" (at 275.59 99.06 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 275.59 91.44 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 275.59 95.25 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 275.59 95.25 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 0b4d89bf-1cc1-4bab-b2cb-751ab406dd1c))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR025") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 186.69 120.65 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 77f8d59f-d584-47b7-9060-318b5733d602)
+    (property "Reference" "#PWR026" (at 190.5 120.65 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 182.88 121.285 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 186.69 120.65 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 186.69 120.65 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 9ba8efcb-a6ac-409f-b38f-2e5adbb8964a))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR026") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 199.39 162.56 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 786539fc-c049-49ea-a97c-ff07afe93ffe)
+    (property "Reference" "#PWR054" (at 193.04 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 195.58 163.195 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 199.39 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 199.39 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 782abc58-25d9-4ef4-9b85-970f4548c44c))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR054") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 199.39 157.48 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 78ea0b7d-5bbc-4cde-89da-8b278843c725)
+    (property "Reference" "#PWR053" (at 203.2 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 195.58 158.115 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 199.39 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 199.39 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 984c5d1e-1c2f-435f-88fd-ff5c06873a33))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR053") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector_Generic:Conn_01x16") (at 168.91 170.18 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no)
+    (uuid 7cc39eb8-444e-4bc3-a883-7728a17764d8)
+    (property "Reference" "J8" (at 167.64 193.04 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "LCD_kontakt" (at 160.02 195.58 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 168.91 170.18 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 168.91 170.18 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid b2f74493-73c1-4070-95cb-45bdded093cc))
+    (pin "10" (uuid 1e527774-7ac7-476c-b8ef-293842ffb911))
+    (pin "11" (uuid 304e202c-5431-4a5b-9128-4e7242042d9d))
+    (pin "12" (uuid 472018f3-8867-4cb2-945d-84a8b3d6bc49))
+    (pin "13" (uuid 503033c7-0e5f-40b7-ae94-7987d3d3abea))
+    (pin "14" (uuid 6d0ccf38-2bf0-4cf2-9c46-ed62192fab71))
+    (pin "15" (uuid 6eabc60f-bcc2-465d-aa1c-aad41e8f0744))
+    (pin "16" (uuid 49a8438a-7829-4ff0-ab40-a190e8962e3e))
+    (pin "2" (uuid 1ef8960a-a88f-4455-b460-ecd63a2a491c))
+    (pin "3" (uuid b57cd3de-9961-47be-9108-895ab23c4dd0))
+    (pin "4" (uuid 532856c4-4677-41d7-9cf7-10366dcdbff7))
+    (pin "5" (uuid e6744ad6-0670-428f-a343-96f5cf8c651a))
+    (pin "6" (uuid e0632ecc-dcc8-46cc-8eab-787d4964acb8))
+    (pin "7" (uuid 3ae15622-330e-4bb9-b323-28e1934f3152))
+    (pin "8" (uuid 84e4dae8-bf8a-4b36-993c-d96c68f47c73))
+    (pin "9" (uuid 525aba2a-e3bd-4bfd-b1b2-561add285c60))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J8") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 265.43 31.75 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 871e0553-7d4e-41de-a6fb-0d67c48c7f4e)
+    (property "Reference" "#PWR019" (at 265.43 35.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 265.43 27.94 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 265.43 31.75 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 265.43 31.75 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid bf654a0e-5cac-4429-9315-a3f702a1ed28))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR019") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 82.55 187.96 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 878eaa8a-0574-4b6b-8370-00185c835940)
+    (property "Reference" "#PWR015" (at 82.55 194.31 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 82.55 193.04 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 82.55 187.96 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 82.55 187.96 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid ab995620-daaa-49a8-8b4c-d78258d02584))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR015") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector_Generic:Conn_01x06") (at 191.77 123.19 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 8eac7080-2d19-4314-a539-ff94cce7bb14)
+    (property "Reference" "J3" (at 194.31 123.825 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "Gyro_kontakt" (at 194.31 126.365 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 191.77 123.19 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 191.77 123.19 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 61a7d3e3-1c7d-4c9c-a5e9-0855e914045a))
+    (pin "2" (uuid 7bf2d9c3-eca6-4f1c-ad67-5348b617b447))
+    (pin "3" (uuid 6704aa88-76bf-4d17-8191-a953a5beca33))
+    (pin "4" (uuid abf30fac-6fe1-42e1-8c09-921018bb43ff))
+    (pin "5" (uuid ef73e63b-049f-43ea-ab5c-abd99607bd2a))
+    (pin "6" (uuid 3b716078-2c0a-42e9-9ca3-eb77bc5eaa2e))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J3") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 44.45 123.19 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 937e86b1-3c92-44dc-8c97-781a97add2ef)
+    (property "Reference" "#PWR06" (at 44.45 129.54 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 44.45 128.27 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 44.45 123.19 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 44.45 123.19 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid f79af32e-2aa7-4ef1-83d1-610d6fab9eb1))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR06") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 269.24 121.92 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid 93ceba94-82d6-4009-b6f9-fb72c393b2b6)
+    (property "Reference" "#PWR037" (at 265.43 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 273.05 122.555 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 269.24 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 269.24 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 10d8bb8f-a2bf-459b-9e8d-837c118bea6c))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR037") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector:AVR-JTAG-10") (at 29.21 172.72 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no)
+    (uuid 9f2ac3bf-a8ba-4fd6-98fa-99b10b1ab407)
+    (property "Reference" "J10" (at 17.78 185.42 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Value" "JTAG_kontakt" (at 26.67 187.96 0)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "Connector_IDC:IDC-Header_2x05-1MP_P2.54mm_Latch6.5mm_Vertical" (at 25.4 168.91 90)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" " ~" (at -3.175 186.69 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid c93fdb03-2bc9-48c2-bb85-b852bdc05b17))
+    (pin "10" (uuid 36af8c81-cc9f-400a-af41-141f0d492adf))
+    (pin "2" (uuid 4ad7004b-51a5-479c-aff2-21028cf36fbe))
+    (pin "3" (uuid 63a89c34-89f3-4a6a-aa0b-e856ec85f8f0))
+    (pin "4" (uuid fb207bdb-2637-46a3-bceb-3687d9fc1806))
+    (pin "5" (uuid d6763661-5757-411e-9a5d-bea74817a370))
+    (pin "6" (uuid 3838acec-f1ef-47b7-9109-610b71ec9700))
+    (pin "7" (uuid f225c159-0420-4de3-ae61-c4cd99817e01))
+    (pin "8" (uuid a6fd0f3f-8e8a-4f9e-9d2f-25856efa0b49))
+    (pin "9" (uuid ae8d3d6d-76eb-42c6-99bc-31c55d38a7eb))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J10") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:C") (at 186.69 24.13 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no)
+    (uuid 9ffbe9fa-672e-494a-b19a-0db007ef9950)
+    (property "Reference" "C2" (at 180.34 24.13 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "C" (at 180.34 26.67 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Capacitor_SMD:C_0201_0603Metric" (at 187.6552 27.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 186.69 24.13 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 922ac4f9-7fd4-4246-bf33-64035924d086))
+    (pin "2" (uuid 4d0b0904-e0b5-40ed-9402-2a863772b6fe))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "C2") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector:DIN41612_02x05_AB_EvenPins") (at 226.06 124.46 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid a16e2f20-7f71-429d-ad2c-da5d66d148d0)
+    (property "Reference" "J4" (at 227.33 114.3 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "Reflex_kontakt" (at 227.33 116.84 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 226.06 124.46 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 226.06 124.46 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "a10" (uuid db74e2ca-4955-49a1-9495-bf0d2f2fa48d))
+    (pin "a2" (uuid 2da606dd-8dea-40dc-8d9e-c440b0c7809d))
+    (pin "a4" (uuid c9b59ff8-b6fb-45a8-aac3-ecc9e03d59d2))
+    (pin "a6" (uuid 5bb322b3-d836-40b6-9fdb-35bdaa631e03))
+    (pin "a8" (uuid 60c1630a-ac54-45f4-8733-0962fa3c4cd9))
+    (pin "b10" (uuid a8c5da10-113a-442c-be0a-ed2695ac07f1))
+    (pin "b2" (uuid 127ef5b5-f5da-465b-a33f-879b367ee196))
+    (pin "b4" (uuid a4abbbb6-7e85-40e5-9fee-1aa03de0bdcd))
+    (pin "b6" (uuid 95ad8162-d765-47df-beab-06eae6731a3f))
+    (pin "b8" (uuid d526d070-1f37-40c7-89ef-fd2734b7a618))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J4") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector_Generic:Conn_01x04") (at 172.72 43.18 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid a1c0eb24-bcbe-4077-a6e0-1730c50a2921)
+    (property "Reference" "J6" (at 175.26 43.815 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "2x_Tryckknapp" (at 175.26 46.355 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 172.72 43.18 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 172.72 43.18 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid d119340f-3d59-49f6-9aec-c2a07ba48c59))
+    (pin "2" (uuid ee665617-d9bb-4175-8ccc-e3afc9c79e81))
+    (pin "3" (uuid 9f568108-3dc9-434f-928c-1dfe790e0f85))
+    (pin "4" (uuid 31f0cf19-2e10-4953-a0c9-ca4db0be71c6))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J6") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 220.98 121.92 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid a52cd9cb-7218-4efe-ba3b-adccf1756f19)
+    (property "Reference" "#PWR030" (at 224.79 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 217.17 122.555 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 220.98 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 220.98 121.92 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 6e36c2c1-8a75-49f2-a72a-365025b7be44))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR030") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 256.54 119.38 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid a74c4728-6a8c-4062-8633-bce6da0c6689)
+    (property "Reference" "#PWR034" (at 250.19 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 252.73 120.015 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 256.54 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 256.54 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 705fe7b4-e678-40b1-8ef4-660f138fa850))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR034") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 29.21 156.21 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid a8730398-e2ce-448c-ad7d-4b73e55f1845)
+    (property "Reference" "#PWR013" (at 29.21 160.02 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 29.21 152.4 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 29.21 156.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 29.21 156.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 47a91ccb-bd68-4a42-9dbd-9a7271ca152d))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR013") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "MCU_Microchip_ATmega:ATmega1284P-P") (at 120.65 72.39 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid a91883a5-6e00-4a14-a8ef-d1b08ba1d21f)
+    (property "Reference" "Styrmodul1" (at 122.6059 123.19 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "ATmega1284P-P" (at 122.6059 125.73 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-40_W15.24mm" (at 120.65 72.39 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8272-8-bit-AVR-microcontroller-ATmega164A_PA-324A_PA-644A_PA-1284_P_datasheet.pdf" (at 120.65 72.39 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid fe163e91-5d08-4514-9551-e50c699189f0))
+    (pin "10" (uuid b5974191-5e9b-4ff1-a7b8-2deb9cb3bed5))
+    (pin "11" (uuid 2a9ff851-52bb-47c1-a0fd-ed2ec747888c))
+    (pin "12" (uuid d85b2165-b65e-4dbf-b3a1-c3739316947b))
+    (pin "13" (uuid c146d90d-453e-45f4-98f9-683ac7ca340d))
+    (pin "14" (uuid 00cdc6d2-eb1c-4612-94b8-09e7e7b42644))
+    (pin "15" (uuid cecc878c-add0-4908-9edf-6ed1227ec6ec))
+    (pin "16" (uuid e41b6ab5-91e6-4acd-99dd-d79cbf2af09f))
+    (pin "17" (uuid 39b63cf6-ca1a-4c81-af0a-edbf6a507144))
+    (pin "18" (uuid 5eed9d0d-729f-4119-b16a-c97aae58a895))
+    (pin "19" (uuid 6a0762e9-0f27-4d52-b159-ed5a29f02472))
+    (pin "2" (uuid 93966bdd-b615-4612-914b-e8b9ba598867))
+    (pin "20" (uuid 04afb278-652f-4ebb-990a-b3726a96ea47))
+    (pin "21" (uuid 1e2855ae-5b3a-4401-9a4c-89968198624e))
+    (pin "22" (uuid 6e2ea400-9535-4988-b5c9-361aedf0ed5f))
+    (pin "23" (uuid ce913712-f61b-4f99-8094-3e6025900ac5))
+    (pin "24" (uuid 23b9bc70-2314-419f-8f29-ee1a371e8d6e))
+    (pin "25" (uuid b87b8278-0100-421f-9325-54f8b39f02af))
+    (pin "26" (uuid 0e66eee2-d838-4c5b-b405-3c4b53ce2c16))
+    (pin "27" (uuid b9395ed4-3142-4be7-8a66-96d90d944317))
+    (pin "28" (uuid d50148b9-b6fa-4179-ada0-08cb9f6a3dae))
+    (pin "29" (uuid 92587817-27b6-4419-beca-eda7657919b4))
+    (pin "3" (uuid b9a317cf-5f22-41b1-8f18-5fc5b65559da))
+    (pin "30" (uuid 0ec91d15-b129-494f-ad82-e1075f97ece3))
+    (pin "31" (uuid 295dbfbb-6511-4c77-bbc0-f09c03660854))
+    (pin "32" (uuid 345d9db1-b674-411c-a23b-e3ff35c047c9))
+    (pin "33" (uuid 8fd5d528-4133-4193-a1d0-6f53bb9d275c))
+    (pin "34" (uuid 9290a63d-1f07-4be0-9c95-3b7643994fe8))
+    (pin "35" (uuid 363fc539-879c-4a05-a23a-8a39618fa381))
+    (pin "36" (uuid d6be6205-a1c2-4701-8f5a-d5835b98a4e8))
+    (pin "37" (uuid 96e16479-6894-4250-b4e6-a5cb7d75d29e))
+    (pin "38" (uuid 536af9c9-b844-4078-9f65-5d70d3391810))
+    (pin "39" (uuid c352f147-679e-4cdc-adb4-eb5c985ba99a))
+    (pin "4" (uuid d997aa58-afeb-4235-bb1b-952f8de117d6))
+    (pin "40" (uuid 82f487cd-0101-4dfc-9c04-6d8c3c77a4f5))
+    (pin "5" (uuid 65cc8ca2-e5a5-45b3-a8a7-5a40eed5cc6e))
+    (pin "6" (uuid 9ede5105-e2c1-48ad-be61-6cbe7b188b6c))
+    (pin "7" (uuid aefb82d5-3b3f-447b-b914-831f3fcbe866))
+    (pin "8" (uuid 97558423-2b15-4be2-a9f0-b0d342adc332))
+    (pin "9" (uuid a08ae5ea-7752-4a78-a61a-a609d9abc70e))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "Styrmodul1") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 226.06 104.14 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid adc24607-28af-4306-81c1-d8df5f5c4491)
+    (property "Reference" "#PWR033" (at 219.71 104.14 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 222.25 104.775 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 226.06 104.14 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 226.06 104.14 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 02036aa9-9954-49ae-9a65-85beabd55fda))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR033") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Connector_Generic:Conn_01x05") (at 245.11 157.48 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid af0be349-a2b3-486c-bb78-78c297e488a6)
+    (property "Reference" "J2" (at 247.65 156.845 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "Odo_R_kontakt" (at 247.65 159.385 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 245.11 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 245.11 157.48 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 8718ccd6-d7b9-477c-98d5-90d76a1f32dc))
+    (pin "2" (uuid e93fef1b-84eb-4eeb-8b7f-ee3b14855492))
+    (pin "3" (uuid bcc91d75-fb1a-4d5f-a0ba-5fe91a95c319))
+    (pin "4" (uuid ea250212-faea-42ba-8a69-ff1a231c3a6b))
+    (pin "5" (uuid e895f276-147a-4973-aeb1-998bca9a6de8))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "J2") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Regulator_Linear:LM7805_TO220") (at 173.99 20.32 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid aff7c2ca-502b-43d4-b8e7-b58b380de464)
+    (property "Reference" "U1" (at 173.99 15.24 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "LM7805_TO220" (at 173.99 17.78 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Package_TO_SOT_THT:TO-220-3_Vertical" (at 173.99 14.605 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "https://www.onsemi.cn/PowerSolutions/document/MC7800-D.PDF" (at 173.99 21.59 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid b92152dd-65c4-4e4b-a8fe-e9a82e6f23cb))
+    (pin "2" (uuid 7b8aa65b-08f5-4a97-bae1-5c4f4fa4bd55))
+    (pin "3" (uuid 5d8d9448-79be-419a-8dc2-0026f28f6a20))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "U1") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 233.68 119.38 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid b170638c-c0ec-4f16-bf8f-c9275625f113)
+    (property "Reference" "#PWR029" (at 240.03 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 237.49 120.015 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 233.68 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 233.68 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 49491d78-8c19-4089-be67-0e56f6d2a2fd))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR029") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "MCU_Microchip_ATmega:ATmega1284P-P") (at 44.45 72.39 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid b40c5084-94d0-4c76-8809-ed4f0c75768c)
+    (property "Reference" "Sensormodul1" (at 46.4059 123.19 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "ATmega1284P-P" (at 46.4059 125.73 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Package_DIP:DIP-40_W15.24mm" (at 44.45 72.39 0)
+      (effects (font (size 1.27 1.27) italic) hide)
+    )
+    (property "Datasheet" "http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-8272-8-bit-AVR-microcontroller-ATmega164A_PA-324A_PA-644A_PA-1284_P_datasheet.pdf" (at 44.45 72.39 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid a189ccd3-268c-4fad-83d9-3c7a90e7997c))
+    (pin "10" (uuid 5b0eb4a3-6a1a-4dc8-9188-19719ce0afd2))
+    (pin "11" (uuid e9bb33f6-a3ae-4421-9ec7-5a5e30d469b0))
+    (pin "12" (uuid 7f5630ce-ff07-43e3-a6b0-01a334e6bdd8))
+    (pin "13" (uuid ca034d26-3448-44e9-bf7e-2096358a286e))
+    (pin "14" (uuid a7622a50-0b7f-44f4-91af-60604894eee9))
+    (pin "15" (uuid f39be40d-6819-4e51-9f72-20cdb9cead84))
+    (pin "16" (uuid 7e3acdcb-bced-4336-87a6-45b47a9e465a))
+    (pin "17" (uuid 622ed548-2be8-4718-bd31-34d95989b8d3))
+    (pin "18" (uuid 6b053a15-5456-4790-9f52-f5c58d2890da))
+    (pin "19" (uuid 32125819-e792-4224-abf8-58ad57020461))
+    (pin "2" (uuid 22b86e89-a0c7-4166-bac2-70ed8b05eb2e))
+    (pin "20" (uuid ecd6c20d-123f-4dd3-9a06-a5f4cb8aabc5))
+    (pin "21" (uuid bda83b44-8228-4247-91ac-2e6fbc5b4239))
+    (pin "22" (uuid 3aa08f68-1ea2-4846-a223-9af2d50d0718))
+    (pin "23" (uuid 2c5b35c0-9780-4885-b4a0-5ca8dcec5688))
+    (pin "24" (uuid 65d72f1b-a428-4166-9aaf-bb65bd6633c0))
+    (pin "25" (uuid 06f404e0-3605-470e-a935-659c34c6398a))
+    (pin "26" (uuid 7cf660e4-f174-4def-bb9e-f93f92a318a0))
+    (pin "27" (uuid d243d6c1-d58a-401c-9ee8-4b423cff8dc6))
+    (pin "28" (uuid 2b526045-597b-4999-9ff3-8f2e2b6b899b))
+    (pin "29" (uuid 325f41b0-8b84-40c2-b2f3-760634a29fe3))
+    (pin "3" (uuid 2d3d94b7-be1d-4cdc-bc1c-3598da8c5f8b))
+    (pin "30" (uuid 587ef71d-8618-4596-a0d0-d2c4ce83d0d3))
+    (pin "31" (uuid a37187f1-82df-4029-b08c-c06e349ad282))
+    (pin "32" (uuid 29d50bfb-6719-43da-8da8-769c13f9d4e3))
+    (pin "33" (uuid f9cfeff6-4337-469a-8671-aa698993bd8c))
+    (pin "34" (uuid 8ad2c4d5-beed-4f94-b7b1-ffa97c970ecc))
+    (pin "35" (uuid caee464b-5699-4f40-aa85-0e71f924e32d))
+    (pin "36" (uuid 44f116ce-83ed-4b24-aca2-bd0c83825fe5))
+    (pin "37" (uuid f3b1dbba-718b-420b-b3e8-ee0ac1549068))
+    (pin "38" (uuid 4578efcb-226c-4d97-a068-75aa916535bb))
+    (pin "39" (uuid 32d9c7a2-6a1c-481f-8cff-fde6bff18de7))
+    (pin "4" (uuid 08dcdaeb-26c5-4761-9d94-badd72cea2f7))
+    (pin "40" (uuid ff7ad533-68f4-4137-a9bc-14996aa38265))
+    (pin "5" (uuid 166bf28e-ca2b-4ed4-b2b8-4f2a1155ed0a))
+    (pin "6" (uuid f1731c5d-1cd2-4ac5-8edf-5fc3ce8b6865))
+    (pin "7" (uuid 47eb3998-885d-408a-81df-babc90a17dfe))
+    (pin "8" (uuid dd8583f8-26ea-4c60-a6a1-32930c56cb85))
+    (pin "9" (uuid 1a273fe9-9f7c-4351-aacf-dbddf2a5c387))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "Sensormodul1") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Switch:SW_Push") (at 96.52 25.4 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid b8035fe5-a767-4c25-ba94-1653e5adfcb6)
+    (property "Reference" "Reset_2" (at 96.52 19.05 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "Tryckknapp" (at 96.52 21.59 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "Button_Switch_SMD:SW_DIP_SPSTx01_Slide_6.7x4.1mm_W6.73mm_P2.54mm_LowProfile_JPin" (at 96.52 20.32 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 96.52 20.32 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 3b5abd0d-3c75-4b2a-bd04-466a0110c77c))
+    (pin "2" (uuid 3e8e7edf-9b35-4dae-953f-b59a350e8e98))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "Reset_2") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:R") (at 195.58 152.4 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid c0ceddd3-a977-4ebd-9b11-ab3ba17aa77f)
+    (property "Reference" "R7" (at 195.58 147.32 90)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Value" "R" (at 195.58 149.86 90)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 195.58 154.178 90)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 195.58 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid b9ca0d80-e176-4ce5-8fdc-a41e3a92ea41))
+    (pin "2" (uuid aedb47f5-a6ca-430e-b854-f935c295ff7f))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "R7") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 82.55 156.21 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid c2361bd5-a7bb-4097-ba15-c56daffe330e)
+    (property "Reference" "#PWR09" (at 82.55 160.02 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 82.55 152.4 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 82.55 156.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 82.55 156.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid d476614c-b3b4-4d88-a2aa-2cb136aba026))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR09") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 220.98 119.38 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid cb89a575-1e2a-4898-8c93-16ca23b9683d)
+    (property "Reference" "#PWR028" (at 214.63 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 217.17 120.015 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 220.98 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 220.98 119.38 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 465b4458-4ad2-47ed-be15-2fff7fda301c))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR028") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 232.41 152.4 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid d0d4a34f-da59-4f1d-842c-3e0d7cac6312)
+    (property "Reference" "#PWR048" (at 232.41 156.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 232.41 148.59 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 232.41 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 232.41 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 873a0e94-96c6-42b0-a811-09383839c00d))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR048") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 123.19 17.78 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid d3cf20b1-c243-4f9f-ad3d-33bace49ebba)
+    (property "Reference" "#PWR08" (at 123.19 21.59 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 123.19 13.97 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 123.19 17.78 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 123.19 17.78 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 5fe6f14a-5a07-4b81-b3be-9becfb612a4f))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR08") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 163.83 187.96 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid dd92ddd2-07e2-4a39-9bbc-e42f814c6133)
+    (property "Reference" "#PWR046" (at 167.64 187.96 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 160.02 188.595 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 163.83 187.96 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 163.83 187.96 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 7244b0c2-4373-4c0d-b9a7-70a961f42710))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR046") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 252.73 25.4 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid df1a4ea3-aec1-407b-be9e-1dc399fd0410)
+    (property "Reference" "#PWR021" (at 252.73 29.21 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 252.73 21.59 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 252.73 25.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 252.73 25.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 68972aa7-67dd-42ac-89b1-ed03832fb406))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR021") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 240.03 162.56 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid e78d59ae-24b5-464a-9f03-a83238539666)
+    (property "Reference" "#PWR050" (at 233.68 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 236.22 163.195 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 240.03 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 240.03 162.56 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 78f9ca20-9f99-45da-953f-b3d9bb6e6ae2))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR050") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 163.83 152.4 270) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid e829e983-ca03-4700-a55f-2bce99c2e36d)
+    (property "Reference" "#PWR040" (at 157.48 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 160.02 153.035 90)
+      (effects (font (size 1.27 1.27)) (justify right))
+    )
+    (property "Footprint" "" (at 163.83 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 163.83 152.4 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 7a4030da-90d8-4534-8342-cd4e4a14be00))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR040") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:+5V") (at 163.83 154.94 90) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid efe42b38-27e5-498a-b69e-e029028017a1)
+    (property "Reference" "#PWR041" (at 167.64 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "+5V" (at 160.02 155.575 90)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "" (at 163.83 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 163.83 154.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 3048ecab-99aa-4209-9e38-1e5368f84567))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR041") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "Device:C") (at 161.29 24.13 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid f1909747-24a8-4b41-ab11-85eca4209549)
+    (property "Reference" "C1" (at 165.1 23.495 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Value" "C" (at 165.1 26.035 0)
+      (effects (font (size 1.27 1.27)) (justify left))
+    )
+    (property "Footprint" "Capacitor_SMD:C_0201_0603Metric" (at 162.2552 27.94 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "~" (at 161.29 24.13 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid ad26e2be-074f-4bd1-bfa6-be929b00e270))
+    (pin "2" (uuid f9407135-fcbb-4520-9eeb-1d052e6195e0))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "C1") (unit 1)
+        )
+      )
+    )
+  )
+
+  (symbol (lib_id "power:GND") (at 132.08 161.29 0) (unit 1)
+    (in_bom yes) (on_board yes) (dnp no) (fields_autoplaced)
+    (uuid f2fd4f4a-a7df-4a28-846e-8622820c4661)
+    (property "Reference" "#PWR042" (at 132.08 167.64 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Value" "GND" (at 132.08 166.37 0)
+      (effects (font (size 1.27 1.27)))
+    )
+    (property "Footprint" "" (at 132.08 161.29 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (property "Datasheet" "" (at 132.08 161.29 0)
+      (effects (font (size 1.27 1.27)) hide)
+    )
+    (pin "1" (uuid 9d1d7d85-6ef6-4bf5-ae5e-16c0614efea1))
+    (instances
+      (project "schematic"
+        (path "/76bf3bf1-1372-4c7f-8be5-873185dd5bdd"
+          (reference "#PWR042") (unit 1)
+        )
+      )
+    )
+  )
+
+  (sheet_instances
+    (path "/" (page "1"))
+  )
+)
diff --git a/hardcopy/hardware/schematic_print_v0_1.pdf b/hardcopy/hardware/schematic_print_v0_1.pdf
new file mode 100644 (file)
index 0000000..6860a46
Binary files /dev/null and b/hardcopy/hardware/schematic_print_v0_1.pdf differ
diff --git a/hardcopy/hardware/schematic_print_v0_2.pdf b/hardcopy/hardware/schematic_print_v0_2.pdf
new file mode 100644 (file)
index 0000000..d78a0d1
Binary files /dev/null and b/hardcopy/hardware/schematic_print_v0_2.pdf differ
diff --git a/hardcopy/styrmodul/.gitignore b/hardcopy/styrmodul/.gitignore
new file mode 100644 (file)
index 0000000..7fd64cf
--- /dev/null
@@ -0,0 +1,3 @@
+/Styrmodul/Debug/
+/.vs/
+.vs/
diff --git a/hardcopy/styrmodul/README.md b/hardcopy/styrmodul/README.md
new file mode 100644 (file)
index 0000000..6d26b7f
--- /dev/null
@@ -0,0 +1,93 @@
+# Styrmodul
+
+
+
+## Getting started
+
+To make it easy for you to get started with GitLab, here's a list of recommended next steps.
+
+Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)!
+
+## Add your files
+
+- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files
+- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command:
+
+```
+cd existing_repo
+git remote add origin https://gitlab.liu.se/da-proj/TSEA56/2024/g08/styrmodul.git
+git branch -M main
+git push -uf origin main
+```
+
+## Integrate with your tools
+
+- [ ] [Set up project integrations](https://gitlab.liu.se/da-proj/TSEA56/2024/g08/styrmodul/-/settings/integrations)
+
+## Collaborate with your team
+
+- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/)
+- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html)
+- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically)
+- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/)
+- [ ] [Set auto-merge](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html)
+
+## Test and Deploy
+
+Use the built-in continuous integration in GitLab.
+
+- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html)
+- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing (SAST)](https://docs.gitlab.com/ee/user/application_security/sast/)
+- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html)
+- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/)
+- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html)
+
+***
+
+# Editing this README
+
+When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thanks to [makeareadme.com](https://www.makeareadme.com/) for this template.
+
+## Suggestions for a good README
+
+Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information.
+
+## Name
+Choose a self-explaining name for your project.
+
+## Description
+Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors.
+
+## Badges
+On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge.
+
+## Visuals
+Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method.
+
+## Installation
+Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection.
+
+## Usage
+Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README.
+
+## Support
+Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc.
+
+## Roadmap
+If you have ideas for releases in the future, it is a good idea to list them in the README.
+
+## Contributing
+State if you are open to contributions and what your requirements are for accepting them.
+
+For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self.
+
+You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser.
+
+## Authors and acknowledgment
+Show your appreciation to those who have contributed to the project.
+
+## License
+For open source projects, say how it is licensed.
+
+## Project status
+If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers.
diff --git a/hardcopy/styrmodul/Styrmodul.atsln b/hardcopy/styrmodul/Styrmodul.atsln
new file mode 100644 (file)
index 0000000..600d920
--- /dev/null
@@ -0,0 +1,22 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Atmel Studio Solution File, Format Version 11.00
+VisualStudioVersion = 14.0.23107.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{54F91283-7BC4-4236-8FF9-10F437C3AD48}") = "Styrmodul", "Styrmodul\Styrmodul.cproj", "{DCE6C7E3-EE26-4D79-826B-08594B9AD897}"
+EndProject
+Global
+       GlobalSection(SolutionConfigurationPlatforms) = preSolution
+               Debug|AVR = Debug|AVR
+               Release|AVR = Release|AVR
+       EndGlobalSection
+       GlobalSection(ProjectConfigurationPlatforms) = postSolution
+               {DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Debug|AVR.ActiveCfg = Debug|AVR
+               {DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Debug|AVR.Build.0 = Debug|AVR
+               {DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Release|AVR.ActiveCfg = Release|AVR
+               {DCE6C7E3-EE26-4D79-826B-08594B9AD897}.Release|AVR.Build.0 = Release|AVR
+       EndGlobalSection
+       GlobalSection(SolutionProperties) = preSolution
+               HideSolutionNode = FALSE
+       EndGlobalSection
+EndGlobal
diff --git a/hardcopy/styrmodul/Styrmodul.atsuo b/hardcopy/styrmodul/Styrmodul.atsuo
new file mode 100644 (file)
index 0000000..796b28a
Binary files /dev/null and b/hardcopy/styrmodul/Styrmodul.atsuo differ
diff --git a/hardcopy/styrmodul/Styrmodul/I2C.c b/hardcopy/styrmodul/Styrmodul/I2C.c
new file mode 100644 (file)
index 0000000..63207da
--- /dev/null
@@ -0,0 +1,148 @@
+#include <util/twi.h>
+#include <avr/interrupt.h>
+
+#include "I2C.h"
+
+static volatile uint8_t package_buffer[PACKET_SIZE];
+static volatile uint8_t byte_index = 0;
+static volatile uint8_t is_req = 0;
+static volatile uint8_t cur_req_idx = 0;
+
+volatile uint8_t state[REQ_SIZE];
+volatile PackageBuffer pkg_buffer;
+
+static DataPackage convert_last_to_pkg(void)
+{
+       DataPackage pkg; 
+       pkg.header = package_buffer[0];
+       pkg.data_1 = (package_buffer[1] << 8) | (package_buffer[2]);
+       pkg.data_2 = (package_buffer[3] << 8) | (package_buffer[4]);
+       
+       uint16_t checksum = (package_buffer[5] << 8) | (package_buffer[6]);
+       for (int i = 0; i < 5; ++i) {
+               checksum -= package_buffer[i];
+       }
+       pkg.valid = checksum==14453;
+       return pkg;
+}
+
+void I2C_init(uint8_t address) {
+       cli();
+       
+       pkg_buffer = pkgbuf_new();
+       // load address into TWI address register
+       TWAR = address << 1;
+       // set the TWCR to enable address matching and enable TWI, clear TWINT, enable TWI interrupt
+       TWCR = (1<<TWIE) | (1<<TWEA) | (1<<TWINT) | (1<<TWEN);
+       sei();
+}
+
+void I2C_stop(void) {
+  // clear acknowledge and enable bits
+  cli();
+  TWCR = 0;
+  TWAR = 0;
+  sei();
+}
+
+void recv(uint8_t byte) {
+       if (byte_index >= PACKET_SIZE) {
+               return;
+       }
+       package_buffer[byte_index] = byte;
+       byte_index += 1;
+}
+
+void req() {
+       TWDR = state[cur_req_idx];
+       cur_req_idx = cur_req_idx + 1;
+}
+
+ISR(TWI_vect)
+{
+  switch(TW_STATUS)
+  {
+    case TW_SR_DATA_ACK:
+      // received data from master, call the receive callback
+       
+      TWCR = (1<<TWIE) | (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
+         recv(TWDR);
+
+         break;
+    case TW_ST_SLA_ACK:
+      // master is requesting data, call the request callback
+      req();
+      TWCR = (1<<TWIE) | (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
+      break;
+    case TW_ST_DATA_ACK:
+      // master is requesting data, call the request callback
+      req();
+      TWCR = (1<<TWIE) | (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
+      break;
+    case TW_BUS_ERROR:
+      // some sort of erroneous state, prepare TWI to be readdressed
+      TWCR = 0;
+      TWCR = (1<<TWIE) | (1<<TWINT) | (1<<TWEA) | (1<<TWEN); 
+      break;
+       case TW_START:
+               cur_req_idx = 0;
+               byte_index = 0;
+               TWCR = (1<<TWIE) | (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
+               break;
+       case TW_SR_STOP:
+               TWCR = (1<<TWIE) | (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
+               is_req = 0;
+               byte_index = 0;
+               cur_req_idx = 0;
+               if (package_buffer[0] == REQ) {
+                 is_req = 1;
+                 package_buffer[0] = 0xff;
+               } else {
+                       
+                       pkgbuf_push(&pkg_buffer, convert_last_to_pkg());
+               }
+               break;
+    default:
+      TWCR = (1<<TWIE) | (1<<TWINT) | (1<<TWEA) | (1<<TWEN);
+      break;
+  }
+} 
+
+PackageBuffer pkgbuf_new() {
+       DataPackage start_pkg;
+       start_pkg.header = 0xff;
+       start_pkg.data_1 = 0xffff;
+       start_pkg.data_2 = 0xffff;
+       start_pkg.valid = 0;
+       PackageBuffer buf;
+       buf.read_idx = 0;
+       buf.write_idx = 0;
+       
+       for (int i = 0; i < BUFFER_SIZE; ++i) {
+               buf.buf[i] = start_pkg;
+       }
+       return buf;
+}
+
+void pkgbuf_push(volatile PackageBuffer *buf, DataPackage pkg) {
+       uint8_t read_idx = buf->read_idx;
+       uint8_t new_write_idx = (buf->write_idx+1)%BUFFER_SIZE;
+       if (new_write_idx != read_idx) {
+               buf->buf[buf->write_idx] = pkg;
+               buf->write_idx = new_write_idx;
+       }
+}
+
+DataPackage pkgbuf_pop(volatile PackageBuffer *buf, int8_t *success) {
+       uint8_t write_idx = buf->write_idx;
+       
+       DataPackage pkg = buf->buf[buf->read_idx];
+       
+       if (write_idx != buf->read_idx) {
+               buf->read_idx = (buf->read_idx+1) % BUFFER_SIZE;
+               *success = 1;
+               return pkg;
+       }
+       *success = 0;
+       return pkg;
+}
diff --git a/hardcopy/styrmodul/Styrmodul/I2C.h b/hardcopy/styrmodul/Styrmodul/I2C.h
new file mode 100644 (file)
index 0000000..b9f6986
--- /dev/null
@@ -0,0 +1,72 @@
+#pragma once
+
+#include <avr/interrupt.h>
+#include <stdint.h>
+#include "motor.h"
+
+#define PACKET_SIZE 13 // 1 byte header, 2*2 bytes of data, 2 byte for checksum.
+
+#define REQ_SIZE 30
+#define BUFFER_SIZE 32
+extern volatile uint8_t state[REQ_SIZE];
+
+inline void __attribute__((always_inline)) I2C_transmitByte(uint8_t data) {
+       TWDR = data;
+}
+
+typedef struct DataPackage {
+       uint8_t header;
+       uint16_t data_1;
+       uint16_t data_2;
+       //uint16_t data_3;
+       //uint16_t data_4;
+       //uint16_t data_5;
+       int8_t valid;
+} DataPackage;
+
+typedef struct PackageBuffer {
+       DataPackage buf[BUFFER_SIZE];
+       uint8_t read_idx;
+       uint8_t write_idx;
+} PackageBuffer;
+
+enum {
+       ODOMETER_SPEED = 0x00,
+       ODOMETER_POS = 1,
+       SET_TARGET_POINT = 2,
+       CLAW_MANUAL = 3,
+       FORWARD = 4,
+       TURN = 5,
+       SET_DIFF_KI = 6,        
+       SET_DIFF_K_ORIGIN = 7,
+       SET_DIFF_THRESHOLD = 8,
+       SET_DIFF_K_OUTER = 9,
+       SET_DIFF_M_OUTER = 10,
+       
+       SET_MEAN_KI = 11,
+       SET_MEAN_K = 12,
+
+       ROTATE = 13,
+       SET_POS = 14,
+       SET_ANGLE = 15,
+       STOP = 16,
+       SET_MANUAL = 17,
+       NUDGE_POS = 18,
+       NUDGE_ANGLE = 19,
+       SET_AUTO_ROTATE_SPEED = 20,
+       SET_TARGET_ANGLE_AND_SPEED = 21,
+       SET_MU = 22,
+       SET_L = 23,
+       NUM_OF_PKGS = 24, // Must be last!
+       REQ = 0x80,
+};
+
+extern volatile PackageBuffer pkg_buffer;
+
+PackageBuffer pkgbuf_new();
+void pkgbuf_push(volatile PackageBuffer *buf, DataPackage pkg);
+DataPackage pkgbuf_pop(volatile PackageBuffer *buf, int8_t *success);
+
+void I2C_init(uint8_t address);
+
+void I2C_stop(void);
diff --git a/hardcopy/styrmodul/Styrmodul/Styrmodul.componentinfo.xml b/hardcopy/styrmodul/Styrmodul/Styrmodul.componentinfo.xml
new file mode 100644 (file)
index 0000000..4637a6f
--- /dev/null
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Store xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="AtmelPackComponentManagement">
+       <ProjectComponents>
+               <ProjectComponent z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
+                       <CApiVersion></CApiVersion>
+                       <CBundle></CBundle>
+                       <CClass>Device</CClass>
+                       <CGroup>Startup</CGroup>
+                       <CSub></CSub>
+                       <CVariant></CVariant>
+                       <CVendor>Atmel</CVendor>
+                       <CVersion>1.3.0</CVersion>
+                       <DefaultRepoPath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs</DefaultRepoPath>
+                       <DependentComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" />
+                       <Description></Description>
+                       <Files xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
+                               <d4p1:anyType i:type="FileInfo">
+                                       <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.3.300\include</AbsolutePath>
+                                       <Attribute></Attribute>
+                                       <Category>include</Category>
+                                       <Condition>C</Condition>
+                                       <FileContentHash i:nil="true" />
+                                       <FileVersion></FileVersion>
+                                       <Name>include</Name>
+                                       <SelectString></SelectString>
+                                       <SourcePath></SourcePath>
+                               </d4p1:anyType>
+                               <d4p1:anyType i:type="FileInfo">
+                                       <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.3.300\include\avr\iom1284p.h</AbsolutePath>
+                                       <Attribute></Attribute>
+                                       <Category>header</Category>
+                                       <Condition>C</Condition>
+                                       <FileContentHash>vh9iXs8qtcuaLy+iWn/Ttg==</FileContentHash>
+                                       <FileVersion></FileVersion>
+                                       <Name>include/avr/iom1284p.h</Name>
+                                       <SelectString></SelectString>
+                                       <SourcePath></SourcePath>
+                               </d4p1:anyType>
+                               <d4p1:anyType i:type="FileInfo">
+                                       <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.3.300\templates\main.c</AbsolutePath>
+                                       <Attribute>template</Attribute>
+                                       <Category>source</Category>
+                                       <Condition>C Exe</Condition>
+                                       <FileContentHash>aLOve8Y2qJXXw+PsttepTw==</FileContentHash>
+                                       <FileVersion></FileVersion>
+                                       <Name>templates/main.c</Name>
+                                       <SelectString>Main file (.c)</SelectString>
+                                       <SourcePath></SourcePath>
+                               </d4p1:anyType>
+                               <d4p1:anyType i:type="FileInfo">
+                                       <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.3.300\templates\main.cpp</AbsolutePath>
+                                       <Attribute>template</Attribute>
+                                       <Category>source</Category>
+                                       <Condition>C Exe</Condition>
+                                       <FileContentHash>YXFphlh0CtZJU+ebktABgQ==</FileContentHash>
+                                       <FileVersion></FileVersion>
+                                       <Name>templates/main.cpp</Name>
+                                       <SelectString>Main file (.cpp)</SelectString>
+                                       <SourcePath></SourcePath>
+                               </d4p1:anyType>
+                               <d4p1:anyType i:type="FileInfo">
+                                       <AbsolutePath>C:/Program Files (x86)\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p</AbsolutePath>
+                                       <Attribute></Attribute>
+                                       <Category>libraryPrefix</Category>
+                                       <Condition>GCC</Condition>
+                                       <FileContentHash i:nil="true" />
+                                       <FileVersion></FileVersion>
+                                       <Name>gcc/dev/atmega1284p</Name>
+                                       <SelectString></SelectString>
+                                       <SourcePath></SourcePath>
+                               </d4p1:anyType>
+                       </Files>
+                       <PackName>ATmega_DFP</PackName>
+                       <PackPath>C:/Program Files (x86)/Atmel/Studio/7.0/Packs/atmel/ATmega_DFP/1.3.300/Atmel.ATmega_DFP.pdsc</PackPath>
+                       <PackVersion>1.3.300</PackVersion>
+                       <PresentInProject>true</PresentInProject>
+                       <ReferenceConditionId>ATmega1284P</ReferenceConditionId>
+                       <RteComponents xmlns:d4p1="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
+                               <d4p1:string></d4p1:string>
+                       </RteComponents>
+                       <Status>Resolved</Status>
+                       <VersionMode>Fixed</VersionMode>
+                       <IsComponentInAtProject>true</IsComponentInAtProject>
+               </ProjectComponent>
+       </ProjectComponents>
+</Store>
\ No newline at end of file
diff --git a/hardcopy/styrmodul/Styrmodul/Styrmodul.cproj b/hardcopy/styrmodul/Styrmodul/Styrmodul.cproj
new file mode 100644 (file)
index 0000000..a691b84
--- /dev/null
@@ -0,0 +1,182 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="14.0">
+  <PropertyGroup>
+    <SchemaVersion>2.0</SchemaVersion>
+    <ProjectVersion>7.0</ProjectVersion>
+    <ToolchainName>com.Atmel.AVRGCC8.C</ToolchainName>
+    <ProjectGuid>dce6c7e3-ee26-4d79-826b-08594b9ad897</ProjectGuid>
+    <avrdevice>ATmega1284P</avrdevice>
+    <avrdeviceseries>none</avrdeviceseries>
+    <OutputType>Executable</OutputType>
+    <Language>C</Language>
+    <OutputFileName>$(MSBuildProjectName)</OutputFileName>
+    <OutputFileExtension>.elf</OutputFileExtension>
+    <OutputDirectory>$(MSBuildProjectDirectory)\$(Configuration)</OutputDirectory>
+    <AssemblyName>Styrmodul</AssemblyName>
+    <Name>Styrmodul</Name>
+    <RootNamespace>Styrmodul</RootNamespace>
+    <ToolchainFlavour>Native</ToolchainFlavour>
+    <KeepTimersRunning>true</KeepTimersRunning>
+    <OverrideVtor>false</OverrideVtor>
+    <CacheFlash>true</CacheFlash>
+    <ProgFlashFromRam>true</ProgFlashFromRam>
+    <RamSnippetAddress>0x20000000</RamSnippetAddress>
+    <UncachedRange />
+    <preserveEEPROM>true</preserveEEPROM>
+    <OverrideVtorValue>exception_table</OverrideVtorValue>
+    <BootSegment>2</BootSegment>
+    <ResetRule>0</ResetRule>
+    <eraseonlaunchrule>0</eraseonlaunchrule>
+    <EraseKey />
+    <AsfFrameworkConfig>
+      <framework-data xmlns="">
+        <options />
+        <configurations />
+        <files />
+        <documentation help="" />
+        <offline-documentation help="" />
+        <dependencies>
+          <content-extension eid="atmel.asf" uuidref="Atmel.ASF" version="3.47.0" />
+        </dependencies>
+      </framework-data>
+    </AsfFrameworkConfig>
+    <avrtool>com.atmel.avrdbg.tool.atmelice</avrtool>
+    <avrtoolserialnumber>J41800004579</avrtoolserialnumber>
+    <avrdeviceexpectedsignature>0x1E9705</avrdeviceexpectedsignature>
+    <com_atmel_avrdbg_tool_atmelice>
+      <ToolOptions>
+        <InterfaceProperties>
+          <JtagDbgClock>200000</JtagDbgClock>
+        </InterfaceProperties>
+        <InterfaceName>JTAG</InterfaceName>
+      </ToolOptions>
+      <ToolType>com.atmel.avrdbg.tool.atmelice</ToolType>
+      <ToolNumber>J41800004579</ToolNumber>
+      <ToolName>Atmel-ICE</ToolName>
+    </com_atmel_avrdbg_tool_atmelice>
+    <avrtoolinterface>JTAG</avrtoolinterface>
+    <avrtoolinterfaceclock>200000</avrtoolinterfaceclock>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
+    <ToolchainSettings>
+      <AvrGcc>
+        <avrgcc.common.Device>-mmcu=atmega1284p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p"</avrgcc.common.Device>
+        <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches>
+        <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
+        <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
+        <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
+        <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
+        <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
+        <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
+        <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
+        <avrgcc.compiler.symbols.DefSymbols>
+          <ListValues>
+            <Value>NDEBUG</Value>
+          </ListValues>
+        </avrgcc.compiler.symbols.DefSymbols>
+        <avrgcc.compiler.directories.IncludePaths>
+          <ListValues>
+            <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value>
+          </ListValues>
+        </avrgcc.compiler.directories.IncludePaths>
+        <avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
+        <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
+        <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
+        <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
+        <avrgcc.linker.libraries.Libraries>
+          <ListValues>
+            <Value>libm</Value>
+          </ListValues>
+        </avrgcc.linker.libraries.Libraries>
+        <avrgcc.assembler.general.IncludePaths>
+          <ListValues>
+            <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value>
+          </ListValues>
+        </avrgcc.assembler.general.IncludePaths>
+      </AvrGcc>
+    </ToolchainSettings>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+    <ToolchainSettings>
+      <AvrGcc>
+        <avrgcc.common.Device>-mmcu=atmega1284p -B "%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\gcc\dev\atmega1284p"</avrgcc.common.Device>
+        <avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches>
+        <avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
+        <avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
+        <avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
+        <avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
+        <avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
+        <avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
+        <avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
+        <avrgcc.compiler.symbols.DefSymbols>
+          <ListValues>
+            <Value>DEBUG</Value>
+          </ListValues>
+        </avrgcc.compiler.symbols.DefSymbols>
+        <avrgcc.compiler.directories.IncludePaths>
+          <ListValues>
+            <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value>
+          </ListValues>
+        </avrgcc.compiler.directories.IncludePaths>
+        <avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
+        <avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
+        <avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
+        <avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
+        <avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
+        <avrgcc.linker.libraries.Libraries>
+          <ListValues>
+            <Value>libm</Value>
+          </ListValues>
+        </avrgcc.linker.libraries.Libraries>
+        <avrgcc.assembler.general.IncludePaths>
+          <ListValues>
+            <Value>%24(PackRepoDir)\atmel\ATmega_DFP\1.3.300\include</Value>
+          </ListValues>
+        </avrgcc.assembler.general.IncludePaths>
+        <avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
+      </AvrGcc>
+    </ToolchainSettings>
+  </PropertyGroup>
+  <ItemGroup>
+    <Compile Include="lowpass.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="lowpass.h">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="motor.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="motor.h">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="I2C.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="I2C.h">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="main.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="purepursuit.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="purepursuit.h">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="trig_lookup.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="uart.c">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="uart.h">
+      <SubType>compile</SubType>
+    </Compile>
+    <Compile Include="vector.h">
+      <SubType>compile</SubType>
+    </Compile>
+  </ItemGroup>
+  <Import Project="$(AVRSTUDIO_EXE_PATH)\\Vs\\Compiler.targets" />
+</Project>
\ No newline at end of file
diff --git a/hardcopy/styrmodul/Styrmodul/lowpass.c b/hardcopy/styrmodul/Styrmodul/lowpass.c
new file mode 100644 (file)
index 0000000..78a5513
--- /dev/null
@@ -0,0 +1,32 @@
+#include "lowpass.h"
+
+LowPass lp_new(int32fp h) {
+       LowPass result = {
+               .filtered_value = 0,
+               .h = h,
+       };
+       return result;
+}
+
+void lp_update(LowPass *filter, int32fp target, int8_t is_angle) {
+       //filter->filtered_value = ( ((target)*filter->h) + ( (filter->filtered_value)*( ((int32fp)1<<15) - filter->h) ) )>>15;
+       
+       volatile int32fp diff = target - filter->filtered_value;
+       if (is_angle) {
+               if (diff > (int32fp)180<<15) {
+                       diff -= (int32fp)360<<15;
+               }
+               if (diff < -(int32fp)180<<15) {
+                       diff += (int32fp)360<<15;
+               }
+       }
+       filter->filtered_value += (((int64_t)diff)*(int64_t)filter->h) >> 15;
+       if (is_angle) {
+               if (filter->filtered_value > (int32fp)180<<15) {
+                       filter->filtered_value -= (int32fp)360<<15;
+               }
+               if (filter->filtered_value < -(int32fp)180<<15) {
+                       filter->filtered_value += (int32fp)360<<15;
+               }
+       }
+}
\ No newline at end of file
diff --git a/hardcopy/styrmodul/Styrmodul/lowpass.h b/hardcopy/styrmodul/Styrmodul/lowpass.h
new file mode 100644 (file)
index 0000000..e67704d
--- /dev/null
@@ -0,0 +1,11 @@
+#pragma once
+
+#include "motor.h"
+
+typedef struct LowPass {
+       int32fp h;
+       int32fp filtered_value; // Must be 15 bit fixed point
+} LowPass;
+
+LowPass lp_new(int32fp h);
+void lp_update(LowPass *filter, int32fp target, int8_t is_angle);
\ No newline at end of file
diff --git a/hardcopy/styrmodul/Styrmodul/main.c b/hardcopy/styrmodul/Styrmodul/main.c
new file mode 100644 (file)
index 0000000..863ac9a
--- /dev/null
@@ -0,0 +1,413 @@
+#define F_CPU 8000000
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <util/delay.h>
+#include <util/twi.h>
+#include <avr/interrupt.h>
+#include "uart.h"
+
+#include "I2C.h"
+#include "motor.h"
+#include "purepursuit.h"
+
+typedef struct OdoUartPkg
+{
+       uint16_t vel_l;
+       uint16_t vel_r;
+       uint16_t dist_since_last_l;
+       uint16_t dist_since_last_r;
+       uint16_t angle; // Degrees I think?
+       uint16_t checksum;
+} OdoUartPkg;
+
+
+int8_t manual = 1;
+uint16_t auto_rotate_speed = 25;
+MovementController controller;
+Theseus theseus;
+OdoUartPkg control_state;
+
+void set_claw_pos(uint8_t pos) {
+       OCR1A = 33+pos;
+}
+
+int8_t recv_uart_pkg()
+{
+       uint8_t buf[12];
+       start:
+       while (!uart_available()) {}
+       //while (!uart_available()) {_delay_us(10);}
+       uint8_t sync_byte = uart_getc();
+       if (sync_byte != 0xf0) {
+               goto start;
+       }
+
+       for (int i = 0; i < 12; ++i) {
+               while (!uart_available()) {}
+               //while (!uart_available()) {_delay_us(10);}
+               uint8_t upper_half = uart_getc();
+               
+               if ((upper_half & 0xf0) != 0) {
+                       return 0;
+               }
+               
+               while (!uart_available()) {}
+               //while (!uart_available()) {_delay_us(10);}
+               uint8_t lower_half = uart_getc();
+               
+               if ((lower_half & 0xf0) != 0) {
+                       return 0;
+               }
+               
+               
+               uint8_t result = (lower_half & 0x0f) | (upper_half << 4);
+               buf[i] = result;
+       }
+       
+       while (!uart_available()) {}
+       //while (!uart_available()) {_delay_us(10);}
+       uint8_t end_byte = uart_getc();
+       if (end_byte != 0xf1) {
+               return 0;
+       }
+       
+       control_state.vel_l = buf[0] << 8;
+       control_state.vel_l |= buf[1];
+       control_state.vel_r = buf[2] << 8;
+       control_state.vel_r |= buf[3];
+       control_state.dist_since_last_l = buf[4] << 8;
+       control_state.dist_since_last_l |= buf[5];
+       control_state.dist_since_last_r = buf[6] << 8;
+       control_state.dist_since_last_r |= buf[7];
+       control_state.angle = buf[8] << 8;
+       control_state.angle |= buf[9];
+       control_state.checksum = buf[10] << 8;
+       control_state.checksum |= buf[11];
+       
+       uint16_t checksum = control_state.checksum;
+       for (int i = 0; i < 10; ++i) {
+               checksum -= buf[i];
+       }
+       if (control_state.vel_l != 0 || control_state.vel_r != 0) {
+               asm("nop");
+       }
+       if (control_state.dist_since_last_l != 0 || control_state.dist_since_last_r != 0) {
+               asm("nop");
+       }
+       
+       return checksum == 14453;
+}
+
+// TODO replace float with ints.
+float temp;
+float vleft;
+float vright;
+void parse_pkg(volatile DataPackage* pkg)
+{
+       
+       float factor;
+       int16fp speed;
+       switch (pkg->header)
+       {
+               // All integers are assumed to be sent as 16 bit big endian.
+               case SET_TARGET_POINT:
+               manual = 0;
+               theseus_set_target_point(&theseus, vec2_new(pkg->data_1, pkg->data_2));
+               break;
+               case CLAW_MANUAL:
+               //Expects [0-33, 2 bytes]
+               set_claw_pos((uint8_t) pkg->data_1);
+               break;
+               case FORWARD:
+               manual = 1;
+               //Expects [0-255, 2 bytes]
+               manual = 1;
+               if (pkg->data_1 == 0) {
+                       controller.diff_controller.sum = 0;
+                       controller.mean_controller.sum = 0;
+               }
+               movementcontroller_set_target(&controller, pkg->data_1, pkg->data_1);
+               break;
+               case TURN:
+               manual = 1;
+               //Expects [1/r, mm^(-1), 12 bit fixed point][v, m/s]
+               // v(1 - d/r)
+               
+               if (pkg->data_2 == 0) {
+                       controller.diff_controller.sum = 0;
+                       controller.mean_controller.sum = 0;
+               }
+               
+               temp = (float)((int16_t)pkg->data_1);
+               factor =  (temp * (float)(WIDTH_MM/2.0))/4096.0f;
+               vleft = (int16_t)pkg->data_2 * (1 - factor);
+               vright = (int16_t)pkg->data_2 * (1 + factor);
+               movementcontroller_set_target(&controller, vleft, vright);
+               break;
+               
+               case SET_DIFF_KI:
+               controller.diff_controller.Ki = pkg->data_1;
+               break;
+               case SET_DIFF_K_ORIGIN:
+               controller.diff_controller.k_origin = pkg->data_1;
+               break;
+               case SET_DIFF_THRESHOLD:
+               controller.diff_controller.threshold = pkg->data_1;
+               break;
+               case SET_DIFF_K_OUTER:
+               controller.diff_controller.k_outer = pkg->data_1;
+               break;
+               case SET_DIFF_M_OUTER:
+               controller.diff_controller.m_outer = pkg->data_1;
+               break;
+
+               case SET_MEAN_KI:
+               controller.mean_controller.Ki = pkg->data_1;
+               break;
+               case SET_MEAN_K:
+               controller.mean_controller.k = pkg->data_1;
+               break;
+
+               case ROTATE:
+               manual = 1;
+               speed = pkg->data_1;
+               //v/r*180/pi=data1e
+               //v=data1*r*pi/180*256 = data1*0.8936 = / almost equal / = data1
+               speed = pkg->data_1;
+               movementcontroller_set_target(&controller, -speed, speed);
+               break;
+               case SET_POS:
+               // Expects [x coord, meter, 8 bit fixed point][y coord, meter, 8 bit fixed point
+               theseus_set_position(&theseus, (int16fp)pkg->data_1, (int16fp)pkg->data_2);
+               break;
+               case SET_ANGLE:
+               theseus_set_angle(&theseus, pkg->data_1);
+               break;
+               case STOP:
+               theseus.target_reached = 1;
+               controller.diff_controller.sum = 0;
+               controller.mean_controller.sum = 0;
+               manual = 1;
+               raw_set_motor_speed(&controller.left_motor, 0);
+               raw_set_motor_speed(&controller.right_motor, 0);
+               movementcontroller_set_target(&controller, 0, 0);
+               break;
+               case SET_MANUAL:
+               manual = pkg->data_1;
+               break;
+               case NUDGE_POS:
+               theseus_nudge_pos(&theseus, (int16fp)pkg->data_1, (int16fp)pkg->data_2);
+               break;
+               case NUDGE_ANGLE:
+               theseus_nudge_angle(&theseus, pkg->data_1);
+               break;
+               case SET_AUTO_ROTATE_SPEED:
+               auto_rotate_speed = pkg->data_1;
+               break;
+               case SET_TARGET_ANGLE_AND_SPEED:
+               // Must be sent before set target position
+               theseus.target_angle = pkg->data_1;
+               theseus.speed = pkg->data_2;
+               break;
+               case SET_MU:
+               theseus.mu = pkg->data_1;
+               break;
+               case SET_L:
+               theseus.l = pkg->data_1;
+               break;
+               default:
+               break;
+       }
+}
+
+
+#define APPEND_TO_STATE_16(i, a) state[i++] = (a) >> 8; state[i++] = (a)
+
+void update_state() {
+
+       cli();
+       
+       volatile int idx = 0;
+       int16fp avg = get_moving_average(&controller.avg_left)>>(15-FIXED_POINT-5);
+       APPEND_TO_STATE_16(idx, avg);
+       
+       avg = get_moving_average(&controller.avg_right)>>(15-FIXED_POINT-5);
+       APPEND_TO_STATE_16(idx, avg);
+       
+       int16fp target_left = controller.mean_controller.target + controller.diff_controller.target;
+       int16fp target_right = controller.mean_controller.target - controller.diff_controller.target;
+       APPEND_TO_STATE_16(idx, target_left);
+       APPEND_TO_STATE_16(idx, target_right);
+       
+       int16fp x = (theseus.lp_x.filtered_value >> (15-FIXED_POINT));
+       APPEND_TO_STATE_16(idx, x);
+       
+       int16fp y = (theseus.lp_y.filtered_value >> (15-FIXED_POINT));
+       APPEND_TO_STATE_16(idx, y);
+       // idx = 12
+       
+       APPEND_TO_STATE_16(idx, controller.diff_controller.k_origin);
+       APPEND_TO_STATE_16(idx, controller.diff_controller.threshold);
+       APPEND_TO_STATE_16(idx, controller.diff_controller.k_outer);
+       APPEND_TO_STATE_16(idx, controller.diff_controller.m_outer);
+       
+       APPEND_TO_STATE_16(idx, controller.mean_controller.k);
+       // idx = 22
+       
+       state[idx++] = controller.left_motor.pwm;
+       state[idx++] = controller.right_motor.pwm;
+
+       APPEND_TO_STATE_16(idx, theseus.lp_angle.filtered_value >> 15);
+       APPEND_TO_STATE_16(idx, auto_rotate_speed);
+       // idx = 28
+
+
+       uint16_t checksum = 14453;
+       for (int i = 0; i < idx; ++i) {
+               checksum += state[i];
+       }
+       
+       APPEND_TO_STATE_16(idx, checksum);
+
+       sei();
+       
+}
+#undef APPEND_TO_STATE_16
+
+
+void motor_init() {
+
+       DDRD |= _BV(PD5) | _BV(PD0) | _BV(PD1) ;
+       DDRB |= _BV(PB3) | _BV(PB4);
+       DDRA |= _BV(PA7) | _BV(PA6);
+
+       TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM11);
+       TCCR1B = 4 |_BV(WGM13) | _BV(WGM12);
+       ICR1 = PWM_COUNTER_MAX;
+
+       TCCR0A = _BV(COM0A1) | _BV(COM0B1) | _BV(WGM00) | _BV(WGM01);
+       TCCR0B = 4;
+
+       Motor left_motor, right_motor;
+       left_motor.dir_addr = &PORTA;
+       left_motor.dir_bit = PA6;
+       left_motor.cur_dir = 1;
+       left_motor.pwm_ocr = &OCR0B;
+
+       right_motor.dir_addr = &PORTA;
+       right_motor.dir_bit = PA7;
+       right_motor.cur_dir = 1;
+       right_motor.pwm_ocr = &OCR0A;
+
+       controller = movementcontroller_new(left_motor, right_motor);
+}
+
+int main (void) {
+       
+       theseus = theseus_new();
+       
+       motor_init();
+
+       // I2C address 3
+       I2C_init(3);
+       uart_init(UART_BAUD_SELECT(UART_BAUD_RATE, F_CPU));
+       
+       sei();
+       
+       int16_t angle = 0;
+       int8_t has_received_angle = 0;
+       // Mainloop
+       while (1) {
+               //asm("nop");
+               //_delay_us(100);
+               while (uart_available()) {
+               //if (0) {      
+                       // control_state.vel_n is m/s in in 15 bit fixed point.
+                       // Data frequency is 30 Hz which is approx 32 Hz.
+                       const int16fp DELTA_TIME = 1<<(FIXED_POINT-5);
+                       
+                       if (recv_uart_pkg()) {
+                       //if (0) {
+                               int16_t signed_delta_pos_l = control_state.dist_since_last_l;
+                               if (controller.left_motor.cur_dir == -1) {
+                                       signed_delta_pos_l = -signed_delta_pos_l;
+                               }
+                               int16_t signed_delta_pos_r = control_state.dist_since_last_r;
+                               if (controller.right_motor.cur_dir == -1) {
+                                       signed_delta_pos_r = -signed_delta_pos_r;
+                               }
+
+                               if (has_received_angle) {
+                                       int16_t diff = -(control_state.angle-angle);
+                                       theseus_update(&theseus, (signed_delta_pos_l+signed_delta_pos_r)/2, diff);
+                               }
+                               angle = control_state.angle;
+                               has_received_angle = 1;
+                               if (signed_delta_pos_l != 0 || signed_delta_pos_r != 0) {
+                                       asm("nop");
+                               }
+                               movementcontroller_update(&controller, signed_delta_pos_l, signed_delta_pos_r, DELTA_TIME);
+                               } else {
+                               movementcontroller_update(&controller, 0, 0, DELTA_TIME);
+                       }
+                       update_state();
+                       
+                       if (manual) {
+                               // Shouldn't be controlled by the automatic stuff.
+                       } else if (theseus.target_reached) {
+                               movementcontroller_set_target(&controller, 0, 0);
+                       } else {
+                               /*int8_t st = should_rotate(&theseus);
+                               
+                               if (st == 0) {
+                                       theseus.turn_threshold = WIDE_TURN_CONE;
+                                       } else if (theseus.is_rotating == 0) {
+                                       theseus.turn_threshold = NARROW_TURN_CONE;
+                               }
+                               theseus.is_rotating = st;*/
+
+                               int8_t dir = 0;
+                               int32fp inv_radius = lq_following(&theseus, &dir);
+                               // TODO remove use of constant speed.
+                               // TODO use fixed point integer instead of floating point.
+                               
+                               temp = (float)(inv_radius);
+                               float factor =  (temp * (float)(WIDTH_MM/1000.0/2.0))/256.0f;
+                               vleft = (float)dir*(float)theseus.speed * (1 - factor);
+                               vright = (float)dir*(float)theseus.speed * (1 + factor);
+                               
+                               if (vleft > 256) {
+                                       vleft = 256;
+                               }
+                               if (vleft < -256) {
+                                       vleft = -256;
+                               }
+                               if (vright > 256) {
+                                       vright = 256;
+                               }
+                               if (vright < -256) {
+                                       vright = -256;
+                               }
+                               
+                               /*if (theseus.is_rotating != 0) {
+                                       vleft = -theseus.is_rotating*auto_rotate_speed;
+                                       vright = theseus.is_rotating*auto_rotate_speed;
+                               }*/
+                               
+                               movementcontroller_set_target(&controller, vleft, vright);
+                       }
+               }
+
+               while (1) {
+                       int8_t success = 0;
+                       DataPackage pkg = pkgbuf_pop(&pkg_buffer, &success);
+                       if (!success) {
+                               break;
+                       }
+                       if (pkg.valid) {
+                               parse_pkg(&pkg);                
+                       }
+               }
+       }
+}
\ No newline at end of file
diff --git a/hardcopy/styrmodul/Styrmodul/motor.c b/hardcopy/styrmodul/Styrmodul/motor.c
new file mode 100644 (file)
index 0000000..5715fa0
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ * controller.c
+ *
+ * Created: 2024-04-08 11:53:13
+ *  Author: alebe643
+ */ 
+#include "motor.h"
+#include <avr/io.h>
+
+
+int16fp update_mean(MeanController *ctrl, int32fp current_speed, int32fp delta_time) {
+       //int32fp error = mean->target - current_speed
+
+       return FP_MUL(ctrl->target, ctrl->k);
+}
+
+int32fp update_diff(DiffController *ctrl, int32fp current_speed, int32fp delta_time) {
+       //int32fp error = ctrl->target - current_speed;
+       
+       int32fp abs_vel = ctrl->target;
+       if (abs_vel < 0) {
+               abs_vel = -abs_vel;
+       }
+       
+       int16_t pwm = 0;
+       
+       if (abs_vel < ctrl->threshold) {
+               pwm = FP_MUL(ctrl->k_origin, abs_vel);
+               } else {
+               pwm = FP_MUL(ctrl->k_outer, abs_vel) + ctrl->m_outer;
+       }
+       
+       if (ctrl->target < 0) {
+               pwm = -pwm;
+       }
+       return pwm;
+}
+
+MeanController meanctrl_new(int16fp Ki) {
+       MeanController controller;
+       controller.Ki = Ki;
+       controller.sum = 0;
+       controller.k = 262;
+       controller.target = 0;
+       return controller;
+}
+
+DiffController diffctrl_new(int16fp Ki) {
+       DiffController controller;
+       controller.Ki = Ki;
+       controller.k_origin = 883;
+       controller.threshold = 10;
+       controller.k_outer = 262;
+       controller.m_outer = 22;
+       
+       controller.sum = 0;
+       controller.target = 0;
+       return controller;
+}
+
+volatile int16_t start_speed;
+// `speed` is an integer between -MAX_SPEED and MAX_SPEED
+void raw_set_motor_speed(Motor* motor, int16_t speed) {
+
+       start_speed = speed;
+       if (speed < 0) {
+               *(motor->dir_addr) = *(motor->dir_addr) & ~(1 << motor->dir_bit);
+               speed = -speed;
+               motor->cur_dir = -1;
+               } else {
+               *(motor->dir_addr) = *(motor->dir_addr) | (1 << motor->dir_bit);
+               motor->cur_dir = 1;
+       }
+       if (speed > MAX_SPEED) {
+               speed = MAX_SPEED;
+
+       }
+       motor->pwm = speed;
+       if (motor->pwm != 0) {
+               asm("nop");
+       }
+       *(motor->pwm_ocr) = speed;
+}
+
+MovingAverage movingaverage_new() {
+       MovingAverage mavg;
+       mavg.cur_idx = 0;
+       mavg.avg = 0;
+       for (int i = 0; i < MOVING_AVERAGE_SIZE; ++i) {
+               mavg.vals[i] = 0;
+       }
+       return mavg;
+}
+
+void update_moving_average(MovingAverage *mavg, int16fp new_val) {
+       mavg->avg -= mavg->vals[mavg->cur_idx];
+       mavg->vals[mavg->cur_idx] = new_val;
+       mavg->avg += mavg->vals[mavg->cur_idx];
+       mavg->cur_idx = (mavg->cur_idx+1) & (MOVING_AVERAGE_SIZE-1); // Modulo (MOVING_AVERAGE_SIZE)
+}
+
+int16fp get_moving_average(MovingAverage *mavg) {
+       return mavg->avg >> MOVING_AVERAGE_POW;
+}
+
+MovementController movementcontroller_new(Motor left_motor, Motor right_motor) {
+       MovementController controller = {
+               .mean_controller = meanctrl_new(0),
+               .diff_controller = diffctrl_new(0),
+               .left_motor = left_motor,
+               .right_motor = right_motor,
+               .avg_left = movingaverage_new(),
+               .avg_right = movingaverage_new(),
+       };
+       return controller;
+}
+
+void movementcontroller_set_target(MovementController *controller, int16fp target_left, int16fp target_right) {
+       if (target_left != 0 || target_right != 0) {
+               asm("nop");
+       }
+       controller->mean_controller.target = (target_left+target_right)/2;
+       controller->diff_controller.target = (target_left-target_right)/2;
+}
+
+void movementcontroller_update(MovementController *controller, volatile int16fp left_speed, volatile int16fp right_speed, int16fp delta_time) {
+       /*update_moving_average(&controller->avg_left, left_speed);
+       update_moving_average(&controller->avg_right, right_speed);
+       
+       int32fp mavg_left = get_moving_average(&controller->avg_left)>>M_TO_MS_RSHIFT;
+       int32fp mavg_right = get_moving_average(&controller->avg_right)>>M_TO_MS_RSHIFT;
+       
+       int32fp mean = (mavg_left+mavg_right)/2;
+       int32fp diff = (mavg_left-mavg_right)/2;
+       
+       volatile int16_t pwm_mean = update_mean(&controller->mean_controller, mean, delta_time);
+       volatile int16_t pwm_diff = update_diff(&controller->diff_controller, diff, delta_time);
+       */
+       
+       volatile int16_t pwm_mean = update_mean(&controller->mean_controller, 0, delta_time);
+       volatile int16_t pwm_diff = update_diff(&controller->diff_controller, 0, delta_time);
+       
+       
+       if (pwm_mean != 0 || pwm_diff != 0) {
+               asm("nop");
+       }
+       
+       raw_set_motor_speed(&controller->left_motor, pwm_mean+pwm_diff);
+       raw_set_motor_speed(&controller->right_motor, pwm_mean-pwm_diff);
+}
+
+void movementcontroller_set_target_left(MovementController *controller, int16fp left_speed) {
+       int16fp target_left = left_speed;
+       int16fp target_right = controller->mean_controller.target - controller->diff_controller.target;
+       controller->mean_controller.target = (target_left+target_right)/2;
+       controller->diff_controller.target = (target_left-target_right)/2;
+}
+
+void movementcontroller_set_target_right(MovementController *controller, int16fp right_speed) {
+       int16fp target_left = controller->mean_controller.target + controller->diff_controller.target;
+       int16fp target_right = right_speed;
+       controller->mean_controller.target = (target_left+target_right)/2;
+       controller->diff_controller.target = (target_left-target_right)/2;
+       //controller->diff_controller.target = right_speed;
+}
diff --git a/hardcopy/styrmodul/Styrmodul/motor.h b/hardcopy/styrmodul/Styrmodul/motor.h
new file mode 100644 (file)
index 0000000..93a8908
--- /dev/null
@@ -0,0 +1,84 @@
+#pragma once
+
+#include <stdint.h>
+
+#define PWM_COUNTER_MAX 640
+#define MAX_SPEED 250
+#define WIDTH_MM 200
+#define MOVING_AVERAGE_POW 3 // buffer will be of size 2^MOVING_AVERAGE_POW.
+#define MOVING_AVERAGE_SIZE (1 << MOVING_AVERAGE_POW)
+
+#define FIXED_POINT 8 // DO NOT CHANGE UNDER ANY CIRCUMSTANCE!!!
+#define FP_MUL(a, b) (( (int32_t)(a)*(int32_t)(b)) >> FIXED_POINT)
+#define FP_DIV(a, b) ( ((a) << FIXED_POINT) /(b))
+
+#define M_TO_MS_RSHIFT (15-FIXED_POINT-5)
+
+typedef int16_t int16fp;
+typedef int32_t int32fp;
+
+typedef struct MeanController {
+       int16fp Ki;
+       int32fp sum;
+       int32fp k; // Slope of line
+       int16fp target;
+} MeanController;
+
+typedef struct DiffController {
+       int16fp Ki;
+       int32fp k_origin; // Slope around the origin.
+       int32fp threshold; // Threshold when we switch from the different lines.
+       int32fp k_outer; // Slope outside of threshold.
+       int32fp m_outer;
+       
+       int32fp sum;
+       int16fp target;
+} DiffController;
+
+typedef struct MovingAverage {
+       int16fp vals[MOVING_AVERAGE_SIZE];
+       uint8_t cur_idx;
+       int32fp avg;
+} MovingAverage;
+
+typedef struct Motor {
+       volatile uint8_t* dir_addr;
+       int8_t dir_bit;
+       int8_t cur_dir;
+       
+       volatile uint8_t* pwm_ocr;
+       uint8_t pwm;
+       int32_t dist_moved;
+} Motor;
+
+// Controls both motors.
+typedef struct MovementController {
+       Motor left_motor;
+       Motor right_motor;
+       MeanController mean_controller;
+       DiffController diff_controller;
+       MovingAverage avg_left;
+       MovingAverage avg_right;
+} MovementController;
+
+MeanController meanctrl_new(int16fp Ki);
+DiffController diffctrl_new(int16fp Ki);
+
+// `speed` is an integer between -MAX_SPEED and MAX_SPEED
+void raw_set_motor_speed(Motor* motor, int16_t speed);
+
+MovingAverage movingaverage_new();
+
+void update_moving_average(MovingAverage *mavg, int16fp new_val);
+
+int16fp get_moving_average(MovingAverage *mavg);
+
+MovementController movementcontroller_new(Motor left_motor, Motor right_motor);
+
+void movementcontroller_set_target(MovementController *controller, int16fp target_left, int16fp target_right);
+
+void movementcontroller_update(MovementController *controller, int16fp left_speed, int16fp right_speed, int16fp delta_time);
+
+void movementcontroller_set_target_left(MovementController *controller, int16fp left_speed);
+
+void movementcontroller_set_target_right(MovementController *controller, int16fp right_speed);
\ No newline at end of file
diff --git a/hardcopy/styrmodul/Styrmodul/purepursuit.c b/hardcopy/styrmodul/Styrmodul/purepursuit.c
new file mode 100644 (file)
index 0000000..8cebb3f
--- /dev/null
@@ -0,0 +1,164 @@
+#include "purepursuit.h"
+
+const int32fp PP_DIST_SQUARED = 1; // 15 cm, nej
+
+Theseus theseus_new() {
+       Theseus theseus;
+       theseus.direction = vec2_new(256, 0);
+       theseus.lp_x = lp_new(8000);
+       theseus.lp_y = lp_new(8000);
+       theseus.lp_angle = lp_new(8000);
+       theseus.target_reached = 1;
+       theseus.target_angle = 0;
+       theseus.speed = 51;
+       theseus.is_rotating = 0;
+       theseus.mu = 5*256;
+       theseus.l = 31;
+       theseus.turn_threshold = WIDE_TURN_CONE; //
+       return theseus;
+}
+
+vec2 target;
+vec2 diff;
+int32fp dist;
+
+// movement_forward should be 15 bit fixed point.
+void theseus_update(Theseus *thes, int32fp movement_forward, int16fp delta_angle) {
+       
+       // It will often be zero.
+       if (movement_forward != 0) {
+               thes->lp_x.filtered_value += FP_MUL(thes->direction.x, movement_forward);
+               thes->lp_y.filtered_value += FP_MUL(thes->direction.y, movement_forward);
+       }
+       
+       // It will often be zero.
+       if (delta_angle != 0) {
+               thes->lp_angle.filtered_value += (int32fp)delta_angle << 15;
+               thes->direction.x = fast_cos(thes->lp_angle.filtered_value >> 15);
+               thes->direction.y = fast_sin(thes->lp_angle.filtered_value >> 15);
+       }
+               
+}
+
+void theseus_set_target_point(Theseus *thes, vec2 target) {
+       thes->target = target;
+       thes->target_reached = 0;
+}
+
+// x and y are 8 bit FP.
+void theseus_set_position(Theseus *thes, int16fp x, int16fp y) {
+       thes->lp_x.filtered_value = x << (15-FIXED_POINT);
+       thes->lp_y.filtered_value = y << (15-FIXED_POINT);
+}
+
+void theseus_set_angle(Theseus *thes, int16_t angle) {
+       thes->lp_angle.filtered_value = (int32fp)angle << 15;
+       thes->direction = vec2_new(fast_sin(angle), fast_cos(angle));
+}
+
+// x and y are 9 bit FP.
+void theseus_nudge_pos(Theseus *thes, int32fp x, int32fp y) {
+       lp_update(&thes->lp_x, x << (15-9), 0);
+       lp_update(&thes->lp_y, y << (15-9), 0);
+}
+
+void theseus_nudge_angle(Theseus *thes, int16_t angle) {
+       lp_update(&thes->lp_angle, (int32fp)angle << 15, 1);
+       thes->direction = vec2_new(fast_cos(thes->lp_angle.filtered_value >> 15), fast_sin(thes->lp_angle.filtered_value >> 15));
+}
+
+
+int32fp pure_pursuit(Theseus *thes, int8_t *dir) {
+       
+       if (thes->target_reached == 0) {
+               vec2 position = vec2_new(thes->lp_x.filtered_value >> (15-FIXED_POINT), thes->lp_y.filtered_value >> (15-FIXED_POINT));
+               volatile vec2 diff = vec2_sub(thes->target, position);
+               volatile int32fp l_squared = vec2_norm_squared(diff);
+               volatile vec2 dir_rot;
+               dir_rot.x = -thes->direction.y;
+               dir_rot.y = thes->direction.x;
+               int32fp d = vec2_dot(thes->direction, diff);
+               if (d < 0) {
+                       *dir = -1;
+               } else {
+                       *dir = 1;
+               }
+               volatile int32fp x = vec2_dot(diff, dir_rot);
+               volatile int32fp a = 2*x;
+               
+               volatile int32fp b = l_squared;
+               return FP_DIV(a, b);
+       }
+
+       // Oh no, we shouldn't reach this point!
+       return 0;
+}
+
+int32fp lq_following(Theseus * volatile thes, int8_t * volatile dir) {
+       if (!thes->target_reached) {
+               volatile vec2 position = vec2_new(thes->lp_x.filtered_value >> (15-FIXED_POINT), thes->lp_y.filtered_value >> (15-FIXED_POINT));
+               volatile int16_t cur_angle = thes->lp_angle.filtered_value >> 15;
+               //vec2 direction = 
+               volatile vec2 dest_dir = vec2_new(fast_cos(thes->target_angle), fast_sin(thes->target_angle));
+               volatile vec2 dir_rot;
+               dir_rot.x = dest_dir.y;
+               dir_rot.y = -dest_dir.x;
+               volatile int32fp y = vec2_dot(dir_rot, vec2_sub(position, thes->target));
+               volatile int32fp alpha = (cur_angle-thes->target_angle);
+               
+               if (alpha < -180) {
+                       alpha += 360;
+               }
+               if (alpha > 180) {
+                       alpha -= 360;
+               }
+               alpha = alpha*4; // pi/180*256
+               volatile int32fp lmu = FP_MUL(thes->l, thes->mu);
+               volatile int32fp alpha_koeff = 256+FP_DIV(FP_MUL(lmu, lmu), 256+lmu);
+               
+               volatile int32fp curvature = 2*FP_MUL(thes->mu, FP_MUL(y, thes->mu)- FP_MUL(alpha, alpha_koeff));
+               
+               //if (vec2_dot())
+               
+               *dir = 1;
+               
+               volatile int32fp curvature_threshold = 5*256;
+               if (curvature > curvature_threshold) {
+                       curvature = curvature_threshold;
+               } 
+               if (curvature < -curvature_threshold) {
+                       curvature = -curvature_threshold;
+               }
+               return curvature;
+       }
+       return 0;
+}
+
+int32fp my_abs(int32fp a) {
+       if (a < 0) {
+               return -a;
+       }
+       return a;
+}
+
+int8_t should_rotate(Theseus *thes) {
+       if (thes->target_reached == 0) {
+               vec2 position = vec2_new(thes->lp_x.filtered_value >> (15-FIXED_POINT), thes->lp_y.filtered_value >> (15-FIXED_POINT));
+               vec2 diff = vec2_sub(thes->target, position);
+               vec2 dir_rot;
+               dir_rot.x = thes->direction.y;  // Rotate 90 clockwise
+               dir_rot.y = -thes->direction.x;
+               int32fp dn = vec2_dot(diff, dir_rot);
+               int32fp dt = vec2_dot(diff, thes->direction);
+               
+               if (my_abs(dn) > FP_MUL(thes->turn_threshold, dt)) {
+                       if (dn > 0) {
+                               return -1; // Turn clockwise
+                       } else {
+                               return 1; // Turn counter clockwise
+                       }
+               }
+       }
+       
+       return 0;
+}
\ No newline at end of file
diff --git a/hardcopy/styrmodul/Styrmodul/purepursuit.h b/hardcopy/styrmodul/Styrmodul/purepursuit.h
new file mode 100644 (file)
index 0000000..67c1e0e
--- /dev/null
@@ -0,0 +1,43 @@
+#pragma once
+
+#include "vector.h"
+#include "lowpass.h"
+
+#define CIRC_BUFFER_POW 5
+#define CIRC_BUFFER_SIZE (2<<CIRC_BUFFER_POW)
+
+// Lookahead distance
+extern const int32fp PP_DIST_SQUARED;
+
+// Distance used to determine if we have reached the last point in the queue.
+#define PP_DIST_END_SQUARED ((4/100*256) * (4/100*256)) // 4 cm
+#define WIDE_TURN_CONE 93 // tan(20)*256
+#define NARROW_TURN_CONE 45 // tan(10)*256
+
+typedef struct Theseus {
+       LowPass lp_x; // Contains a 15 bit fixed point
+       LowPass lp_y; // Contains a 15 bit fixed point
+       LowPass lp_angle; // Contains a 15 bit fixed point
+       vec2 direction;
+       int16fp speed;
+       vec2 target;
+       int16_t target_angle;
+       int32fp mu;
+       int32fp l;
+       int8_t target_reached;
+       int16fp turn_threshold; // sin(angle) it will go to without rotating on spot.
+       int8_t is_rotating;
+} Theseus;
+
+Theseus theseus_new();
+void theseus_update(Theseus *thes, int32fp movement_forward, int16fp delta_angle);
+void theseus_set_target_point(Theseus *thes, vec2 target);
+void theseus_set_position(Theseus *thes, int16fp x, int16fp y);
+void theseus_set_angle(Theseus *thes, int16_t angle);
+
+void theseus_nudge_pos(Theseus *thes, int32fp x, int32fp y);
+void theseus_nudge_angle(Theseus *thes, int16_t angle);
+
+int32fp pure_pursuit(Theseus *thes, int8_t *direction);
+int32fp lq_following(Theseus *thes, int8_t *dir);
+int8_t should_rotate(Theseus *thes);
diff --git a/hardcopy/styrmodul/Styrmodul/trig_lookup.c b/hardcopy/styrmodul/Styrmodul/trig_lookup.c
new file mode 100644 (file)
index 0000000..b6a8de7
--- /dev/null
@@ -0,0 +1,4 @@
+#include "vector.h"
+
+const int16fp sin_table[360] = {0,4,8,13,17,22,26,31,35,40,44,48,53,57,61,66,70,74,79,83,87,91,95,100,104,108,112,116,120,124,127,131,135,139,143,146,150,154,157,161,164,167,171,174,177,181,184,187,190,193,196,198,201,204,207,209,212,214,217,219,221,223,226,228,230,232,233,235,237,238,240,242,243,244,246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255,256,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,244,243,242,240,238,237,235,233,232,230,228,226,223,221,219,217,214,212,209,207,204,201,198,196,193,190,187,184,181,177,174,171,167,164,161,157,154,150,146,143,139,135,131,127,124,120,116,112,108,104,100,95,91,87,83,79,74,70,66,61,57,53,48,44,40,35,31,26,22,17,13,8,4,0,-4,-8,-13,-17,-22,-26,-31,-35,-40,-44,-48,-53,-57,-61,-66,-70,-74,-79,-83,-87,-91,-95,-100,-104,-108,-112,-116,-120,-124,-128,-131,-135,-139,-143,-146,-150,-154,-157,-161,-164,-167,-171,-174,-177,-181,-184,-187,-190,-193,-196,-198,-201,-204,-207,-209,-212,-214,-217,-219,-221,-223,-226,-228,-230,-232,-233,-235,-237,-238,-240,-242,-243,-244,-246,-247,-248,-249,-250,-251,-252,-252,-253,-254,-254,-255,-255,-255,-255,-255,-256,-255,-255,-255,-255,-255,-254,-254,-253,-252,-252,-251,-250,-249,-248,-247,-246,-244,-243,-242,-240,-238,-237,-235,-233,-232,-230,-228,-226,-223,-221,-219,-217,-214,-212,-209,-207,-204,-201,-198,-196,-193,-190,-187,-184,-181,-177,-174,-171,-167,-164,-161,-157,-154,-150,-146,-143,-139,-135,-131,-128,-124,-120,-116,-112,-108,-104,-100,-95,-91,-87,-83,-79,-74,-70,-66,-61,-57,-53,-48,-44,-40,-35,-31,-26,-22,-17,-13,-8,-4};
+const int16fp cos_table[360] = {256,255,255,255,255,255,254,254,253,252,252,251,250,249,248,247,246,244,243,242,240,238,237,235,233,232,230,228,226,223,221,219,217,214,212,209,207,204,201,198,196,193,190,187,184,181,177,174,171,167,164,161,157,154,150,146,143,139,135,131,128,124,120,116,112,108,104,100,95,91,87,83,79,74,70,66,61,57,53,48,44,40,35,31,26,22,17,13,8,4,0,-4,-8,-13,-17,-22,-26,-31,-35,-40,-44,-48,-53,-57,-61,-66,-70,-74,-79,-83,-87,-91,-95,-100,-104,-108,-112,-116,-120,-124,-127,-131,-135,-139,-143,-146,-150,-154,-157,-161,-164,-167,-171,-174,-177,-181,-184,-187,-190,-193,-196,-198,-201,-204,-207,-209,-212,-214,-217,-219,-221,-223,-226,-228,-230,-232,-233,-235,-237,-238,-240,-242,-243,-244,-246,-247,-248,-249,-250,-251,-252,-252,-253,-254,-254,-255,-255,-255,-255,-255,-256,-255,-255,-255,-255,-255,-254,-254,-253,-252,-252,-251,-250,-249,-248,-247,-246,-244,-243,-242,-240,-238,-237,-235,-233,-232,-230,-228,-226,-223,-221,-219,-217,-214,-212,-209,-207,-204,-201,-198,-196,-193,-190,-187,-184,-181,-177,-174,-171,-167,-164,-161,-157,-154,-150,-146,-143,-139,-135,-131,-128,-124,-120,-116,-112,-108,-104,-100,-95,-91,-87,-83,-79,-74,-70,-66,-61,-57,-53,-48,-44,-40,-35,-31,-26,-22,-17,-13,-8,-4,0,4,8,13,17,22,26,31,35,40,44,48,53,57,61,66,70,74,79,83,87,91,95,100,104,108,112,116,120,124,128,131,135,139,143,146,150,154,157,161,164,167,171,174,177,181,184,187,190,193,196,198,201,204,207,209,212,214,217,219,221,223,226,228,230,232,233,235,237,238,240,242,243,244,246,247,248,249,250,251,252,252,253,254,254,255,255,255,255,255};
diff --git a/hardcopy/styrmodul/Styrmodul/uart.c b/hardcopy/styrmodul/Styrmodul/uart.c
new file mode 100644 (file)
index 0000000..415c073
--- /dev/null
@@ -0,0 +1,1589 @@
+/*
+ * uart.c
+ *
+ * Created: 2024-04-02 09:27:32
+ *  Author: nilfo359
+ */ 
+/*************************************************************************
+
+       Title:    Interrupt UART library with receive/transmit circular buffers
+       Author:   Andy Gock
+       Software: AVR-GCC 4.1, AVR Libc 1.4
+       Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz
+       License:  GNU General Public License
+       Usage:    see README.md and Doxygen manual
+
+       Based on original library by Peter Fluery, Tim Sharpe, Nicholas Zambetti.
+
+       https://github.com/andygock/avr-uart
+
+       Updated UART library (this one) by Andy Gock
+       https://github.com/andygock/avr-uart
+
+       Based on updated UART library (this one) by Tim Sharpe
+       http://beaststwo.org/avr-uart/index.shtml
+
+       Based on original library by Peter Fluery
+       http://www.peterfleury.epizy.com/avr-software.html
+
+*************************************************************************/
+
+/*************************************************************************
+
+LICENSE:
+       Copyright (C) 2012 Andy Gock
+       Copyright (C) 2006 Peter Fleury
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+*************************************************************************/
+
+/************************************************************************
+uart_available, uart_flush, uart1_available, and uart1_flush functions
+were adapted from the Arduino HardwareSerial.h library by Tim Sharpe on
+11 Jan 2009.  The license info for HardwareSerial.h is as follows:
+
+  HardwareSerial.cpp - Hardware serial library for Wiring
+  Copyright (c) 2006 Nicholas Zambetti.  All right reserved.
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+  Modified 23 November 2006 by David A. Mellis
+************************************************************************/
+
+/************************************************************************
+Changelog for modifications made by Tim Sharpe, starting with the current
+  library version on his Web site as of 05/01/2009.
+
+Date        Description
+=========================================================================
+05/11/2009  Changed all existing UARTx_RECEIVE_INTERRUPT and UARTx_TRANSMIT_INTERRUPT
+                       macros to use the "_vect" format introduced in AVR-Libc
+                       v1.4.0.  Had to split the 3290 and 6490 out of their existing
+                       macro due to an inconsistency in the UART0_RECEIVE_INTERRUPT
+                       vector name (seems like a typo: USART_RX_vect for the 3290/6490
+                       vice USART0_RX_vect for the others in the macro).
+                       Verified all existing macro register names against the device
+                       header files in AVR-Libc v1.6.6 to catch any inconsistencies.
+05/12/2009  Added support for 48P, 88P, 168P, and 328P by adding them to the
+                       existing 48/88/168 macro.
+                       Added Arduino-style available() and flush() functions for both
+                       supported UARTs.  Really wanted to keep them out of the library, so
+                       that it would be as close as possible to Peter Fleury's original
+                       library, but has scoping issues accessing internal variables from
+                       another program.  Go C!
+05/13/2009  Changed Interrupt Service Routine label from the old "SIGNAL" to
+                       the "ISR" format introduced in AVR-Libc v1.4.0.
+
+************************************************************************/
+
+#include <avr/io.h>
+#include <avr/interrupt.h>
+#include <avr/pgmspace.h>
+#include <util/atomic.h>
+#include "uart.h"
+
+/*
+ *  constants and macros
+ */
+
+/* size of RX/TX buffers */
+#define UART_RX0_BUFFER_MASK (UART_RX0_BUFFER_SIZE - 1)
+#define UART_RX1_BUFFER_MASK (UART_RX1_BUFFER_SIZE - 1)
+#define UART_RX2_BUFFER_MASK (UART_RX2_BUFFER_SIZE - 1)
+#define UART_RX3_BUFFER_MASK (UART_RX3_BUFFER_SIZE - 1)
+
+#define UART_TX0_BUFFER_MASK (UART_TX0_BUFFER_SIZE - 1)
+#define UART_TX1_BUFFER_MASK (UART_TX1_BUFFER_SIZE - 1)
+#define UART_TX2_BUFFER_MASK (UART_TX2_BUFFER_SIZE - 1)
+#define UART_TX3_BUFFER_MASK (UART_TX3_BUFFER_SIZE - 1)
+
+#if (UART_RX0_BUFFER_SIZE & UART_RX0_BUFFER_MASK)
+       #error RX0 buffer size is not a power of 2
+#endif
+#if (UART_TX0_BUFFER_SIZE & UART_TX0_BUFFER_MASK)
+       #error TX0 buffer size is not a power of 2
+#endif
+
+#if (UART_RX1_BUFFER_SIZE & UART_RX1_BUFFER_MASK)
+       #error RX1 buffer size is not a power of 2
+#endif
+#if (UART_TX1_BUFFER_SIZE & UART_TX1_BUFFER_MASK)
+       #error TX1 buffer size is not a power of 2
+#endif
+
+#if (UART_RX2_BUFFER_SIZE & UART_RX2_BUFFER_MASK)
+       #error RX2 buffer size is not a power of 2
+#endif
+#if (UART_TX2_BUFFER_SIZE & UART_TX2_BUFFER_MASK)
+       #error TX2 buffer size is not a power of 2
+#endif
+
+#if (UART_RX3_BUFFER_SIZE & UART_RX3_BUFFER_MASK)
+       #error RX3 buffer size is not a power of 2
+#endif
+#if (UART_TX3_BUFFER_SIZE & UART_TX3_BUFFER_MASK)
+       #error TX3 buffer size is not a power of 2
+#endif
+
+#if defined(__AVR_AT90S2313__) \
+ || defined(__AVR_AT90S4414__) \
+ || defined(__AVR_AT90S4434__) \
+ || defined(__AVR_AT90S8515__) \
+ || defined(__AVR_AT90S8535__) \
+ || defined(__AVR_ATmega103__)
+       /* old AVR classic or ATmega103 with one UART */
+       #define AT90_UART
+       #define UART0_RECEIVE_INTERRUPT   UART_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect
+       #define UART0_STATUS   USR
+       #define UART0_CONTROL  UCR
+       #define UART0_DATA     UDR
+       #define UART0_UDRIE    UDRIE
+#elif defined(__AVR_AT90S2333__) \
+   || defined(__AVR_AT90S4433__)
+       /* old AVR classic with one UART */
+       #define AT90_UART
+       #define UART0_RECEIVE_INTERRUPT   UART_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect
+       #define UART0_STATUS   UCSRA
+       #define UART0_CONTROL  UCSRB
+       #define UART0_DATA     UDR
+       #define UART0_UDRIE    UDRIE
+#elif defined(__AVR_ATmega8__) \
+   || defined(__AVR_ATmega16__) \
+   || defined(__AVR_ATmega32__) \
+   || defined(__AVR_ATmega323__)
+       /* ATmega with one USART */
+       #define ATMEGA_USART
+       #define UART0_RECEIVE_INTERRUPT   USART_RXC_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect
+       #define UART0_STATUS   UCSRA
+       #define UART0_CONTROL  UCSRB
+       #define UART0_DATA     UDR
+       #define UART0_UDRIE    UDRIE
+#elif defined(__AVR_ATmega8U2__) \
+   || defined(__AVR_ATmega16U2__) \
+   || defined(__AVR_ATmega16U4__) \
+   || defined(__AVR_ATmega32U2__) \
+   || defined(__AVR_ATmega32U4__) \
+   || defined(__AVR_ATmega32U6__)
+       /* ATmega with one USART, but is called USART1 (untested) */
+       #define ATMEGA_USART1
+       #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect
+       #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect
+       #define UART1_STATUS   UCSR1A
+       #define UART1_CONTROL  UCSR1B
+       #define UART1_DATA     UDR1
+       #define UART1_UDRIE    UDRIE1
+#elif defined(__AVR_ATmega8515__) \
+   || defined(__AVR_ATmega8535__)
+       /* ATmega with one USART */
+       #define ATMEGA_USART
+       #define UART0_RECEIVE_INTERRUPT   USART_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect
+       #define UART0_STATUS   UCSRA
+       #define UART0_CONTROL  UCSRB
+       #define UART0_DATA     UDR
+       #define UART0_UDRIE    UDRIE
+#elif defined(__AVR_ATmega163__)
+       /* ATmega163 with one UART */
+       #define ATMEGA_UART
+       #define UART0_RECEIVE_INTERRUPT   UART_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  UART_UDRE_vect
+       #define UART0_STATUS   UCSRA
+       #define UART0_CONTROL  UCSRB
+       #define UART0_DATA     UDR
+       #define UART0_UDRIE    UDRIE
+#elif defined(__AVR_ATmega162__)
+       /* ATmega with two USART */
+       #define ATMEGA_USART0
+       #define ATMEGA_USART1
+       #define UART0_RECEIVE_INTERRUPT   USART0_RXC_vect
+       #define UART1_RECEIVE_INTERRUPT   USART1_RXC_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
+       #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect
+       #define UART0_STATUS   UCSR0A
+       #define UART0_CONTROL  UCSR0B
+       #define UART0_DATA     UDR0
+       #define UART0_UDRIE    UDRIE0
+       #define UART1_STATUS   UCSR1A
+       #define UART1_CONTROL  UCSR1B
+       #define UART1_DATA     UDR1
+       #define UART1_UDRIE    UDRIE1
+#elif defined(__AVR_ATmega64__) \
+   || defined(__AVR_ATmega128__)
+       /* ATmega with two USART */
+       #define ATMEGA_USART0
+       #define ATMEGA_USART1
+       #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
+       #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
+       #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect
+       #define UART0_STATUS   UCSR0A
+       #define UART0_CONTROL  UCSR0B
+       #define UART0_DATA     UDR0
+       #define UART0_UDRIE    UDRIE0
+       #define UART1_STATUS   UCSR1A
+       #define UART1_CONTROL  UCSR1B
+       #define UART1_DATA     UDR1
+       #define UART1_UDRIE    UDRIE1
+#elif defined(__AVR_ATmega161__)
+       /* ATmega with UART */
+       #error "AVR ATmega161 currently not supported by this libaray !"
+#elif defined(__AVR_ATmega169__)
+       /* ATmega with one USART */
+       #define ATMEGA_USART
+       #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
+       #define UART0_STATUS   UCSRA
+       #define UART0_CONTROL  UCSRB
+       #define UART0_DATA     UDR
+       #define UART0_UDRIE    UDRIE
+#elif defined(__AVR_ATmega48__) \
+   || defined(__AVR_ATmega88__) \
+   || defined(__AVR_ATmega168__) \
+   || defined(__AVR_ATmega48P__) \
+   || defined(__AVR_ATmega88P__) \
+   || defined(__AVR_ATmega168P__) \
+   || defined(__AVR_ATmega328P__)
+       /* TLS-Added 48P/88P/168P/328P */
+       /* ATmega with one USART */
+       #define ATMEGA_USART0
+       #define UART0_RECEIVE_INTERRUPT   USART_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect
+       #define UART0_STATUS   UCSR0A
+       #define UART0_CONTROL  UCSR0B
+       #define UART0_DATA     UDR0
+       #define UART0_UDRIE    UDRIE0
+#elif defined(__AVR_ATtiny2313__) \
+   || defined(__AVR_ATtiny2313A__) \
+   || defined(__AVR_ATtiny4313__)
+       #define ATMEGA_USART
+       #define UART0_RECEIVE_INTERRUPT   USART_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART_UDRE_vect
+       #define UART0_STATUS   UCSRA
+       #define UART0_CONTROL  UCSRB
+       #define UART0_DATA     UDR
+       #define UART0_UDRIE    UDRIE
+#elif defined(__AVR_ATmega329__) \
+   || defined(__AVR_ATmega649__) \
+   || defined(__AVR_ATmega325__) \
+   || defined(__AVR_ATmega3250__) \
+   || defined(__AVR_ATmega645__) \
+   || defined(__AVR_ATmega6450__)
+       /* ATmega with one USART */
+       #define ATMEGA_USART0
+       #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
+       #define UART0_STATUS   UCSR0A
+       #define UART0_CONTROL  UCSR0B
+       #define UART0_DATA     UDR0
+       #define UART0_UDRIE    UDRIE0
+#elif defined(__AVR_ATmega3290__) \
+   || defined(__AVR_ATmega6490__)
+       /* TLS-Separated these two from the previous group because of inconsistency in the USART_RX */
+       /* ATmega with one USART */
+       #define ATMEGA_USART0
+       #define UART0_RECEIVE_INTERRUPT   USART_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
+       #define UART0_STATUS   UCSR0A
+       #define UART0_CONTROL  UCSR0B
+       #define UART0_DATA     UDR0
+       #define UART0_UDRIE    UDRIE0
+#elif defined(__AVR_ATmega2560__) \
+   || defined(__AVR_ATmega1280__) \
+        || defined(__AVR_ATmega640__)
+       /* ATmega with four USART */
+       #define ATMEGA_USART0
+       #define ATMEGA_USART1
+       #define ATMEGA_USART2
+       #define ATMEGA_USART3
+       #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
+       #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect
+       #define UART2_RECEIVE_INTERRUPT   USART2_RX_vect
+       #define UART3_RECEIVE_INTERRUPT   USART3_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
+       #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect
+       #define UART2_TRANSMIT_INTERRUPT  USART2_UDRE_vect
+       #define UART3_TRANSMIT_INTERRUPT  USART3_UDRE_vect
+       #define UART0_STATUS   UCSR0A
+       #define UART0_CONTROL  UCSR0B
+       #define UART0_DATA     UDR0
+       #define UART0_UDRIE    UDRIE0
+       #define UART1_STATUS   UCSR1A
+       #define UART1_CONTROL  UCSR1B
+       #define UART1_DATA     UDR1
+       #define UART1_UDRIE    UDRIE1
+       #define UART2_STATUS   UCSR2A
+       #define UART2_CONTROL  UCSR2B
+       #define UART2_DATA     UDR2
+       #define UART2_UDRIE    UDRIE2
+       #define UART3_STATUS   UCSR3A
+       #define UART3_CONTROL  UCSR3B
+       #define UART3_DATA     UDR3
+       #define UART3_UDRIE    UDRIE3
+#elif defined(__AVR_ATmega644__)
+       /* ATmega with one USART */
+       #define ATMEGA_USART0
+       #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
+       #define UART0_STATUS   UCSR0A
+       #define UART0_CONTROL  UCSR0B
+       #define UART0_DATA     UDR0
+       #define UART0_UDRIE    UDRIE0
+#elif defined(__AVR_ATmega164P__) \
+   || defined(__AVR_ATmega324P__) \
+   || defined(__AVR_ATmega644P__) \
+   || defined(__AVR_ATmega644PA__) \
+   || defined(__AVR_ATmega1284P__)
+       /* ATmega with two USART */
+       #define ATMEGA_USART0
+       #define ATMEGA_USART1
+       #define UART0_RECEIVE_INTERRUPT   USART0_RX_vect
+       #define UART1_RECEIVE_INTERRUPT   USART1_RX_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_UDRE_vect
+       #define UART1_TRANSMIT_INTERRUPT  USART1_UDRE_vect
+       #define UART0_STATUS   UCSR0A
+       #define UART0_CONTROL  UCSR0B
+       #define UART0_DATA     UDR0
+       #define UART0_UDRIE    UDRIE0
+       #define UART1_STATUS   UCSR1A
+       #define UART1_CONTROL  UCSR1B
+       #define UART1_DATA     UDR1
+       #define UART1_UDRIE    UDRIE1
+#elif defined(__AVR_ATtiny814__)
+  /* AVR-1 with USART */
+       #define AVR1_USART0
+       #define UART0_RECEIVE_INTERRUPT   USART0_RXC_vect
+       #define UART0_TRANSMIT_INTERRUPT  USART0_DRE_vect
+  #define USART0_BAUD_RATE(_br_)    (uint16_t)((float)(F_CPU * 64 / (16 * (float)(_br_)) + 0.5))
+  //   #error "AVR ATtiny814 currently not supported by this libaray !"
+#else
+       #error "no UART definition for MCU available"
+#endif
+
+/*
+ *  Module global variables
+ */
+
+#if defined(USART0_ENABLED)
+    #if defined(ATMEGA_USART) || defined(ATMEGA_USART0) || defined(AVR1_USART0) || defined(AT90_UART)
+               static volatile uint8_t UART_TxBuf[UART_TX0_BUFFER_SIZE];
+               static volatile uint8_t UART_RxBuf[UART_RX0_BUFFER_SIZE];
+
+               #if defined(USART0_LARGE_BUFFER)
+                       static volatile uint16_t UART_TxHead;
+                       static volatile uint16_t UART_TxTail;
+                       static volatile uint16_t UART_RxHead;
+                       static volatile uint16_t UART_RxTail;
+                       static volatile uint8_t UART_LastRxError;
+               #else
+                       static volatile uint8_t UART_TxHead;
+                       static volatile uint8_t UART_TxTail;
+                       static volatile uint8_t UART_RxHead;
+                       static volatile uint8_t UART_RxTail;
+                       static volatile uint8_t UART_LastRxError;
+               #endif
+
+       #endif
+#endif
+
+#if defined(USART1_ENABLED)
+       #if defined(ATMEGA_USART1)
+               static volatile uint8_t UART1_TxBuf[UART_TX1_BUFFER_SIZE];
+               static volatile uint8_t UART1_RxBuf[UART_RX1_BUFFER_SIZE];
+
+               #if defined(USART1_LARGE_BUFFER)
+                       static volatile uint16_t UART1_TxHead;
+                       static volatile uint16_t UART1_TxTail;
+                       static volatile uint16_t UART1_RxHead;
+                       static volatile uint16_t UART1_RxTail;
+                       static volatile uint8_t UART1_LastRxError;
+               #else
+                       static volatile uint8_t UART1_TxHead;
+                       static volatile uint8_t UART1_TxTail;
+                       static volatile uint8_t UART1_RxHead;
+                       static volatile uint8_t UART1_RxTail;
+                       static volatile uint8_t UART1_LastRxError;
+               #endif
+       #endif
+#endif
+
+#if defined(USART2_ENABLED)
+       #if defined(ATMEGA_USART2)
+               static volatile uint8_t UART2_TxBuf[UART_TX2_BUFFER_SIZE];
+               static volatile uint8_t UART2_RxBuf[UART_RX2_BUFFER_SIZE];
+
+               #if defined(USART2_LARGE_BUFFER)
+                       static volatile uint16_t UART2_TxHead;
+                       static volatile uint16_t UART2_TxTail;
+                       static volatile uint16_t UART2_RxHead;
+                       static volatile uint16_t UART2_RxTail;
+                       static volatile uint8_t UART2_LastRxError;
+               #else
+                       static volatile uint8_t UART2_TxHead;
+                       static volatile uint8_t UART2_TxTail;
+                       static volatile uint8_t UART2_RxHead;
+                       static volatile uint8_t UART2_RxTail;
+                       static volatile uint8_t UART2_LastRxError;
+               #endif
+       #endif
+#endif
+
+#if defined(USART3_ENABLED)
+       #if defined(ATMEGA_USART3)
+               static volatile uint8_t UART3_TxBuf[UART_TX3_BUFFER_SIZE];
+               static volatile uint8_t UART3_RxBuf[UART_RX3_BUFFER_SIZE];
+
+               #if defined(USART3_LARGE_BUFFER)
+                       static volatile uint16_t UART3_TxHead;
+                       static volatile uint16_t UART3_TxTail;
+                       static volatile uint16_t UART3_RxHead;
+                       static volatile uint16_t UART3_RxTail;
+                       static volatile uint8_t UART3_LastRxError;
+               #else
+                       static volatile uint8_t UART3_TxHead;
+                       static volatile uint8_t UART3_TxTail;
+                       static volatile uint8_t UART3_RxHead;
+                       static volatile uint8_t UART3_RxTail;
+                       static volatile uint8_t UART3_LastRxError;
+               #endif
+
+       #endif
+#endif
+
+#if defined(USART0_ENABLED)
+
+#if defined(AT90_UART) || defined(ATMEGA_USART) || defined(ATMEGA_USART0)  || defined(AVR1_USART0)
+
+ISR(UART0_RECEIVE_INTERRUPT)
+/*************************************************************************
+Function: UART Receive Complete interrupt
+Purpose:  called when the UART has received a character
+**************************************************************************/
+{
+    uint16_t tmphead;
+    uint8_t data;
+    uint8_t usr;
+    uint8_t lastRxError;
+
+    /* read UART status register and UART data register */
+#if defined(AVR1_USART0)
+    usr  = USART0_RXDATAH;
+    data = USART0.RXDATAL;
+#else
+    usr  = UART0_STATUS;
+    data = UART0_DATA;
+#endif
+
+    /* */
+#if defined(AT90_UART)
+    lastRxError = (usr & (_BV(FE)|_BV(DOR)));
+#elif defined(ATMEGA_USART)
+    lastRxError = (usr & (_BV(FE)|_BV(DOR)));
+#elif defined(ATMEGA_USART0)
+    lastRxError = (usr & (_BV(FE0)|_BV(DOR0)));
+#elif defined(ATMEGA_UART)
+    lastRxError = (usr & (_BV(FE)|_BV(DOR)));
+#elif defined(AVR1_USART0)
+    lastRxError = (usr & (USART_BUFOVF_bm | USART_FERR_bm | USART_PERR_bm));
+#endif
+
+    /* calculate buffer index */
+    tmphead = (UART_RxHead + 1) & UART_RX0_BUFFER_MASK;
+
+    if (tmphead == UART_RxTail) {
+        /* error: receive buffer overflow */
+        lastRxError = UART_BUFFER_OVERFLOW >> 8;
+    } else {
+        /* store new index */
+        UART_RxHead = tmphead;
+        /* store received data in buffer */
+        UART_RxBuf[tmphead] = data;
+    }
+    UART_LastRxError = lastRxError;
+}
+
+
+ISR(UART0_TRANSMIT_INTERRUPT)
+/*************************************************************************
+Function: UART Data Register Empty interrupt
+Purpose:  called when the UART is ready to transmit the next byte
+**************************************************************************/
+{
+    uint16_t tmptail;
+
+    if (UART_TxHead != UART_TxTail) {
+        /* calculate and store new buffer index */
+        tmptail = (UART_TxTail + 1) & UART_TX0_BUFFER_MASK;
+        UART_TxTail = tmptail;
+        /* get one byte from buffer and write it to UART */
+#if defined(AVR1_USART0)
+        USART0_TXDATAL = UART_TxBuf[tmptail];  /* start transmission */
+#else
+        UART0_DATA = UART_TxBuf[tmptail];  /* start transmission */
+#endif
+    } else {
+        /* tx buffer empty, disable UDRE interrupt */
+#if defined(AVR1_USART0)
+        USART0_CTRLA &= ~USART_DREIE_bm;
+#else
+        UART0_CONTROL &= ~_BV(UART0_UDRIE);
+#endif
+    }
+}
+
+
+/*************************************************************************
+Function: uart0_init()
+Purpose:  initialize UART and set baudrate
+Input:    baudrate using macro UART_BAUD_SELECT()
+Returns:  none
+**************************************************************************/
+#if defined(AVR1_USART0)
+void uart0_init(uint32_t baudrate)
+#else
+void uart0_init(uint16_t baudrate)
+#endif
+{
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               UART_TxHead = 0;
+               UART_TxTail = 0;
+               UART_RxHead = 0;
+               UART_RxTail = 0;
+       }
+
+#if defined(AT90_UART)
+       /* set baud rate */
+       UBRR = (uint8_t) baudrate;
+
+       /* enable UART receiver and transmitter and receive complete interrupt */
+       UART0_CONTROL = _BV(RXCIE)|_BV(RXEN)|_BV(TXEN);
+
+#elif defined(ATMEGA_USART)
+       /* Set baud rate */
+       if (baudrate & 0x8000) {
+               UART0_STATUS = (1<<U2X);  //Enable 2x speed
+               baudrate &= ~0x8000;
+       }
+       UBRRH = (uint8_t) (baudrate>>8);
+       UBRRL = (uint8_t) baudrate;
+
+       /* Enable USART receiver and transmitter and receive complete interrupt */
+       UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
+
+       /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
+#ifdef URSEL
+       UCSRC = (1<<URSEL)|(3<<UCSZ0);
+#else
+       UCSRC = (3<<UCSZ0);
+#endif
+
+#elif defined(ATMEGA_USART0)
+       /* Set baud rate */
+       if (baudrate & 0x8000) {
+               UART0_STATUS = (1<<U2X0);  //Enable 2x speed
+               baudrate &= ~0x8000;
+       }
+       UBRR0H = (uint8_t)(baudrate>>8);
+       UBRR0L = (uint8_t) baudrate;
+
+       /* Enable USART receiver and transmitter and receive complete interrupt */
+       UART0_CONTROL = _BV(RXCIE0)|(1<<RXEN0)|(1<<TXEN0);
+
+       /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
+#ifdef URSEL0
+       UCSR0C = (1<<URSEL0)|(3<<UCSZ00);
+#else
+       UCSR0C = (3<<UCSZ00);
+#endif
+
+#elif defined(ATMEGA_UART)
+       /* set baud rate */
+       if (baudrate & 0x8000) {
+               UART0_STATUS = (1<<U2X);  //Enable 2x speed
+               baudrate &= ~0x8000;
+       }
+       UBRRHI = (uint8_t) (baudrate>>8);
+       UBRR   = (uint8_t) baudrate;
+
+       /* Enable UART receiver and transmitter and receive complete interrupt */
+       UART0_CONTROL = _BV(RXCIE)|(1<<RXEN)|(1<<TXEN);
+
+#elif defined(AVR1_USART0)
+    // set the baud rate
+    USART0.BAUD = USART0_BAUD_RATE(baudrate);
+
+    USART0.CTRLA = USART_RXCIE_bm;
+    USART0.CTRLB = USART_TXEN_bm | USART_RXEN_bm | USART_RXMODE_NORMAL_gc;
+    // Default configuration of CTRLC is 8N1 in asynchronous mode
+#endif
+
+} /* uart0_init */
+
+
+/*************************************************************************
+Function: uart0_getc()
+Purpose:  return byte from ringbuffer
+Returns:  lower byte:  received byte from ringbuffer
+          higher byte: last receive error
+**************************************************************************/
+uint16_t uart0_getc(void)
+{
+       uint16_t tmptail;
+       uint8_t data;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               if (UART_RxHead == UART_RxTail) {
+                       return UART_NO_DATA;   /* no data available */
+               }
+       }
+
+       /* calculate / store buffer index */
+       tmptail = (UART_RxTail + 1) & UART_RX0_BUFFER_MASK;
+
+       UART_RxTail = tmptail;
+
+       /* get data from receive buffer */
+       data = UART_RxBuf[tmptail];
+
+       return (UART_LastRxError << 8) + data;
+
+} /* uart0_getc */
+
+/*************************************************************************
+Function: uart0_peek()
+Purpose:  Returns the next byte (character) of incoming UART data without
+          removing it from the ring buffer. That is, successive calls to
+                 uartN_peek() will return the same character, as will the next
+                 call to uartN_getc()
+Returns:  lower byte:  next byte in ring buffer
+          higher byte: last receive error
+**************************************************************************/
+uint16_t uart0_peek(void)
+{
+       uint16_t tmptail;
+       uint8_t data;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               if (UART_RxHead == UART_RxTail) {
+                       return UART_NO_DATA;   /* no data available */
+               }
+       }
+
+       tmptail = (UART_RxTail + 1) & UART_RX0_BUFFER_MASK;
+
+       /* get data from receive buffer */
+       data = UART_RxBuf[tmptail];
+
+       return (UART_LastRxError << 8) + data;
+
+} /* uart0_peek */
+
+/*************************************************************************
+Function: uart0_putc()
+Purpose:  write byte to ringbuffer for transmitting via UART
+Input:    byte to be transmitted
+Returns:  none
+**************************************************************************/
+void uart0_putc(uint8_t data)
+{
+
+#ifdef USART0_LARGE_BUFFER
+       uint16_t tmphead;
+       uint16_t txtail_tmp;
+
+       tmphead = (UART_TxHead + 1) & UART_TX0_BUFFER_MASK;
+
+       do {
+               ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+                       txtail_tmp = UART_TxTail;
+               }
+       } while (tmphead == txtail_tmp); /* wait for free space in buffer */
+#else
+       uint16_t tmphead;
+
+       tmphead = (UART_TxHead + 1) & UART_TX0_BUFFER_MASK;
+
+       while (tmphead == UART_TxTail); /* wait for free space in buffer */
+#endif
+
+       UART_TxBuf[tmphead] = data;
+       UART_TxHead = tmphead;
+
+       /* enable UDRE interrupt */
+#if defined(AVR1_USART0)
+    USART0_CTRLA |= USART_DREIE_bm;
+#else
+       UART0_CONTROL |= _BV(UART0_UDRIE);
+#endif
+
+} /* uart0_putc */
+
+
+/*************************************************************************
+Function: uart0_puts()
+Purpose:  transmit string to UART
+Input:    string to be transmitted
+Returns:  none
+**************************************************************************/
+void uart0_puts(const char *s)
+{
+       while (*s) {
+               uart0_putc(*s++);
+       }
+
+} /* uart0_puts */
+
+
+/*************************************************************************
+Function: uart0_puts_p()
+Purpose:  transmit string from program memory to UART
+Input:    program memory string to be transmitted
+Returns:  none
+**************************************************************************/
+void uart0_puts_p(const char *progmem_s)
+{
+       register char c;
+
+       while ((c = pgm_read_byte(progmem_s++))) {
+               uart0_putc(c);
+       }
+
+} /* uart0_puts_p */
+
+
+
+/*************************************************************************
+Function: uart0_available()
+Purpose:  Determine the number of bytes waiting in the receive buffer
+Input:    None
+Returns:  Integer number of bytes in the receive buffer
+**************************************************************************/
+uint16_t uart0_available(void)
+{
+       uint16_t ret;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               ret = (UART_RX0_BUFFER_SIZE + UART_RxHead - UART_RxTail) & UART_RX0_BUFFER_MASK;
+       }
+       return ret;
+} /* uart0_available */
+
+/*************************************************************************
+Function: uart0_flush()
+Purpose:  Flush bytes waiting the receive buffer. Actually ignores them.
+Input:    None
+Returns:  None
+**************************************************************************/
+void uart0_flush(void)
+{
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               UART_RxHead = UART_RxTail;
+       }
+} /* uart0_flush */
+
+#endif
+
+#endif /* defined(USART0_ENABLED) */
+
+#if defined(USART1_ENABLED)
+
+/*
+ * these functions are only for ATmegas with two USART
+ */
+#if defined(ATMEGA_USART1)
+
+ISR(UART1_RECEIVE_INTERRUPT)
+/*************************************************************************
+Function: UART1 Receive Complete interrupt
+Purpose:  called when the UART1 has received a character
+**************************************************************************/
+{
+       uint16_t tmphead;
+       uint8_t data;
+       uint8_t usr;
+       uint8_t lastRxError;
+
+       /* read UART status register and UART data register */
+       usr  = UART1_STATUS;
+       data = UART1_DATA;
+
+       /* */
+       lastRxError = (usr & (_BV(FE1)|_BV(DOR1)));
+
+       /* calculate buffer index */
+       tmphead = (UART1_RxHead + 1) & UART_RX1_BUFFER_MASK;
+
+       if (tmphead == UART1_RxTail) {
+               /* error: receive buffer overflow */
+               lastRxError = UART_BUFFER_OVERFLOW >> 8;
+       } else {
+               /* store new index */
+               UART1_RxHead = tmphead;
+               /* store received data in buffer */
+               UART1_RxBuf[tmphead] = data;
+       }
+       UART1_LastRxError = lastRxError;
+}
+
+
+ISR(UART1_TRANSMIT_INTERRUPT)
+/*************************************************************************
+Function: UART1 Data Register Empty interrupt
+Purpose:  called when the UART1 is ready to transmit the next byte
+**************************************************************************/
+{
+       uint16_t tmptail;
+
+       if (UART1_TxHead != UART1_TxTail) {
+               /* calculate and store new buffer index */
+               tmptail = (UART1_TxTail + 1) & UART_TX1_BUFFER_MASK;
+               UART1_TxTail = tmptail;
+               /* get one byte from buffer and write it to UART */
+               UART1_DATA = UART1_TxBuf[tmptail];  /* start transmission */
+       } else {
+               /* tx buffer empty, disable UDRE interrupt */
+               UART1_CONTROL &= ~_BV(UART1_UDRIE);
+       }
+}
+
+
+/*************************************************************************
+Function: uart1_init()
+Purpose:  initialize UART1 and set baudrate
+Input:    baudrate using macro UART_BAUD_SELECT()
+Returns:  none
+**************************************************************************/
+void uart1_init(uint16_t baudrate)
+{
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               UART1_TxHead = 0;
+               UART1_TxTail = 0;
+               UART1_RxHead = 0;
+               UART1_RxTail = 0;
+       }
+
+       /* Set baud rate */
+       if (baudrate & 0x8000) {
+               UART1_STATUS = (1<<U2X1);  //Enable 2x speed
+               baudrate &= ~0x8000;
+       }
+       UBRR1H = (uint8_t) (baudrate>>8);
+       UBRR1L = (uint8_t) baudrate;
+
+       /* Enable USART receiver and transmitter and receive complete interrupt */
+       UART1_CONTROL = _BV(RXCIE1)|(1<<RXEN1)|(1<<TXEN1);
+
+       /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
+#ifdef URSEL1
+       UCSR1C = (1<<URSEL1)|(3<<UCSZ10);
+#else
+       UCSR1C = (3<<UCSZ10);
+#endif
+} /* uart_init */
+
+
+/*************************************************************************
+Function: uart1_getc()
+Purpose:  return byte from ringbuffer
+Returns:  lower byte:  received byte from ringbuffer
+          higher byte: last receive error
+**************************************************************************/
+uint16_t uart1_getc(void)
+{
+       uint16_t tmptail;
+       uint8_t data;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               if (UART1_RxHead == UART1_RxTail) {
+                       return UART_NO_DATA;   /* no data available */
+               }
+
+               /* calculate / store buffer index */
+               tmptail = (UART1_RxTail + 1) & UART_RX1_BUFFER_MASK;
+               UART1_RxTail = tmptail;
+       }
+
+       /* get data from receive buffer */
+       data = UART1_RxBuf[tmptail];
+
+       return (UART1_LastRxError << 8) + data;
+
+} /* uart1_getc */
+
+/*************************************************************************
+Function: uart1_peek()
+Purpose:  Returns the next byte (character) of incoming UART data without
+          removing it from the ring buffer. That is, successive calls to
+                 uartN_peek() will return the same character, as will the next
+                 call to uartN_getc()
+Returns:  lower byte:  next byte in ring buffer
+          higher byte: last receive error
+**************************************************************************/
+uint16_t uart1_peek(void)
+{
+       uint16_t tmptail;
+       uint8_t data;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               if (UART1_RxHead == UART1_RxTail) {
+                       return UART_NO_DATA;   /* no data available */
+               }
+       }
+
+       tmptail = (UART1_RxTail + 1) & UART_RX1_BUFFER_MASK;
+
+       /* get data from receive buffer */
+       data = UART1_RxBuf[tmptail];
+
+       return (UART1_LastRxError << 8) + data;
+
+} /* uart1_peek */
+
+/*************************************************************************
+Function: uart1_putc()
+Purpose:  write byte to ringbuffer for transmitting via UART
+Input:    byte to be transmitted
+Returns:  none
+**************************************************************************/
+void uart1_putc(uint8_t data)
+{
+
+#ifdef USART1_LARGE_BUFFER
+       uint16_t tmphead;
+       uint16_t txtail_tmp;
+
+       tmphead = (UART1_TxHead + 1) & UART_TX1_BUFFER_MASK;
+
+       do {
+               ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+                       txtail_tmp = UART1_TxTail;
+               }
+       } while (tmphead == txtail_tmp); /* wait for free space in buffer */
+#else
+       uint16_t tmphead;
+
+       tmphead = (UART1_TxHead + 1) & UART_TX1_BUFFER_MASK;
+
+       while (tmphead == UART1_TxTail); /* wait for free space in buffer */
+#endif
+
+       UART1_TxBuf[tmphead] = data;
+       UART1_TxHead = tmphead;
+
+       /* enable UDRE interrupt */
+       UART1_CONTROL |= _BV(UART1_UDRIE);
+
+} /* uart1_putc */
+
+
+/*************************************************************************
+Function: uart1_puts()
+Purpose:  transmit string to UART1
+Input:    string to be transmitted
+Returns:  none
+**************************************************************************/
+void uart1_puts(const char *s)
+{
+       while (*s) {
+               uart1_putc(*s++);
+       }
+
+} /* uart1_puts */
+
+
+/*************************************************************************
+Function: uart1_puts_p()
+Purpose:  transmit string from program memory to UART1
+Input:    program memory string to be transmitted
+Returns:  none
+**************************************************************************/
+void uart1_puts_p(const char *progmem_s)
+{
+       register char c;
+
+       while ((c = pgm_read_byte(progmem_s++))) {
+               uart1_putc(c);
+       }
+
+} /* uart1_puts_p */
+
+
+
+/*************************************************************************
+Function: uart1_available()
+Purpose:  Determine the number of bytes waiting in the receive buffer
+Input:    None
+Returns:  Integer number of bytes in the receive buffer
+**************************************************************************/
+uint16_t uart1_available(void)
+{
+       uint16_t ret;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               ret = (UART_RX1_BUFFER_SIZE + UART1_RxHead - UART1_RxTail) & UART_RX1_BUFFER_MASK;
+       }
+       return ret;
+} /* uart1_available */
+
+
+
+/*************************************************************************
+Function: uart1_flush()
+Purpose:  Flush bytes waiting the receive buffer. Actually ignores them.
+Input:    None
+Returns:  None
+**************************************************************************/
+void uart1_flush(void)
+{
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               UART1_RxHead = UART1_RxTail;
+       }
+} /* uart1_flush */
+
+#endif
+
+#endif /* defined(USART1_ENABLED) */
+
+#if defined(USART2_ENABLED)
+
+/*
+ * these functions are only for ATmegas with four USART
+ */
+#if defined(ATMEGA_USART2)
+
+ISR(UART2_RECEIVE_INTERRUPT)
+/*************************************************************************
+Function: UART2 Receive Complete interrupt
+Purpose:  called when the UART2 has received a character
+**************************************************************************/
+{
+       uint16_t tmphead;
+       uint8_t data;
+       uint8_t usr;
+       uint8_t lastRxError;
+
+
+       /* read UART status register and UART data register */
+       usr  = UART2_STATUS;
+       data = UART2_DATA;
+
+       /* */
+       lastRxError = (usr & (_BV(FE2)|_BV(DOR2)));
+
+       /* calculate buffer index */
+       tmphead = (UART2_RxHead + 1) & UART_RX2_BUFFER_MASK;
+
+       if (tmphead == UART2_RxTail) {
+               /* error: receive buffer overflow */
+               lastRxError = UART_BUFFER_OVERFLOW >> 8;
+       } else {
+               /* store new index */
+               UART2_RxHead = tmphead;
+               /* store received data in buffer */
+               UART2_RxBuf[tmphead] = data;
+       }
+       UART2_LastRxError = lastRxError;
+}
+
+
+ISR(UART2_TRANSMIT_INTERRUPT)
+/*************************************************************************
+Function: UART2 Data Register Empty interrupt
+Purpose:  called when the UART2 is ready to transmit the next byte
+**************************************************************************/
+{
+       uint16_t tmptail;
+
+
+       if (UART2_TxHead != UART2_TxTail) {
+               /* calculate and store new buffer index */
+               tmptail = (UART2_TxTail + 1) & UART_TX2_BUFFER_MASK;
+               UART2_TxTail = tmptail;
+               /* get one byte from buffer and write it to UART */
+               UART2_DATA = UART2_TxBuf[tmptail];  /* start transmission */
+       } else {
+               /* tx buffer empty, disable UDRE interrupt */
+               UART2_CONTROL &= ~_BV(UART2_UDRIE);
+       }
+}
+
+
+/*************************************************************************
+Function: uart2_init()
+Purpose:  initialize UART2 and set baudrate
+Input:    baudrate using macro UART_BAUD_SELECT()
+Returns:  none
+**************************************************************************/
+void uart2_init(uint16_t baudrate)
+{
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               UART2_TxHead = 0;
+               UART2_TxTail = 0;
+               UART2_RxHead = 0;
+               UART2_RxTail = 0;
+       }
+
+       /* Set baud rate */
+       if (baudrate & 0x8000) {
+               UART2_STATUS = (1<<U2X2);  //Enable 2x speed
+               baudrate &= ~0x8000;
+       }
+       UBRR2H = (uint8_t) (baudrate>>8);
+       UBRR2L = (uint8_t) baudrate;
+
+       /* Enable USART receiver and transmitter and receive complete interrupt */
+       UART2_CONTROL = _BV(RXCIE2)|(1<<RXEN2)|(1<<TXEN2);
+
+       /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
+#ifdef URSEL2
+       UCSR2C = (1<<URSEL2)|(3<<UCSZ20);
+#else
+       UCSR2C = (3<<UCSZ20);
+#endif
+} /* uart_init */
+
+
+/*************************************************************************
+Function: uart2_getc()
+Purpose:  return byte from ringbuffer
+Returns:  lower byte:  received byte from ringbuffer
+          higher byte: last receive error
+**************************************************************************/
+uint16_t uart2_getc(void)
+{
+       uint16_t tmptail;
+       uint8_t data;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               if (UART2_RxHead == UART2_RxTail) {
+                       return UART_NO_DATA;   /* no data available */
+               }
+       }
+
+       /* calculate / store buffer index */
+
+       tmptail = (UART2_RxTail + 1) & UART_RX2_BUFFER_MASK;
+       UART2_RxTail = tmptail;
+
+       /* get data from receive buffer */
+       data = UART2_RxBuf[tmptail];
+
+       return (UART2_LastRxError << 8) + data;
+
+} /* uart2_getc */
+
+/*************************************************************************
+Function: uart2_peek()
+Purpose:  Returns the next byte (character) of incoming UART data without
+          removing it from the ring buffer. That is, successive calls to
+                 uartN_peek() will return the same character, as will the next
+                 call to uartN_getc()
+Returns:  lower byte:  next byte in ring buffer
+          higher byte: last receive error
+**************************************************************************/
+uint16_t uart2_peek(void)
+{
+       uint16_t tmptail;
+       uint8_t data;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               if (UART2_RxHead == UART2_RxTail) {
+                       return UART_NO_DATA;   /* no data available */
+               }
+       }
+
+       tmptail = (UART2_RxTail + 1) & UART_RX2_BUFFER_MASK;
+
+       /* get data from receive buffer */
+       data = UART2_RxBuf[tmptail];
+
+       return (UART2_LastRxError << 8) + data;
+
+} /* uart2_peek */
+
+/*************************************************************************
+Function: uart2_putc()
+Purpose:  write byte to ringbuffer for transmitting via UART
+Input:    byte to be transmitted
+Returns:  none
+**************************************************************************/
+void uart2_putc(uint8_t data)
+{
+
+#ifdef USART2_LARGE_BUFFER
+       uint16_t tmphead;
+       uint16_t txtail_tmp;
+
+       tmphead = (UART2_TxHead + 1) & UART_TX2_BUFFER_MASK;
+
+       do {
+               ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+                       txtail_tmp = UART2_TxTail;
+               }
+       } while (tmphead == txtail_tmp); /* wait for free space in buffer */
+#else
+       uint16_t tmphead;
+
+       tmphead = (UART2_TxHead + 1) & UART_TX2_BUFFER_MASK;
+
+       while (tmphead == UART2_TxTail); /* wait for free space in buffer */
+#endif
+
+       UART2_TxBuf[tmphead] = data;
+       UART2_TxHead = tmphead;
+
+       /* enable UDRE interrupt */
+       UART2_CONTROL |= _BV(UART2_UDRIE);
+
+} /* uart2_putc */
+
+
+/*************************************************************************
+Function: uart2_puts()
+Purpose:  transmit string to UART2
+Input:    string to be transmitted
+Returns:  none
+**************************************************************************/
+void uart2_puts(const char *s)
+{
+       while (*s)
+               uart2_putc(*s++);
+
+} /* uart2_puts */
+
+
+/*************************************************************************
+Function: uart2_puts_p()
+Purpose:  transmit string from program memory to UART2
+Input:    program memory string to be transmitted
+Returns:  none
+**************************************************************************/
+void uart2_puts_p(const char *progmem_s)
+{
+       register char c;
+
+       while ((c = pgm_read_byte(progmem_s++))) {
+               uart2_putc(c);
+       }
+
+} /* uart2_puts_p */
+
+
+
+/*************************************************************************
+Function: uart2_available()
+Purpose:  Determine the number of bytes waiting in the receive buffer
+Input:    None
+Returns:  Integer number of bytes in the receive buffer
+**************************************************************************/
+uint16_t uart2_available(void)
+{
+       uint16_t ret;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               ret = (UART_RX2_BUFFER_SIZE + UART2_RxHead - UART2_RxTail) & UART_RX2_BUFFER_MASK;
+       }
+       return ret;
+} /* uart2_available */
+
+
+
+/*************************************************************************
+Function: uart2_flush()
+Purpose:  Flush bytes waiting the receive buffer. Actually ignores them.
+Input:    None
+Returns:  None
+**************************************************************************/
+void uart2_flush(void)
+{
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               UART2_RxHead = UART2_RxTail;
+       }
+} /* uart2_flush */
+
+#endif
+
+#endif /* defined(USART2_ENABLED) */
+
+#if defined(USART3_ENABLED)
+
+/*
+ * these functions are only for ATmegas with four USART
+ */
+#if defined(ATMEGA_USART3)
+
+ISR(UART3_RECEIVE_INTERRUPT)
+/*************************************************************************
+Function: UART3 Receive Complete interrupt
+Purpose:  called when the UART3 has received a character
+**************************************************************************/
+{
+       uint16_t tmphead;
+       uint8_t data;
+       uint8_t usr;
+       uint8_t lastRxError;
+
+       /* read UART status register and UART data register */
+       usr  = UART3_STATUS;
+       data = UART3_DATA;
+
+       /* */
+       lastRxError = (usr & (_BV(FE3)|_BV(DOR3)));
+
+       /* calculate buffer index */
+       tmphead = (UART3_RxHead + 1) & UART_RX3_BUFFER_MASK;
+
+       if (tmphead == UART3_RxTail) {
+               /* error: receive buffer overflow */
+               lastRxError = UART_BUFFER_OVERFLOW >> 8;
+       } else {
+               /* store new index */
+               UART3_RxHead = tmphead;
+               /* store received data in buffer */
+               UART3_RxBuf[tmphead] = data;
+       }
+       UART3_LastRxError = lastRxError;
+}
+
+
+ISR(UART3_TRANSMIT_INTERRUPT)
+/*************************************************************************
+Function: UART3 Data Register Empty interrupt
+Purpose:  called when the UART3 is ready to transmit the next byte
+**************************************************************************/
+{
+       uint16_t tmptail;
+
+
+       if (UART3_TxHead != UART3_TxTail) {
+               /* calculate and store new buffer index */
+               tmptail = (UART3_TxTail + 1) & UART_TX3_BUFFER_MASK;
+               UART3_TxTail = tmptail;
+               /* get one byte from buffer and write it to UART */
+               UART3_DATA = UART3_TxBuf[tmptail];  /* start transmission */
+       } else {
+               /* tx buffer empty, disable UDRE interrupt */
+               UART3_CONTROL &= ~_BV(UART3_UDRIE);
+       }
+}
+
+
+/*************************************************************************
+Function: uart3_init()
+Purpose:  initialize UART3 and set baudrate
+Input:    baudrate using macro UART_BAUD_SELECT()
+Returns:  none
+**************************************************************************/
+void uart3_init(uint16_t baudrate)
+{
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               UART3_TxHead = 0;
+               UART3_TxTail = 0;
+               UART3_RxHead = 0;
+               UART3_RxTail = 0;
+       }
+
+       /* Set baud rate */
+       if (baudrate & 0x8000) {
+               UART3_STATUS = (1<<U2X3);  //Enable 2x speed
+               baudrate &= ~0x8000;
+       }
+       UBRR3H = (uint8_t)(baudrate>>8);
+       UBRR3L = (uint8_t) baudrate;
+
+       /* Enable USART receiver and transmitter and receive complete interrupt */
+       UART3_CONTROL = _BV(RXCIE3)|(1<<RXEN3)|(1<<TXEN3);
+
+       /* Set frame format: asynchronous, 8data, no parity, 1stop bit */
+#ifdef URSEL3
+       UCSR3C = (1<<URSEL3)|(3<<UCSZ30);
+#else
+       UCSR3C = (3<<UCSZ30);
+#endif
+} /* uart_init */
+
+
+/*************************************************************************
+Function: uart3_getc()
+Purpose:  return byte from ringbuffer
+Returns:  lower byte:  received byte from ringbuffer
+          higher byte: last receive error
+**************************************************************************/
+uint16_t uart3_getc(void)
+{
+       uint16_t tmptail;
+       uint8_t data;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               if (UART3_RxHead == UART3_RxTail) {
+                       return UART_NO_DATA;   /* no data available */
+               }
+       }
+
+       /* calculate / store buffer index */
+       tmptail = (UART3_RxTail + 1) & UART_RX3_BUFFER_MASK;
+       UART3_RxTail = tmptail;
+
+       /* get data from receive buffer */
+       data = UART3_RxBuf[tmptail];
+
+       return (UART3_LastRxError << 8) + data;
+
+} /* uart3_getc */
+
+/*************************************************************************
+Function: uart3_peek()
+Purpose:  Returns the next byte (character) of incoming UART data without
+          removing it from the ring buffer. That is, successive calls to
+                 uartN_peek() will return the same character, as will the next
+                 call to uartN_getc()
+Returns:  lower byte:  next byte in ring buffer
+          higher byte: last receive error
+**************************************************************************/
+uint16_t uart3_peek(void)
+{
+       uint16_t tmptail;
+       uint8_t data;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               if (UART3_RxHead == UART3_RxTail) {
+                       return UART_NO_DATA;   /* no data available */
+               }
+       }
+
+       tmptail = (UART3_RxTail + 1) & UART_RX3_BUFFER_MASK;
+
+       /* get data from receive buffer */
+       data = UART3_RxBuf[tmptail];
+
+       return (UART3_LastRxError << 8) + data;
+
+} /* uart3_peek */
+
+/*************************************************************************
+Function: uart3_putc()
+Purpose:  write byte to ringbuffer for transmitting via UART
+Input:    byte to be transmitted
+Returns:  none
+**************************************************************************/
+void uart3_putc(uint8_t data)
+{
+
+#ifdef USART3_LARGE_BUFFER
+       uint16_t tmphead;
+       uint16_t txtail_tmp;
+
+       tmphead = (UART3_TxHead + 1) & UART_TX3_BUFFER_MASK;
+
+       do {
+               ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+                       txtail_tmp = UART3_TxTail;
+               }
+       } while (tmphead == txtail_tmp); /* wait for free space in buffer */
+#else
+       uint16_t tmphead;
+
+       tmphead = (UART3_TxHead + 1) & UART_TX3_BUFFER_MASK;
+
+       while (tmphead == UART3_TxTail); /* wait for free space in buffer */
+#endif
+
+       UART3_TxBuf[tmphead] = data;
+       UART3_TxHead = tmphead;
+
+       /* enable UDRE interrupt */
+       UART3_CONTROL |= _BV(UART3_UDRIE);
+
+} /* uart3_putc */
+
+
+/*************************************************************************
+Function: uart3_puts()
+Purpose:  transmit string to UART3
+Input:    string to be transmitted
+Returns:  none
+**************************************************************************/
+void uart3_puts(const char *s)
+{
+       while (*s) {
+               uart3_putc(*s++);
+       }
+
+} /* uart3_puts */
+
+
+/*************************************************************************
+Function: uart3_puts_p()
+Purpose:  transmit string from program memory to UART3
+Input:    program memory string to be transmitted
+Returns:  none
+**************************************************************************/
+void uart3_puts_p(const char *progmem_s)
+{
+       register char c;
+
+       while ((c = pgm_read_byte(progmem_s++))) {
+               uart3_putc(c);
+       }
+
+} /* uart3_puts_p */
+
+
+
+/*************************************************************************
+Function: uart3_available()
+Purpose:  Determine the number of bytes waiting in the receive buffer
+Input:    None
+Returns:  Integer number of bytes in the receive buffer
+**************************************************************************/
+uint16_t uart3_available(void)
+{
+       uint16_t ret;
+
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               ret = (UART_RX3_BUFFER_SIZE + UART3_RxHead - UART3_RxTail) & UART_RX3_BUFFER_MASK;
+       }
+       return ret;
+} /* uart3_available */
+
+
+
+/*************************************************************************
+Function: uart3_flush()
+Purpose:  Flush bytes waiting the receive buffer. Actually ignores them.
+Input:    None
+Returns:  None
+**************************************************************************/
+void uart3_flush(void)
+{
+       ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
+               UART3_RxHead = UART3_RxTail;
+       }
+} /* uart3_flush */
+
+#endif
+
+#endif /* defined(USART3_ENABLED) */
\ No newline at end of file
diff --git a/hardcopy/styrmodul/Styrmodul/uart.h b/hardcopy/styrmodul/Styrmodul/uart.h
new file mode 100644 (file)
index 0000000..bed43fb
--- /dev/null
@@ -0,0 +1,450 @@
+/*
+ * uart.h
+ *
+ * Created: 2024-04-02 09:28:23
+ *  Author: nilfo359
+ */ 
+
+#ifndef UART_H
+#define UART_H
+
+/************************************************************************
+Title:    Interrupt UART library with receive/transmit circular buffers
+Author:   Andy Gock
+Software: AVR-GCC 4.1, AVR Libc 1.4
+Hardware: any AVR with built-in UART, tested on AT90S8515 & ATmega8 at 4 Mhz
+License:  GNU General Public License
+Usage:    see README.md and Doxygen manual
+
+Based on original library by Peter Fluery, Tim Sharpe, Nicholas Zambetti.
+
+https://github.com/andygock/avr-uart
+
+LICENSE:
+
+       Copyright (C) 2012 Andy Gock
+       Copyright (C) 2006 Peter Fleury
+
+       This program is free software; you can redistribute it and/or modify
+       it under the terms of the GNU General Public License as published by
+       the Free Software Foundation; either version 2 of the License, or
+       any later version.
+
+       This program is distributed in the hope that it will be useful,
+       but WITHOUT ANY WARRANTY; without even the implied warranty of
+       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+       GNU General Public License for more details.
+
+************************************************************************/
+
+/************************************************************************
+uart_available, uart_flush, uart1_available, and uart1_flush functions
+were adapted from the Arduino HardwareSerial.h library by Tim Sharpe on
+11 Jan 2009.  The license info for HardwareSerial.h is as follows:
+
+  HardwareSerial.h - Hardware serial library for Wiring
+  Copyright (c) 2006 Nicholas Zambetti.  All right reserved.
+
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+************************************************************************/
+
+/**
+ *  @defgroup avr-uart UART Library
+ *  @code #include <uart.h> @endcode
+ *
+ *  @brief Interrupt UART library using the built-in UART with transmit and receive circular buffers.
+ *  @see README.md
+ *
+ *  This library can be used to transmit and receive data through the built in UART.
+ *
+ *  An interrupt is generated when the UART has finished transmitting or
+ *  receiving a byte. The interrupt handling routines use circular buffers
+ *  for buffering received and transmitted data.
+ *
+ *  The UART_RXn_BUFFER_SIZE and UART_TXn_BUFFER_SIZE constants define
+ *  the size of the circular buffers in bytes. Note that these constants must be a power of 2.
+ *
+ *  You need to define these buffer sizes as a symbol in your compiler settings or in uart.h
+ *
+ *  See README.md for more detailed information. Especially that relating to symbols: USARTn_ENABLED and USARTn_LARGE_BUFFER
+ *
+ *  @author Andy Gock <andy@gock.net>
+ *  @note Based on Atmel Application Note AVR306 and original library by Peter Fleury and Tim Sharpe.
+ */
+
+/**@{*/
+#include <stdint.h>
+#include <avr/io.h>
+
+#if (__GNUC__ * 100 + __GNUC_MINOR__) < 304
+#error "This library requires AVR-GCC 3.4 or later, update to newer AVR-GCC compiler !"
+#endif
+
+#define UART_BAUD_RATE 230400
+
+//uint8_t uart_buffer[5]; // For some reason this doesnt send lots of unessecary data
+
+
+/*
+ * constants and macros
+ */
+
+/* Enable USART 1, 2, 3 as required */
+/* Can be defined in compiler symbol setup with -D option (preferred) */
+#ifndef USART0_ENABLED
+       #define USART0_ENABLED /**< Enable USART0 */
+#endif
+//#define USART1_ENABLED
+//#define USART2_ENABLED
+//#define USART3_ENABLED
+
+/* Set size of receive and transmit buffers */
+
+#ifndef UART_RX0_BUFFER_SIZE
+       #define UART_RX0_BUFFER_SIZE 128 /**< Size of the circular receive buffer, must be power of 2 */
+#endif
+#ifndef UART_RX1_BUFFER_SIZE
+       #define UART_RX1_BUFFER_SIZE 128 /**< Size of the circular receive buffer, must be power of 2 */
+#endif
+#ifndef UART_RX2_BUFFER_SIZE
+       #define UART_RX2_BUFFER_SIZE 128 /**< Size of the circular receive buffer, must be power of 2 */
+#endif
+#ifndef UART_RX3_BUFFER_SIZE
+       #define UART_RX3_BUFFER_SIZE 128 /**< Size of the circular receive buffer, must be power of 2 */
+#endif
+
+#ifndef UART_TX0_BUFFER_SIZE
+       #define UART_TX0_BUFFER_SIZE 128 /**< Size of the circular transmit buffer, must be power of 2 */
+#endif
+#ifndef UART_TX1_BUFFER_SIZE
+       #define UART_TX1_BUFFER_SIZE 128 /**< Size of the circular transmit buffer, must be power of 2 */
+#endif
+#ifndef UART_TX2_BUFFER_SIZE
+       #define UART_TX2_BUFFER_SIZE 128 /**< Size of the circular transmit buffer, must be power of 2 */
+#endif
+#ifndef UART_TX3_BUFFER_SIZE
+       #define UART_TX3_BUFFER_SIZE 128 /**< Size of the circular transmit buffer, must be power of 2 */
+#endif
+
+/* Check buffer sizes are not too large for 8-bit positioning */
+
+#if (UART_RX0_BUFFER_SIZE > 256 & !defined(USART0_LARGE_BUFFER))
+       #error "Buffer too large, please use -DUSART0_LARGE_BUFFER switch in compiler options"
+#endif
+
+#if (UART_RX1_BUFFER_SIZE > 256 & !defined(USART1_LARGE_BUFFER))
+       #error "Buffer too large, please use -DUSART1_LARGE_BUFFER switch in compiler options"
+#endif
+
+#if (UART_RX2_BUFFER_SIZE > 256 & !defined(USART2_LARGE_BUFFER))
+       #error "Buffer too large, please use -DUSART2_LARGE_BUFFER switch in compiler options"
+#endif
+
+#if (UART_RX3_BUFFER_SIZE > 256 & !defined(USART3_LARGE_BUFFER))
+       #error "Buffer too large, please use -DUSART3_LARGE_BUFFER switch in compiler options"
+#endif
+
+/* Check buffer sizes are not too large for *_LARGE_BUFFER operation (16-bit positioning) */
+
+#if (UART_RX0_BUFFER_SIZE > 32768)
+       #error "Buffer too large, maximum allowed is 32768 bytes"
+#endif
+
+#if (UART_RX1_BUFFER_SIZE > 32768)
+       #error "Buffer too large, maximum allowed is 32768 bytes"
+#endif
+
+#if (UART_RX2_BUFFER_SIZE > 32768)
+       #error "Buffer too large, maximum allowed is 32768 bytes"
+#endif
+
+#if (UART_RX3_BUFFER_SIZE > 32768)
+       #error "Buffer too large, maximum allowed is 32768 bytes"
+#endif
+
+/** @brief  UART Baudrate Expression
+ *  @param  xtalCpu  system clock in Mhz, e.g. 4000000L for 4Mhz
+ *  @param  baudRate baudrate in bps, e.g. 1200, 2400, 9600
+ */
+#define UART_BAUD_SELECT(baudRate,xtalCpu) (((xtalCpu)+8UL*(baudRate))/(16UL*(baudRate))-1UL)
+
+/** @brief  UART Baudrate Expression for ATmega double speed mode
+ *  @param  xtalCpu  system clock in Mhz, e.g. 4000000L for 4Mhz
+ *  @param  baudRate baudrate in bps, e.g. 1200, 2400, 9600
+ */
+#define UART_BAUD_SELECT_DOUBLE_SPEED(baudRate,xtalCpu) ((((xtalCpu)+4UL*(baudRate))/(8UL*(baudRate))-1)|0x8000)
+
+/* test if the size of the circular buffers fits into SRAM */
+
+#if defined(USART0_ENABLED) && ( (UART_RX0_BUFFER_SIZE+UART_TX0_BUFFER_SIZE) >= (RAMEND-0x60))
+       #error "size of UART_RX0_BUFFER_SIZE + UART_TX0_BUFFER_SIZE larger than size of SRAM"
+#endif
+
+#if defined(USART1_ENABLED) && ( (UART_RX1_BUFFER_SIZE+UART_TX1_BUFFER_SIZE) >= (RAMEND-0x60))
+       #error "size of UART_RX1_BUFFER_SIZE + UART_TX1_BUFFER_SIZE larger than size of SRAM"
+#endif
+
+#if defined(USART2_ENABLED) && ( (UART_RX2_BUFFER_SIZE+UART_RX2_BUFFER_SIZE) >= (RAMEND-0x60))
+       #error "size of UART_RX2_BUFFER_SIZE + UART_TX2_BUFFER_SIZE larger than size of SRAM"
+#endif
+
+#if defined(USART3_ENABLED) && ( (UART_RX3_BUFFER_SIZE+UART_RX3_BUFFER_SIZE) >= (RAMEND-0x60))
+       #error "size of UART_RX3_BUFFER_SIZE + UART_TX3_BUFFER_SIZE larger than size of SRAM"
+#endif
+
+/*
+** high byte error return code of uart_getc()
+*/
+#define UART_FRAME_ERROR      0x0800              /**< Framing Error by UART       */
+#define UART_OVERRUN_ERROR    0x0400              /**< Overrun condition by UART   */
+#define UART_BUFFER_OVERFLOW  0x0200              /**< receive ringbuffer overflow */
+#define UART_NO_DATA          0x0100              /**< no receive data available   */
+
+/* Macros, to allow use of legacy names */
+
+/** @brief Macro to initialize USART0 (only available on selected ATmegas) @see uart0_init */
+#define uart_init(b)      uart0_init(b)
+
+/** @brief Macro to get received byte of USART0 from ringbuffer. (only available on selected ATmega) @see uart0_getc */
+#define uart_getc()       uart0_getc()
+
+/** @brief Macro to peek at next byte in USART0 ringbuffer */
+#define uart_peek()       uart0_peek()
+
+/** @brief Macro to put byte to ringbuffer for transmitting via USART0 (only available on selected ATmega) @see uart0_putc */
+#define uart_putc(d)      uart0_putc(d)
+
+/** @brief Macro to put string to ringbuffer for transmitting via USART0 (only available on selected ATmega) @see uart0_puts */
+#define uart_puts(s)      uart0_puts(s)
+
+/** @brief Macro to put string from program memory to ringbuffer for transmitting via USART0 (only available on selected ATmega) @see uart0_puts_p */
+#define uart_puts_p(s)    uart0_puts_p(s)
+
+/** @brief Macro to return number of bytes waiting in the receive buffer of USART0 @see uart0_available */
+#define uart_available()  uart0_available()
+
+/** @brief Macro to flush bytes waiting in receive buffer of USART0 @see uart0_flush */
+#define uart_flush()      uart0_flush()
+
+/*
+** function prototypes
+*/
+
+/**
+   @brief   Initialize UART and set baudrate
+   @param   baudrate Specify baudrate using macro UART_BAUD_SELECT()
+   @return  none
+*/
+#if defined(AVR1_USART0)
+extern void uart0_init(uint32_t baudrate);
+#else
+extern void uart0_init(uint16_t baudrate);
+#endif
+
+/**
+ *  @brief   Get received byte from ringbuffer
+ *
+ * Returns in the lower byte the received character and in the
+ * higher byte the last receive error.
+ * UART_NO_DATA is returned when no data is available.
+ *
+ *  @return  lower byte:  received byte from ringbuffer
+ *  @return  higher byte: last receive status
+ *           - \b 0 successfully received data from UART
+ *           - \b UART_NO_DATA
+ *             <br>no receive data available
+ *           - \b UART_BUFFER_OVERFLOW
+ *             <br>Receive ringbuffer overflow.
+ *             We are not reading the receive buffer fast enough,
+ *             one or more received character have been dropped
+ *           - \b UART_OVERRUN_ERROR
+ *             <br>Overrun condition by UART.
+ *             A character already present in the UART UDR register was
+ *             not read by the interrupt handler before the next character arrived,
+ *             one or more received characters have been dropped.
+ *           - \b UART_FRAME_ERROR
+ *             <br>Framing Error by UART
+ */
+extern uint16_t uart0_getc(void);
+
+/**
+ *  @brief   Peek at next byte in ringbuffer
+ *
+ * Returns the next byte (character) of incoming UART data without removing it from the
+ * internal ring buffer. That is, successive calls to uartN_peek() will return the same
+ * character, as will the next call to uartN_getc().
+ *
+ * UART_NO_DATA is returned when no data is available.
+ *
+ *  @return  lower byte:  next byte in ringbuffer
+ *  @return  higher byte: last receive status
+ *           - \b 0 successfully received data from UART
+ *           - \b UART_NO_DATA
+ *             <br>no receive data available
+ *           - \b UART_BUFFER_OVERFLOW
+ *             <br>Receive ringbuffer overflow.
+ *             We are not reading the receive buffer fast enough,
+ *             one or more received character have been dropped
+ *           - \b UART_OVERRUN_ERROR
+ *             <br>Overrun condition by UART.
+ *             A character already present in the UART UDR register was
+ *             not read by the interrupt handler before the next character arrived,
+ *             one or more received characters have been dropped.
+ *           - \b UART_FRAME_ERROR
+ *             <br>Framing Error by UART
+ */
+extern uint16_t uart0_peek(void);
+
+/**
+ *  @brief   Put byte to ringbuffer for transmitting via UART
+ *  @param   data byte to be transmitted
+ *  @return  none
+ */
+extern void uart0_putc(uint8_t data);
+
+
+/**
+ *  @brief   Put string to ringbuffer for transmitting via UART
+ *
+ *  The string is buffered by the uart library in a circular buffer
+ *  and one character at a time is transmitted to the UART using interrupts.
+ *  Blocks if it can not write the whole string into the circular buffer.
+ *
+ *  @param   s string to be transmitted
+ *  @return  none
+ */
+extern void uart0_puts(const char *s);
+
+
+/**
+ * @brief    Put string from program memory to ringbuffer for transmitting via UART.
+ *
+ * The string is buffered by the uart library in a circular buffer
+ * and one character at a time is transmitted to the UART using interrupts.
+ * Blocks if it can not write the whole string into the circular buffer.
+ *
+ * @param    s program memory string to be transmitted
+ * @return   none
+ * @see      uart0_puts_P
+ */
+extern void uart0_puts_p(const char *s);
+
+/**
+ * @brief    Macro to automatically put a string constant into program memory
+ * \param    __s string in program memory
+ */
+#define uart_puts_P(__s)       uart0_puts_p(PSTR(__s))
+
+/** @brief  Macro to automatically put a string constant into program memory */
+#define uart0_puts_P(__s)      uart0_puts_p(PSTR(__s))
+
+/**
+ *  @brief   Return number of bytes waiting in the receive buffer
+ *  @return  bytes waiting in the receive buffer
+ */
+extern uint16_t uart0_available(void);
+
+/**
+ *  @brief   Flush bytes waiting in receive buffer
+ */
+extern void uart0_flush(void);
+
+
+/** @brief  Initialize USART1 (only available on selected ATmegas) @see uart_init */
+extern void uart1_init(uint16_t baudrate);
+
+/** @brief  Get received byte of USART1 from ringbuffer. (only available on selected ATmega) @see uart_getc */
+extern uint16_t uart1_getc(void);
+
+/** @brief  Peek at next byte in USART1 ringbuffer */
+extern uint16_t uart1_peek(void);
+
+/** @brief  Put byte to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_putc */
+extern void uart1_putc(uint8_t data);
+
+/** @brief  Put string to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts */
+extern void uart1_puts(const char *s);
+
+/** @brief  Put string from program memory to ringbuffer for transmitting via USART1 (only available on selected ATmega) @see uart_puts_p */
+extern void uart1_puts_p(const char *s);
+
+/** @brief  Macro to automatically put a string constant into program memory of USART1 @see uart1_puts_p */
+#define uart1_puts_P(__s)       uart1_puts_p(PSTR(__s))
+
+/** @brief  Return number of bytes waiting in the receive buffer of USART1 */
+extern uint16_t uart1_available(void);
+
+/** @brief  Flush bytes waiting in receive buffer of USART1 */
+extern void uart1_flush(void);
+
+
+/** @brief  Initialize USART2 (only available on selected ATmegas) @see uart_init */
+extern void uart2_init(uint16_t baudrate);
+
+/** @brief  Get received byte of USART2 from ringbuffer. (only available on selected ATmega) @see uart_getc */
+extern uint16_t uart2_getc(void);
+
+/** @brief  Peek at next byte in USART2 ringbuffer */
+extern uint16_t uart2_peek(void);
+
+/** @brief  Put byte to ringbuffer for transmitting via USART2 (only available on selected ATmega) @see uart_putc */
+extern void uart2_putc(uint8_t data);
+
+/** @brief  Put string to ringbuffer for transmitting via USART2 (only available on selected ATmega) @see uart_puts */
+extern void uart2_puts(const char *s);
+
+/** @brief  Put string from program memory to ringbuffer for transmitting via USART2 (only available on selected ATmega) @see uart_puts_p */
+extern void uart2_puts_p(const char *s);
+
+/** @brief  Macro to automatically put a string constant into program memory of USART2 @see uart2_puts_p */
+#define uart2_puts_P(__s)       uart2_puts_p(PSTR(__s))
+
+/** @brief  Return number of bytes waiting in the receive buffer of USART2 */
+extern uint16_t uart2_available(void);
+
+/** @brief  Flush bytes waiting in receive buffer of USART2 */
+extern void uart2_flush(void);
+
+
+/** @brief  Initialize USART3 (only available on selected ATmegas) @see uart_init */
+extern void uart3_init(uint16_t baudrate);
+
+/** @brief  Get received byte of USART3 from ringbuffer. (only available on selected ATmega) @see uart_getc */
+extern uint16_t uart3_getc(void);
+
+/** @brief  Peek at next byte in USART3 ringbuffer */
+extern uint16_t uart3_peek(void);
+
+/** @brief  Put byte to ringbuffer for transmitting via USART3 (only available on selected ATmega) @see uart_putc */
+extern void uart3_putc(uint8_t data);
+
+/** @brief  Put string to ringbuffer for transmitting via USART3 (only available on selected ATmega) @see uart_puts */
+extern void uart3_puts(const char *s);
+
+/** @brief  Put string from program memory to ringbuffer for transmitting via USART3 (only available on selected ATmega) @see uart_puts_p */
+extern void uart3_puts_p(const char *s);
+
+/** @brief  Macro to automatically put a string constant into program memory of USART3 @see uart3_puts_p */
+#define uart3_puts_P(__s)       uart3_puts_p(PSTR(__s))
+
+/** @brief  Return number of bytes waiting in the receive buffer of USART3 */
+extern uint16_t uart3_available(void);
+
+/** @brief  Flush bytes waiting in receive buffer of USART3 */
+extern void uart3_flush(void);
+
+/**@}*/
+
+#endif // UART_H
diff --git a/hardcopy/styrmodul/Styrmodul/vector.h b/hardcopy/styrmodul/Styrmodul/vector.h
new file mode 100644 (file)
index 0000000..cbcb57a
--- /dev/null
@@ -0,0 +1,77 @@
+#pragma once
+
+#include "motor.h"
+
+typedef struct vec2 {
+       int16fp x;
+       int16fp y;
+} vec2;
+
+extern const int16fp sin_table[360];
+extern const int16fp cos_table[360];
+
+inline static int16fp fast_sin(int16_t angle) {
+       while (angle > 360) {
+               angle -= 360;
+       }
+       while (angle < 0) {
+               angle += 360;
+       }
+       return sin_table[angle];
+}
+
+inline static int16fp fast_cos(int16_t angle) {
+       while (angle > 360) {
+               angle -= 360;
+       }
+       while (angle < 0) {
+               angle += 360;
+       }
+       return cos_table[angle];
+}
+
+inline static vec2 vec2_new(int16fp x, int16fp y) {
+       vec2 result;
+       result.x = x;
+       result.y = y;
+       return result;
+}
+
+inline static vec2 vec2_add(vec2 a, vec2 b) {
+       vec2 result;
+       result.x = a.x+b.x;
+       result.y = a.y+b.y;
+       return result;
+}
+
+inline static vec2 vec2_sub(vec2 a, vec2 b) {
+       vec2 result;
+       result.x = a.x-b.x;
+       result.y = a.y-b.y;
+       return result;
+}
+
+inline static int32fp vec2_norm_squared(vec2 a) {
+       return FP_MUL((int32fp)a.x, a.x) + FP_MUL((int32fp)a.y, a.y);
+}
+
+inline static vec2 vec2_scalar_mul(vec2 a, int16fp scalar) {
+       vec2 result;
+       result.x = FP_MUL(a.x, scalar);
+       result.y = FP_MUL(a.y, scalar);
+       return result;
+}
+
+inline static int32fp vec2_dot(vec2 a, vec2 b) {
+       return FP_MUL((int32fp)a.x, b.x) + FP_MUL((int32fp)a.y, b.y);
+}
+
+// Rotate angle degrees counter clockwise.
+inline static vec2 vec2_rotate(vec2 a, int16_t angle) {
+       // [cos -sin]
+       // [sin cos]
+       vec2 result;
+       result.x = FP_MUL(fast_cos(angle), a.x) - FP_MUL(fast_sin(angle), a.y);
+       result.y = FP_MUL(fast_sin(angle), a.x) + FP_MUL(fast_cos(angle), a.y);
+       return result;
+}
diff --git a/hardcopy/styrmodul/gen_trig_table.py b/hardcopy/styrmodul/gen_trig_table.py
new file mode 100644 (file)
index 0000000..0dda401
--- /dev/null
@@ -0,0 +1,17 @@
+#!/usr/bin/env python3
+
+from math import *
+
+
+sin_table = []
+cos_table = []
+for angle in range(360):
+    a = sin(angle*pi/180.0)
+    sin_table.append(int(a*(2**8)))
+
+    a = cos(angle*pi/180.0)
+    cos_table.append(int(a*(2**8)))
+
+result = "int16fp sin_table[360] = {" + ','.join(map(str, sin_table)) + "}\n;"
+result += "int16fp cos_table[360] = {" + ','.join(map(str, cos_table)) + "}\n;"
+print(result)
\ No newline at end of file