Índice:

Jogo de braço robótico - controlador de smartphone: 6 etapas
Jogo de braço robótico - controlador de smartphone: 6 etapas

Vídeo: Jogo de braço robótico - controlador de smartphone: 6 etapas

Vídeo: Jogo de braço robótico - controlador de smartphone: 6 etapas
Vídeo: BRAÇO ROBÓTICO PARTE 1 - MONTAGEM MECÂNICA 2024, Julho
Anonim
Robotic Arm Game - Smartphone Controller
Robotic Arm Game - Smartphone Controller

Olá !

Aqui está um divertido jogo de verão: O braço robótico controlado por Smartphone !!

Como você pode ver no vídeo, você pode controlar o braço com alguns joysticks no seu smartphone.

Você também pode salvar um padrão, que o robô irá reproduzir em loop, para fazer algumas tarefas repetitivas, por exemplo. Mas esse padrão é modulável como você deseja !!!!

Seja criativo !

Etapa 1: Materiais

Materiais
Materiais

Aqui você pode ver o material que precisa.

Irá custar-lhe cerca de 50 € para construir este braço robótico. O software e as ferramentas podem ser substituídos, mas eu os usei para este projeto.

Etapa 2: imprimir em 3D o braço robótico

Impressão 3D do braço robótico
Impressão 3D do braço robótico
Impressão 3D do braço robótico
Impressão 3D do braço robótico
Impressão 3D do braço robótico
Impressão 3D do braço robótico

O braço robótico foi impresso em 3D (com nosso prusa i3).

Graças ao site "HowtoMechatronics.com", seus arquivos STL são fantásticos para construir um braço 3D.

A impressão de todas as peças demorará cerca de 20 horas.

Etapa 3: Montagem Eletrônica

Montagem Eletrônica
Montagem Eletrônica

A montagem é separada em 2 partes:

Uma parte eletrônica, onde o arduino é conectado aos servos pelos pinos digitais, e com o dispositivo Bluetooth (Rx, Tx).

Uma parte de alimentação, onde os servos são alimentados com 2 carregadores de telefone (5 V, 2 A no máximo).

Etapa 4: aplicativo para smartphone

Aplicativo para smartphone
Aplicativo para smartphone

O Aplicativo foi feito no App inventor 2. Usamos 2 Joystick para controlar 4 Servos e mais 2 Botões para controlar o Grip final.

Conectamos Arm e Smartphone juntos usando um módulo Bluetooth (HC-06).

Finalmente, um modo de economia permite ao usuário salvar até 9 posições para o braço.

O braço entrará em modo automático, onde reproduzirá as posições salvas.

Etapa 5: o código do Arduino

O Código Arduino
O Código Arduino
O Código Arduino
O Código Arduino

// 19/08 - Braço robótico controlado por smartphone

#include #define TRUE true #define FALSE false // ******************** DECLARAÇÕES ***************** ***********

palavra rep; // mot envoyé du module Arduino au smartphone

int chiffre_final = 0; int cmd = 3; // variável 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 motor; // em définit notre servomoteur Servo moteur1; Servo moteur2; Servo moteur3; // Servo moteur4; Servo moteur5; int step_angle_mini = 4; ângulo_do_passo int = 3; ângulo interno, ângulo1, ângulo3, ângulo5, ângulo2; // ângulo int pas; int r, r1, r2, r3; int enregistrer; barbatana booleana = FALSO; boolean fin1 = FALSE; boolean fin2 = FALSE; boolean fin3 = FALSE; boolean fin4 = FALSE; palavra w; // variável 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];

// ângulo interno; // ângulo de rotação (0 a 180)

//********************CONFIGURAR*************************** ******** configuração vazia () {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); ângulo = 6; moteur1.write (100); ângulo1 = 100; moteur2.write (90); moteur3.write (90); //moteur4.write(12); moteur5.write (90); ângulo = 6; ângulo1 = 100; ângulo 2 = 90; ângulo 3 = 90; ângulo 5 = 90; Serial.begin (9600); // permettra de communiquer au module Bluetooth} // ********************* BOUCLE ******************* ****************** void loop () {

