Eagle fif


Når man anvender Eagle til hjemmefremstilling af print, er det at få et ordentligt udgangs materiale ikke lige til.

Man støder ind i følgende problemer (Eagle version 6.5.0):
- Alt for grov opløsning når man printer boardet.
- Genererer man i stedet PNG filer, er der flere problemer som manglende huller, nogen gange pixel fejl.
- Det er svært at bore printet, hullerne er alt for store til at hjælpe med centrering.
- Der ætses huller både på overside og underside hvilket øger kravene til alignment.

For at løse dette, har jeg lavet et ULP og et SCR program, som afhjælper disse problemer. Programmerne listes nederst.

Jeg har en laser printer, som kan printe med 1200 dpi, som er en OK opløsning til mine print.

For at generere PNG filerne til printeren, kører jeg skriptet generate-png.scr. Dette kalder bl.a. a-drill-aid.ulp, som er en videreudvikling af Eagles drill-aid.ulp.

Resultatet er et toplag med 0,4 mm huller hvor der skal bores, virker fint som centrerings middel til 0,8 mm bor. Bundlaget har via pads uden huller. Det betyder, at der er mere kobber hvis top og bundlag ikke er godt alignet.

Man skal (desværre) selv editere filerne for at spejlvende top lag og stopmaske, og alle filerne skal farve inverteres.

Resultater

Det resulterende top og bund lag vises her i 1/8 af opløsningen (hullerne i venstre billede er mindre i virkeligheden, mindre end de små sorte prikker i højre billede):

SCR programmet

display none 116 117 118;
group all;
delete (> 0 0);
group;
# Make layers drillAidInner, drillAidOuter and holeFill
run a-drill-aid.ulp
grid mm;
display none Vias Bottom Pads holeFill;
RATSNEST;
EXPORT IMAGE copperBottom.png MONOCHROME 1200;
# Make small holes in the top layer vias for better manual drilling
display none Vias Top Pads drillAidOuter drillAidInner;
RATSNEST;
EXPORT IMAGE copperTop.png MONOCHROME 1200;
SET FILL_LAYER tStop solid;
display none tStop;
EXPORT IMAGE stopTop.png MONOCHROME 1200;
SET FILL_LAYER bStop solid;
display none bStop;
EXPORT IMAGE stopBottom.png MONOCHROME 1200;

ULP programmet

real fillDiameter = 0.8; // diameter of the via holes
real drillAidDiameter = 0.4; // diameter of the drill aid hole

string cmd = "GRID mm;\n";
cmd += "Layer 116 holeFill;\nSET FILL_LAYER holeFill solid;\nSET COLOR_LAYER holeFill 2;\n";
cmd += "Layer 117 drillAidInner;\nSET FILL_LAYER drillAidInner solid;\nSET COLOR_LAYER drillAidInner 0;\n";
cmd += "Layer 118 drillAidOuter;\nSET FILL_LAYER drillAidOuter solid;\nSET COLOR_LAYER drillAidOuter 2;\n";

void center(int x, int y) {
string h;
cmd += "change layer holeFill;\n";
sprintf(h, "circle %.3f (%.3f %.3f) (%.3f %.3f) ;\n",
0.0,
u2mm(x), u2mm(y), u2mm(x) + fillDiameter / 2, u2mm(y) );
cmd += h;
cmd += "change layer drillAidInner;\n";
sprintf(h, "circle %.3f (%.3f %.3f) (%.3f %.3f) ;\n",
0.0,
u2mm(x), u2mm(y), u2mm(x) + fillDiameter / 2, u2mm(y) );
cmd += h;
cmd += "change layer drillAidOuter;\n";
real width = drillAidDiameter / 2 + 0.5;
real radius = (drillAidDiameter + width) / 2;
sprintf(h, "circle %.3f (%.3f %.3f) (%.3f %.3f) ;\n",
width,
u2mm(x), u2mm(y), u2mm(x) + radius, u2mm(y) );
cmd += h;
return;
}

if (board) board(B) {
B.holes(L) {
center(L.x, L.y);
}
B.elements(E) {
E.package.holes(H) {
center(H.x, H.y);
}
E.package.contacts(C) {
if (C.pad) {
center(C.pad.x, C.pad.y);
}
}
}
B.signals(S) {
S.vias(V) {
center(V.x, V.y);
}
}
exit (cmd);
}

else dlgMessageBox("Start this ULP in a Board!", "OK");
exit (0);