Autor Tema: Grabador de pasos de un brazo robotico  (Leído 1430 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado DavFalc

  • PIC10
  • *
  • Mensajes: 4
Grabador de pasos de un brazo robotico
« en: 24 de Octubre de 2021, 21:11:09 »
Buen día,

Tengo una duda con este programa que encontre en Internet, es acerca de la programación de un brazo robotico grabador de pasos, en esta configuración el switch cuando esta cerrado entre en modo de grabar, y cuando se abre entra en modo ejecutar, sin embargo, quiero saber como cambiar esta configuración, de tal manera que cuando el switch este abierto grabe y cuando este cerrado ejecute, aqui dejo el código, agradezco de su ayuda de antemano

Código: [Seleccionar]
#include <Servo.h>
#define NUMSERVOS 3       // Cantidad de servos
#define PINGRABA 4        // Pin de PULSADOR que determina cuando graba la posicion
#define PINMODO 2         // Pin de SWITCH que determina el modo
#define MAXPASOS 300      // 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};  // Array de pines de potenciometros
byte pinservo[NUMSERVOS] = {5, 6, 9}; //, 10, 3};    // Array de pines de servos
bool modoGraba = true;    // Modo: true:Graba, false:Ejecuta
byte limites[NUMSERVOS][2] = { {0,180}, {82,178}, {5,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(0);
  servos[1].write(178);
  servos[2].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();
  }
}

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 190
Re:Grabador de pasos de un brazo robotico
« Respuesta #1 en: 25 de Octubre de 2021, 06:41:09 »
Hola Dav

No soy de intervenir mucho cuando alguien necesita algo; porque casi siempre entiendo mal o distinto lo que necesitan de lo que yo comprendo.
Veamos que caso será este. :oops:

En el área de definición de variables dice:
bool modoGraba = true;    // Modo: true:Graba, false:Ejecuta
lo cambiamos x
bool modoGraba = false;  // Modo: true:Graba, false:Ejecuta

En la Rutina de validaciones
Código: [Seleccionar]
// 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 = false;
    Serial.print("Cambio de modo, Modo graba:");
    Serial.println(modo);
  } else {
    cambio = true;
  }
  modoGraba = modo;
  if (cambio) {
    paso = 0;
  }

Tengo mis dudas si debemos cambiar el estado también en el Void loop()... cualquier cosa después vemos...
« Última modificación: 25 de Octubre de 2021, 07:50:03 por humberto 02 »

Desconectado DavFalc

  • PIC10
  • *
  • Mensajes: 4
Re:Grabador de pasos de un brazo robotico
« Respuesta #2 en: 25 de Octubre de 2021, 23:34:35 »
Que tal Humberto,

Gracias por la respuesta, lo probe, sin embargo, me marca error, adjunto el diagrama del circuito, espero me puedan apoyar con esto