I have tried making PCBs in so many ways: with marker pen, whitch is too much hand work. With photo sensitive spray where results seem to fail. Finally I did get tired of this and bought CNC Mill. The main purpose for me was making PCB but of course this can be used for many other thing too. The mill I bought is MAXNC 10 OL. This is nice hobby mill for just things like this. But mechanical etching with mill was not easy as I first thought. The biggest problem I bumb in to was that the BCP attached to mill table was not straight. With little bigger boards, attached in both ends, the board raises at the midle. Not much, maybe 0.2mm but that is enought if you have via that is 0.4mm and 60 deg cutter bit. When this hapens, via is gone and what you have there after that is some ugly jumper wire fix.. So my idea for fixing this was to measure board heights from several points and compensate this height difference in milling program. To do this I wrote some code and did some hardware too.
In picture below you see my 'measure probe'. It is actually network webcam (D-Link DCS-900) that is taking pictures from digital micrometer. I did not use the gap in micrometer at all, instead I use the other end of the measure bar. My original plan was to solder wires to micrometer but it was so small print that I did not feel that it was possible, at least not without breaking it. So I settle for less stable solution of webcam taking pictures of LCD screen and process the image with software. Threre is also green led (painted black) at top of micrometer. It is connected to spindle outlet, it is used to send image processing computer a message that we are now at measure point, take a measure. Click picture to see full image.
For designing PCBs I use Eagle. For export to G-code I use ULP programs found at http://cncwiki.eriskouma.com/cncwiki/pcb_manufacture.html. In bottom of the page.
My software consists two parts, the first one is cncFix. The cncFix has following parameters:
cncFix --filegen maxx maxy step gcodefile answerfile
cncFix --fix answerfile yourcncfile
You use --filegen to generate G-code file to take measurements and empty answer file. After you have filled answer file some way, you run --fix with that answer file and and cnc file you generated in eagle. The answer file contains coordinates and height of the board relative to (x=0,y=0) point. I think cncFix only supports G-code generated by eriskourma.com's ULP programs, but not sure about this.
The other software is CNCMittari, this program connects to webcam and analyzes images it receives. If greed led is on, it takes measurement and saves it. After all measurements are done, there is buttons to patch answer file with correct numbers. This code is highly depend on micrometer: it scans white borders around LCD to find out where LCD is located. After that it picks points where segment centers are and compares colors to figure out if segment is on or not. So this is code you are not likely to use. Better aproach would be use real measure brope. Maybe I build one some day and change to that, but this is as it is now. Of course you can attach measure dial to your mill and fill answer file by hand. This is what I did before this code. Picture of CNCMittari here.
Process of milling one sided board
1. Attach board to mill table. Mark your zero point to board. Run mill to zero point so that micrometer is center of its measurement area. for example it shows -5.00mm. Zero all axis of mill. this is our X=0,Y=0,Z=0 point.
2. Measure the working area. For example width=4.30 heigth=2,25. Run: cncFix --filegen 4,30 2,25 1 measure.g board.ans
3. Start CNCMittari, check checkbox1 and press load image button. CNCMittari is now processing images.
4. Run measure.g program on your mill. Watch CNCMittari collect measurements.
5. After step 4 is done, patch answers to board.ans.
5. Run 3outlines_gcode_excel_mirrored.ulp on eagle, save results work.out
6. Run cncFix.exe --fix board.ans work.out > newwork.out
7. Attach etching bit to mill, run mill so that bit barely touches your marked zero on board. Zero all axis.
8. Run newwork.out with your mill.
9. Replace bit with a drilling bit.
10. Run 1nc-drill_gcode.ulp on eagle. Save results as work.drl
11. With notepad do search and replace Y- to Y for work.drl. This 'flips the board around'. The drill code is ment for drilling from component side, but there is no point flipping board phisically if you are doing one sided board.
12. Run work.drl with your mill.
This is my current process. I do have some improvements in mind:
1. Buy or build digitizer proben and use it to measurements. I think it is more stable and standard solution.
2. Use and possible integrate compensation code with pcbgcode.org software. They seem to have more advanced G-code generator than the one I am currently using.
And one trick to the end: It you have trouble with cutter cutting too thin(not removing enough copper) you can spray some old photo sensitive spray before milling. Now you can use chemical etching after milling. The mill usually scraches the spray off so it can be finised chemically.