domingo, 4 de julio de 2010

Motor paso a paso con arduino

Esta tarde he desmontao un scanner viejo que tenía por ahi y me he encontrado dentro con esto:


Tachaaann!! que coño es esto? verdad?

pues ya me sonaban un poco asi de oidas lo de los stepper motor , o en castellano, motores paso a paso (PaP).

He investigado por ahi los tipos de motores y resulta que estos tipos de motores funcionan como si tuvieran 4 imanes dentro, uno a sus 12 otro a las 3 , 6 y 9, osea, norte sur este y oeste. Entonces dependiendo de el iman que esté encendido es un paso u otro.

Por ejemplo, para darle una vuelta a este motor, tendríamos que encender el motor del norte, solo, luego el del este solo, luego el del sur solo y por ultimo el del oeste solo, y norte again.

voy a robar unas imagenes explicativas que me han gustao xDD









y si queremos girar en sentido opuesto pues imagina, los enciendes en el otro sentido.

También se puede hacer los giros en lugar de en 4 pasos, en 8 encendiendo tambien 2 imanes a la vez, lo cual hace que se quede en medio del A y B por ejemplo

Bueno lo básico ya está claro, si tienes más interés en los motores puedes verlo en este link:
http://www.x-robotics.com/motorizacion.htm

Seguimos, el tema es que una vez desmontado, te vienen 5 cables y no tienes ni idea de para que es cada uno xDD

En mi caso me venían 4 seguidos y uno separado, usando la lógica, el separado es para meterle los voltios y los otros cuatro son para controlar los cuatro imanes ke lleva. Así que si hay ke controlar cosas, que mejor que el multiusos chip ULN2003 que también nos había servido para el ambilight casero.

He usado las primeras 4 patillas del chip para los cuatro cables de control y están conectadas a los pines 8, 9, 10,11. El de voltaje no va enchufado al chip, pero lo enchufaremos más tarde directamente a los 12v de una fuente.



Como se vé los colores amarillo, negro, naranja y marron son de control y el rojo es el del voltaje.
según la especificación del motor el motor se le supone ke va con 24v, pero con 12v o incluso con 5 a mi me ha ido a la misma velocidad...




Para terminar de hacer la gracia , he puesto el motor donde estaba y ahora manejo el carrusel del scaner con el arduino xDDD, la verdad esque me esperaba poder ponerle más velocidad, pero es lento de cojones... aunque bastante potente.


Ah!, por último el código del arduino para hacer maravillas con este motor xDD

PD: mi motor en concreto tiene un giro de 3 grados por cambio de fase

Step Angle
3.75º/step

eso pone en la DATASHEET xDD

osea que por ejemplo para dar una vuelta entera deberemos cambiar de fase unas 360 / 3,75 = inicio, ejecutar, calc y nos dá un resultadod de 96 cambios

en el codigo voy a hacer dos funciones, una que de una vuelta pa un lao y otra ke haga exactamente lo contrario.




int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;

int step = 0;

// Up Down Left Right


void derecha(int delayTime,int vueltas){
//96 pasos de 3,75 grados son 360 grados

vueltas = vueltas * 96;
for (int i=0; i < vueltas ; i++) {
digitalWrite(motorPin1, step==0?HIGH:LOW);
digitalWrite(motorPin2, step==1?HIGH:LOW);
digitalWrite(motorPin3, step==2?HIGH:LOW);
digitalWrite(motorPin4, step==3?HIGH:LOW);
delay(delayTime);
step = (step+1)%4;
}

}

void izquierda(int delayTime,int vueltas){
//96 pasos de 3,75 grados son 360 grados

vueltas = vueltas * 96;
for (int i=0; i < vueltas ; i++) {
digitalWrite(motorPin4, step==0?HIGH:LOW);
digitalWrite(motorPin3, step==1?HIGH:LOW);
digitalWrite(motorPin2, step==2?HIGH:LOW);
digitalWrite(motorPin1, step==3?HIGH:LOW);
delay(delayTime);
step = (step+1)%4;
}

}


void setup() {
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
}

void loop() {
derecha(2,1);
izquierda(2,1);
derecha(3,1);
izquierda(3,1);
derecha(4,1);
izquierda(4,1);
derecha(5,1);
izquierda(5,1);
}



Y este codigo hace una vuelta pa un lao y otra pa otro xDD lo mas rápido posible, ya que si le metes un delay de 1 se vuelve loco y no se mueve xDDD

OJO! Las funciones se llaman up down left y right, pero no significa que el up sea pa arriba y right sea derecha, tendría que cambiar los nombres, para hacer funciones para girar 90 grados, osea 6 cambios seguidos.

Ah están hechas las funciones de los pasos diagonales, si hicieramos los 4 pasos solo con diagonales el motor sería mas powerfull ya que el motor gira con la fuerza de dos imanes por paso.


Fuentes:
http://www.mitsumi.co.jp/latest/Catalog/compo/motor/m42sp4_e.html
http://www.x-robotics.com/motorizacion.htm
http://www.arduino.cc/en/Tutorial/StepperUnipolar


2 comentarios:

  1. Que ideas tienes, me ha dejado :roto2: lo de la tapa del móvil xD

    PD: El algoritmo es revolucionario, paténtalo! xD

    ResponderEliminar
  2. Exelente, me ha servido mucho para hacer mis pruebas con mi arduino uno, pero lo que no entiendo es esta linea de los for digitalWrite(motorPin4, step==0?HIGH:LOW); si me podrias decir que haces con eso? gracias

    ResponderEliminar