Assembly is straightforward but takes a while. Comes with all the tools you need. Everything is metric. I recommend labeling the screw packets before starting so you know which size is which.
I ended up tightening the drive belts after initial assembly, which is tough to do. I used vise grips to help.
I also added a couple washers (of my own) to the pen mechanism to reduce slop. On either side of the arm that raises / lowers the pen.
There are two software packages, one is Windows only (Benbox) and the other is cross-platform (mDraw). I've only used mDraw. Each ships with its own firmware I think.
Their software is crappy but good enough as a starting point. It's easy to roll your own software in any language that can connect to the serial port. Baud rate is 115200.
Their firmware is also on GitHub (and a modified version in my xy repo). It's super basic so that's something else you can tweak if needed.
I usually use this paper, I prefer the vellum surface:
http://www.strathmoreartist.com/draw-bristol/300-series-bristol.html
And these pens:
From the local craft store. Anything similar should be fine. The pens come in different sizes. Keep the cap on the pen when not in use, they dry up fast.
I use double sided tape underneath the paper I'm drawing on. Initially I just taped down the corners but if the paper lifts up off the surface of the table, even just a little, the pen will leave stray marks where it shouldn't be marking as it raises / lowers.
The pen servo takes an angular position, 0 - 180 degrees. You basically set an up value and a down value in the software.
The important GCodes for the default firmware:
G28
Go Home - move both axes until limit switches are hit and set internal position to (0, 0). The firmware doesn't differentiate between the min and max limit switches, which is dumb.
G0|G1 [X<xpos>] [Y<ypos>]
G0 and G1 are identical. Move in a straight line to the specified (absolute) point.
G0 X10 Y10
Go to (10, 10). Units are millimeters. Working area is about 315 x 380mm.
G0 X100
Go to (100, Y) where Y is the current Y value.
M1 <angle>
Set servo position.
M1 0
M1 50
The firmware can only handle one GCode at a time. So you have to wait for an OK
response before sending the next command.
I've supplemented these directions with additional information: https://gist.github.com/heavysixer/511a7019a3c009027b83