Modifying the DaVinci 3D Printer
Modifying the DaVinci 3D Printer


XYZPrinting puts out a nice printer “DaVinci” with an enclosed build platform (helps immensely with build quality). Unfortunately the software that comes with it is abusive to the end-user, but we can put it our own stack! Caveat: the ABS spools that the company sells (high-quality product, by the way) cause the machine to destroy itself if you run the machine past the end of the spool… which wouldn’t happen if one just used their software. So long as you don’t run the machine while you sleep, I’ve run out two spools without too many problems.

The DaVinci is designed to plug in via USB so the user can send their files over for printing. The software that ships with the printer also uses this interface to update the firmware of the printer, which may or may not be in the user’s interest. Since we’re going to use our own software stack, we’ll just ignore the USB interface.
Block the USB port so noone foolishly plugs the machine into a computer
Pictured: Signal to users that this printer should never be plugged in by USB.

This printer is basically a reprap clone, and will run slightly modified gcode that standard tools (such as Slic3r [settings file]) can produce. If the factory-installed firmware is old enough, you can remove the SD card from the control board, overwrite one of the three demo prints, and use the “Build Sample” interface from the menu on the front of the machine to make arbitrary prints.
Removing a bit of plastic from the hinge makes it easier to remove the back access panel
Pictured: A coping saw removes a small amount of plastic from the hinge.

After opening the back access panel and removing all of the screws, the SD card can be removed
Pictured: The stock SD Card is accessible after removing all screws (Torx T10) from the control board.

Replace the SD Card with an SD Card extender
Pictured: An “SD Card extender” is installed to make the SD Card easier to acccess.

I printed a few cubes using this method, and found the printer would slightly over or underprint dimensions fairly consistently. I tried scaling a few objects by my observed dimensions, and have been super satisfied with the results so far! I either apply them directly when modeling, or by loading an .stl into OpenSCAD and applying global scaling:

sx = 15.92/16.0;
sy = 16.30/16.0;
sz = 14.88/16.0 * 93.0/88.0;
scale([sx, sy, sz])
	import("file.stl", convexity=3);

ABS dissolved in acetone is used to adhere the printed object to the bed
Pictured: The ABS juice method was used to keep the object adhered to the bed.

A printed cube in the dimensions specified, after printer calibration
Pictured: A post-calibration, perfectly dimensioned cube!

After testing the method, it was time to get down to business and write some tools to help me go from an .stl to a printed object! First up was a script that took standard Slic3r gcode and made it palatable for the DaVinci:

HEADER='; filename = composition.3w
; machine = daVinciF10
; material = abs
; layer_height = 0.3
; total_layers = 173
; total_filament = 0.00
; extruder = 1
G21 ; set units to millimeters
M190 S85 ; wait for bed temperature to be reached
M104 S225 ; set temperature
M109 S225 ; wait for temperature to be reached
G90 ; use absolute coordinates
G92 E0
M82 ; use absolute distances for extrusion
G1 F1800.000 E-1.00000
G92 E0
G1 Z0.600 F3600.000'

echo "$HEADER" > "$OUTPUT"
sed -e '1,/G1 Z0.600 F3600.000/ d' "$FILE" >> "$OUTPUT"

Next, I swapped out the stock SD card for one of Toshiba’s “FlashAir” wireless-enabled SD cards and wrote up a tool to upload files to it:

import argparse
import requests # pip install requests
parser = argparse.ArgumentParser()
parser.add_argument('filename', help='basename of output file')
parser.add_argument('url', help='basename of output file')
args = parser.parse_args()
with open(args.filename, 'rb') as f:
	r =, files={'file': f})

Then, I tied everything together with a VM I named ‘davinci’ to hold all of my tools and wrote a script to upload an .stl from any computer:

set -e # immediately exit if any child command returns nonzero

function echo_stderr
	echo "$1" 1>&2

if [ $# -lt 1 ]; then
	echo_stderr "usage: $0 model.stl"
	exit 1

if [ ! -f "$1" ]; then
	echo_stderr "$1 not a file!"
	exit 1

NAME=$(basename "$1")

CHECKSERVER='ping -c 1 davinci'
echo_stderr "$CHECKSERVER"

CHECKPRINTER='ssh davinci ping -c 1 printer'
echo_stderr "$CHECKPRINTER"

SCP='scp '
SCP+=' davinci:/tmp/'
echo_stderr "$SCP"

SLICE='ssh davinci slic3r /tmp/'
SLICE+=' --load /etc/slic3r.ini --output /tmp/'
echo_stderr "$SLICE"

CONVERT='ssh davinci /usr/local/bin/convert-gcode /tmp/'
echo_stderr "$CONVERT"

UPLOAD='ssh davinci python /usr/local/bin/ /home/matti/SAMPLE01.gcode'
UPLOAD+=' http://printer/upload.cgi'
echo_stderr "$UPLOAD"

Leave a Comment?

Send me an email, then I'll place our discussion on this page (with your permission).

Return | About/Contact