Skip to content

10. Open Source Hardware - From Fibers to Fabric

For this week, I chose to work with the Braccio robot arm from the Arduino Tinkerkit kit. The objective of this week is to assemble it and learn to control it in many ways. Then finally to cross this robot with traditional textile practices.


Arm robot Braccio


References & Inspiration

DiffeRug - Robot tufting - IAAC MAA2 Workshop april 2022 - Marielena Papandreou, Anastasia Pistofidou, Daniil Kohelyu Wetuft hand tuft robot - New Robotuft HMI Launching 2021

via GIPHY


Arm robot Braccio

Arm robot braccio presentation

The Braccio robot arm is a manipulator robot, that means it is composed of rigid parts interconnected by joints and a terminal part, in this case a gripper for grasping objects. Braccio is 6 axes robotic arm from Arduino itself.

The Braccio robot is capable of rotating at six different axes.

  • Axis 1 – It is located at the base of a robot, and helps it to rotate from left to right.
  • Axis 2 – It helps the lower arm of a robot to move in an up and down motion.
  • Axis 3 – It allows the upper arm of a robot to move forward and backward.
  • Axis 4 – This axis is known as wrist roll, and it rotates the upper arm of a robot in a circular movement.
  • Axis 5 – It permits the wrist of the robot’s arm to raise and lower.
  • Axis 6 – It allows the wrist of the robot’s arm to rotate freely in a circular motion.

All the above six axes are controlled with the help of servo motors.

The Arduino Braccio is a 6 axis robot arm

What is a servo motor

A servo motor is a component that can rotate its handle between 0° and 180°. It used to control the angular posistition of the object. Its angle is determined by the width of PMW signal.

A servo motor controlled by a potentiometer A servo motor controlled by Arduino A servo motor controlled by Arduino with an ultrasonic sensor

via GIPHY

via GIPHY

via GIPHY

More information of servo motor More information of potentiometer More information of ultrasonic sensor

I wanted to discover the processing software to maybe use it to control the robot. So I reproduced a project using processing and a servo motor to discover this software. It is a project which detects the various obstacles and plots them on a graph.

Hardware et softwares

Bill of Materials

Qty Description Price Link
1 Tinkerkit Braccio robot €238,80 Arduino store
1 Arduino Uno Rev3 €24,00 Arduino store
1 USB cable €8,40 Arduino store

Softwares

Arm robot Braccio Assembly

Steps

The package comes with all the plastic parts, motors, screws, and shield for Arduino UNO which has to be assembled. There is also an Assembly guide inside.

Documents to look at before starting and during the assembly:

Robot assembly

There are several points to consider during and after assembly

  • During the assembly, put the motor servos wire inside the robot arm
  • During the assembly, orient the motor servos so that they are in line with the parts
  • After the assembly, place a weight at the base of the robot to prevent it from collapsing during these movements
  • Pay attention to robot initialization (That's means at each programme upload) leave a clear space around the robot and do not attach anything to its clamp.


The assembly of the robot arm took us 1h30 with Diane Wakim.

1. Arm robot assembly

Control of the servo motor alignment

In the Braccio library, there is testBraccio90 sketch. Upload the sketch to the Arduino. The motor arm should immediatley spring over to its center position (90°).

Arduino sketch

/*testBraccio90.ino

 testBraccio90 is a setup sketch to check the alignment of all the servo motors
 This is the first sketch you need to run on Braccio
 When you start this sketch Braccio will be positioned perpendicular to the base
 If you can't see the Braccio in this exact position you need to reallign the servo motors position

 Created on 18 Nov 2015
 by Andrea Martino

 This example is in the public domain. 
 */

#include <Braccio.h>
#include <Servo.h>

Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;

void setup() {  
  //Initialization functions and set up the initial position for Braccio
  //All the servo motors will be positioned in the "safety" position:
  //Base (M1):90 degrees
  //Shoulder (M2): 45 degrees
  //Elbow (M3): 180 degrees
  //Wrist vertical (M4): 180 degrees
  //Wrist rotation (M5): 90 degrees
  //gripper (M6): 10 degrees
  Braccio.begin();
}

void loop() {
  /*
   Step Delay: a milliseconds delay between the movement of each servo.  Allowed values from 10 to 30 msec.
   M1=base degrees. Allowed values from 0 to 180 degrees
   M2=shoulder degrees. Allowed values from 15 to 165 degrees
   M3=elbow degrees. Allowed values from 0 to 180 degrees
   M4=wrist vertical degrees. Allowed values from 0 to 180 degrees
   M5=wrist rotation degrees. Allowed values from 0 to 180 degrees
   M6=gripper degrees. Allowed values from 10 to 73 degrees. 10: the toungue is open, 73: the gripper is closed.
  */

  // the arm is aligned upwards  and the gripper is closed
                     //(step delay, M1, M2, M3, M4, M5, M6);
  Braccio.ServoMovement(20,         90, 90, 90, 90, 90,  73);  

}


Moving the arm robot

In the Braccio library, there is takethesponge sketch. Here is the video of the robot during the execution of the program.

"Take the sponge"

via GIPHY

Arduino sketch

/*
  takethesponge.ino

 This example commands to the Braccio to take a sponge from the table and it shows to the user

 Created on 18 Nov 2015
 by Andrea Martino

 This example is in the public domain.
*/

#include <Braccio.h>
#include <Servo.h>


Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;


void setup() {  
  //Initialization functions and set up the initial position for Braccio
  //All the servo motors will be positioned in the "safety" position:
  //Base (M1):90 degrees
  //Shoulder (M2): 45 degrees
  //Elbow (M3): 180 degrees
  //Wrist vertical (M4): 180 degrees
  //Wrist rotation (M5): 90 degrees
  //gripper (M6): 10 degrees
  Braccio.begin();
}

void loop() {
  /*
  Step Delay: a milliseconds delay between the movement of each servo.  Allowed values from 10 to 30 msec.
  M1=base degrees. Allowed values from 0 to 180 degrees
  M2=shoulder degrees. Allowed values from 15 to 165 degrees
  M3=elbow degrees. Allowed values from 0 to 180 degrees
  M4=wrist vertical degrees. Allowed values from 0 to 180 degrees
  M5=wrist rotation degrees. Allowed values from 0 to 180 degrees
  M6=gripper degrees. Allowed values from 10 to 73 degrees. 10: the toungue is open, 73: the gripper is closed.
  */

  //Starting position
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,           0,  45, 180, 180,  90,  10);

  //Wait 1 second
  delay(1000);

  //The braccio moves to the sponge. Only the M2 servo will moves
  Braccio.ServoMovement(20,           0,  95, 180, 180,  90,   10);

  //Close the gripper to take the sponge. Only the M6 servo will moves
  Braccio.ServoMovement(10,           0,  95, 180, 180,  90,  73 );

  //Brings the sponge upwards.
  Braccio.ServoMovement(20,         0,   45, 180,  45,  0, 73);

  //Show the sponge. Only the M1 servo will moves
  Braccio.ServoMovement(20,         180,  45, 180,   45,   0,  73);

  //Return to the start position.
  Braccio.ServoMovement(20,         0,   95, 180,  180,  90, 73);

  //Open the gripper
  Braccio.ServoMovement(20,         0,   95, 180,  180,  90, 10 );


}

Pick up and move an object

Process

To experiment with the robot arm, I chose to make a program allowing to catch an object, to move it and to put it down in another place. The choreography of the robot must be broken down into successive positions. For each position of the robot, I chose arbitrarily the angles of the 6 servo motors. Below is an example of 3 positions of the robot according to the angle of its 6 servo motors and the choreography of the robot to perform the tasks I programmed.

M1: 90, M2:20, M3:170, M4:0, M5:90, M6:10 M1: 90, M2:45, M3:170, M4:0, M5:90, M6:10 M1: 90, M2:45, M3:80, M4:40, M5:90, M6:10 Pick up and move an object

via GIPHY

Arduino sketch

 #include <Braccio.h>
#include <Servo.h>

Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;

void setup() {  
  //Initialization functions and set up the initial position for Braccio
  //All the servo motors will be positioned in the "safety" position:
  //Base (M1):90 degrees
  //Shoulder (M2): 45 degrees
  //Elbow (M3): 180 degrees
  //Wrist vertical (M4): 180 degrees
  //Wrist rotation (M5): 90 degrees
  //gripper (M6): 10 degrees
  Braccio.begin();
}

void loop() {
  /*
  Step Delay: a milliseconds delay between the movement of each servo.  Allowed values from 10 to 30 msec.
  M1=base degrees. Allowed values from 0 to 180 degrees
  M2=shoulder degrees. Allowed values from 15 to 165 degrees
  M3=elbow degrees. Allowed values from 0 to 180 degrees
  M4=wrist vertical degrees. Allowed values from 0 to 180 degrees
  M5=wrist rotation degrees. Allowed values from 0 to 180 degrees
  M6=gripper degrees. Allowed values from 10 to 73 degrees. 10: the toungue is open, 73: the gripper is closed.
  */

// Direction l'étagère
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,         180, 95, 93, 90, 90, 10);

  //Wait 1 second
  delay(1000);

// se dirige vers l'objet
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,         180, 70, 55, 120, 90, 10);

  //Wait 1 second
  delay(1000);


// Baisse le M4
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,         180, 70, 55, 55, 90, 10);

  //Wait 1 second
  delay(1000);


// Saisi l'objet
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,         180, 70, 55, 55, 90, 73);

  //Wait 1 second
  delay(1000);

// Releve l'objet pour pas qu'il frotte sur la surface de l'étagère
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,         180, 70, 55, 110, 90, 73);

  //Wait 1 second
  delay(1000);



// Déplace l'objet 
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,         0, 70, 55, 110, 90, 73);

  //Wait 1 second
  delay(1000);



// Relache l'objet 
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,         0, 45, 20, 55, 90, 10);

  //Wait 1 second
  delay(1000);

}

Automated loom

Process

I worked with the loom group (Tess Larquemin, Camille Barot and Berenice Courtin). The simplified explanation of how the loom works is that the woven pattern depends on the height of the shaft(s) throughout the weaving process. The height of the shaft determines the position of the threads (depending on the shaft pattern). For more information, I invite you to go to their documentations.

Loom - lecture OS Hardware 2022-2023 Sara Diaz

Several tests were made to mount this shaft and then these shaft at three different heights: high,middle and low:

  • Without hindrance
  • Without hindrance and along guides
  • With wires inside the shaft
  • With wires inside the shaft and along guides
  • With 2 shafts ( inclining the clamp)
  • Weaving during arm robot lifting the shaft
Test: arm robot lifting the shaft without hindrance and along guides Test: arm robot lifting the shaft with wires Test : weaving during arm robot lifting the shaft

via GIPHY

via GIPHY

via GIPHY

Arduino sketch

Lifting at three different heights: high,middle and low:

// Braccio robot is raised up by 26 cm

#include <Braccio.h>
#include <Servo.h>

Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;

void setup() {  
  //Initialization functions and set up the initial position for Braccio
  //All the servo motors will be positioned in the "safety" position:
  //Base (M1):90 degrees
  //Shoulder (M2): 45 degrees
  //Elbow (M3): 180 degrees
  //Wrist vertical (M4): 180 degrees
  //Wrist rotation (M5): 90 degrees
  //gripper (M6): 10 degrees
  Braccio.begin();
}

void loop() {
  /*
  Step Delay: a milliseconds delay between the movement of each servo.  Allowed values from 10 to 30 msec.
  M1=base degrees. Allowed values from 0 to 180 degrees
  M2=shoulder degrees. Allowed values from 15 to 165 degrees
  M3=elbow degrees. Allowed values from 0 to 180 degrees
  M4=wrist vertical degrees. Allowed values from 0 to 180 degrees
  M5=wrist rotation degrees. Allowed values from 0 to 180 degrees
  M6=gripper degrees. Allowed values from 10 to 73 degrees. 10: the toungue is open, 73: the gripper is closed.
  */

//Position basse
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
 //Braccio.ServoMovement(20,          90, 0, 50, 120, 90, 10);

  //Wait 1 second
 // delay(2000);


 //Position neutre
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
 // Braccio.ServoMovement(20,          90, 0, 100, 90, 90, 10);

  //Wait 1 second
 // delay(2000);


//Position haute
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
//  Braccio.ServoMovement(20,          90, 0, 140, 50, 90, 10);

  //Wait 1 second
 // delay(2000);

}

Tilting the clamp in 3 directions:

// Braccio robot is raised up by 26 cm

#include <Braccio.h>
#include <Servo.h>

Servo base;
Servo shoulder;
Servo elbow;
Servo wrist_rot;
Servo wrist_ver;
Servo gripper;

void setup() {  
  //Initialization functions and set up the initial position for Braccio
  //All the servo motors will be positioned in the "safety" position:
  //Base (M1):90 degrees
  //Shoulder (M2): 45 degrees
  //Elbow (M3): 180 degrees
  //Wrist vertical (M4): 180 degrees
  //Wrist rotation (M5): 90 degrees
  //gripper (M6): 10 degrees
  Braccio.begin();
}

void loop() {
  /*
  Step Delay: a milliseconds delay between the movement of each servo.  Allowed values from 10 to 30 msec.
  M1=base degrees. Allowed values from 0 to 180 degrees
  M2=shoulder degrees. Allowed values from 15 to 165 degrees
  M3=elbow degrees. Allowed values from 0 to 180 degrees
  M4=wrist vertical degrees. Allowed values from 0 to 180 degrees
  M5=wrist rotation degrees. Allowed values from 0 to 180 degrees
  M6=gripper degrees. Allowed values from 10 to 73 degrees. 10: the toungue is open, 73: the gripper is closed.
  */

  //Neutral position M5 at 0° 
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
  Braccio.ServoMovement(20,          90, 0, 100, 90, 0, 10);

  //Wait 1 second
  delay(9000);

 //Neutral position M5 at 90°
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
 Braccio.ServoMovement(20,          90, 0, 100, 90, 90, 10);

  //Wait 1 second
  delay(9000);


//Neutral position M5 at 180°
                      //(step delay  M1 , M2 , M3 , M4 , M5 , M6);
 Braccio.ServoMovement(20,          90, 0, 100, 90, 180, 10);

  //Wait 1 second
delay(9000);
}

Notes

  • I tried to draw vertically with the robot arm. It is difficult to make a drawing by arbitrarily choosing the angle of the servo motors. Instead, it should be based on the coordinates of each point in the drawing on a vertical frame to determine the positions the robot should take. It is also necessary to determine the workspace of the robot, that is means the area that the tip of the gripper can reach.

  • Pauline Gamore suggested that I use Processing software to draw with the robot. It could also be used as a user interface to act on the robot.


Last update: 2023-04-10