Little robots with Arduino

My second experiment (first is here ) to make Art o something similar with Arduino, is the Dadaist Poetry Box.

It’s made ​​with an Arduino using a printer for receipts to write poem. The box composes the poems in autonomy, thanks to an algorithm that has been implemented on the Arduino. Push the button and here your dadaist poem. Each poem is different from the previous. It is original, new. Just press a button, and comes out a poem. Simple, immediate, trivial.

Normally, the poem is a valuable asset, is the result of an intimate moment, when the poet transposes on paper the emotions of his soul. It ‘an act inspired, an act of concentration and transport. It’s not immediate. The poem box instead is trivial, it seems almost anti-poem. But not, it’s Dadaist poem. In one of his writings, the famous poet Tristan Tzara, one of the major poets Dadaists, describes how to produce a Dadaist poem. The pass following explains their way to proceed:

Take a newspaper.

Take some scissors.

Choose from this paper an article the length you want to make your poem.

Cut out the article.

Next carefully cut out each of the words that make up this article and put them all in a bag.

Shake gently.

Next take out each cutting one after the other.

Copy conscientiously in the order in which they left the bag.

The poem will resemble you.

And there you are—an infinitely original author of charming sensibility, even though unappreciated by the vulgar herd.

The Dadaist poetry box is based on Arduino Uno. These are the components:

– Arduino Uno

– Sparkfun thermal printer

– A big button

The program is based on pre-defined verses, that Arduino choices with an random alghoritm. The thermal printer is drove by the Arduino, using the SoftwareSerial library. The verses are stored in the program memory of Arduino (almost 7 kb).

The verses are in italian, so if you want the English language, you have to rewrite all the verses!

I’m often thinking if it is possible to make Art with Arduino. Arduino is a machine, a little computer made with electronic circuits. It hasn’t a soul. Can an Arduino make Art? This is my question.

I’m trying to do something with Arduino that could be Art, or similar to Art. The Arts are painting, poetry, music, sculpture and so on. I’m trying to do something in different Arts. The road is long but I began to travel it. This is my first experiment with painting. Indeed, a easy form of painting, the sketching in Black and White. Arduino drives a robot arm, that with only a pen sketches a city skyline. The skyline is every time different, the buildings are always different. The arm tries to imitate the human sketching, with errors, shaking lines not parallel and so on. The arm tries to be human, to make a little form of Art. This is the goal, I don’t know if the goal is reached. The judgment is yours.

The robotic arms are among the most fascinating robot that you can build. There are many commercial robotic arms with 4-5-6 axes, while, at amateur level, there are no polar arms.

The arms using polar, instead of Cartesian coordinates (x and y), the polar coordinates (angle and radius).

So, the point P(x,y) in polar coordinates became P(r,phi). This means a line, which in polar coordinates is described by a very simple equation, in polar coordinates becomes a complex and more difficult, because the radius can increase and decrease while describing the line.

So, which is the advantage using the polar coordinates? The advantage is the robot is very simple to build. I used also an awesome aluminum infrastructure based on Makerbeam (www.makerbeam.eu) , that allows to build the robot similar to the Lego, with the advantage that all is in metal and not in plastic. Makerbeam is an open-sourced extruded beam construction kit. I got a kit, and this is my first project using it.

The hardware is:

– 1 arduino (2009/uno or Mega)

– a kit of makerbeam for the chassis and 16 ball bearings (www.makerbeam.eu)

– 2 stepper nema 17 400 steps, 0.9° (www.robot-italy.com)

– 2 big easy stepper driver (www.robot-italy.com)

– 2 pignons and 1 gear rack (www.conrad.com)

– 1 little servo motor (www.robot-italy.com)

– 1 pen

This is the robot:

The robot has 2 dof: radius and angle. The forward and inverse kinematics are simple.

The only two shapes that are possible to draw when running one motor at a time is a radial line or a circle segment. The Arduino program implements sort of the Bresenham’s line drawing algorithm to draw segments. Each segment is divided into small segments (steps). Then, for each step we translate this movement to its corresponding changes in the polar coordinate system, angle and radius. This is finally translated to the number of steps to run each motor.

The robot can have a good precision: the balance is between good speed and good precision. If the robot has a low speed it can be very very precise. When the speed grow the precision goes down. But in this work the precision is not very important. The goal is to imitate a human sketch, and the human when are sketching are not precise.

For the sketch algorithm I’m inspired by this processing sketch: http://www.openprocessing.org/sketch/12095 semplified for Arduino. The robot can work alone, without a computer, all the logic is inside the Arduino.

I bought some time ago a couple of motors from Dongbu: the Herkulex DRS-0101. These motors are ‘smart’ because they have inside a microprocessor that allow to manage many parameters and the behavior of the motors.

The Herkulex are an alternative to more famous motors like the Dynamixel. They have 4 wires and can be drove by a simple microprocessor with a UART (serial) port. My choice is to control them with an Arduino, so I wrote a simple library supporting all the most common Herkulex functionalities.

For the wiring of Herkulex to Arduino, it is important to consider that it is necessary to dedicate a serial port to the communication Arduino-Herkulex.It is not possible (or is not advisable) to use the standard Arduino port because it is dedicated to communication between PC and Arduino to see the values in the serial monitor. So it is important to use another serial port.

For the Arduino Mega it is easy, because the Mega has 4 serial ports, for the Arduino Uno/2009 that has only one serial port, it is mandatory to use a software serial port. So a library called SoftwareSerial has to be included if we want to use the Arduino Uno/2009.

To do this the last version of SoftwareSerial is not useful, so I included in the library also the right SoftwareSerial version in order to work well with Arduino Uno/2009.

For general knowledge about the Herkulex Dongbu motors, please see the manual: here

start the communication between Arduino Mega and Herkulex using the Serial Port 1

beginSerial2(long baud)

start the communication between Arduino Mega and Herkulex using the Serial Port 2

beginSerial3(long baud)

start the communication between Arduino Mega and Herkulex using the Serial Port 3

end()

stop the communication between Arduino and Herkulex

initialize()

initialize all the motors

stat(int servoID)

ask for the motor status to control the errors

ACK(int valueACK)

set the answer of the motors to a request (verbose or not verbose)

set_ID(int ID_Old, int ID_New)

change the ID of the motor

clearError(int servoID)

clear the motor error

torqueON(int servoID)

set the motor torque to ON

torqueOFF(int servoID)

set the motor torque to OFF

moveAll(int servoID, int Goal, int iLed)

prepare the motors to execute the movement in the same time to position (same start time – end time) – unison movement

moveAllAngle(int servoID, float angle, int iLed)

prepare the motors to execute the movement in the same time to angle (same start time – end time) – unison movement

moveSpeedAll(int servoID, int Goal, int iLed)

prepare the motors to execute the movement in continuous rotation with same start time and end time – unison movement

actionAll(int pTime)

execute the unison movement

moveSpeedOne(int servoID, int Goal, int pTime, int iLed)

motor continuous rotation with a specified speed

moveOne(int servoID, int Goal, int pTime, int iLed)

move one motor to an absolute position

moveOneAngle(int servoID, float angle, int pTime, int iLed)

move one motor to an angle

getPosition(int servoID)

get the motor position

getAngle(int servoID)

get the position in degrees

getSpeed(int servoID)

get the motor speed (continuous rotation)

reboot(int servoID)

reboot the motor

setLed(int servoID, int valueLed)

set the led color

writeRegistryRAM(int servoID, int address, int writeByte)

write a value in a register in the RAM memory

writeRegistryEEP(int servoID, int address, int writeByte)

write a value in a register in the ROM memory

I think the Herkulex are a good motors. My tests are not very deep and I don’t stressed the motors, but in general, compared to Dynamixel, I think they are good. The big difference is the possibility to set a large variety of parameters and the possibility to start and stop the movement for all the motors at the same time leaving to motors the definition of acceleration and speed needed to cover the distance assigned in the same time frame. Some time I experimented problems with the Serial port, receiving the data, I tried to limit them in the library, but sometimes these problems are present yet. This depends by the Herkulex motors, not by my library.

These are the details of each command.

begin

Command

void begin(long baud, int rx, int tx)

Description

start the communication between Arduino Uno/2009 and Herkulex

Arduino Type

Arduino Uno/2009

Input

Baud: speed of the Serial Port: it is mandatory to use this value: 57600. Other values supported are: 115200 but in my experience it doesn’t work well with the Arduino Uno/2009

rx, tx: receive and transmit pins. The receiving pin on Arduino has to be wired with the transmission pin on the Herkulex. The same for the receiving pin.