Indholdsfortegnelse:
- Trin 1: Materialer
- Trin 2: 3D -udskrivning af robotarmen
- Trin 3: Elektronisk montage
- Trin 4: Smartphone -applikation
- Trin 5: Arduino -koden
- Trin 6: Det er det
Video: Robotic Arm Game - Smartphone Controller: 6 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:27
Hej !
Her et sjovt sommerspil: Robotarmen styret af smartphone !!
Som du kan se på videoen, kan du styre armen med nogle joysticks på din smartphone.
Du kan også gemme et mønster, som robotten vil gengive i en loop, for at udføre nogle gentagne opgaver som eksempel. Men dette mønster er modulerbart, som du ønsker !!!!
Vær kreativ !
Trin 1: Materialer
Her kan du se det materiale, du har brug for.
Det vil koste dig omkring 50 € at bygge denne robotarm. Softwaren og værktøjerne kan udskiftes, men jeg brugte dem til dette projekt.
Trin 2: 3D -udskrivning af robotarmen
Robotarmen blev 3D -printet (med vores prusa i3).
Takket være webstedet "HowtoMechatronics.com" er hans STL -filer fantastiske for at bygge en 3D -arm.
Det vil tage omkring 20 timer at udskrive alle stykker.
Trin 3: Elektronisk montage
Montagen er adskilt i 2 dele:
En elektronisk del, hvor arduinoen er forbundet til servoerne med de digitale stifter og med Bluetooth -enheden (Rx, Tx).
En strømdel, hvor servoerne drives med 2 telefonopladere (5V, 2A max).
Trin 4: Smartphone -applikation
Ansøgningen blev foretaget på App opfinder 2. Vi bruger 2 joystick til at styre 4 servoer og 2 knapper til at styre det sidste greb.
Vi forbinder arm og smartphone sammen ved hjælp af et Bluetooth-modul (HC-06).
Endelig giver en sparetilstand brugeren mulighed for at gemme op til 9 positioner til armen.
Armen går derefter over i en automatisk tilstand, hvor han vil gengive de gemte positioner.
Trin 5: Arduino -koden
// 08/19 - Robotarm Smartphone styret
#include #define TRUE true #define FALSE false // ******************** ERKLÆRINGER ***************** ************
ord rep; // Mod envoyé du module Arduino eller 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 active_saving = 0; Servomotor; // on définit notre servomoteur Servo moteur1; Servomotor2; Servomotor3; // Servomotor4; Servomotor5; int step_angle_mini = 4; int step_angle = 3; int vinkel, vinkel1, vinkel3, vinkel5, vinkel2; // vinkel int pas; int r, r1, r2, r3; int enregistrer; boolsk finne = FALSK; boolsk fin1 = FALSK; boolsk fin2 = FALSK; boolsk fin3 = FALSK; boolsk fin4 = FALSK; ord w; // variabel envoyé du smartphone eller modul 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];
// int vinkel; // rotationsvinkel (0 a 180)
//********************OPSÆTNING*************************** ******** 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); vinkel = 6; moteur1.write (100); vinkel1 = 100; moteur2.write (90); moteur3.write (90); //moteur4.write(12); moteur5.write (90); vinkel = 6; vinkel1 = 100; vinkel2 = 90; vinkel3 = 90; vinkel5 = 90; Serial.begin (9600); // permettra de communiquer au module Bluetooth} // ******************* BOUCLE ****************** ******************* ugyldigt loop () {
// Serial.print ("vinkel");
//Serial.print(angle);Serial.print ("\ t"); Serial.print (vinkel1); Serial.print ("\ t"); Serial.print (vinkel2); Serial.print ("\ t "); Serial.print (vinkel3); Serial.print (" / t "); Serial.print (vinkel5); Serial.print (" / n ");
//Serial.print("angle ");
int i; w = recevoir (); // om en ny information om smartphone, med variabel switch (w) {case 1: TouchDown_Release (); pause; sag 2: TouchDown_Grab (); pause; case 3: Base_Rotation (); pause; sag 4: Base_AntiRotation (); pause; sag 5: Waist_Rotation (); pause; sag 6: Waist_AntiRotation (); pause; sag 7: Third_Arm_Rotation (); pause; case 8: Third_Arm_AntiRotation (); pause; case 9: Fourth_Arm_Rotation (); pause; sag 10: Fourth_Arm_AntiRotation (); pause; // sag 11: Fifth_Arm_Rotation (); pause; // sag 12: Fifth_Arm_AntiRotation (); pause; case 21: Serial.print ("case button 1"); chiffre_final = 1; sauvegarde_positions1 [0] = vinkel; sauvegarde_positions1 [1] = vinkel1; sauvegarde_positions1 [2] = vinkel2; sauvegarde_positions1 [3] = vinkel3; sauvegarde_ = vinkel5; Serial.println (sauvegarde_positions1 [1]); Serial.println (sauvegarde_positions1 [2]); Serial.println (sauvegarde_positions1 [3]); Serial.println (sauvegarde_positions1 [4]); pause; sag 22: chiffre_final = 2; sauvegarde_positions2 [0] = vinkel; sauvegarde_positions2 [1] = vinkel1; sauvegarde_positions2 [2] = vinkel2; sauvegarde_positions2 [3] = vinkel3; sauvegarde_positions2 [4] = vinkel5; pause; sag 23: chiffre_final = 3; sauvegarde_positions3 [0] = vinkel; sauvegarde_positions3 [1] = vinkel1; sauvegarde_positions3 [2] = vinkel2; sauvegarde_positions3 [3] = vinkel3; sauvegarde_positions3 [4] = vinkel5; sag 24: chiffre_final = 4; sauvegarde_positions4 [0] = vinkel; sauvegarde_positions4 [1] = vinkel1; sauvegarde_positions4 [2] = vinkel2; sauvegarde_positions4 [3] = vinkel3; sauvegarde_positioner4 [4] = vinkel5; pause; sag 25: chiffre_final = 5; sauvegarde_positions5 [0] = vinkel; sauvegarde_positions5 [1] = vinkel1; sauvegarde_positions5 [2] = vinkel2; sauvegarde_positions5 [3] = vinkel3; sauvegarde_positions5 [4] = vinkel5; pause; sag 26: chiffre_final = 6; sauvegarde_positions6 [0] = vinkel; sauvegarde_positions6 [1] = vinkel1; sauvegarde_positions6 [2] = vinkel2; sauvegarde_positions6 [3] = vinkel3; sauvegarde_positioner6 [4] = vinkel5; pause; sag 27: chiffre_final = 7; sauvegarde_positions7 [0] = vinkel; sauvegarde_positions7 [1] = vinkel1; sauvegarde_positions7 [2] = vinkel2; sauvegarde_positions7 [3] = vinkel3; sauvegarde_positions7 [4] = vinkel5; pause; sag 28: chiffre_final = 8; sauvegarde_positions8 [0] = vinkel; sauvegarde_positions8 [1] = vinkel1; sauvegarde_positions8 [2] = vinkel2; sauvegarde_positions8 [3] = vinkel3; sauvegarde_positions8 [4] = vinkel5; pause; sag 29: chiffre_final = 9; sauvegarde_positions9 [0] = vinkel; sauvegarde_positions9 [1] = vinkel1; sauvegarde_positions9 [2] = vinkel2; sauvegarde_positions9 [3] = vinkel3; sauvegarde_positions9 [4] = vinkel5; pause;
sag 31: Serial.print ("31"); active_saving = 1; chiffre_final = 0; pause; // BEGYNG
sag 33: Serial.print ("33"); active_saving = 0; pause; // BUTTON SAVE default: break; } hvis (w == 32) {Serial.print ("\ nReproducer / nChiffre endelig:"); Serial.print (chiffre_final); Serial.print ("\ n Sauvegarde position 1: / n"); for (i = 0; i <5; i ++) {Serial.print (sauvegarde_positions1 ); Serial.print ("\ t");} Serial.print ("\ n Sauvegarde position 2: / n"); for (i = 0; i <5; i ++) {Serial.print (sauvegarde_positions2 ); Serial.print ("\ t");} Serial.print ("\ n Sauvegarde position 3: / n"); for (i = 0; i <5; i ++) {Serial.print (sauvegarde_positions3 ); 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)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions1+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions1+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions1+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions1+4)); forsinkelse (200); pause; sag 2: goto_moteur (*(sauvegarde_positions2)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions2+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions2+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions2+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions2+4)); forsinkelse (200); pause; sag 3: goto_moteur (*(sauvegarde_positions3)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions3+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions3+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions3+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions3+4)); forsinkelse (200); pause; sag 4: goto_moteur (*(sauvegarde_positions4)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions4+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions4+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions4+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions4+4)); forsinkelse (200); pause; sag 5: goto_moteur (*(sauvegarde_positions5)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions5+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions5+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions5+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions5+4)); forsinkelse (200); pause; sag 6: goto_moteur (*(sauvegarde_positions6)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions6+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions6+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions6+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions6+4)); forsinkelse (200); pause; sag 7: goto_moteur (*(sauvegarde_positions7)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions7+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions7+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions7+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions7+4)); forsinkelse (200); pause; sag 8: goto_moteur (*(sauvegarde_positions8)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions8+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions8+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions8+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions8+4)); forsinkelse (200); pause; sag 9: goto_moteur (*(sauvegarde_positions9)); forsinkelse (200); goto_moteur1 (*(sauvegarde_positions9+1)); forsinkelse (200); goto_moteur2 (*(sauvegarde_positions9+2)); forsinkelse (200); goto_moteur3 (*(sauvegarde_positions9+3)); forsinkelse (200); goto_moteur5 (*(sauvegarde_positions9+4)); forsinkelse (200); pause; } Serial.print ("\ n ********************** FIN REPRODUCE ***************** / n "); forsinkelse (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");
Serial.print ("\ nfin / n");*/
forsinkelse (100); } // *************************** FUNKTIONER ******************* *******************
word recevoir () {// fonction permettant de recevoir l'information du smartphone
hvis (Serial.available ()) {w = Serial.read ();
Seriel.flush ();
vende tilbage; }}
ugid goto_moteur (int vinkel_destination)
{while (vinkel_bestemmelsesvinkel+trin_vinkel) {Serial.print ("\ n -------------- * * * * * * -------------- ---- / n "); Serial.print ("vinkel_destination = / t"); Serial.print (vinkel_destination); Serial.print ("\ n vinkel1 = / t"); Serial.print (vinkel); hvis (vinkel_bestemmelsesvinkel + trin_vinkel) {vinkel = vinkel + trin_vinkel; moteur.write (vinkel);} forsinkelse (100); } moteur.write (vinkel_destination); } ugid goto_moteur1 (int angle_destination) {while (angle_destination angle1+step_angle) {Serial.print ("\ n -------------- * * * * * * ------- ----------- / n "); Serial.print ("vinkel_destination = / t"); Serial.print (vinkel_destination); Serial.print ("\ n vinkel2 = / t"); Serial.print (vinkel1); hvis (vinkel_destination vinkel1 +trin_vinkel) {vinkel1 += trin_vinkel; moteur1.write (vinkel1);;} forsinkelse (100); } moteur1.write (vinkel_destination); } ugid goto_moteur2 (int vinkel_destination) {
mens (vinkel_bestemmelsesvinkel2+trin_vinkel)
{Serial.print ("\ n -------------- * * * * * * ------------------ / n"); Serial.print ("vinkel_destination = / t"); Serial.print (vinkel_destination); Serial.print ("\ n vinkel3 = / t"); Serial.print (vinkel2); hvis (vinkel_destination vinkel2 +trin_vinkel) {vinkel2 += trin_vinkel; moteur2.write (vinkel2);} forsinkelse (100); } moteur2.write (vinkel_destination); } void goto_moteur3 (int vinkel_destination) {
mens (vinkel_bestemmelsesvinkel3+trin_vinkel)
{Serial.print ("\ n -------------- * * * * * * ------------------ / n"); Serial.print ("vinkel_destination = / t"); Serial.print (vinkel_destination); Serial.print ("\ n vinkel4 = / t"); Serial.print (vinkel3); hvis (vinkel_destination vinkel3 +trin_vinkel) {vinkel3 += trin_vinkel; moteur3.write (vinkel3);} forsinkelse (100); } moteur3.write (vinkel_destination); } ugid goto_moteur5 (int vinkel_destination) {
mens (vinkel_bestemmelsesvinkel5+trin_vinkel)
{Serial.print ("\ n -------------- * * * * * * ------------------ / n"); Serial.print ("vinkel_destination = / t"); Serial.print (vinkel_destination); Serial.print ("\ n vinkel5 = / t"); Serial.print (vinkel5); hvis (vinkel_destination vinkel5 +trin_vinkel) {vinkel5 += trin_vinkel; moteur5.write (vinkel5);} forsinkelse (100); } moteur5.write (vinkel_destination); }
void TouchDown_Release () // TouchDown Button Release
{hvis (vinkel5 <180) {vinkel5 = vinkel5+trin_vinkel_mini; } moteur5.write (vinkel5); }
void TouchDown_Grab () // TouchDown Button Grab
{if (angle5> 0) {angle5 = angle5-step_angle_mini; } moteur5.write (vinkel5); } ugyldig Base_Rotation () {if (vinkel 0) {vinkel = vinkel-trin_angel; } anden vinkel = 0; moteur.write (vinkel); } void Waist_Rotation () {if (angle1 20) {angle1 = angle1-step_angle; } anden vinkel1 = 20; moteur1.write (vinkel1); } void Third_Arm_Rotation () {if (angle2 0) {angle2 = angle2-step_angle; } moteur2.write (vinkel2); } void Fourth_Arm_Rotation () {if (angle3 = 0) {angle3 = angle3-step_angle_mini; } moteur3.write (vinkel3); }
Trin 6: Det er det
Tak fordi du så med, jeg håber du værdsætter det!
Hvis du kunne lide denne Instructable, kan du helt sikkert besøge os for mere! =)
Anbefalede:
Matlab-baseret ROS Robotic Controller: 9 trin
Matlab-baseret ROS Robotic Controller: Lige siden jeg var barn har jeg altid drømt om at være Iron Man og gør det stadig. Iron Man er en af de karakterer, der er realistisk muligt og ganske enkelt håber jeg på at blive Iron Man en dag, selvom folk griner af mig eller siger, at det er umuligt
Popsicle Stick Robotic Arm: 17 trin (med billeder)
Popsicle Stick Robotic Arm: Sådan bygger du en simpel robotarm med en griber ved hjælp af popsicle sticks, en Arduino og et par servoer
Arduino Game Controller + Unity Game: 5 trin
Arduino Game Controller + Unity Game: I denne instruktive vil jeg vise dig, hvordan du bygger/programmerer en arduino game controller, som kan oprette forbindelse til enhed
Xbox 360 ROBOTIC ARM [ARDUINO]: AXIOM ARM: 4 trin
Xbox 360 ROBOTIC ARM [ARDUINO]: AXIOM ARM:
ROS MoveIt Robotic Arm Part 2: Robot Controller: 6 trin
ROS MoveIt Robotic Arm Part 2: Robot Controller: https://github.com/AIWintermuteAI/ros-moveit-arm.git I den forrige del af artiklen har vi oprettet URDF- og XACRO-filer til vores robotarm og lanceret RVIZ for at kontrollere vores robotarm i simuleret miljø. Denne gang gør vi det med rea