[desarrollo] Steppers bipolares

hola , ultimamente he estado haciendo paranoias con steppers bipolares.Para hacer el montaje se necesita la placa , un L293D y un motor paso a paso bipolar (yo este lo saqué de una impresora Epson C64).
Me he currado una serie de funciones para hacernos la vida mas fácil.

¿como sé que mi motor paso a paso es bipolar?.
Los motores estos tienen una pareja de electroimanes y 4 salidas.Haces que corra una corriente entre un par de salidas notas que el motor se 'bloquea' si haces lo mismo con el otro par se bloquea tambien pero antes ha girado un poquitin

Montaje

¡Huy que lio de codigo! hay al final de post

a lo que hay que estar al loro es
declarar un motor

 int stepper1[5]={7,6,3,2};//pins donde se enchufa  el L293 ,el array es de 5 (importante)

hacerlo mover
una vez que lo hemos declarado podemos que de un paso haciendo:

step(stepper1,LOW);//el sentido del giro se define en el segundo parametro LOW o HIGH

ademas hay 2 funciones mas:

lock(stepper1);//hace que el motor se bloquee 
unlock(stepper1);//el motor se queda en punto muerto
//30-10-05 Martín Nadal elreycabra@yahoo.com
int stepper1[5]={7,6,3,2,0};//control pins m1,m2,m3,m4 y estado,se deja 

int x;

//bloquea el motor, lo para haciendo fuerza
void lock(int *stepper)
{
  digitalWrite(stepper[0],LOW);
  digitalWrite(stepper[1],HIGH);
  digitalWrite(stepper[2],LOW);  
  digitalWrite(stepper[3],HIGH);
}
//deja el motor suelto
void unlock(int *stepper)
{
  digitalWrite(stepper[0],LOW);
  digitalWrite(stepper[1],LOW);
  digitalWrite(stepper[2],LOW);  
  digitalWrite(stepper[3],LOW);
}  
//da un paso , sentido va HIGH o LOW segun el sentido del giro          
void step(int *stepper,int sentido)
{
  if(sentido==HIGH)
  {
    stepper[4]=(stepper[4]+1)%4;
  }else{
    stepper[4]=(stepper[4]+3)%4; 
   } 
  switch(stepper[4])
  {
    case 0:
      digitalWrite(stepper[0],LOW);
      digitalWrite(stepper[1],LOW);
      digitalWrite(stepper[2],LOW);  
      digitalWrite(stepper[3],HIGH);
      break;
    case 1:
      digitalWrite(stepper[0],HIGH);
      digitalWrite(stepper[1],LOW);
      digitalWrite(stepper[2],LOW);  
      digitalWrite(stepper[3],LOW);
      break;
    case 2:
      digitalWrite(stepper[0],LOW);
      digitalWrite(stepper[1],LOW);
      digitalWrite(stepper[2],HIGH);  
      digitalWrite(stepper[3],LOW);
      break;
    case 3:
      digitalWrite(stepper[0],LOW);
      digitalWrite(stepper[1],HIGH);
      digitalWrite(stepper[2],LOW);  
      digitalWrite(stepper[3],LOW);
      break;
  }
}
void setup()
{
  pinMode(stepper1[0],OUTPUT);
  pinMode(stepper1[1],OUTPUT);
  pinMode(stepper1[2],OUTPUT);
  pinMode(stepper1[3],OUTPUT);
}

void loop()
{
//gira en una dirección
  for(x=0;x<1000;x++)
  {  
    step(stepper1,HIGH);
    delay(100);
  }
//gira en la otra dirección
  for(x=0;x<1000;x++)
  {  
    step(stepper1,LOW);
    delay(100);
  }
}

un saludote

Bien!

en cuanto tenga 10 minutos libres, lo pruebo en el laboratorio y subo tu codigo a la web.

Gracias!!!

/David

oye, ¿hay alguna manera de separar estas funciones?a ver , me explico a me gustaria que ahora que estoy haciendo cositas con estas funciones no tenga que copiarlas al principio del programa en cada prueba que haga .me gustaria hacer un #include o algo así...¿si esto fuera posible donde tendria que ir el .h?

muchas gracias

esta pregunta es de tipo avanzadp :wink:

es posible hacerte una pareja de ficheros *.c *.h, es decir una libreria en C, que pongas dentro de la carpeta "lib/targets/arduino". Todas las librerias dentro de esa carpeta se autoreferencian al compilar los programas. De ese modo no tendras que escribir ni "include" in nada por el estilo.

Estoy trabajando en una serie de ejemplos avanzados, en los que uso este truco constantemente, con lo que voy a documentar el truco. En cualquier caso, como es facil, pruebalo y dime a ver si te funciona bien.

/David