Taula de continguts:

Joc de braços robòtics: controlador de telèfon intel·ligent: 6 passos
Joc de braços robòtics: controlador de telèfon intel·ligent: 6 passos

Vídeo: Joc de braços robòtics: controlador de telèfon intel·ligent: 6 passos

Vídeo: Joc de braços robòtics: controlador de telèfon intel·ligent: 6 passos
Vídeo: How to make a 8 Channel Transmitter | 8 Channel Simple RF Remote Control For RC | Part 01 #jlcpcb 2024, Juliol
Anonim
Joc de braços robòtics: controlador de telèfon intel·ligent
Joc de braços robòtics: controlador de telèfon intel·ligent

Hola !

Aquí un divertit joc d'estiu: el braç robòtic controlat per Smartphone !!

Com podeu veure al vídeo, podeu controlar el braç amb alguns joysticks al telèfon intel·ligent.

També podeu desar un patró que el robot reproduirà en bucle, per tal de fer algunes tasques repetitives com a exemple. Però aquest patró és modulable com vulguis !!!!

Sigues creatiu !

Pas 1: materials

Materials
Materials

Aquí podeu veure el material que necessiteu.

Costarà uns 50 € construir aquest braç robòtic. El programari i les eines es poden substituir, però els he utilitzat per a aquest projecte.

Pas 2: imprimiu en 3D el braç robòtic

Impressió 3D del braç robòtic
Impressió 3D del braç robòtic
Impressió 3D del braç robòtic
Impressió 3D del braç robòtic
Impressió 3D del braç robòtic
Impressió 3D del braç robòtic

El braç robòtic es va imprimir en 3D (amb la nostra prusa i3).

Gràcies al lloc web "HowtoMechatronics.com", els seus fitxers STL són increïbles per construir un braç 3D.

Es trigaran unes 20 hores a imprimir totes les peces.

Pas 3: muntatge electrònic

Muntatge electrònic
Muntatge electrònic

El muntatge està separat en 2 parts:

Una part electrònica, on l’arduino està connectat als servos mitjançant els pins digitals i amb el dispositiu Bluetooth (Rx, Tx).

Una part d'alimentació, on els servos s'alimenten amb un carregador de 2 telèfons (5V, 2A màxim).

Pas 4: Aplicació de telèfon intel·ligent

Aplicació de telèfon intel·ligent
Aplicació de telèfon intel·ligent

L'aplicació es va fer a l'inventor de l'aplicació 2. Utilitzem 2 palanques de control per controlar 4 servos i 2 botons més per controlar el grip final.

Connectem Arm i Smartphone junts mitjançant un mòdul Bluetooth (HC-06).

Finalment, un mode d'estalvi permet a l'usuari guardar fins a 9 posicions per al braç.

El braç passarà a un mode automàtic, on reproduirà les posicions guardades.

Pas 5: el codi Arduino

El codi Arduino
El codi Arduino
El codi Arduino
El codi Arduino

// 08/19 - Controlat per Smartphone amb braç robòtic

#include #define TRUE true #define FALSE false // ******************** DECLARACIONS ***************** ***********

representant de la paraula; // 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; Servomotor; // 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; aleta booleana = FALS; boolean fin1 = FALS; boolean fin2 = FALS; aleta booleana3 = FALS; boolean fin4 = FALS; paraula 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];

// int angle; // angle de rotació (0 a 180)

// ******************** CONFIGURACIÓ *************************** ******** 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); // permetra de communiquer au module Bluetooth} // ********************* BOUCLE ****************** ***************** bucle buit () {

// 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 ");

//Serial.print("angle ");

int i; w = recevoir (); // on va recevoir una information du smartphone, la variable w switch (w) {case 1: TouchDown_Release (); break; cas 2: TouchDown_Grab (); break; cas 3: Base_Rotation (); break; cas 4: Base_AntiRotation (); break; cas 5: Waist_Rotation (); break; cas 6: Waist_AntiRotation (); break; cas 7: Third_Arm_Rotation (); break; cas 8: Third_Arm_AntiRotation (); break; cas 9: Quart_Arm_Rotation (); break; cas 10: Quart_Arm_AntiRotation (); break; // cas 11: Fifth_Arm_Rotation (); break; // cas 12: Fifth_Arm_AntiRotation (); break; cas 21: Serial.print ("botó de cas 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]); trencar; cas 22: chiffre_final = 2; sauvegarde_positions2 [0] = angle; sauvegarde_positions2 [1] = angle1; sauvegarde_positions2 [2] = angle2; sauvegarde_positions2 [3] = angle3; sauvegarde_positions2 [4] = angle5; trencar; cas 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; cas 24: chiffre_final = 4; sauvegarde_positions4 [0] = angle; sauvegarde_positions4 [1] = angle1; sauvegarde_positions4 [2] = angle2; sauvegarde_positions4 [3] = angle3; sauvegarde_positions4 [4] = angle5; trencar; cas 25: chiffre_final = 5; sauvegarde_positions5 [0] = angle; sauvegarde_positions5 [1] = angle1; sauvegarde_positions5 [2] = angle2; sauvegarde_positions5 [3] = angle3; sauvegarde_positions5 [4] = angle5; trencar; cas 26: chiffre_final = 6; sauvegarde_positions6 [0] = angle; sauvegarde_positions6 [1] = angle1; sauvegarde_positions6 [2] = angle2; sauvegarde_positions6 [3] = angle3; sauvegarde_positions6 [4] = angle5; trencar; cas 27: chiffre_final = 7; sauvegarde_positions7 [0] = angle; sauvegarde_positions7 [1] = angle1; sauvegarde_positions7 [2] = angle2; sauvegarde_positions7 [3] = angle3; sauvegarde_positions7 [4] = angle5; trencar; cas 28: chiffre_final = 8; sauvegarde_positions8 [0] = angle; sauvegarde_positions8 [1] = angle1; sauvegarde_positions8 [2] = angle2; sauvegarde_positions8 [3] = angle3; sauvegarde_positions8 [4] = angle5; trencar; cas 29: chiffre_final = 9; sauvegarde_positions9 [0] = angle; sauvegarde_positions9 [1] = angle1; sauvegarde_positions9 [2] = angle2; sauvegarde_positions9 [3] = angle3; sauvegarde_positions9 [4] = angle5; trencar;

