Go Down

Topic: Sistema para acercar una diana en un campo de tiro. (Read 90 times) previous topic - next topic

chemita83

Hola, buenas tardes.
Estoy intentando hacer un proyecto con arduino nano, dos botones, un driver a4899 y un nema, tengo que aclarar que soy un novato en esto. Me gustaría saber si el código estaría bien. La idea es llevar una diana al sitio de disparo con un botón y traerla con otro.
Necesito mover un numero determinado de pasos en una dirección cuando pulse un botón y que al pulsar el otro botón lo haga en otra dirección. La idea es que entre cada secuencia de pasos el driver se apague. Os dejo el código por aquí. gracias
Code: [Select]
#define VELOCIDAD 1700

int steps = 11;       //Posición del pin contador de pasos
int direccion = 9;    //Posición del pin dirección
int reset = 10;       //Posición del reset
int button1 = 3;      //Posicion de tiro
int button2 = 4;       // Posicion de cambio
int pasos = 2000;     //Cantidad de pasos a meter

// La rutina de inicialización
void setup() {               
 
  pinMode(button1, INPUT);
  pinMode(button2, INPUT);
  pinMode(steps, OUTPUT);
  pinMode(direccion, OUTPUT);
  pinMode(reset, OUTPUT);
}

// La rutina que se repite cíclicamente
void loop() {

  //De primeras damos señal de que el motor esté apagado. Esperamos 100ms y lo encendemos. Colocamos la dirección a HIGH.
  digitalWrite(reset, LOW);    //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  delay(100);
  digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
  digitalWrite(direccion, HIGH);
   
  //Se repite un bucle hasta final de carril.
  for (int i = 0; i<pasos; i++)       //Equivale al numero de vueltas (200 es 360º grados) o micropasos

  if (digitalRead(button1) == HIGH);
  {
    digitalWrite(steps, HIGH);  // This LOW to HIGH change is what creates the
    digitalWrite(steps, LOW); // al A4988 de avanzar una vez por cada pulso de energia. 
    delayMicroseconds(VELOCIDAD);     // Regula la velocidad, cuanto mas bajo mas velocidad.

  }

  //Volvemos a dar señal de que el motor esté apagado. Esperamos 100ms y lo encendemos. Esta vez la dirección es LOW, avanzará en la dirección opuesta.
  digitalWrite(reset, LOW);   //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  delay(100);
  digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
  digitalWrite(direccion, LOW);

  for (int i = 0; i<pasos; i++)//Equivale al numero de vueltas (200 es 360º grados) o micropasos

  if (digitalRead(button2) == HIGH);
  {
     
    digitalWrite(steps, LOW);   // LOW to HIGH hace que el motor avance ya que da la orden
    digitalWrite(steps, HIGH);    // al A4988 de avanzar una vez por cada pulso de energia.
    delayMicroseconds(VELOCIDAD);         // Regula la velocidad, cuanto mas bajo mas velocidad.
  }
}

surbyte

esto esta mal

Code: [Select]
if (digitalRead(button2) == HIGH);
no debes poner el ; al final porque bloqueas de ese modo el uso de lo que sigue entre {}

debe en ese caso modificarse asi

Code: [Select]
 if (digitalRead(button2) == HIGH)  {
    
    digitalWrite(steps, LOW);   // LOW to HIGH hace que el motor avance ya que da la orden
    digitalWrite(steps, HIGH);    // al A4988 de avanzar una vez por cada pulso de energia.
    delayMicroseconds(VELOCIDAD);         // Regula la velocidad, cuanto mas bajo mas velocidad.
  }


Otra observación que hago es que está desconectado esto

Code: [Select]
  //Se repite un bucle hasta final de carril.
  for (int i = 0; i<pasos; i++)       //Equivale al numero de vueltas (200 es 360º grados) o micropaso


con lo que sigue.
De hecho ese for no tiene instrucciónes que se repitan.
en un stepper o motor paso a paso, los pasos que pones ahi son los que aseguran que el motor se desplace X pasos.
Si 200 son una vuelta y 2PixR en mm es el desplazamiento de esa vuelta, entonces sabrás cuando moverte para cumplir con tu objetivo.

chemita83

Gracias!! 

Hoy por la tarde probare el código con los componentes cuando llegue al taller.  Lo demás esta bien?

surbyte

Disculpa, yo respondo y edito mientras voy viendo el código, hay mas comentarios.

