Project tutorial

Arduino Robot Arm Follow Your Movement with Tactigon © MIT

We wanted to use The Tactigon ONE and T-Skin to move a Arduino One base robot arm and have it follow our movements. Rasberry is central unit

  • 501 views
  • 0 comments
  • 9 respects

Components and supplies

Tactigonfronte3 5x2msol6vb
The Tactigon One
×2
Wearable mpt2 render6 gokepkujhm
The Tactigon Skin (T-SKIN)
×1
A000066 iso both
Arduino UNO & Genuino UNO
ARDUINO UNO REV3 CON ATMEGA328
×1
Pi 3 02
Raspberry Pi 3 Model B
×1
Zwtdlh05zcct5usceslj
Arduino MotorShield Rev3
SHIELD ARDUINO CONTROLLO SERVO RC
×1
Bluetooth Low Energy (BLE) Module (Generic)
The Arduino UNO, on its side, does not have Bluetooth Low Energy communication, so we used an HC-05 module for this purpose.
×1

Apps and online services

About this project

Introduction

Hello! We made this project since we wanted to use The Tactigon ONE and T-Skin to move a robotic arm and have it follow our movements, like a shadow. By using two Tactigon ONEs (one on the arm and another on the forearm) along with a T-Skin (worn on the hand), we made this possible! Other devices we used are a Raspberry Pi 3, an Arduino UNO, a BLE and a servo shield, and obviously, a robotic arm.

Tactigon Skin Product is compatible with Arduino SDK

Hardware Architecture

Lots of devices are connected here, so a little picture helps this:

The Raspberry Pi 3 plays a fundamental role: it runs handle inputs from the human arms, translates it in servos' positions and then send the new position to the robotic arm. Nice!

The Arduino UNO, on its side, does not have Bluetooth Low Energy communication, so we used an HC-05 module for this purpose.

The robotic arm is equipped with Arduino UNO board and a Bluetooth Low Energy shield, with whom receives new servos positions, and a "servo shield" which allows to uncouple Arduino UNO power supply from servos power supply, and so use high torque servos without draining current over the microcontroller's limit.

First Integration

The first step was to assemble few cardboards to resemble an arm: 2 joints to emulate elbow and wrist. This was to speed up tests, and avoid unwanted movement of the arm.

After this step, we designed a little case with our favourite CAD and printed it out.

Software Architecture

Now that we know how our nodes are linked, we can analyze the software running on each of them.

Tactigon ONE and T-Skin

They run an Arduino Sketch which process IMU's data and transform to Quaternions. This data is then published over Bluetooth Low Energy.

Raspberry Pi

The Raspberry Pi is running a Python script which uses 3 threads to communicate with Tactigon ONEs and T-Skin (T1, T2 and T3), a thread (T4) to handle all connections (and reconnect if needed), one for the UI (T5), and one (T6) to send servo positions to the robotic arm. T1 to T3 process data from quaternions to an angle, the new position of the arm.

Arduino UNO and Robotic Arm

The board Arduino UNO installed in Robotic arm is running an Arduino Sketch too, which receives servo positions and applies to its servos We used Arduino RC servo shield board compatible with Arduino UNO.

Conclusions

This shadow robotic arm based on Arduino UNO is awesome since it can replicate human's movements with an higher torque (well, not the small unit we used in this test tho!).

Next step is to make it able to learn the movements, optimize them and replicate endlessly for Industry 4.0 purpose.

Code

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



#define pump  2
#define valve 4


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



// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(pump, OUTPUT);
  pinMode(valve, OUTPUT);

  digitalWrite(pump, HIGH);
  digitalWrite(valve, HIGH); //HIGH SUCCHIO  LOW RILASCIO

  //For each step motor this set up the initial degree


  Braccio.begin();
}