cas 31: Serial.print ("31"); activate_saving = 1; chiffre_final = 0; trencar; // COMENÇAR

cas 33: Serial.print ("33"); activate_saving = 0; break; // BUTTON SAVE per defecte: break; } if (w == 32) {Serial.print ("\ nReprodueix / nChiffre final:"); Serial.print (chiffre_final); Serial.print ("\ n Sauvegarde posició 1: / n"); for (i = 0; i <5; i ++) {Serial.print (sauvegarde_positions1 ); Serial.print ("\ t");} Serial.print ("\ n Sauvegarde posició 2: / n"); for (i = 0; i <5; i ++) {Serial.print (sauvegarde_positions2 ); Serial.print ("\ t");} Serial.print ("\ n Sauvegarde posició 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 COMENÇAR / nLoop:"); Serial.print (i); Serial.print ("\ n"); switch (i) {case 1: goto_moteur (* (sauvegarde_positions1)); delay (200); goto_moteur1 (* (sauvegarde_positions1 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions1 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions1 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions1 + 4)); delay (200); trencar; cas 2: goto_moteur (* (sauvegarde_positions2)); delay (200); goto_moteur1 (* (sauvegarde_positions2 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions2 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions2 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions2 + 4)); delay (200); trencar; cas 3: goto_moteur (* (sauvegarde_positions3)); delay (200); goto_moteur1 (* (sauvegarde_positions3 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions3 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions3 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions3 + 4)); delay (200); trencar; cas 4: goto_moteur (* (sauvegarde_positions4)); delay (200); goto_moteur1 (* (sauvegarde_positions4 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions4 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions4 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions4 + 4)); delay (200); trencar; cas 5: goto_moteur (* (sauvegarde_positions5)); delay (200); goto_moteur1 (* (sauvegarde_positions5 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions5 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions5 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions5 + 4)); delay (200); trencar; cas 6: goto_moteur (* (sauvegarde_positions6)); delay (200); goto_moteur1 (* (sauvegarde_positions6 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions6 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions6 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions6 + 4)); delay (200); trencar; cas 7: goto_moteur (* (sauvegarde_positions7)); delay (200); goto_moteur1 (* (sauvegarde_positions7 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions7 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions7 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions7 + 4)); delay (200); trencar; cas 8: goto_moteur (* (sauvegarde_positions8)); delay (200); goto_moteur1 (* (sauvegarde_positions8 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions8 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions8 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions8 + 4)); delay (200); trencar; cas 9: goto_moteur (* (sauvegarde_positions9)); delay (200); goto_moteur1 (* (sauvegarde_positions9 + 1)); retard (200); goto_moteur2 (* (sauvegarde_positions9 + 2)); delay (200); goto_moteur3 (* (sauvegarde_positions9 + 3)); retard (200); goto_moteur5 (* (sauvegarde_positions9 + 4)); delay (200); trencar; } Serial.print ("\ n ************************ FIN REPRODUIR ***************** / n "); retard (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"); * /

retard (100); } // ***************************** FONCIONS ****************** ******************

word recevoir () {// fonction permettant de recevoir l'information du smartphone

if (Serial.available ()) {w = Serial.read ();

Serial.flush ();

tornar w; }}

void goto_moteur (int angle_destination)

{while (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);} delay (100); } moteur.write (angle_destination); } void goto_moteur1 (int angle_destination) {while (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);;} delay (100); } moteur1.write (angle_destination); } void goto_moteur2 (int angle_destination) {

while (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);} delay (100); } moteur2.write (angle_destination); } void goto_moteur3 (int angle_destination) {

while (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);} delay (100); } moteur3.write (angle_destination); } void goto_moteur5 (int angle_destination) {

while (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);} delay (100); } moteur5.write (angle_destination); }

void TouchDown_Release () // Versió del botó TouchDown

{if (angle5 <180) {angle5 = angle5 + step_angle_mini; } moteur5.write (angle5); }

void TouchDown_Grab () // Captura de botons TouchDown

{if (angle5> 0) {angle5 = angle5-step_angle_mini; } moteur5.write (angle5); } void Rotació_Base () {if (angle 0) {angle = angle-step_angle; } else angle = 0; moteur.write (angle); } void Rotació_cintura () {if (angle1 20) {angle1 = angle1-pas_angle; } else angle1 = 20; moteur1.write (angle1); } void Third_Arm_Rotation () {if (angle2 0) {angle2 = angle2-step_angle; } moteur2.write (angle2); } void Fourth_Arm_Rotation () {if (angle3 = 0) {angle3 = angle3-step_angle_mini; } moteur3.write (angle3); }

Pas 6: Això és tot

Gràcies per veure-ho, espero que us agradi!

Si us ha agradat aquest instructiu, segur que ens podeu visitar per obtenir més informació. =)

Recomanat: