Robotic Arm Game - Smartphone Controller
by TechnoFabrique in Circuits > Robots
2190 Views, 16 Favorites, 0 Comments
Robotic Arm Game - Smartphone Controller
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 !
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.
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.
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).
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.
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>
That's It !
Thanks for watching, i hope you appreciated !
If you liked this Instructable, you can for sure visit us for more ! =)