This post explains my process for creating relatively good quality double-sided printed circuit boards. I use these to test prototypes before sending them off to get professionally made in batches. My process is no way near as good as a professional service as I cannot easily add solder masks or silk screens to the boards. I generally only make PCBs for a few prototypes to make sure the components fit and I have not made any errors and that the circuit works.
To do this I use KiCad to design the PCB from the schematic and I use HeeksCNC to convert the drill file into g-code, both of which are open-source and multi-platform. I use EMC2 to control my CNC machine, another open-source program.
First I create the PCB in KiCad. I then print off the front and back sides of the board. I print these to tracing paper, which will be used as the negative to expose the board.
I also create a drill file. To do this click File -> Fabrication Outputs -> Drill File. This will bring up a pop-up window. I change the drill units to millimeters (my CNC machine is set-up in millimeters) and I click to say “minimal header” (as shown in the screen shot below) and then click save. Choose a filename. Drill files are usually in Excellon file format.
Create g-code for CNC
Now we open HeeksCNC. Use File -> Import (do not try to open the drill file with HeeksCNC as my version always crashes). Import the drill file you just made. You will then see a whole load of Xs which mark all the drill points (you might have top zoom out quite a bit, or click the auto-zoom button).
We need to make sure that they are all the correct size. I drill my vias with a 0.6mm drill bit (small!) and through hole components with a 0.8mm drill bit. There may also be some 1.0mm and 1.2mm holes. I generally drill all at 0.8mm and then check to see which components need larger holes and add these as a separate machining process.
The vias and the other holes will come in as different drilling actions, which can be highlighted by clicking on the relevant operations.
I select everything and move the drill holes to close to the origin. The origin will be the 0,0 point for my CNC machine so I try and get the top left hand corner of the board as the origin.
We now want to select some drill points. Either use the area select tool, or click on each one individually, while holding down the control key.
Then click Machining -> Add new Milling Operation -> Drilling Operation.
This will add a new operation to the list of operations shown in the ‘Objects’ window. You can set the parameters, such as drill size and depth from the ‘Properties’ window. You can have any number of drilling operations. I do one set with 0.6mm, one with 0.8mm etc etc. Using a different tool means that the CNC machine will stop and ask for a new tool size. I can then change it (an auto tool changer for my CNC would be amazing….).
You can also add any milling operations. Sometimes I mill the PCB edges or a large hole in the PCB, sometimes I use my PCB guillotine.
Once this is done, you go to Machining -> Post-Process and this will generate the g-code for the CNC machine. This will be saved in the folder when the heeks file is saved.
Top tip: For HeeksCNC I save often, as I have had the program crash when post processing or operations added and have lost lots of work this way. I now click save after every modification.
Drilling holes with CNC
I open up EMC2 on my dedicated CNC computer (running a real-time api version of Ubuntu). I do not do anything else with this machine apart from use EMC2 to control the CNC. It is an old desktop which works well but struggles a bit if you try and do too much extra with it. I use a flash drive to move the program to this machine and do not save anything to the hard drive, even though these files are small. I can directly open my g-code in EMC2. Sometimes I have not set up the tools correctly. HeeksCNC will set a tool number for each operation. If this does not match a tool in the EMC2 tool library then you cannot open up the g-code. To solve this you must open the tool list in EMC2, add the correct tool number and give it a drill size. You can then re-open the g-code file and it should work. I’m sure I should be more organised with this, but it seems to work OK, especially as I do not have a tool auto-changer.
I align a piece of double sided photo resist PCB board onto the CNC work area, with scrap wood underneath (to stop it drilling into the CNC platform). This is clamped down well in at least 3 or 4 places.
I insert the correct first tool, set the machine running and drill all the first holes. It will then stop and ask for a tool change. This is a bit of a hassle, but OK for small runs. I stop the spindle, manually move the drill up (change the Z axis), fit the drill bit, then move the Z axis down to the initial position (usually 5mm above the work surface). This is easily done by using an off-cut of 5mm acrylic and moving the drill bit down until it just touches, then removing the off-cut. With drilling the height is not so critical, as it goes through the board and into the wood a bit anyway.
Here are some photos of the CNC in progress:
PCB UV exposure
The nest step is to use the PCB design to expose the photo resist board and hence get the correct copper resist pattern. This needs to be very accurately aligned and hence carefully done.
I print the designs for my two sides of the PCB onto tracing paper using a laser printer. You want very even and dark ink.
We then peel back the covering from the board (the black plastic covering, which stops any UV light degrading the photo resist.
My alignment procedure is not so good. Basically I just hold he design and the board up to the light and ensure that all the holes are in the right place. I then use masking tape to hold the PCB mask onto the board. Ensure it does not move when you do this (this has ruined some boards for me before). Also ensure you have both PCB designs the correct orientation. I print some text on each side to ensure that it is correct – if you can read the text then the design is the right way around.
The board and mask is then exposed to UV light for around 3-4mins. This is a home-brew UV exposure unit, made from an old scanner.
Do both sides of the PCB like this. The rest of the process is just normal PCB developing and etching. I’m not going into too much detail here as there are good guides available, such as here and here.
We develop the board using photo resist developing fluid.
Here you can see the etch mask left on the board, with the copper showing through.
We now etch the board in a heated bubble etch tank. This takes anywhere from 5mins to 20mins.
Here you can see some copper removed and some still left – this board needs more time to etch.
And here is the final board:
I get OK resolution from this (generally I keep tracks >20mil wide as I have problems if they are smaller).
I put a piece of uncoated wire through the 0.6mm vias. This is then soldered on both sides to join from top to bottom.
One of the major failing of this technique is that none of the holes are through-hole plated. This means that you must ensure all solder connections are on the back copper side. This makes for a slightly messy design, which has to be changed for production batches. There are through-hole via links and techniques I could use, but I have not yet tried them.
Hope that is interesting to someone trying to do the same thing.
Last bit of advice – it is a big hassle to do this. I only do it to prove a board works before spending the money on getting production batches made up. A production process has much better tolerances and can add things like solder mask, through hole plating and silk-screen.