// Serial.print ("ângulo");

//Serial.print(angle);Serial.print ("\ t"); Serial.print (angle1); Serial.print ("\ t"); Serial.print (angle2); Serial.print ("\ t "); Serial.print (ângulo3); Serial.print (" / t "); Serial.print (ângulo5); Serial.print (" / n ");

//Serial.print("angle ");

int i; w = receber (); // ao receber uma informação do smartphone, a variável w switch (w) {case 1: TouchDown_Release (); break; caso 2: TouchDown_Grab (); quebrar; caso 3: Base_Rotation (); break; caso 4: Base_AntiRotation (); break; caso 5: Waist_Rotation (); break; caso 6: Waist_AntiRotation (); break; caso 7: Third_Arm_Rotation (); break; caso 8: Third_Arm_AntiRotation (); break; caso 9: Fourth_Arm_Rotation (); break; caso 10: Fourth_Arm_AntiRotation (); quebrar; // caso 11: Fifth_Arm_Rotation (); break; // caso 12: Fifth_Arm_AntiRotation (); break; case 21: Serial.print ("case button 1"); chiffre_final = 1; sauvegarde_positions1 [0] = ângulo; sauvegarde_positions1 [1] = ângulo1; sauvegarde_positions1 [2] = ângulo2; sauvegarde_positions1 [3] = ângulo3; sauvegarde_positions1 [1] = ângulo1; sauvegarde_positions1 [2] = ângulo2; sauvegarde_positions1 [3] = ângulo3; sauvegarde_positions1 [4] = ângulo5; Serial.println (sauvegarde_positions1 [1]); Serial.println (sauvegarde_positions1 [2]); Serial.println (sauvegarde_positions1 [3]); Serial.println (sauvegarde_positions1 [4]); pausa; caso 22: chiffre_final = 2; sauvegarde_positions2 [0] = ângulo; sauvegarde_positions2 [1] = ângulo1; sauvegarde_positions2 [2] = ângulo2; sauvegarde_positions2 [3] = ângulo3; sauvegarde_positions2 [4] = ângulo5; pausa; caso 23: chiffre_final = 3; sauvegarde_positions3 [0] = ângulo; sauvegarde_positions3 [1] = ângulo1; sauvegarde_positions3 [2] = ângulo2; sauvegarde_positions3 [3] = ângulo3; sauvegarde_positions3 [4] = ângulo5; break; caso 24: chiffre_final = 4; sauvegarde_positions4 [0] = ângulo; sauvegarde_positions4 [1] = ângulo1; sauvegarde_positions4 [2] = ângulo2; sauvegarde_positions4 [3] = ângulo3; sauvegarde_positions4 [4] = ângulo5; pausa; caso 25: chiffre_final = 5; sauvegarde_positions5 [0] = ângulo; sauvegarde_positions5 [1] = ângulo1; sauvegarde_positions5 [2] = ângulo2; sauvegarde_positions5 [3] = ângulo3; sauvegarde_positions5 [4] = ângulo5; pausa; caso 26: chiffre_final = 6; sauvegarde_positions6 [0] = ângulo; sauvegarde_positions6 [1] = ângulo1; sauvegarde_positions6 [2] = ângulo2; sauvegarde_positions6 [3] = ângulo3; sauvegarde_positions6 [4] = ângulo5; pausa; caso 27: chiffre_final = 7; sauvegarde_positions7 [0] = ângulo; sauvegarde_positions7 [1] = ângulo1; sauvegarde_positions7 [2] = ângulo2; sauvegarde_positions7 [3] = ângulo3; sauvegarde_positions7 [4] = ângulo5; pausa; caso 28: chiffre_final = 8; sauvegarde_positions8 [0] = ângulo; sauvegarde_positions8 [1] = ângulo1; sauvegarde_positions8 [2] = ângulo2; sauvegarde_positions8 [3] = ângulo3; sauvegarde_positions8 [4] = ângulo5; pausa; caso 29: chiffre_final = 9; sauvegarde_positions9 [0] = ângulo; sauvegarde_positions9 [1] = ângulo1; sauvegarde_positions9 [2] = ângulo2; sauvegarde_positions9 [3] = ângulo3; sauvegarde_positions9 [4] = ângulo5; pausa;

caso 31: Serial.print ("31"); activate_saving = 1; chiffre_final = 0; break; // BEGIN

caso 33: Serial.print ("33"); activate_saving = 0; break; // BOTÃO SALVAR padrão: break; } if (w == 32) {Serial.print ("\ nReproduzir / nChiffre final:"); Serial.print (chiffre_final); Serial.print ("\ n Sauvegarde posição 1: / n"); para (i = 0; i <5; i ++) {Serial.print (sauvegarde_positions1 ); Serial.print ("\ t");} Serial.print ("\ n Sauvegarde posição 2: / n"); para (i = 0; i <5; i ++) {Serial.print (sauvegarde_positions2 ); Serial.print ("\ t");} Serial.print ("\ n Sauvegarde posição 3: / n"); for (i = 0; i <5; i ++) {Serial.print (sauvegarde_positions3 ); Serial.print ("\ t");} for (i = 1; i <= chiffre_final; i ++) {Serial. imprimir ("\ n / n BEGIN / nLoop:"); Serial.print (i); Serial.print ("\ n"); switch (i) {case 1: goto_moteur (* (sauvegarde_positions1)); atraso (200); goto_moteur1 (* (sauvegarde_positions1 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions1 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions1 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions1 + 4)); atraso (200); pausa; caso 2: goto_moteur (* (sauvegarde_positions2)); atraso (200); goto_moteur1 (* (sauvegarde_positions2 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions2 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions2 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions2 + 4)); atraso (200); pausa; caso 3: goto_moteur (* (sauvegarde_positions3)); atraso (200); goto_moteur1 (* (sauvegarde_positions3 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions3 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions3 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions3 + 4)); atraso (200); pausa; caso 4: goto_moteur (* (sauvegarde_positions4)); atraso (200); goto_moteur1 (* (sauvegarde_positions4 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions4 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions4 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions4 + 4)); atraso (200); pausa; caso 5: goto_moteur (* (sauvegarde_positions5)); atraso (200); goto_moteur1 (* (sauvegarde_positions5 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions5 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions5 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions5 + 4)); atraso (200); pausa; caso 6: goto_moteur (* (sauvegarde_positions6)); atraso (200); goto_moteur1 (* (sauvegarde_positions6 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions6 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions6 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions6 + 4)); atraso (200); pausa; caso 7: goto_moteur (* (sauvegarde_positions7)); atraso (200); goto_moteur1 (* (sauvegarde_positions7 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions7 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions7 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions7 + 4)); atraso (200); pausa; caso 8: goto_moteur (* (sauvegarde_positions8)); atraso (200); goto_moteur1 (* (sauvegarde_positions8 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions8 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions8 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions8 + 4)); atraso (200); pausa; caso 9: goto_moteur (* (sauvegarde_positions9)); atraso (200); goto_moteur1 (* (sauvegarde_positions9 + 1)); atraso (200); goto_moteur2 (* (sauvegarde_positions9 + 2)); atraso (200); goto_moteur3 (* (sauvegarde_positions9 + 3)); atraso (200); goto_moteur5 (* (sauvegarde_positions9 + 4)); atraso (200); pausa; } Serial.print ("\ n *********************** FIN REPRODUCE ****************** / n "); atraso (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"); * /

atraso (100); } // **************************** FONÇÕES ****************** ******************

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

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

Serial.flush ();

