Declarar una función en arduino uno

Tengo 16 años,soy algo novato en esto.
Tengo un "programa".Un motor a pasos que gira al recibir la señal del sensor ultrasonico,programado a 15 cm.
El problema esta que no se como acomodar la función para que se detenga el motor.

Si lo pongo El motor hace las pulsaciones previamente cargadas (osea gira las dos vueltas puestas),cuando detecta la señal del ultrasonico.Pero solamente funciona con la primera señal,si le acerco presencia al ultrasonico,el motor no volera a girar.Solamente cargando el programa de nuevo.
Y si omito la función de parar,obviamente el motor solamente cuando tenga presencia,sin respetar las vueltas programadas (pulsos),y su giro sera infinito (hasta que le aleje el objeto del ultrasonico).
Quiero que el motor gire "n" vueltas y se detenga,y que este proceso se pueda repetir las que desee.¿Como declaro la función y la mando a llamar,adecuadamente
Por sus atenciones,gracias.

Programa en IDE de arduino:
goo.gl/33ordw [Alojado en Dropbox]


Código:
#include<Ultrasonic.h>  
#define MA_1 8
#define MA_2 9
#define MB_1 10
#define MB_2 11

int contador;
int estado;
  
//declaramos un objeto ultrasonic de la la librería Ultrasonic para referirnos a ella.  
Ultrasonic ultrasonic1(7,A0);           
      
int Distancia1;  


void setup(){  
  
	pinMode(MA_1,OUTPUT);
	pinMode(MA_2,OUTPUT);
	pinMode(MB_1,OUTPUT);
	pinMode(MB_2,OUTPUT);
	contador 	= 1;
	estado 		= 1;

}  
   
void loop(){  
  
  
    //leemos el sensor de ultrasonidos y guardamos el valor en una variable  
    Distancia1 = ultrasonic1.Ranging(CM);   
    
    if (Distancia1 <=15){   
  
        //movemos el servo en una dirección  
        izquierda(96);  
      
         delay(5);
  
    }
        
}
  
void izquierda(int pulso) {
  static byte estado=1;
	do  {
	    delay(30);    //30
	    switch(estado)    {
	      case 1:
	        digitalWrite(MA_1,HIGH);
	        digitalWrite(MA_2,LOW);
	        digitalWrite(MB_1,LOW);
	        digitalWrite(MB_2,LOW);
	        estado = 4;
	      break;
	      case 2:
	        digitalWrite(MA_1,LOW);
	        digitalWrite(MA_2,HIGH);
	        digitalWrite(MB_1,LOW);
	        digitalWrite(MB_2,LOW);
	        estado = 1;
	      break;
	      case 3:
	        digitalWrite(MA_1,LOW);
	        digitalWrite(MA_2,LOW);
	        digitalWrite(MB_1,HIGH);
	        digitalWrite(MB_2,LOW);
	        estado = 2;
	      break;
	      case 4:
	        digitalWrite(MA_1,LOW);
	        digitalWrite(MA_2,LOW);
	        digitalWrite(MB_1,LOW);
	        digitalWrite(MB_2,HIGH);
	        estado = 3;
	      break;
	    }
	} while(++contador<=pulso);
    
    //  "FUNCIÓN PARA DETENER MOTOR
    /*
    digitalWrite(MA_1,LOW);
    digitalWrite(MA_2,LOW);
    digitalWrite(MB_1,LOW);
    digitalWrite(MB_2,LOW);*/  
}
P.D Posteriormente sera con dos sensores,para asi hacer funcionar una puerta automatica (abrir y cerrar)
 
Última edición:
Bienvenid@!!!!

Observa la variable global contador, al llamar a izquierda(96) ¿con qué valor termina?.
¿Y que va a pasar la próxima vez que llames izquierda(96)?.
Respuestas abajo de todo.

Ahora queda ver soluciones, que dependen de que rol quieras para la variable contador.
Una opción sería poner contador = 0 después de
} while(++contador<=pulso);

Pero si la idea es que contador guarde la posición (suposición mía, que indique si el eje está en el paso X) entonces no sirve.
La opción que queda es cambiar la forma de llamar a la función izquierda, en la función loop() en vez de
izquierda(96);
usar
izquierda(contador+96);

Otra precaución es que si el motor tiene 200 pasos por ejemplo, la variable contador debería ir de 0 a (200*4-1) = 799. Multiplico por 4 porque cada paso consta de 4 salidas en secuencia (cada uno de los case del switch(estado).
Entonces la respuesta anterior viene con esta otra pregunta:
¿Qué pasará en la siguiente situación?: la variable contador es = 785 y llamas a izquierda(contador+96).

Otra cosa que quiero que pienses, ¿de cuantos bits es la variable contador?, y cómo habría que modificar las cosas? (supongo que usas un motor de 200 pasos, si es menos aclararlo).

Respuestas a las primeras preguntas:
La variable contador termina con un valor de 96.
La próxima llamada de izquierda(96) se ejecuta el loop, llega al while(++contador<=pulso); pero como contador ahora es 97 ya es mayor que pulso = 96, por lo tanto el do..while se ejecuta una sola vez y la función retorna luego de parar el motor.
 
Lo que dice el compañero es cierto. Para mover el motor yo usaría la librería stepper. Agrega algo de peso al programa pero no creo que sea un problema en tu sketch. Por cierto, apagar el paso a paso se usa para algunos casos en particular, es mejor dejarlo enclavado en la ultima posicion. Saludos
 
Última edición:
Atrás
Arriba