Robotic Arm Game - Smartphone Controller

About: Tech, DIY and Arduino Realisation If you liked it , come check our sites Website :http://technofabrique.wixsite.com/techno-fabrik Google +:https://plus.google.com/109229784299061111421

Hello !

Here a fun summer game : The robotic Arm controlled by Smartphone !!

As you can see on the Video, you can control the Arm with some Joysticks on your smartphone.

You also can save a pattern, that the robot will reproduce in a loop, in order to do some repetitive tasks as exemple. But this pattern is modulable as you wish !!!!

Be creative !

Teacher Notes

Teachers! Did you use this instructable in your classroom?
Add a Teacher Note to share how you incorporated it into your lesson.

Step 1: Materials

Here you can see the material that you need.

It will cost you around 50€ to build this robotic Arm. The Software and tools can be replaced, but i used those for this project.

Step 2: 3D Print the Robotic Arm

The Robotic Arm was 3D printed (with our prusa i3).

Thanks to the website "HowtoMechatronics.com", his STL Files are awesome in order to build an 3D arm.

It will take around 20 hours to print all the pieces.

Step 3: Electronic Montage

The montage is separate in 2 parts :

An electronic part, where the arduino is connected to the servos by the Digital Pins, and with the Bluetooth device (Rx, Tx).

A Power part, where the servos are powered with 2 phone charger (5V, 2A max).

Step 4: Smartphone Application

The Application was made on App inventor 2.
We use 2 Joystick to control 4 Servos and 2 more Buttons to control the final Grip.

We connect Arm and Smartphone together by using a Bluetooth module (HC-06).

Finally, a saving mode allow the user to save up to 9 positions for the Arm.

The arm will then go into an automatic mode, where he will reproduce the saved positions.

Step 5: The Arduino Code

// 08/19 - Robotic Arm Smartphone controlled
<p>#include <servo.h> <br>#define TRUE true
#define FALSE false
//********************DECLARATIONS****************************</servo.h></p><p>word rep;   // mot envoyé du module Arduino au smartphone
int chiffre_final = 0;
int cmd=3; // variable commande du servo moteur ( troisième fil ( orange, jaune ))
int cmd1=5; // servo1
int cmd2=9; // servo2
int cmd3=10; // servo3
//int cmd4=10; //servo4
int cmd5=11; // pince
int activate_saving = 0;
Servo moteur; //on définit notre servomoteur
Servo moteur1;
Servo moteur2;
Servo moteur3;
//Servo moteur4;
Servo moteur5;
int step_angle_mini = 4;
int step_angle = 3;
int angle, angle1, angle3, angle5,angle2;//angle
int pas;
int r,r1,r2,r3;
int enregistrer;
boolean fin = FALSE;
boolean fin1 = FALSE;
boolean fin2 = FALSE;
boolean fin3 = FALSE;
boolean fin4 = FALSE;
word w; // variable envoyé du smartphone au module Arduino
int sauvegarde_positions1[5];
int sauvegarde_positions2[5];
int sauvegarde_positions3[5];
int sauvegarde_positions4[5];
int sauvegarde_positions5[5];
int sauvegarde_positions6[5];
int sauvegarde_positions7[5];
int sauvegarde_positions8[5];
int sauvegarde_positions9[5];</p><p>//int angle; // angle de rotation ( 0 a 180)
//********************SETUP***********************************
void setup() {
  sauvegarde_positions1[0] = sauvegarde_positions1[1] = sauvegarde_positions1[2] = sauvegarde_positions1[3] = sauvegarde_positions1[4] = 0;
  sauvegarde_positions2[0] = sauvegarde_positions2[1] = sauvegarde_positions2[2] = sauvegarde_positions2[3] = sauvegarde_positions2[4] = 0;
  sauvegarde_positions3[0] = sauvegarde_positions3[1] = sauvegarde_positions3[2] = sauvegarde_positions3[3] = sauvegarde_positions3[4] = 0;
  sauvegarde_positions4[0] = sauvegarde_positions4[1] = sauvegarde_positions4[2] = sauvegarde_positions4[3] = sauvegarde_positions4[4] = 0;
  sauvegarde_positions5[0] = sauvegarde_positions5[1] = sauvegarde_positions5[2] = sauvegarde_positions5[3] = sauvegarde_positions5[4] = 0;
  sauvegarde_positions6[0] = sauvegarde_positions6[1] = sauvegarde_positions6[2] = sauvegarde_positions6[3] = sauvegarde_positions6[4] = 0;
  sauvegarde_positions7[0] = sauvegarde_positions7[1] = sauvegarde_positions7[2] = sauvegarde_positions7[3] = sauvegarde_positions7[4] = 0;
  sauvegarde_positions8[0] = sauvegarde_positions8[1] = sauvegarde_positions8[2] = sauvegarde_positions8[3] = sauvegarde_positions8[4] = 0;
  sauvegarde_positions9[0] = sauvegarde_positions9[1] = sauvegarde_positions9[2] = sauvegarde_positions9[3] = sauvegarde_positions9[4] = 0;
  moteur.attach(cmd); // on relie l'objet au pin de commande
  moteur1.attach(cmd1);
  moteur2.attach(cmd2);
  moteur3.attach(cmd3);
 // moteur4.attach(cmd4);
  moteur5.attach(cmd5);
  moteur.write(6);
  angle = 6;
  moteur1.write(100);
  angle1 = 100;
  moteur2.write(90);
  moteur3.write(90);
  //moteur4.write(12);
  moteur5.write(90);
  angle=6;
  angle1=100;
  angle2= 90;
  angle3=90; 
  angle5=90;
  Serial.begin(9600); // permettra de communiquer au module Bluetooth
  
}
//********************BOUCLE***********************************
void loop() {</p><p>// Serial.print (" angle");
  //Serial.print(angle);Serial.print (" \t");Serial.print(angle1);Serial.print (" \t");Serial.print(angle2);Serial.print (" \t");Serial.print(angle3);Serial.print (" \t");Serial.print(angle5);Serial.print (" \n");</p><p>  //Serial.print("angle");
  int i;
 w=recevoir();    // on va recevoir une information du smartphone , la variable w
  switch (w)
  {
    case 1: TouchDown_Release();break;
    case 2: TouchDown_Grab();break;
    case 3: Base_Rotation();break;
    case 4: Base_AntiRotation();break;
    case 5: Waist_Rotation();break;
    case 6: Waist_AntiRotation();break;
    case 7: Third_Arm_Rotation();break;
    case 8: Third_Arm_AntiRotation();break;
    case 9: Fourth_Arm_Rotation();break;
    case 10: Fourth_Arm_AntiRotation();break;
    //case 11: Fifth_Arm_Rotation();break;
    //case 12: Fifth_Arm_AntiRotation();break;
    case 21 : Serial.print("case button 1 ") ;chiffre_final = 1;sauvegarde_positions1[0] =angle ;sauvegarde_positions1[1] =angle1 ;sauvegarde_positions1[2] =angle2 ;sauvegarde_positions1[3] =angle3 ;sauvegarde_positions1[4] =angle5 ;Serial.println(sauvegarde_positions1[1]);Serial.println(sauvegarde_positions1[2]);Serial.println(sauvegarde_positions1[3]);Serial.println(sauvegarde_positions1[4]); break;
    case 22 : chiffre_final = 2;sauvegarde_positions2[0] =angle ;sauvegarde_positions2[1] =angle1 ;sauvegarde_positions2[2] =angle2 ;sauvegarde_positions2[3] =angle3 ;sauvegarde_positions2[4] =angle5 ; break;
    case 23 : chiffre_final = 3;sauvegarde_positions3[0] =angle ;sauvegarde_positions3[1] =angle1 ;sauvegarde_positions3[2] =angle2 ;sauvegarde_positions3[3] =angle3 ;sauvegarde_positions3[4] =angle5 ;break;
    case 24 : chiffre_final = 4;sauvegarde_positions4[0] =angle ;sauvegarde_positions4[1] =angle1 ;sauvegarde_positions4[2] =angle2 ;sauvegarde_positions4[3] =angle3 ;sauvegarde_positions4[4] =angle5 ; break;
    case 25 : chiffre_final = 5;sauvegarde_positions5[0] =angle ;sauvegarde_positions5[1] =angle1 ;sauvegarde_positions5[2] =angle2 ;sauvegarde_positions5[3] =angle3 ;sauvegarde_positions5[4] =angle5 ; break;
    case 26 : chiffre_final = 6;sauvegarde_positions6[0] =angle ;sauvegarde_positions6[1] =angle1 ;sauvegarde_positions6[2] =angle2 ;sauvegarde_positions6[3] =angle3 ;sauvegarde_positions6[4] =angle5 ; break;
    case 27 : chiffre_final = 7;sauvegarde_positions7[0] =angle ;sauvegarde_positions7[1] =angle1 ;sauvegarde_positions7[2] =angle2 ;sauvegarde_positions7[3] =angle3 ;sauvegarde_positions7[4] =angle5 ; break;
    case 28 : chiffre_final = 8;sauvegarde_positions8[0] =angle ;sauvegarde_positions8[1] =angle1 ;sauvegarde_positions8[2] =angle2 ;sauvegarde_positions8[3] =angle3 ;sauvegarde_positions8[4] =angle5 ; break;
    case 29 : chiffre_final = 9;sauvegarde_positions9[0] =angle ;sauvegarde_positions9[1] =angle1 ;sauvegarde_positions9[2] =angle2 ;sauvegarde_positions9[3] =angle3 ;sauvegarde_positions9[4] =angle5 ; break;</p><p>    case 31 : Serial.print("31");activate_saving = 1;chiffre_final = 0; break;// BEGIN
    
    case 33 : Serial.print("33");activate_saving = 0; break;// BUTTON SAVE
    default : break;
  }
  if(w == 32 )
  {
    
       Serial.print("\nReproduce\nChiffre final : ");
       Serial.print(chiffre_final);
       Serial.print("\n Sauvegarde position 1 :  \n");
       for(i=0;i<5;i++){ Serial.print(sauvegarde_positions1[i]);Serial.print("\t");}
       Serial.print("\n Sauvegarde position 2 :  \n");
       for(i=0;i<5;i++){ Serial.print(sauvegarde_positions2[i]);Serial.print("\t");}
       Serial.print("\n Sauvegarde position 3 :  \n");
       for(i=0;i<5;i++){ Serial.print(sauvegarde_positions3[i]);Serial.print("\t");}
      
       for (i = 1;i<=chiffre_final;i++)
      {
         Serial.print(" \n\n BEGIN \nLoop : "); Serial.print(i);Serial.print("\n");
         switch(i)
         {
          case 1 : 
                   goto_moteur(*(sauvegarde_positions1));delay(200);
                   goto_moteur1(*(sauvegarde_positions1+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions1+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions1+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions1+4));delay(200);
                   break;
                   
          case 2 : goto_moteur(*(sauvegarde_positions2));delay(200);
                   goto_moteur1(*(sauvegarde_positions2+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions2+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions2+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions2+4));delay(200);
                   break;
          case 3 : goto_moteur(*(sauvegarde_positions3));delay(200);
                   goto_moteur1(*(sauvegarde_positions3+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions3+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions3+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions3+4));delay(200);
                   break;
          case 4 : goto_moteur(*(sauvegarde_positions4));delay(200);
                   goto_moteur1(*(sauvegarde_positions4+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions4+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions4+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions4+4));delay(200);
                   break;
          case 5 : goto_moteur(*(sauvegarde_positions5));delay(200);
                   goto_moteur1(*(sauvegarde_positions5+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions5+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions5+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions5+4));delay(200);
                   break;
          case 6 : goto_moteur(*(sauvegarde_positions6));delay(200);
                   goto_moteur1(*(sauvegarde_positions6+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions6+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions6+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions6+4));delay(200);
                   break;
          case 7 : goto_moteur(*(sauvegarde_positions7));delay(200);
                   goto_moteur1(*(sauvegarde_positions7+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions7+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions7+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions7+4));delay(200);
                   break;
          case 8 : goto_moteur(*(sauvegarde_positions8));delay(200);
                   goto_moteur1(*(sauvegarde_positions8+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions8+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions8+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions8+4));delay(200);
                   break;
          case 9 : goto_moteur(*(sauvegarde_positions9));delay(200);
                   goto_moteur1(*(sauvegarde_positions9+1)); delay(200);
                   goto_moteur2(*(sauvegarde_positions9+2));delay(200);
                   goto_moteur3(*(sauvegarde_positions9+3)); delay(200);
                   goto_moteur5(*(sauvegarde_positions9+4));delay(200);
                   break;
          
         }
         Serial.print("\n*********************** FIN  REPRODUCE ***************** \n ");
      delay(500);
      }
  }
    /*Serial.print (" debut\n");
  Serial.print(sauvegarde_positions1[0]);Serial.print (" \t");Serial.print(sauvegarde_positions1[1]);Serial.print (" \t");Serial.print(sauvegarde_positions1[2]);Serial.print (" \t");Serial.print(sauvegarde_positions1[3]);Serial.print (" \t");Serial.print(sauvegarde_positions1[4]);Serial.print (" \n");
  Serial.print(sauvegarde_positions2[0]);Serial.print (" \t");Serial.print(sauvegarde_positions2[1]);Serial.print (" \t");Serial.print(sauvegarde_positions2[2]);Serial.print (" \t");Serial.print(sauvegarde_positions2[3]);Serial.print (" \t");Serial.print(sauvegarde_positions2[4]);Serial.print (" \n");
  Serial.print(sauvegarde_positions3[0]);Serial.print (" \t");Serial.print(sauvegarde_positions3[1]);Serial.print (" \t");Serial.print(sauvegarde_positions3[2]);Serial.print (" \t");Serial.print(sauvegarde_positions3[3]);Serial.print (" \t");Serial.print(sauvegarde_positions3[4]);Serial.print (" \n");
  Serial.print(sauvegarde_positions4[0]);Serial.print (" \t");Serial.print(sauvegarde_positions4[1]);Serial.print (" \t");Serial.print(sauvegarde_positions4[2]);Serial.print (" \t");Serial.print(sauvegarde_positions4[3]);Serial.print (" \t");Serial.print(sauvegarde_positions4[4]);Serial.print (" \n");</p><p>  Serial.print("\nfin\n");*/
  delay(100);
}
//****************************FONCTIONS************************************</p><p>word recevoir() { // fonction permettant de recevoir l'information du smartphone
if (Serial.available()) {
 
w = Serial.read();</p><p>Serial.flush();  
return w; }}</p><p>void goto_moteur(int angle_destination)
{
  
  while (angle_destination < angle-step_angle || angle_destination > angle+step_angle)
  {
    Serial.print(" \n --------------* * * * * *------------------\n");
  Serial.print("angle_destination = \t "); Serial.print(angle_destination); 
  Serial.print("\n angle1 = \t ");Serial.print(angle);
  
    if(angle_destination <  angle-step_angle ){ angle = angle - step_angle;moteur.write(angle);}
    else if (angle_destination > angle +step_angle){ angle = angle + step_angle;moteur.write(angle);}
    delay(100);
  }
 moteur.write(angle_destination);
}
void goto_moteur1(int angle_destination)
{
  while (angle_destination < angle1-step_angle || angle_destination > angle1+step_angle)
  {
    Serial.print(" \n --------------* * * * * *------------------\n");
  Serial.print("angle_destination = \t "); Serial.print(angle_destination); 
  Serial.print("\n angle2 = \t ");Serial.print(angle1);
    if(angle_destination <  angle1-step_angle ){ angle1 -= step_angle;moteur1.write(angle1);}
    else if (angle_destination > angle1 +step_angle){angle1 += step_angle; moteur1.write(angle1);;}
    delay(100);
  }
   moteur1.write(angle_destination);
}
void goto_moteur2(int angle_destination)
{</p><p>  while (angle_destination < angle2-step_angle || angle_destination > angle2+step_angle)
  {
    Serial.print(" \n --------------* * * * * *------------------\n");
  Serial.print("angle_destination = \t "); Serial.print(angle_destination); 
  Serial.print("\n angle3 = \t ");Serial.print(angle2);
  if(angle_destination <  angle2-step_angle ){ angle2 -= step_angle;moteur2.write(angle2);}
  else if (angle_destination > angle2 +step_angle){angle2+=step_angle; moteur2.write(angle2);}
  delay(100);
  }
  moteur2.write(angle_destination);
}
void goto_moteur3(int angle_destination)
{</p><p>  while (angle_destination < angle3-step_angle || angle_destination > angle3+step_angle)
  {
    Serial.print(" \n --------------* * * * * *------------------\n");
  Serial.print("angle_destination = \t "); Serial.print(angle_destination); 
  Serial.print("\n angle4 = \t ");Serial.print(angle3);
    if(angle_destination <  angle3-step_angle ){ angle3-=step_angle;moteur3.write(angle3);}
    else if (angle_destination > angle3 +step_angle){angle3+=step_angle; moteur3.write(angle3);}
    delay(100);
  }
  moteur3.write(angle_destination);
}
void goto_moteur5(int angle_destination)
{</p><p>  while (angle_destination < angle5-step_angle || angle_destination > angle5+step_angle)
  {
    Serial.print(" \n --------------* * * * * *------------------\n");
  Serial.print("angle_destination = \t "); Serial.print(angle_destination); 
  Serial.print("\n angle5 = \t ");Serial.print(angle5);
    if(angle_destination <  angle5-step_angle ){ angle5-=step_angle;moteur5.write(angle5);}
    else if (angle_destination > angle5 +step_angle){angle5+=step_angle; moteur5.write(angle5);}
    delay(100);
  }
   moteur5.write(angle_destination);
}</p><p>void TouchDown_Release() // TouchDown Button Release
  { 
    if (angle5 < 180)
    {
      angle5 = angle5+step_angle_mini;
      
    }
    moteur5.write(angle5);
  }</p><p>void TouchDown_Grab() // TouchDown Button Grab
  { 
    if (angle5 > 0)
    {
      angle5 = angle5-step_angle_mini;
    }
    moteur5.write(angle5);
  }
