\documentclass[conference, a4paper]{IEEEtran}
\IEEEoverridecommandlockouts
% The preceding line is only needed to identify funding in the first footnote. If that is unneeded, please comment it out.
\usepackage{cite}
\usepackage{amsmath,amssymb,amsfonts}
\usepackage{algorithmic}
\usepackage{graphicx}
\usepackage{textcomp}
\usepackage{xcolor}
\def\BibTeX{{\rm B\kern-.05em{\sc i\kern-.025em b}\kern-.08em
    T\kern-.1667em\lower.7ex\hbox{E}\kern-.125emX}}

%############# LENGUAJE #############
% Para lenguaje español
\usepackage[spanish]{babel}
\selectlanguage{spanish}
% Para los acentos.
% Seleccionar ISO-8859-1 como codificación
\usepackage[latin1]{inputenc}
% Para la separación silábica en castellano
\usepackage[T1]{fontenc}
\hyphenation{on-line im-age fabrication}

% Para que las referencias queden en 2 columnas iguales.
\usepackage{flushend}

% Esto permite cortar mejor los URLs largos y soluciona
% problemas con caracteres no permitidos en los URLs
% como por ejemplo & y _
\usepackage{url}
\makeatletter
\g@addto@macro{\UrlBreaks}{\UrlOrds}
\makeatother

\begin{document}

\title{Generación automática de archivos de fabricación en KiCad}

\author{\IEEEauthorblockN{Salvador E. Tropea}
\IEEEauthorblockA{\textit{Centro de Micro y Nano Tecnologías} \\
\textit{Instituto Nacional de Tecnología Industrial}\\
Buenos Aires, Argentina \\
stropea@inti.gob.ar}
}

\maketitle

\begin{abstract}
KiCad es probablemente la herramienta de desarrollo de circuitos impresos
más avanzada en el mundo del software libre.

En este trabajo presentamos un conjunto de herramientas capaces de
automatizar la verificación de reglas de diseño y la generación de
los archivos de fabricación cuándo usamos KiCad.

Estas herramientas son adecuadas para ser usadas localmente o en entornos
de integración continua.
\end{abstract}

\begin{IEEEkeywords}
KiCad, automatización, fabricación, integración continua
\end{IEEEkeywords}


\section{Introducción}

A la hora de elegir una herramienta de desarrollo de circuitos impresos
que sea de software libre KiCad\cite{kicad_2019} es probablemente la mejor elección.
Esta herramienta ha avanzado mucho en los últimos años, con el apoyo de
prestigiosas instituciones como el CERN\cite{kicad_about}.

Una vez desarrollado el circuito se debe generar toda la documentación
necesaria para su fabricación. Esta documentación incluye una amplia
variedad de documentos, tales como el listado de materiales, los gerbers\cite{gerber_format},
archivos de taladrado, archivos de posicionamiento de componentes, etc.
Todos acompañados por archivos PDF con el esquemático y PCB.
Siendo los gerbers el formato estándar de fabricación de PCBs.
La generación de estos archivos es una tarea bastante tediosa ya que es
necesario generar cada uno de estos documentos usando opciones diferentes
de herramientas diferentes. Esto es peligroso ya que se podrían cometer errores
en alguno de los pasos.

Lamentablemente no hay una receta estandarizada que le permita a la herramienta
generar esta documentación en una única operación. Esto es así porque cada
fabricante, y cada desarrollador, tiene sus propias preferencias. Pero lo
que si sería posible es volcar dichas preferencias en un único
archivo y que luego la herramienta se encargara de generar la documentación
de acuerdo con esta especificación.

En este trabajo se presenta un conjunto de herramientas capaces de realizar
la tarea antes mencionada. Estas herramientas fueron desarrolladas tomando
ideas y componentes presentados en la KiCon 2019\cite{kicon_2019}, junto con heramientas
ya usadas por nuestro equipo de trabajo.


\section{Herramientas}

\subsection{Núcleo central}

El núcleo de este conjunto de herramientas es un derivado de KiPlot\cite{kiplot_ori}\cite{kiplot}. Esta
herramienta permite tomar un archivo de configuración en formato YAML\cite{YAML} y
generar en forma automática la documentación especificada. Todas las opciones
quedan así concentradas en un único archivo de fácil interpretación.

Originalmente KiPlot se limita a generar los archivos que pueden generarse
a través de la interfaz Python de KiCad. Esto incluye los gerbers y todos
los formatos disponibles en la opción \verb|plot| del menú y
los archivos de taladrado. Pero esto es sólo una
parte de los archivos necesarios.

Por esta razón se extendió la aplicación para soportar otros formatos.
Por un lado se agregaron los archivos de posicionamiento de componentes y
el archivo de integración de los gerbers a la misma herramienta.
Por otro lado se agregó la posibilidad de integrar otras tres aplicaciones
para complementarla.

La Fig.~\ref{fig} muestra el flujo de trabajo. En la misma se aprecia como KiPlot
tiene un rol central.

\begin{figure}[htbp]
\centerline{\includegraphics{Esquema.eps}}
\caption{Flujo de datos.}
\label{fig}
\end{figure}


\subsection{Listado de materiales}

Esta compuesto por todos los componentes pasivos, integrados, conectores, etc.
presentes en el esquemático. 
KiCad utiliza un mecanismo de plug-ins para esta tarea, por lo que es
relativamente simple utilizar herramientas externas. Para ello se seleccionaron
dos aplicaciones muy útiles.

KiBoM\cite{kibom_ori}\cite{kibom} es un script que permite generar un listado de materiales ordenado
y completo. Se contribuyó a este proyecto varios detalles interesantes,
tales como poder reconocer campos con el código de parte en Digi-Key\cite{digikey} y
convertirlos en links al sitio, o generar un listado separado de componentes
que son opcionales. Luego se integró con KiPlot.

InteractiveHtmlBom\cite{ibom_ori}\cite{ibom} es otro script interesante. El mismo permite generar
una página web interactiva donde se puede ver la posición de cada componente
en el PCB e ir marcando cuáles ya han sido soldados. También fue integrada a
KiPlot.

\subsection{Automatización de la interacción con el usuario}

KiCad no ofrece mecanismos automáticos para generar las versiones PDF
de documentación del esquemático ni del PCB. Si bien es posible generar
desde Python archivos PDF, estos son más bien unos gerbers en formato
PDF, y no los archivos de documentación.

Adicionalmente es imposible automatizar las tareas de verificar las
reglas de diseño o actualizar el netlist necesario para KiBoM e
InteractiveHtmlBom.

Para automatizar estas tareas es necesario simular las acciones que
haría una persona con las herramientas. Es decir que es necesario sintetizar
la interacción con la interfaz de usuario. En la KiCon 2019\cite{kicon_kiauto} se presentó un esfuerzo
por realizar estas tareas con una herramienta denominada
kicad-automation-scripts\cite{kiauto_ori}\cite{kiauto}. La misma estaba incompleta y sólo orientada
a entornos de integración continua, siendo complicado usarla de
manera local.

Se mejoró y complementó esta herramienta, para luego integrarla a KiPlot.
En la actualidad es posible realizar todas las tareas antes mencionadas
especificándolas en el archivo de configuración de KiPlot.

\subsection{Integración continua}

Los entornos de integración continua incluidos en los repositorios
populares como GitHub y GitLab permiten realizar tareas automáticas
cada vez que un cambio es subido al repositorio. Este tema también
fue cubierto por otra charla de la KiCon 2019\cite{kicon_cicd}
y es impulsado por herramientas comerciales\cite{altium_cicd}.

Si bien el objetivo de estas herramientas es generar la documentación
final para la fabricación, existen varias razones que hacen su uso
atractivo en estos entornos, entre ellas:

\begin{itemize}
\item La posibilidad de correr los chequeos de las reglas de diseño.
\item La generación de documentación parcial durante el desarrollo. De manera tal que otros equipos involucrados o el mismo cliente puedan acceder a documentación temprana.
\item La documentación y verificación de las revisiones posteriores a la fabricación del primer prototipo.
\end{itemize}

Por estas razones se decidió generar imágenes docker conteniendo KiCad\cite{docker_ki_dh}\cite{docker_ki_gh} y
las herramientas producto de este trabajo\cite{docker_kia_dh}\cite{docker_kia_gh}. Las mismas se encuentran
disponibles en Docker Hub.

Al mismo tiempo, esto permite disponer de entornos completos y
controlados en los cuales correr las aplicaciones.


\section{Ejemplos de aplicación}

Se crearon tres ejemplos de aplicación. Dos muy básicos, cada uno como
ejemplo de uso del entorno GitHub\cite{kia_ej_gh} y GiLab\cite{kia_ej_gl}. El tercero es un poco más
elaborado ya que se trata de un proyecto real compuesto por tres PCBs\cite{kia_ej_spora}
(Spora\cite{spora_pre}). Adicionalmente en este último ejemplo se implementó un
sistema de releases automáticas, al realizar un tag en el repositorio
se corren las verificaciones de las reglas de diseño, se genera la
documentación y se empaqueta todo en una release.

En el ejemplo que usó como base el proyecto Spora se puede observar
como las herramientas reportaron errores en las reglas de diseño que
luego fueron subsanados, ver la Fig.~\ref{fig2}.


\begin{figure}[htbp]
\centerline{\includegraphics{GitLab_Pipelines.eps}}
\caption{CI/CD pipelines. Arriba ejemplo de release automática, en medio verificación exitosa y abajo falla en las verificaciones}
\label{fig2}
\end{figure}


\section{Conclusiones}

La integración con los sistemas de CI/CD de GitHub y GitLab mostró ser
simple. Permitiendo resultados consistentes y automáticos, aplicados a
proyectos reales. Cualquier cambio que viole las reglas de diseño es
informado por correo electrónico y es posible ver el estado de
cumplimiento en la página del proyecto.

Se logró la disponibilidad de varios documentos prelimirares generaros
en forma automática con cada cambio introducido. Esto permite que
otros grupos del equipo de desarrollo accedan a información actualizada
sin intereferir con las tareas de desarrollo de hardware.

A futuro se piensa agregar la generación de modelos 3D del proyecto y
completar la testeabilidad de los programas usados. Así como también
simplificar la configuración.

\bibliographystyle{IEEEtran}

\bibliography{IEEEabrv,utic}

\end{document}
