Paso 18: Programa el brazo.
Usted puede encontrar el bosquejo que controla el brazo del robot en el repositorio de github en DynamixShield/apuntes/RobotArm. Voy a explicar brevemente las partes principales del bosquejo.
1. en primer lugar, debe incluir la clase DynamixSerial. Esta clase es lo que usted utilizará para comunicarse con los servos Dynamixel.
#include
2. a continuación tenemos algunas variables para asignar los pines de los sensores de presión y palanca de mando y seguimiento de los movimientos de servo.
#define SERVO_COUNT 5
#define AXIS_COUNT 4
Estas constantes no va a cambiar. Son utilizados para dar nombres
para los pernos utilizan:
const int x1Pin = A0;
const int y1Pin = A1;
const int x2Pin = A2;
const int y2Pin = A3;
const int pressurePin = A11;
Índice de la matriz de AxisPos que controla la apertura y cierre de pinza
const int gripperCloseIdx = 1;
const int gripperOpenIdx = 3;
const int gripperIdx = 4;
int servoPos [SERVO_COUNT];
servoDir int [SERVO_COUNT];
int servoAdd [SERVO_COUNT];
axisID int [AXIS_COUNT];
int axisPos [AXIS_COUNT];
int gripPressure = 0;
3. a continuación declaramos la clase DynamixelSerial. Esta clase asume que está utilizando Serial1 para comunicaciones a los servos Dynamixel. Sin embargo, si pasa en un puerto serial hardware puede reemplazarlo. Esto es por lo que el software puede utilizarse en proyectos personalizados que no usan el DynamixShield.
DynamixelSerial Dynamixel;
4. la siguiente parte más importante es la configuración. Se inicio nuestra conexión en serie de depuración y luego comenzar la clase de DynamixelSerial. Por defecto una tarifa de comunicaciones 1 Mbaud y el pin que utiliza para controlar el medio-duplex del protocolo Dynamixel está basado en el tablero que se utiliza. Así sucesivamente un debido es pin 22, pero en el cero es pin 2. Sin embargo, también tienes la opción de especificar estos parámetros en la llamada al método begin para reemplazar lo que se utiliza para proyectos personalizados.
#ifdef ENABLE_DEBUG
Serial.Begin(57600);
mientras (!. Serie);
Serial.println ("configuración inicial");
#endif
Dynamixel.Begin (); o Dynamixel.begin (1000000, 22);
5. configuración entonces tiene algo de código para restablecer todos los servos a la posición predeterminada para prepararse para el movimiento. También restablece todas las variables a su estado predeterminado.
6. el bucle de procesamiento principal es bastante simple. Solo llama processJoysticks() y luego retrasos de 20 milisegundos.
void loop () {}
processJoysticks();
Delay (20);
}
7. el método de la palanca de mando de proceso tiene un lazo que pasa por cada eje del joystick y lee el valor analógico del joystick.
void processJoysticks() {}
String servoPosReport = "", servoAddReport = "", axisReport = "";
Lectura analógica de valor:
para (int i = 0; i
axisPos [i] = analogRead(axisID[i]);
8. luego escala el valor de la palanca de mando entre 255 y 755 en un valor entre -5 y 5. Si el valor es superior a 1020 entonces significa que estamos presionando hacia abajo en el joystick para cerrar las mordazas de la pinza, así que dejaremos el método de sujeción proceso lidiar con eso.
Si es mayor de 1020, que se presiona el botón.
Si {} (axisPos [i] < 1020)
servoAdd [i] = mapa (axisPos [i], 255, 755, -5, 5);
}
Else {}
servoAdd [i] = 0;
}
9. a continuación añadimos el valor de movimiento a la posición de los servos.
Si ((servoPos [i] + servoAdd[i]) > = 0 & & (servoPos [i] + servoAdd [i] < 1024)) {}
servoPos [i] += (servoDir [i] * servoAdd[i]);
}
10. Si hemos tenido movimiento en este eje establecemos la nueva posición del servo.
Si (servoAdd [i]! = 0) {}
Dynamixel.moveSpeed (i + 1, servoPos [i], 150); Delay(10);
}
11. Finalmente, llama processGripper. Que métodos comienza por leer la señal analógica del sensor de presión.
void processGripper (String & servoPosReport, String & servoAddReport) {}
gripPressure = analogRead(pressurePin);
12. empuja hacia abajo en el joystick derecho cierra la girpper, mientras empuja hacia abajo en el joystick izquierdo abre. El método comprueba esto por ver si la posición del eje de la posición de pinza estrecha o abierta es igual a 1023. Este es el valor leído de la palanca de mando cuando está presionando hacia abajo en él. Si es hacia abajo y luego fijamos el servo agregar para ser más o menos 10. De lo contrario, añade cero.
Si (axisPos [gripperCloseIdx] == 1023) {}
Si {} (gripPressure < 850)
servoAdd [gripperIdx] = -10;
}
}
else if (axisPos [gripperOpenIdx] == 1023) {}
servoAdd [gripperIdx] = 10;
}
Else {}
servoAdd [gripperIdx] = 0;
}
13. establecemos la posición del servo mientras permanezca en 0 y 512. La garra no puede mover más.
Si ((servoPos [gripperIdx] + servoAdd[gripperIdx]) > = 0
& & (servoPos [gripperIdx] + servoAdd [gripperIdx] < = 512)) {}
servoPos [gripperIdx] += (servoDir [gripperIdx] * servoAdd[gripperIdx]);
}
14. por último, si agregamos a la posición entonces necesitamos establecer la nueva posición del servo de la pinza.
Si (servoAdd [gripperIdx]! = 0) {}
Dynamixel.moveSpeed (gripperIdx + 1, servoPos [gripperIdx], 150);
}
Y eso es todo. Hay algunas otras cosas en el sketch que no discutir aquí, sino que es principalmente para propósitos de depuración. Usted puede activar la depuración por tenga //#define ENABLE_DEBUG 1 línea en la parte superior. Esto imprimirá lo que está sucediendo como ejecutar el sketch. Utilice el IDE de Arduino para programar el bosquejo en el microcontrolador y permite ejecuta nuestro nuevo brazo robot!