chemita83

Si, entiendo tu forma de proceder y te lo agradezco.
Code: [Select]
//Se repite un bucle hasta final de carril.
  for (int i = 0; i<pasos; i++)       //Equivale al numero de vueltas (200 es 360º grados) o micropaso

 
el for esta declarado en
Code: [Select]
int pasos = 2000;     //Cantidad de pasos a meter

 es correcto? necesito dar ese numero de pasos

TonyDiana

A ver, no es que esté mal la idea, pero en un campo de tiro ¿de fechas? ¿arma de fuego? ¿LR22, 9mm, .40, .45? ¿al aire libre o en galería?

Normalmente en las galerías un motor continuo, un botón con inversión, dos poleas y cable, mucho cable, pongamos 120m (yo tiro en galería a 50m) es la solución estándar

¿en serio es necesario tanta complicación?

Otra cosa es que te apetezca como iniciación de un nuevo hobby, en cuyo caso, como si lo conectas con un satélite para saber la hora de cada movimiento, pero vamos, me parece "un poquito grande"

chemita83

Hey.

Yo tiro con carabina de aire comprimido de 4,5mm. en una galería casera de 10 m.
He instalado un sistema con dos poleas y en una de estas dos tengo puesto el motor por pasos.
Hay un carril con dos cables en los cuales se mueve una plataforma de la cual tira la polea que tracciona.
A lo largo del día os mando unas fotos del sistema terminado.

TonyDiana

Ok, ¿y un sencillo motor en una y cambiarle la polaridad? pura electrónica simple, sin necesidad de nada digital, si lo deseas digital pues surbyte ya te dio unos consejos y necesitas mover una cantidad de pasos, pero es que, como decía mi madre, es más caro el collar que el perro, por eso lo que comentaba.

surbyte

Conozco a Tony y te aseguro que tiene mucha razón pero te comprendo.
Si quieres hacerlo con un motor paso a paso, adelante.
He modificado tu código

Code: [Select]
#define VELOCIDAD 1700

const int dirPin      =  9;     // Posición del pin dirección
const int stepPin     = 11;     // Posición del pin contador de pasos
const int butTiro     =  3;     // Posicion de tiro
const int butCambio   =  4;     // Posicion de cambio
const int reset       = 10;     // Posición del reset
 
const int steps = 2000;
int stepDelay;


// La rutina de inicialización
void setup() {              
   pinMode(butTiro, INPUT);
   pinMode(butCambio, INPUT);
   pinMode(dirPin, OUTPUT);
   pinMode(stepPin, OUTPUT);
   pinMode(reset, OUTPUT);
}

// La rutina que se repite cíclicamente
void loop() {
  
  //Se repite un bucle hasta final de carril.
  if (digitalRead(butTiro)) {
      digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
      // Activar una direccion y fijar la velocidad con stepDelay
      digitalWrite(dirPin, HIGH);
      stepDelay = VELOCIDAD;
      // Giramos 2000 pulsos para hacer una vuelta completa
      // Vueltas x N
      int nVueltas = 10;
      for (int x = 0; x < steps * nVueltas; x++) {
          digitalWrite(stepPin, HIGH);
          delayMicroseconds(stepDelay);
          digitalWrite(stepPin, LOW);
          delayMicroseconds(stepDelay);
      }
      // De primeras damos señal de que el motor esté apagado. Esperamos 100ms y lo encendemos. Colocamos la dirección a HIGH.
      digitalWrite(reset, LOW);    //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  }

  if (digitalRead(butCambio)) {
      digitalWrite(reset, HIGH);   //Cuando reset se encuentre en HIGH el motor arrancará y leerá los comandos enviados.
      digitalWrite(dirPin, LOW);
      stepDelay = VELOCIDAD;
      int nVueltas = 10;
      for (int x = 0; x < steps * nVueltas; x++) {
          digitalWrite(stepPin, HIGH);
          delayMicroseconds(stepDelay);
          digitalWrite(stepPin, LOW);
          delayMicroseconds(stepDelay);
      }
      // De primeras damos señal de que el motor esté apagado. Esperamos 100ms y lo encendemos. Colocamos la dirección a HIGH.
      digitalWrite(reset, LOW);    //Mientras reset este en LOW el motor permanecerá apagado y no sufrirá. El chip apagará todos los puertos y no leerá comandos.
  }
}

Go Up