void Base_Rotation()
{
  if (angle < 180)
    {
      angle = angle+step_angle;
    }
  else angle =180;
    moteur.write(angle);
}
void Base_AntiRotation()
{
  if (angle > 0)
    {
      angle = angle-step_angle;
    }
  else angle =0;
    moteur.write(angle);
}
void Waist_Rotation()
{
  if (angle1 < 180)
    {
      angle1 = angle1+step_angle;
    }
    else angle1 = 180;
    moteur1.write(angle1);
}
void Waist_AntiRotation()
{
  if (angle1 > 20)
    {
      angle1 = angle1-step_angle;
    }
   else angle1 = 20;
    moteur1.write(angle1);
}
void Third_Arm_Rotation()
{
  if (angle2 < 180)
    {
      angle2 = angle2+step_angle;
    }
    moteur2.write(angle2);
}
void Third_Arm_AntiRotation()
{
  if (angle2 > 0)
    {
      angle2 = angle2-step_angle;
    }
    moteur2.write(angle2);
}
void Fourth_Arm_Rotation()
{
  if (angle3 <= 180)
    {
      angle3 = angle3+step_angle_mini;
    }
    moteur3.write(angle3);
}
void Fourth_Arm_AntiRotation()
{
  if (angle3 >= 0)
    {
      angle3 = angle3-step_angle_mini;
    }
    moteur3.write(angle3);
}</p>

Step 6: That's It !

Thanks for watching, i hope you appreciated !

If you liked this Instructable, you can for sure visit us for more ! =)

Games Contest

Participated in the
Games Contest

Be the First to Share

    Recommendations

    • CNC Contest

      CNC Contest
    • Make it Move

      Make it Move
    • Teacher Contest

      Teacher Contest

    Discussions