Go Down

Topic: Controlar bucle con final de carrera (Read 149 times) previous topic - next topic

polu2

Hola a todos, me preguntaba si alguien sabe como poner una condición para un final de carrera sin que me interrumpa el bucle de rotación de un motor. Como veis, he puesto la condición if( estadofinal == HIGH) dentro de la función void loop() por lo que, cuando intenta repetir el bucle, se detiene el motor. Lo que intento es mediante dicha función es posicionar el motor en un paso determinado. ¿Alguien me puede ayudar? :( :
Code: [Select]

const int pinDir = 2;
const int pinStep = 3;
 
const int numStepMotor = 800;
const long velocidad = 4000;
const long velocidad2 = 1000;

int finalCarrera = 8;                         
int estadofinal = 0;
 
void setup() {
 
  pinMode(pinStep, OUTPUT);
  pinMode(pinDir, OUTPUT);
  pinMode(finalCarrera, INPUT);

  digitalWrite(pinDir, HIGH);

  for (int x = 0; x < numStepMotor; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocidad);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocidad);

  }
}
void loop() {
  estadofinal = digitalRead(finalCarrera);

    if( estadofinal == HIGH)
  {

  delay(2000);
  digitalWrite(pinDir, HIGH);

  for (int x = 0; x < numStepMotor; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocidad);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocidad);
  }

  digitalWrite(pinDir, LOW);
 
  for (int x = 0; x < numStepMotor; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocidad2);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocidad2);
  }
}
}

surbyte

Porque esta tonteería?

Code: [Select]
  if( estadofinal == HIGH)   {

  delay(2000);


xq un delay(2000) junto a un motor que se mueve un un contacto que debe ser verificado?
Que pasa si ocurre durante elcomienzo de dichos 2 segundos? Contra que presiona?. Se trata justamente de evitar que un motor siga girando cuando se detecta un fin de carrera no?

bien.

No entiendo bien que intentas hacer, pero mientras hice un pequeño cambio a tu código para que sea mas fácil su lectura

Code: [Select]
void loop() {
  estadofinal = digitalRead(finalCarrera);
  if ( estadofinal == HIGH)  {
      delay(2000);
      digitalWrite(pinDir, HIGH);
      motor(velocidad);

      digitalWrite(pinDir, LOW);
      motor(velocidad2);
  }
}

void motor(int temp) {
  for (int x = 0; x < numStepMotor; x++) {
      digitalWrite(pinStep, HIGH);
      delayMicroseconds(temp);
      digitalWrite(pinStep, LOW);
      delayMicroseconds(temp);
  }
}


No entiendo qué quieres hacer?

polu2

Hola surbyte, gracias por contestar, en realidad, la pausa "delay(2000)" es para orientarme en la ejecución del código en vez de poner un print, (luego lo quitaría, claro).

Te cuento mi objetivo:

Tengo un motor PAP con una rueda de colores con un imán y un sensor magnético:


Lo que intento es:

1º - Girar el disco 360º hasta que el sensor se encuentre con el mán:
Code: [Select]
  for (int x = 0; x < numStepMotor; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocidad);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocidad);

  }

2º - Una vez que encuentre el imán, que se ejecute sin parar el contenido de la función void loop() para que pueda ir cambiando de color uno por uno:
Code: [Select]
void loop() {
  estadofinal = digitalRead(finalCarrera);
  // define la dirección del motor

    if( estadofinal == HIGH)                     // Girar una vuelta entera en un sentido
  {
 
  digitalWrite(pinDir, HIGH);

  // ejecuta una revolución completa en una dirección
  for (int x = 0; x < 25; x++) {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(velocidad);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(velocidad);
  }
delay(1000);
 
}
}

...creo que la condición "if" no debería de estar dentro del bucle y por eso me para el ciclo pero no sé dónde poner dicha condición para que me repita el loop.

surbyte

Perdona pero que cambia que encuentre el iman o no lo encuentre?
Lo pones a girar por siempre y ya.. ni arduino necesitas o al menos solo para mover el PAP.

polu2

Es por posicionar el disco en un punto concreto, así podre programar el disco para que se vaya a un color determinado, en definitiva, tener una secuencia controlada de manera que si se va la luz que vuelva a buscar el punto de partida. el código que muestro es un ejemplo para hacerlo más fácil.

surbyte

Bueno pero no comentaste eso.. hablabas de un código tal que detecte la marca y luego giro libremente. Ahora le agregas que indicarás un color.

Perdona pero cuesta tanto contar la idea general desde el comienzo? Dirás que soy esto o lo otro pero mi tiempo vale e intento ayudarte. Me dices toda la idea y trabajamos sobre dicha idea.

Ahoa esta claro que quieres hacer. Vas a la muesca, algo que tranquilamente puede hacerse al inicializar el Arduino
y luego simplemente, contarás cuantos pasos son una vuelta entre marca y marca y luego dividides x la cantidad de colores y listo.


polu2

Ok, ahora caigo, gracias surbyte, Solucionado.

Go Up