Hola, estoy en un proyecto para controlar un brazo robótico con potenciometros, de tal manera que, con una llave, pase al modo grabar posiciones, y luego al terminar de mover el potenciometro ir apretando un pulsador para grabar cada movimiento.
Definición del Porblema 1: Cuando grabo las posiciones de los servos estos no se mueven al mover el potenciometro, asique no logro ver lo que "estoy haciendo", más allá de que las posiciones se graban perfectamente.
Busco ésta solución: que los servos se muevan efectivamente mientres grabo al mismo tiempo.
Definición del Problema 2: Cuando esta en modo ejecución, es decir, cuando repite los movimientos guardados, lo realiza una vez, hasta llegar a "ultimo paso". Lo que quiero es tener la opcion de que repita los pasos guardados indefinidamente.
Busco ésta solución: que al reproducir los pasos guardados, y al llegar al ultimo paso, repita la secuencia, y así sucesivamente.
Este es el código:
#include <Servo.h>
#define NUMSERVOS 6 // Cantidad de servos
#define PINGRABA 8 // Pin de SWITCH que determina el modo
#define PINMODO 9 // Pin de PULSADOR que determina cuando graba la posicion
#define MAXPASOS 100 // Maxima cantidad de pasos
int paso = 0; // contador de pasos;
int ultimoPaso = 0; // Contiene el ultimo paso guardado
byte position[MAXPASOS][NUMSERVOS]; // Array de 100 pasos, de los N servos
Servo servos[NUMSERVOS]; // Array de los servos
byte potpin[NUMSERVOS] = {A0, A1, A2, A3, A4, A5}; // Array de pines de potenciometros
byte pinservo[NUMSERVOS] = {2, 3, 4, 5, 6, 7}; // // Array de pines de servos
bool modoGraba = true; // Modo: true:Graba, false:Ejecuta
byte limites[NUMSERVOS][2] = { {0,180}, {0,180}, {0,180}, {0,180}, {0,180}, {0,180} }; //valores limites de cada servo de mi brazo {inferior, superior}
// graba la posicion de los potenciometros en el paso
void savePos() {
if (paso >= MAXPASOS) // Si excede la cantidad de pasos comienza a sobreescribir del inicio
paso = 0;
Serial.print("Grabando paso (");
Serial.print(paso);
Serial.print(")");
for (byte i = 0; i < NUMSERVOS; i++) {
int lectura = analogRead(potpin[i]);
int valor = map(lectura, 0, 1023, limites[i][0], limites[i][1]);
Serial.print(" | ");
//Serial.print(lectura);
//Serial.print(",");
Serial.print(valor);
position[paso][i] = valor;
}
Serial.println("");
paso++;
ultimoPaso = paso;
}
// ejecuta la posicion en el paso
void execPos() {
if (paso == ultimoPaso){
Serial.println("Ultimo paso");
paso++; // Para que el mensaje solo salga una vez
}
if (paso >= ultimoPaso) return; // Si llego al ultimo paso no avanza
Serial.print("Ejecutando paso:");
Serial.print(paso);
for (byte i = 0; i < NUMSERVOS; i++) {
servos[i].write(position[paso][i]);
delay(15);
Serial.print(" | ");
Serial.print(position[paso][i]);
}
Serial.println("");
paso++;
delay(1000);
}
// validaciones del modo de grabacion o ejecucion
void validarModo() {
bool modo = digitalRead(PINMODO);
// si cambio de modo resetear paso a 0
bool cambio = false;
if (modoGraba != modo) {
cambio = true;
Serial.print("Cambio de modo, Modo graba:");
Serial.println(modo);
} else {
cambio = false;
}
modoGraba = modo;
if (cambio) {
paso = 0;
}
}
// Arduino setup
void setup() {
Serial.begin(9600);
for (byte i = 0; i < NUMSERVOS; i++) {
servos[i].attach(pinservo[i]);
}
pinMode(PINGRABA, INPUT);
pinMode(PINMODO, INPUT);
//Valores iniciales de mi brazo/servos
servos[0].write(90);
servos[1].write(90);
servos[2].write(90);
servos[3].write(90);
servos[4].write(90);
servos[5].write(90);
}
// Arduino loop
void loop() {
validarModo();
if (modoGraba) { // modo Graba
int graba = digitalRead(PINGRABA);
if (graba == HIGH) {
savePos();
delay(1000);
}
} else { // modo Ejecucion
execPos();
}
}
Alguna sugerencia?