return w; }}

void goto_moteur (int ângulo_destino)

{while (ângulo_destino ângulo + passo_angulo) {Serial.print ("\ n -------------- * * * * * * -------------- ---- / n "); Serial.print ("ângulo_destino = / t"); Serial.print (ângulo_destino); Serial.print ("\ n ângulo1 = / t"); Serial.print (ângulo); if (ângulo_destino ângulo + passo_ângulo) {ângulo = ângulo + passo_ângulo; moteur.write (ângulo);} delay (100); } moteur.write (ângulo_destino); } void goto_moteur1 (int ângulo_destino) {while (ângulo_destino ângulo1 + passo_ângulo) {Serial.print ("\ n -------------- * * * * * * ------- ----------- / n "); Serial.print ("ângulo_destino = / t"); Serial.print (ângulo_destino); Serial.print ("\ n ângulo2 = / t"); Serial.print (ângulo1); if (ângulo_destino ângulo1 + passo_ângulo) {ângulo1 + = passo_ângulo; moteur1.write (ângulo1);;} atraso (100); } moteur1.write (ângulo_destino); } void goto_moteur2 (int ângulo_destino) {

while (ângulo_destino ângulo2 + passo_ângulo)

{Serial.print ("\ n -------------- * * * * * * ------------------ / n"); Serial.print ("angulo_destino = / t"); Serial.print (ângulo_destino); Serial.print ("\ n ângulo3 = / t"); Serial.print (ângulo2); if (ângulo_destino ângulo2 + passo_ângulo) {ângulo2 + = passo_ângulo; moteur2.write (ângulo2);} atraso (100); } moteur2.write (ângulo_destino); } void goto_moteur3 (int ângulo_destino) {

enquanto (ângulo_destino ângulo3 + passo_ângulo)

{Serial.print ("\ n -------------- * * * * * * ------------------ / n"); Serial.print ("ângulo_destino = / t"); Serial.print (ângulo_destino); Serial.print ("\ n ângulo4 = / t"); Serial.print (ângulo3); if (ângulo_destino ângulo3 + passo_ângulo) {ângulo3 + = passo_ângulo; moteur3.write (ângulo3);} atraso (100); } moteur3.write (ângulo_destino); } void goto_moteur5 (int ângulo_destino) {

while (ângulo_destino ângulo 5 + passo_ângulo)

{Serial.print ("\ n -------------- * * * * * * ------------------ / n"); Serial.print ("ângulo_destino = / t"); Serial.print (ângulo_destino); Serial.print ("\ n ângulo5 = / t"); Serial.print (ângulo5); if (ângulo_destino ângulo5 + passo_ângulo) {ângulo5 + = passo_ângulo; moteur5.write (ângulo5);} atraso (100); } moteur5.write (ângulo_destino); }

void TouchDown_Release () // Liberação do botão TouchDown

{if (ângulo5 <180) {ângulo5 = ângulo5 + passo_ângulo_mini; } moteur5.write (ângulo5); }

void TouchDown_Grab () // Captura do botão TouchDown

{if (angle5> 0) {angle5 = angle5-step_angle_mini; } moteur5.write (ângulo5); } void Base_Rotation () {if (ângulo 0) {ângulo = ângulo-passo_ângulo; } outro ângulo = 0; moteur.write (ângulo); } void Waist_Rotation () {if (ângulo1 20) {ângulo1 = ângulo1-passo_ângulo; } senão ângulo1 = 20; moteur1.write (ângulo1); } void Third_Arm_Rotation () {if (angle2 0) {angle2 = angle2-step_angle; } moteur2.write (ângulo2); } void Fourth_Arm_Rotation () {if (angle3 = 0) {angle3 = angle3-step_angle_mini; } moteur3.write (ângulo3); }

Etapa 6: é isso

Obrigado por assistir, espero que tenha gostado!

Se gostou deste Instructable, pode com certeza nos visitar para mais! =)

Recomendado: