Cambiar el tamaño de los agujeros en una PCB en Eagle

Muchas veces habremos notado, a la hora de fabricar una PCB con Eagle, que el tamaño del agujero es demasiado grande para nuestro componente. Además, si hacemos el trabajo manualmente, probablemente en el tercer o cuarto agujero pensemos ¿no sería mas facil si el agujero fuera mas chico, asi se centraria mejor mi herramienta?

En el caso de tener un taladro CNC, o de enviar la placa a fabricar, simplemente debemos dejar marcada la casilla “Fill holes”, lo que producira una mascara sin los agujeros marcados. Esto sirve perfectamente para un taladro CNC pero es una pesadilla para trabajo manual.

Para hacerlo manualmente, deberiamos cambiar manualmente todos los agujeros de las librerias. Un trabjo tedioso, y que ademas provocaría que, si algún dia deseamos enviar la placa a fabricación, la harán con un drill size muy pequeño.

Propondremos entonces 2 soluciones para este problema. Una mediante el uso de círculos en una capa, que cubren los agujeros; y la otra mediante el procesador CAM, que modificará la salida.

Opción 1: Círculos con drill-aid.ulp

Si para hacer nuestra placa utilizamos la opción “Imprimir” o “Exportar a imagen”, este será el método a utilizar. Si necesitamos exportar en EPS o PS, se puede saltear esta seccion y ver la opción 2.

Mencionamos que la solucion en este caso es agregar círculos sobre cada uno de nuestros pads, suficientes para cubrir los agujeros de nuestros componentes. ¿Cómo lograr esto sin perder la paciencia? ¡Usando un script! Eagle incluye el script “drill-aid.ulp” que hace exactamente lo que necesitamos.

Esta solución la encontre aquí: http://www.edaboard.com/thread99686.html

Aquí podemos ver un diseño de PCB con los pads por defecto en Eagle:

Pads grandes

Se ve perfectamente como los agujeros son muy variables. En el caso de C3 quizá sean muy grandes, comparandolos con IC3.

Probamos entonces correr el script, ingresando el comando RUN drill-aid.ulp en la barra de comandos:

y Eagle nos mostrara la siguiente ventana:

Es una pequeña ayuda, y propone un drill de 0,3mm. Trataremos de tener el drill mas pequeño posible, pero no tanto como para que nos cause problemas a la hora de transferir el diseño. 0,3mm es un valor aceptable. Presionamos OK, y a continuación la placa se verá asi:

Vemos que ahora se agregaron círculos grises sobre la imagen. Estos círculos estan en la capa 116 y es posible activarlos o desactivarlos. Al exportar la imagen para hacer nuestra máscara, quedará de la siguiente manera:

¡Perfecto! Ahora todos los drills son de 0.3mm de diametro y nos facilitará muchisimo la tarea del taladrado manual. Y como extra, esta capa no afectará el resultado del DRC.

Opción 2: Modificando el CAM Processor

Hay un pequeño inconveniente el método anterior, y es que Eagle, por defecto, no aceptará la capa 116 como algo a exportar mediante el CAM processor. Una solución alternativa es modificar Eagle para que el CAM processor, por defecto, utilice agujeros mas pequeños. No es necesario realizar los pasos de la opción 1 para utilizar este método.

La solución la encontré aquí: http://www.eaglecentral.ca/forums/index.php/mv/msg/37268/125834/

Debemos abrir Notepad en modo administrador (en Windows Vista y posteriores, en XP normalmente), y editar el archivo “eagle.def”  que se encuentra en el directorio BIN de la instalacion de Eagle. En mi caso esta en C:\Program Files (x86)\EAGLE-6.2.0\bin. Se debe abrir el archivo y agregar las siguientes lineas al final:


[EPS-Drillaid]

@EPS
Long = "Postscript with max hole size in pads/etc, ala drill-aid.ulp"

Header3 = "%% redefine our /h function with a fixed diameter\n"\
"/h { %% draw a hole\n"\
" /d exch def\n %% Still need to pop diam off stack\n"\
" d 2000 gt {\n"\
" /d 2000 def\n %% But override it to 0.2mm\n"\
" } if\n"\
" /y exch def\n"\
" /x exch def\n"\
" d 0 gt {\n"\
" newpath\n"\
" x EU y EU d 2 div EU 0 360 arc\n"\
" currentgray dup\n"\
" 1 exch sub setgray\n"\
" fill\n"\
" setgray\n"\
" } if\n"\
"   } def\n"\
"\n"\
"%% The drawing\n"


[PS-Drillaid]

@PS
Long = "Postscript (printable) with max hold size ala Drill-aid.ulp"

Header2 = "%% redefine our /h function with a fixed diameter\n"\
"/h { %% draw a hole\n"\
" /d exch def\n %% Still need to pop diam off stack\n"\
" d 2000 gt {\n"\
" /d 2000 def\n %% But override it to 0.2mm\n"\
" } if\n"\
" /y exch def\n"\
" /x exch def\n"\
" d 0 gt {\n"\
" newpath\n"\
" x EU y EU d 2 div EU 0 360 arc\n"\
" currentgray dup\n"\
" 1 exch sub setgray\n"\
" fill\n"\
" setgray\n"\
" } if\n"\
" } def\n"\
"%% Remainder of Header2 copied from define for PS device\n"\
"%% the real drawing size:\n"\
"\n"\
"/MinDrawX %6d EU def\n"\
"/MinDrawY %6d EU def\n"\
"/MaxDrawX %6d EU def\n"\
"/MaxDrawY %6d EU def\n"\
"\n"\
"%% the usable page size:\n"\
"\n"\
"/LeftMargin 0.25 inch def %% change these if drawing gets clipped!\n"\
"/BotMargin 0.25 inch def\n"\
"/PageWidth %7.4f inch def\n"\
"/PageHeight %7.4f inch def\n"\
"\n"\
"%% are we going to rotate?:\n"\
"\n"\
"/RotateDrawing %d 0 ne def\n"\
"\n"
;(x1, y1, x2, y2, Width, Height, DoRotate)

[PS-Drillaid_INVERTED]

@PS-Drillaid
Long     = "PostScript (printable, inverted)"

Header3  = "%% Media size functions:\n"\
           "\n"\
           "/AbortMessage {  %% Show a message in a box and stop printing\n"\
           "   /h 100 def\n"\
           "   /Courier findfont 12 scalefont setfont\n"\
           "   mediawidth pagemargin sub h 1 setpage\n"\
           "   newpath\n"\
           "   0 0 moveto\n"\
           "   0 h rlineto\n"\
           "   mediawidth pagemargin sub 0 rlineto\n"\
           "   0 h neg rlineto\n"\
           "   closepath\n"\
           "   5 setlinewidth\n"\
           "   stroke\n"\
           "   newpath 50 60 moveto (ERROR: Jobsize exceeds physical printing area!) show\n"\
           "   newpath 50 40 moveto (       Job has been aborted!) show\n"\
           "   showpage\n"\
           "   stop\n"\
           "   } def\n"\
           "\n"\
           "/SelectPage {  %% Select the page identified by Row and Column\n"\
           "   /Column exch def\n"\
           "   /Row    exch def\n"\
           "\n"\
           "   %% the actually exposed area (if the machine knows these parameters!):\n"\
           "\n"\
           "   /DrawX MaxDrawX MinDrawX sub def\n"\
           "   /DrawY MaxDrawY MinDrawY sub def\n"\
           "   statusdict /setpage known\n"\
           "   statusdict /mediawidth known and\n"\
           "   statusdict /medialength known and\n"\
           "   statusdict /pagemargin known and {\n"\
           "      %% this is for machines that can tell the media size:\n"\
           "      statusdict begin\n"\
           "         /MediaW mediawidth pagemargin sub def\n"\
           "         DrawX DrawY ge {\n"\
           "            DrawX MediaW le DrawY medialength le and {\n"\
           "               MediaW DrawY 1 setpage\n"\
           "               MediaW DrawX sub 2 div 0 translate\n"\
           "               }{\n"\
           "            DrawY MediaW le DrawX medialength le and {\n"\
           "               MediaW DrawX 0 setpage\n"\
           "               0 MediaW DrawY sub 2 div translate\n"\
           "               }{\n"\
           "               AbortMessage\n"\
           "               } ifelse\n"\
           "               } ifelse\n"\
           "            }{\n"\
           "            DrawY MediaW le DrawX medialength le and {\n"\
           "               MediaW DrawX 0 setpage\n"\
           "               0 MediaW DrawY sub 2 div translate\n"\
           "               }{\n"\
           "            DrawX MediaW le DrawY medialength le and {\n"\
           "               MediaW DrawY 1 setpage\n"\
           "               MediaW DrawX sub 2 div 0 translate\n"\
           "               }{\n"\
           "               AbortMessage\n"\
           "               } ifelse\n"\
           "               } ifelse\n"\
           "            } ifelse\n"\
           "         end\n"\
           "      }{\n"\
           "      %% this is for machines that can NOT tell the media size:\n"\
           "      %% (Ghostscript doesn't like this!)\n"\
           "      /Product product length string def\n"\
           "      /i 0 def\n"\
           "      product { dup 97 lt { 32 add } if Product exch i exch put /i i 1 add def } forall \n"\
           "      Product (ghostscript) search dup /IsGhostscript exch def\n"\
           "      { pop pop } if\n"\
           "      pop\n"\
           "      IsGhostscript not {\n"\
           "         statusdict /setpage known {\n"\
           "            statusdict begin\n"\
           "               RotateDrawing {\n"\
           "                  LeftMargin PageHeight add BotMargin DrawY add\n"\
           "                  }{\n"\
           "                  BotMargin DrawY add LeftMargin DrawX add \n"\
           "                  } ifelse\n"\
           "               0 setpage\n"\
           "               end\n"\
           "            } if\n"\
           "         } if\n"\
           "      %% set clipping boundary:\n"\
           "      newpath\n"\
           "      LeftMargin BotMargin moveto\n"\
           "      0 PageHeight rlineto\n"\
           "      PageWidth  0 rlineto\n"\
           "      0 PageHeight neg rlineto\n"\
           "      closepath\n"\
           "      clip\n"\
           "      %% set the origin:\n"\
           "      LeftMargin BotMargin translate\n"\
           "      RotateDrawing {\n"\
           "         0 PageHeight translate\n"\
           "         -90 rotate\n"\
           "         PageHeight Column mul neg PageWidth Row mul neg translate\n"\
           "         }{\n"\
           "         PageWidth Column mul neg PageHeight Row mul neg translate\n"\
           "         } ifelse\n"\
           "      } ifelse\n"\
           "   %% move the lower left corner of the drawing to the origin:\n"\
           "   MinDrawX neg MinDrawY neg translate\n"\
           "   \n"\
           "   %% Linestyle:\n"\
           "   \n"\
           "   1 setlinecap\n"\
           "   1 setlinejoin\n"\
           "   \n"\
           "   %% invert drawing:\n"\
           "   newpath\n"\
           "   MinDrawX MinDrawY moveto\n"\
           "   MaxDrawX MinDrawY lineto\n"\
           "   MaxDrawX MaxDrawY lineto\n"\
           "   MinDrawX MaxDrawY lineto\n"\
           "   0 setgray\n"\
           "   closepath fill\n"\
           "   1 setgray\n"\
           "   \n"\
           "   } def\n"\
           "\n"\
           "%% TheDrawing\n"

Ahora, a la hora de utilizar el CAM processor, todos los agujeros tendran 0,2mm de diametro. Si deseamos cambiar esto, hay que modificar el archivo, y cambiar la linea que contiene el numero 2000:

" /d exch def\n %% Still need to pop diam off stack\n"\
" d 2000 gt {\n"\
" /d 2000 def\n %% But override it to 0.2mm\n"\
" } if\n"\

 En este caso, 2000 significará 0,2 mm. Para hacer los agujeros de 0,3mm usaremos el valor 3000, y así.

Esta modificación agregara 3 opciones al CAM processor: EPS-Drillaid, PS-Drillad, y PS-Drillaid_INVERTED. Esta última es la que yo uso para el método de transferencia, que requiere una imagen en negativo.

Ventajas y desventajas de cada método

Las dos soluciones tienen cada una un problema. El método 1 requerirá, si se mueven o agregan componentes, de que se borren los circulos en la capa 116, y se vuelva a ejecutar el script en cada modificación, y además, no es compatible con la exportación mediante CAM processor.

La opción 2 es mas compleja. Requiere modificar un archivo de Eagle, y esto deberemos hacerlo en cada instalación. Como ventaja tiene que funcionará con cualquier layout, y no es necesario modificar nada en la PCB. Simplemente se exporta y todos los pads tendrán el diametro mínimo.

En lo personal, prefiero el segundo método ya que da mejores resultados con mi impresora.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *