Although there is much in my process that requires refinement,

Although there is much in my process that requires refinement, I am now able to consistently make very usable, two-sided, 4" x 6" circuit boards (which I find much more challenging than the smaller ones).
Here is the top side. I would appreciate any critique, but from my perspective, the holes are all well-centered and the isolation traces are all clean (unlike earlier attempts, which came out with jagged edges and inconsistent depth, this is exactly how it came out of the CNC – no standing, touch-up, or even re-running individual sections),

And here is the bottom. The holes are not quite centered, but are entirely within traces. I believe the problem is that I need to fine-tune my algorithm that adjusts X coordinates to compensate for my machine’s lack of exact perpendicularity. I had ignored the need to adjust the y-coordinate, and my measurement of the x-offset wasn’t done carefully – I just wanted to see if I could make it work.

The board does look really nice, but yes I can see those holes off on the bottom side. Do you think when you flip the board that what’s really needed is fiducial alignment with a camera and OpenCV to calculate offsets? It seems more that your board was rotated a tiny bit rather than your CNC machine possibly not being perpendicular. If a hole is detected at each corner a rotation could be calculated and we may get closer to perfect results from ChiliPeppr then.

I think I have two problems.

First, as my earlier attempts demonstrated to me, even when all of the y=0 holes are perfectly lined up (and that part is easy), the y= max holes are significantly off in the X direction, which is exactly what I would expect if my machine were not perfectly perpendicular. So, if a Y=M hole is say a little to the right of where it should be if perfectly perpendicular, when the board is flipped over, the location of that hole will mirror to the left, while the machine thinks that the hole is skewed to the right (since the machine doesn’t know it is not perfectly perpendicular). To solve that problem, I have automated a correction factor to the G-Code for the bottom side of the board. The amount of that correction is proportionate to the Y value, so no correction is made where y=0 (and those hole continue to line up perfectly), but a full correction is applied at the top. Without the correction, the misalignment of the top holes is unacceptably large. But, my correction factor was not carefully measured - just something to get me in the ball park I suspect that with a little fine tuning, I can get the misalignment error arbitrarily close to zero.

The second problem I have is that, in positioning my board to cut the back side, and after recognizing that my correction still left a little error, I tried to position the board in such a way as to distribute the error, but I was not real careful in that process either. It does appear that I inadvertently introduced a little bit of rotational error, as well as some lateral error. Next time, I am going to set my reference holes at y=max/2. Those should line up perfectly (since my X-adjustment is identical for all values having the same y value), and any alignment error will be spread between the top and bottom.

I didn’t understand your suggestion about using a camera. The adjustment factor isn’t unique to any particular layout, but it is unique to my machine. Even so, I just have to carefully set it one time, and that should be the same factor for every board thereafter.
I am using the 4 alignment holes that you can see in the corner. As it is I can get the top 2 to match, or the bottom 2 (but not diagonals, because the lack of perpendicularity is essentially creating parallelograms),. With the correction I am applying, they come much closer (by perhaps a factor of 10) than without correction.

Using a camera obviates the need for reference holes. Essentially you mount a camera near the spindle and then snap the board. Software looks for known fiducial points and compares them against where they should be, then sets an origin and interpolates skew transformations on the intended positioning as needed

I just got my mill running yesterday with proper ball screws rather than warped M8 bars and unfortunately the first try bust three bits. Then i tried to mill some MDF to create a referenced flat base (i was getting different autoleveller data each pass on the same piece ) and found that the y sides of the pocket i were killing were very diagonal (0.6cm over 4 cm). So I’m assuming my X gantry is not remotely parallel to the y gantry. Which is odd because all the manual measurements i am doing suggest that everything is plumb and square!

I have not milled a double sided board yet, so haven’t experienced this much myself yet. You guys are making me worried my 3040 may not be perfectly perpendicular either. I’ve measured and it looks perfect. I keep thinking the only way to get really good accuracy on a flip is with camera-based hole detection. I agree you wouldn’t necessarily need fiducials if you can just line up the holes. I did get close a couple months ago to having an OpenCV server running on Google Compute Engine. I just never got it finished.

You can easily test. The bigger the board the better. Drill holes in the four corners, say 0,0 0,T, R,0 and R,T (where R and T are are the X value of the far right side of the board, and T is the Y value of the top). Then, flip the board over (horizontally), and place the board so that the holes at 0,0 and R,0 align perfectly with the positions you get when jogging there. Then jog to the top two positions. If you machine is perfectly aligned, the top positions will also match perfectly. If your machine is not perfectly aligned, they won’t match. But that misalignment can be easily accounted for by adjusting your bottom side G-Code. The misalignment is exactly proportionate to the Y value of any given hole. You know that your X and Y axises are not perpendicular because the diagonals of your 4 holes will not be identical (but the distance between the top holes will be the same as the distance between the bottom holes. And same thing with the distances between the side holes. .

Update: I did some fine-tuning on my x-axis adjustment factor to compensate for my machine’s lack of perfect perpendicularity in the X-Y plane. The holes are much more closely aligned, and unlike my prior attempt, in this case I lined up the holes at the bottom, even knowing that all of the error would be concentrated at the very top. So, if you look at the misalignment at the bottom, that is the result of a lack of perfect precision in my effort to position the board for cutting the bottom side. That error, which is some combination of X, Y and rotational is independent of the perpendicularity error. With that in mind, the additional error at the top of the board is (for me at least) almost imperceptible. I believe I have adequately solved my perpendicularity problem, at least for boards on this scale.

In comparing the before and after, it should be understood that I mirrored the top (and not the bottom – it fits my Arduino better that way), and drilled all of the holes from the bottom side (so alignment error is visible from the top side). Also, I am experimenting with feeds and speeds and recognize that the cuts on this board are not as smooth as my last attempt.

As always, all critique and suggestions are appreciated.