A CNC made from CDROM parts
Eagle C++ C
Switch branches/tags
Nothing to show
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
Software Update main.cpp Jul 9, 2014



I always wanted a fast way to make PCB prototype before send the project to a fabhouse and wait 2 or more months to see the result. This is why I built this CNC, it's made from cd-rom parts and was inspired viewing some similar projects on internet.



  • Cheap - Just three cd-rom drives, wood, screws/bolts, cheap electronics, wires and any pen
  • Compact - 20x15 cm of size and 35x38 mm of work area (varies from cd-rom), great for home use, small projects and SMDs
  • Functional - Print over paper/copper to do circuit boards or just print images
  • USB - Native Windows/Linux USB driver support, no serial/parallel port or drivers needed
  • Easy - Just connect the USB cable to PC and supply the step motor driver with +5 VDC and GND
  • Eagle - Support one of the most popular PCB software design Cadsoft Eagle PCB (with limitations)
  • Gerber - Support GERBER RS274X protocol (with limitations)
  • Precise - 0.147 mm virtual precision (varies from cd-rom motors, step motor driver, frame build quality...)
  • Code - Small, clean and simple code. You can easily change/adapt to your own project

What is used?


  • 1x Microchip PIC16F628A
  • 3x Easy Driver v4.4 Step Motor Driver
  • 1x PL2303HX USB-Serial TTL Converter
  • 3x CD-ROM Drives
  • Some wood/screws for frame and wires for electronics


  • Microsoft Windows 7
  • Bloodshed Dev-C++
  • Microchip MPlab 8.92
  • Hitech PICC Lite compiler
  • Cadsoft Eagle PCB 6.6.0
  • Microsoft Paint

How the whole thing works?


x00000y00000z1 - This is all what the firmware understand and need! Just send the X and Y coordinate in 'micrometer' unit and '1' or '2' for Z axis, where 1 = down and 2 = up.


The software connect to CNC through a serial connection of 9600 kbps, send commands and wait the CNC process (move the motors), when done, CNC will return back a flag to software (an ASCII '*'), and then the software can send the next command.


The software was built to work with files generated by eagle CAM processor using the 'GERBER_RS274X' as device. The limitation here is in the gerber rs274x protocol, I added support just to 'wire' tool of Eagle toolbox, that generate these type of gerber commands:
``` X000100Y000100D02* X000100Y013874D01* X013874Y013874D01* X013081Y013908D02* ``` And what this mean? To print anything you will need use the 'wire' tool or import an image (see below).

How to print images

First step is convert the image to monochrome bitmap, this can be done with Microsoft Paint, you need reduce the image size too (something between 35x35 and 300x300 pixels would be ok, where less pixels = fast print and script draw time, but low quality). Then at Eagle you must use a script that import this bitmap file and draw the image using the 'wire' tool. The default Eagle's script name is 'import_bmp.ulp', but it draw the image with the 'rectangle' tool (that is useless to my software), so I modified it to draw using the 'wire' tool. Details in the tutorial folder.