Tabla de contenido:

Piano Tiles tocando el brazo robótico: 5 pasos
Piano Tiles tocando el brazo robótico: 5 pasos

Video: Piano Tiles tocando el brazo robótico: 5 pasos

Video: Piano Tiles tocando el brazo robótico: 5 pasos
Video: El juego casi imposible! | • Liza Baez • #shorts 2024, Mes de julio
Anonim
Azulejos de piano tocando el brazo robótico
Azulejos de piano tocando el brazo robótico

El grupo está formado por 2 Ingenieros en Automatización de UCN, a quienes se les ocurrió una brillante idea que nos motiva hacer y desarrollar. La idea se basa en una placa Arduino que controla un brazo robótico. La placa Arduino es el cerebro de la operación y luego el actuador de la operación, el brazo robótico, hará lo que necesite. La explicación más detallada vendrá más adelante.

Paso 1: Equipo

Equipo
Equipo

Brazo robótico:

Kit de brazo robótico Phantomx Pincher Maek II (https://learn.trossenrobotics.com/38-interbotix-ro…)

Software para el robot- https://www.arduino.cc/en/Main/OldSoftwareRelease… Cámara de detección de color:

Cámara CMUcam5 Pixy - (https://charmedlabs.com/default/pixy-cmucam5/)

Software: PixyMon (https://cmucam.org/projects/cmucam5/wiki/Install_PixyMon_on_Windows_Vista_7_8)

Paso 2: configuración de Arduino

Configuración de Arduino
Configuración de Arduino

Puedes ver la configuración en el tablero aquí, lo cual es muy fácil.

A la izquierda está la fuente de alimentación.

El del medio es para el primer servo, que luego se conecta a los otros servos, servo por servo.

El de abajo es donde controlamos la placa desde una PC o Laptop, que tiene una entrada USB en el otro extremo.

Paso 3: Programa final

||| PROGRAMA |||

#incluir

#include #include "poses.h" #include // Pixy Library #include

#define POSECOUNT 5

BioloidController bioloid = BioloidController (1000000);

const int SERVOCOUNT = 5; int id; int pos; boolean IDCheck; boolean RunCheck;

configuración vacía () {pinMode (0, SALIDA); ax12SetRegister2 (1, 32, 50); // establece el registro 32 del número de junta 1 en la velocidad 50. ax12SetRegister2 (2, 32, 50); // establece el registro 32 del número de junta 2 en la velocidad 50. ax12SetRegister2 (3, 32, 50); // establece el registro 32 del número de articulación 3 a la velocidad 50. ax12SetRegister2 (4, 32, 50); // establece el registro 32 del número de articulación 4 a la velocidad 50. ax12SetRegister2 (5, 32, 100); // establece el registro del número de articulación 5 32 a velocidad 100. // inicializar variables id = 1; pos = 0; IDCheck = 1; RunCheck = 0; // abre el puerto serie Serial.begin (9600); retraso (500); Serial.println ("##########################"); Serial.println ("Comunicación en serie establecida");

// Verifique el voltaje de la batería Lipo CheckVoltage ();

// Escanear servos, volver a la posición MoveTest (); Mudanza de casa(); Opciones de menú(); RunCheck = 1; }

bucle vacío () {// leer el sensor: int inByte = Serial.read ();

switch (inByte) {

caso '1': MovePose1 (); rotura;

caso '2': MovePose2 (); rotura; caso '3': MovePose3 (); rotura;

caso '4': MovePose4 (); rotura;

caso '5': MoveHome (); rotura; caso '6': Agarrar (); rotura;

caso '7': LEDTest (); rotura;

caso '8': RelaxServos (); rotura; }}

void CheckVoltage () {// espere, luego verifique el voltaje (seguridad de LiPO) voltaje de flotación = (ax12GetRegister (1, AX_PRESENT_VOLTAGE, 1)) / 10.0; Serial.println ("##########################"); Serial.print ("Voltaje del sistema:"); Serial.print (voltaje); Serial.println ("voltios"); if (voltaje 10.0) {Serial.println ("Niveles de voltaje nominal."); } if (RunCheck == 1) {MenuOptions (); } Serial.println ("##########################"); }

void MoveHome () {retraso (100); // pausa recomendada bioloid.loadPose (Inicio); // carga la pose desde FLASH, en el búfer nextPose bioloid.readPose (); // lee las posiciones actuales de los servos en el búfer curPose Serial.println ("#########################"); Serial.println ("Mover los servos a la posición de inicio"); Serial.println ("##########################"); retraso (1000); bioloid.interpolateSetup (1000); // configuración para la interpolación desde actual-> siguiente más de 1/2 segundo while (bioloid.interpolates> 0) {// hacemos esto mientras no hayamos alcanzado nuestra nueva pose bioloid.interpolateStep (); // mueve los servos, si es necesario. retraso (3); } if (RunCheck == 1) {MenuOptions (); }}

void MovePose1 () {retraso (100); // pausa recomendada bioloid.loadPose (Pose1); // carga la pose desde FLASH, en el búfer nextPose bioloid.readPose (); // leer las posiciones actuales de los servos en el búfer curPose Serial.println ("#########################"); Serial.println ("Mover los servos a la 1ª posición"); Serial.println ("##########################"); retraso (1000); bioloid.interpolateSetup (1000); // configuración para la interpolación desde actual-> siguiente más de 1/2 segundo while (bioloid.interpolates> 0) {// hacemos esto mientras no hayamos alcanzado nuestra nueva pose bioloid.interpolateStep (); // mueve los servos, si es necesario. retraso (3); } SetPosition (3, 291); // establece la posición de la articulación 3 en '0' delay (100); // espera a que la articulación se mueva if (RunCheck == 1) {MenuOptions (); }}

void MovePose2 () {retraso (100); // pausa recomendada bioloid.loadPose (Pose2); // carga la pose desde FLASH, en el búfer nextPose bioloid.readPose (); // lee las posiciones actuales de los servos en el búfer curPose Serial.println ("#########################"); Serial.println ("Mover los servos a la 2ª posición"); Serial.println ("##########################"); retraso (1000); bioloid.interpolateSetup (1000); // configuración para la interpolación desde actual-> siguiente más de 1/2 segundo while (bioloid.interpolates> 0) {// hacemos esto mientras no hayamos alcanzado nuestra nueva pose bioloid.interpolateStep (); // mueve los servos, si es necesario. retraso (3); } SetPosition (3, 291); // establece la posición de la articulación 3 en '0' delay (100); // espera a que la articulación se mueva if (RunCheck == 1) {MenuOptions (); }} void MovePose3 () {retraso (100); // pausa recomendada bioloid.loadPose (Pose3); // carga la pose desde FLASH, en el búfer nextPose bioloid.readPose (); // leer las posiciones actuales de los servos en el búfer curPose Serial.println ("#########################"); Serial.println ("Mover los servos a la 3ª posición"); Serial.println ("##########################"); retraso (1000); bioloid.interpolateSetup (1000); // configuración para la interpolación desde actual-> siguiente más de 1/2 segundo while (bioloid.interpolates> 0) {// hacemos esto mientras no hayamos alcanzado nuestra nueva pose bioloid.interpolateStep (); // mueve los servos, si es necesario. retraso (3); } SetPosition (3, 291); // establece la posición de la articulación 3 en '0' delay (100); // espera a que la articulación se mueva if (RunCheck == 1) {MenuOptions (); }}

void MovePose4 () {retraso (100); // pausa recomendada bioloid.loadPose (Pose4); // carga la pose desde FLASH, en el búfer nextPose bioloid.readPose (); // lee las posiciones actuales de los servos en el búfer curPose Serial.println ("#########################"); Serial.println ("Mover los servos a la 4ª posición"); Serial.println ("##########################"); retraso (1000); bioloid.interpolateSetup (1000); // configuración para la interpolación desde actual-> siguiente más de 1/2 segundo while (bioloid.interpolates> 0) {// hacemos esto mientras no hayamos alcanzado nuestra nueva pose bioloid.interpolateStep (); // mueve los servos, si es necesario. retraso (3); } SetPosition (3, 291); // establece la posición de la articulación 3 en '0' delay (100); // espera a que la articulación se mueva if (RunCheck == 1) {MenuOptions (); }}

void MoveTest () {Serial.println ("#########################"); Serial.println ("Inicialización de la prueba de signos de movimiento"); Serial.println ("##########################"); retraso (500); id = 1; pos = 512; while (id <= SERVOCOUNT) {Serial.print ("ID de servo móvil:"); Serial.println (id);

while (pos> = 312) {SetPosition (id, pos); pos = pos--; retraso (10); }

while (pos <= 512) {SetPosition (id, pos); pos = pos ++; retraso (10); }

// iterar al siguiente ID de servo id = id ++;

} if (RunCheck == 1) {MenuOptions (); }}

void MenuOptions () {Serial.println ("##########################"); Serial.println ("Ingrese la opción 1-5 para ejecutar pruebas individuales nuevamente"); Serial.println ("1) 1.ª posición"); Serial.println ("2) 2ª posición"); Serial.println ("3) 3.ª posición"); Serial.println ("4) 4ª posición"); Serial.println ("5) Posición inicial"); Serial.println ("6) Verifique el voltaje del sistema"); Serial.println ("7) Realizar prueba de LED"); Serial.println ("8) Relax Servos"); Serial.println ("##########################"); }

anular RelaxServos () {id = 1; Serial.println ("##########################"); Serial.println ("Servos relajantes"); Serial.println ("##########################"); while (id <= SERVOCOUNT) {Relax (id); id = (id ++)% SERVOCOUNT; retraso (50); } if (RunCheck == 1) {MenuOptions (); }}

void LEDTest () {id = 1; Serial.println ("##########################"); Serial.println ("Prueba de LED en ejecución"); Serial.println ("##########################"); while (id <= SERVOCOUNT) {ax12SetRegister (id, 25, 1); Serial.print ("LED ENCENDIDO - Servo ID:"); Serial.println (id); retraso (3000); ax12SetRegister (id, 25, 0); Serial.print ("LED APAGADO - Servo ID:"); Serial.println (id); retraso (3000); id = id ++; } if (RunCheck == 1) {MenuOptions (); }}

void Grab () {SetPosition (5, 800); // establece la posición de la articulación 1 en '0' delay (100); // espera a que la articulación se mueva

}

Hemos basado nuestro programa en el programa PincherTest del fabricante con algunos ajustes importantes en el caso del posicionamiento. Usamos poses.h para que el robot tenga las posiciones en la memoria. En primer lugar, intentamos crear nuestro brazo de reproducción con Pixycam para que fuera automático, pero debido a problemas de luz y pantalla pequeña, eso no pudo suceder. El robot tiene una posición de inicio básica, después de cargar el programa, probará todos los servos que se encuentran en el robot. Hemos establecido las poses para los botones 1-4, por lo que será fácil de recordar. Siéntete libre de usar el programa.

Paso 4: Guía de video

Paso 5: Conclusión

En conclusión, el robot es un pequeño proyecto divertido para nosotros y algo divertido para jugar y experimentar. Te animo a que lo pruebes y lo personalices también.

Recomendado: