Taula de continguts:
- Pas 1: materials
- Pas 2: imprimiu en 3D el braç robòtic
- Pas 3: muntatge electrònic
- Pas 4: Aplicació de telèfon intel·ligent
- Pas 5: el codi Arduino
- Pas 6: Això és tot
Vídeo: Joc de braços robòtics: controlador de telèfon intel·ligent: 6 passos
2024 Autora: John Day | [email protected]. Última modificació: 2024-01-30 08:12
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
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
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
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
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
// 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:
Llum LED d'escriptori intel·ligent - Il·luminació intel·ligent amb Arduino - Espai de treball Neopixels: 10 passos (amb imatges)
Llum LED d'escriptori intel·ligent | Il·luminació intel·ligent amb Arduino | Espai de treball de Neopixels: ara passem molt de temps a casa estudiant i treballant virtualment, per què no fer que el nostre espai de treball sigui més gran amb un sistema d’il·luminació personalitzat i intel·ligent basat en els LEDs Arduino i Ws2812b. Aquí us mostro com construir el vostre Smart Llum LED d'escriptori que
Converteix un telèfon intel·ligent no utilitzat en una pantalla intel·ligent: 6 passos (amb imatges)
Converteix un telèfon intel·ligent no utilitzat en una pantalla intel·ligent: el tutorial de Deze es troba a Engels, per a la versió del clàssic espanyol. Teniu un telèfon intel·ligent (antic) sense utilitzar? Convertiu-lo en una pantalla intel·ligent amb Fulls de càlcul de Google i paper i llapis seguint aquest senzill tutorial pas a pas. Quan hagis acabat
Làmpada LED intel·ligent controlada per telèfon intel·ligent Bluetooth: 7 passos
Làmpada LED intel·ligent controlada per telèfon intel·ligent Bluetooth: sempre somio amb controlar els meus aparells d’il·luminació. Aleshores algú va fabricar una increïble llum LED de colors. Fa poc em vaig trobar amb una làmpada LED de Joseph Casha a Youtube. Inspirant-me en ell, vaig decidir afegir diverses funcions mantenint la comoditat
Cistella de compra intel·ligent controlada per telèfon intel·ligent: 7 passos
Cistella de compra intel·ligent controlada per telèfon intel·ligent: visitar centres comercials pot ser divertit. Però arrossegar el carretó de la compra mentre l’ompliu de coses és una cosa que és francament molest. El dolor d’empènyer-lo per aquells passadissos estrets i fer aquells girs bruscos! Per tant, aquí teniu (una mena d’oferta) que podeu
Com controlar l'interruptor intel·ligent bàsic Sonoff basat en ESP8266 amb un telèfon intel·ligent: 4 passos (amb imatges)
Com controlar el commutador intel·ligent bàsic de Sonoff basat en ESP8266 amb un telèfon intel·ligent: Sonoff és una línia de dispositius per a Smart Home desenvolupada per ITEAD. Un dels dispositius més flexibles i econòmics d’aquesta línia és Sonoff Basic. És un commutador habilitat per Wi-Fi basat en un gran xip, ESP8266. En aquest article es descriu com configurar el Cl