void loop() {
  //vado in posizione A
  Braccio.ServoMovement(40, 120, 110, 90, 100, 90, 90); 
  Braccio.ServoMovement(40, 120, 60, 90, 100, 90, 90);
  delay(500);
  Braccio.ServoMovement(40, 120, 60, 90, 100, 90, 90);
  Braccio.ServoMovement(40, 120, 60, 100, 100, 90, 90);
  //mi abbasso e dico no no  
  Braccio.ServoMovement(10, 120, 60, 100, 50, 90, 90);      //no no
  Braccio.ServoMovement(10, 120, 60, 100, 150, 90, 90); 
  Braccio.ServoMovement(10, 120, 60, 100, 50, 90, 90); 
  Braccio.ServoMovement(10, 120, 60, 100, 90, 90, 90);   
  delay(1000);
  // vado in posizione B e mi abbasso
  Braccio.ServoMovement(40, 120, 110, 90, 100, 90, 90); 
  Braccio.ServoMovement(40, 70, 60, 90, 90, 90, 90);  
  Braccio.ServoMovement(40, 70, 60, 110, 90, 90, 90); 
  //faccio partire la pompa
  digitalWrite(valve, HIGH);
  digitalWrite(pump, LOW);
  delay(1000);
  //mi alzo
  Braccio.ServoMovement(40, 70, 60, 90, 90, 90, 90);  
  Braccio.ServoMovement(40, 70, 110, 90, 90, 90, 90); 
  Braccio.ServoMovement(40, 70, 110, 90, 50, 90, 90);

  //Vado in posizione A  
  delay(1000);
  Braccio.ServoMovement(40, 120, 110, 90, 100, 90, 90); 
  Braccio.ServoMovement(40, 120, 60, 90, 100, 90, 90);
  delay(500);
  // mi abbasso
  Braccio.ServoMovement(40, 120, 60, 110, 100, 90, 90);
  //spengo la pompa 
  digitalWrite(valve, LOW);
  digitalWrite(pump, HIGH);
  delay(1000);
  //mi alzo
  Braccio.ServoMovement(40, 120, 90, 90, 100, 90, 90);
  Braccio.ServoMovement(40, 120, 90, 90, 90, 90, 90);

  //Vado in posizione B
  delay(1000);
  Braccio.ServoMovement(40, 70, 60, 80, 90, 90, 90);  
  Braccio.ServoMovement(40, 70, 60, 100, 90, 90, 90); 
  //Mi abbasso
  delay(1000);
  //e dico no no
  Braccio.ServoMovement(10, 70, 60, 100, 50, 90, 90);   //no no
  Braccio.ServoMovement(10, 70, 60, 100, 150, 90, 90);
  Braccio.ServoMovement(10, 70, 60, 100, 50, 90, 90);
  Braccio.ServoMovement(10, 70, 60, 100, 90, 90, 90);
  //Wait 1 second
  delay(1000);
  //mi rialzo e vado in posizione A
  Braccio.ServoMovement(40, 120, 110, 90, 100, 90, 90); 
  Braccio.ServoMovement(40, 120, 60, 90, 100, 90, 90);
  delay(500);
  //mi abbasso
  Braccio.ServoMovement(40, 120, 60, 90, 100, 90, 90);
  Braccio.ServoMovement(40, 120, 60, 110, 100, 90, 90);
  //e faccio partire la pompa
  digitalWrite(valve, HIGH);
  digitalWrite(pump, LOW);
  delay(1000);
  //mi alzo
  Braccio.ServoMovement(40, 120, 90, 90, 100, 90, 90);
  Braccio.ServoMovement(40, 120, 90, 90, 90, 90, 90);
  

  //Wait 1 second
  delay(1000);
  //vado in pos B
  Braccio.ServoMovement(40, 70, 60, 90, 90, 90, 90);  
  Braccio.ServoMovement(40, 70, 60, 110, 90, 90, 90); 
  digitalWrite(valve, LOW);
  digitalWrite(pump, HIGH);
  //dico no no
  delay(1000);
  Braccio.ServoMovement(40, 70, 60, 90, 90, 90, 90);  
  Braccio.ServoMovement(40, 70, 110, 90, 90, 90, 90); 
  Braccio.ServoMovement(40, 70, 110, 90, 50, 90, 90);
  //Wait 1 second

}

Comments

Similar projects you might like

MeArm Robot Arm - Your Robot - V1.0

Project tutorial by Benjamin Gray

  • 20,411 views
  • 3 comments
  • 39 respects

LittleArm: Arduino Robot Arm

Project showcase by Slant Concepts

  • 16,075 views
  • 1 comment
  • 73 respects

Gesture Controlled Trainable Arduino Robot Arm via Bluetooth

Project tutorial by KureBas Robotics

  • 11,905 views
  • 41 comments
  • 100 respects

Control Arduino Robot Arm with Android App

Project tutorial by Slant Concepts

  • 9,081 views
  • 7 comments
  • 26 respects

Arduino Robot Arm Mixologist

Project tutorial by RobotGeek Projects Team

  • 2,459 views
  • 0 comments
  • 11 respects
Add projectSign up / Login