Skip to main content

Drawing Robot v2

Version 2 of the drawing robot.  
I have been working on a new drawing robot.  I am now working on version 4, so I thought it was a good idea to document what happened with version 2.  Version 3 only made it half way through development before I decided to move on to a very different approach. 
The idea is to make the robot able to respond to the material qualities of drawing, such as the roughness of a surface or the hardness of pencils, etc.  Ordinary pen plotters, such as the AxiDraw, cannot do this.  Pen plotters are typically designed to be very precise drawing machines, receiving movement instructions from a computer and then following them.  In effect, a pen plotter has no idea if it even has a pen or if it is touching the drawing surface - it just does what it is told to do.  In contrast, the drawing robot I am working on will have a higher level of autonomy and intelligence.  Ultimately, I want the drawing robot to respond to the materials by itself.  To do this, the robot needs to have sensors to both perceive material qualities, and to also be able to move with a softness.  A good test will be for the robot to use a pencil without snapping the lead, whilst also compensating for the gradual wear down of the pencil.   This seems trivial to us, but it is a difficult problem to solve within a robotic system.  

For this robot I am using a delta design.  Most pen plotters are Cartesian, meaning that their moving parts travel exactly along the x and y axis, and occasionally a small amount of movement in the z axis to move a pen on and off a page.  The Cartesian design is good because it is mechanically quite simple and therefore easier to make rigid, which is important if you want a precise drawing machine.  For the drawing robot I am working on, I am placing a higher emphasis on the speed and acceleration of the robot.  I am interested in how movement and gesture can enrich drawing.  It is also important that the robot will be able to respond quickly and dynamically to any changes in the material (such as, crumbling charcoal).   I am interested in how a machine such as a robot can lend itself to expression, rather than precision.

The lightweight drawing part of the robot.
A delta design is a good choice for speed because all the heavy parts of the robot are located away from the final part of the machine that moves.  This means that there is less of a problem with momentum, and the robot can change direction very quickly.  I think this will be important for drawing.  We can observe how quickly we move when we scribble and shade in.  Usually this is very quick back and forth movements.  The delta design also provides quite a bit of movement in the z direction (up and down).  I will probably get this robot to experiment with calligraphy and painting, so versatility in three dimension is interesting as well. 

Often, drawing machines and robots in the arts have been made to look a little like humans (anthropomorphic).  There may be something to learn from building drawing robots with similar physiology to us.  However, most robots do not have antagonistic pairs of muscles (and other such properties) such as humans do, so the approximation to human physiology and processes is poor.  Some of the projects to develop drawing machines and robots in the arts have also not been shy to admit that the human appearance of their system adds theatrical value.  For this project, I am more interested in investigating how the robot can generate new forms of expression in the visual arts, and I have a research interest behind the how and why such work may be compelling.  Perhaps the robot will be its own theatrical spectacle, without leaning on anthropomorphism.     

Assembly for DC motor, encoder and mechanism.
Version 2 of the drawing robot used DC motors and rotary encoders.  Usually stepper motors are used in these types of computer-numerical-control (CNC) machines.  The AxiDraw uses stepper motors.  Stepper motors are convenient because you can count the steps you have made with the motor to keep track of the machine position.  Stepper motors are also good at holding a position a fixed position.  In contrast, DC motors are typically used to rotate at a high speed.  I decided to experiment with DC motors because I wanted to solve some software problems I might have later by solving them in hardware. 
A key part of this project is that the robot can move softly.  If the robot was drawing on a rough surface, the motors would need to be soft enough to ride over the bumps.  In this scenario, the ability of a stepper motor to firmly hold a position is not so desirable.  Pushing back against the normal rotation of a motor is called back-driving, and in robotics it can be used to create compliant motion.  Baxter is an example of a robot that has compliant actuators.  Because a stepper motor is designed to holds a position, if it is back-driven, it suddenly jumps to the next step position.  This is phenomenon is called cogging and it creates very juddering motor movement.  It also creates the software problem of reducing cogging, and handling the steps required to get back to the original position.  In contrast, DC motors are driven with a continuous analogue signal that varies the power to the motor.  In conjunction with a rotary encoder, the motor can be used with this varying power to 'fight' to get to a target position on the rotary encoder.  

Base board and motor assembly from above.
To use a DC motor in this way they must typically be geared down.  In fact, the common RC Servo motor works with a DC motor, encoder and gearbox in this way.  A gear box is required because DC motors are designed to rotate at high speed, and this must be geared down to create a usable, relatively slower, positioning force from the DC motor.  Gearing creates a new problem though, because they work by transmitting power in one direction, and they are therefore not good for back-driving.  For this project then, I bought some relatively large DC motors and attempted to use them without gearing.  Version 1 of the drawing robot had no gears, but the motors did not have enough torque (force) to move the robot.  As a half-way measure, I used a pulley mechanism to provide reduction gearing, but to permit the motor to be easily back-driven.   I used a 16 tooth pulley on the motor shaft and a 60 tooth pulley on the mechanism, providing a 3.75:1 reduction.  This was sufficient to move the robot.
Adjustment screws to alter the belt tension.
I was quite happy with the compliance, or softness, I was able to get from the motors.  I used a conventional PID control loop to control the motor positions.   I adjusted the PI gain terms to make the motors more or less aggressive in holding their position against external forces.  An interesting problem came up though.  Because the motors generate more force when they rotate quickly, and less when they rotate slowly, they were not effective when moving from a static held position.  Whilst the motors were able to hold a position, they would lurch to a new target position.  And so, once moving, they required significant dampening in order not to overshoot their target position.

Overall, working to remedy this problem started to feel futile because the motors were on the very threshold of being able to hold their position.  I also noticed that when the motors were required to move quickly, too many pulses from the encoder were interrupting the Arduino.  With the reduction gearing, the three motors were generating almost 4 times as many encoder pulses.  It became obvious I would need to upgrade from an Arduino to something more powerful.  Added to this motor control problem, I became unhappy with the added complexity in the design of the pulleys. 

I used 12v DC motors from RS Online, and 2048cpr encoders from Mouser