domingo, 4 de mayo de 2014

Arduino y motor de disco duro

Ya hace tiempo subí un vídeo en Youtube donde hacia una prueba de concepto. En la que manejaba  el motor de un disco duro directamente con una placa Arduino.  En este caso el motor del disco duro era un motor paso a paso bipolar de tres hilos.


Del cual me han solicitado varias veces más información sobre él.

Como se ve en la imagen siguiente, el  montaje es muy simple pues es conectar directamente los 3 pines del motor a las tres salidas de la placa Arduino, tal como se ve en la imagen.

Placa Arduino manejando directamente el motor de un disco duro.
Placa Arduino manejando directamente el motor de un disco duro

Y a continuación el código del programa que está ejecutando la placa Arduino.

const int delayInicial = 300;
const int delayFinal = 25;
const int incrementoDelay = 5;

int pin0 = 26;
int pin1 = 24;
int pin2 = 22;

void setup(){
  pinMode(pin0, OUTPUT);
  pinMode(pin1, OUTPUT);
  pinMode(pin2, OUTPUT);
}

void loop(){
 
  //Bucle para ir acelerando el movimiento
  for( int x = delayInicial; x>delayFinal; x=x-incrementoDelay){
   digitalWrite(pin0, true);
   digitalWrite(pin1,true);
   digitalWrite(pin2,false);
   delay(x);
  
   digitalWrite(pin0, false);
   digitalWrite(pin1,true);
   digitalWrite(pin2,true);
   delay(x);
  
   digitalWrite(pin0, true);
   digitalWrite(pin1,false);
   digitalWrite(pin2,true);
   delay(x);
  }

  //Bucle infinito con velocidad fija
  while(true){
   digitalWrite(pin0, true);
   digitalWrite(pin1,true);
   digitalWrite(pin2,false);
   delay(delayFinal);
  
   digitalWrite(pin0, false);
   digitalWrite(pin1,true);
   digitalWrite(pin2,true);
   delay(delayFinal);
  
   digitalWrite(pin0, true);
   digitalWrite(pin1,false);
   digitalWrite(pin2,true);
   delay(delayFinal);
  }
}
Y a continuación el vídeo actualizado del resultado de ejecutar el programa anterior.


Es un ejemplo muy, muy simple de cómo funciona un motor paso a paso, espero que sea de utilidad a todas las personas que me lo han pedido.

28 comentarios:

  1. Hola, pase tiempo buscando algo así, para controlar un motor de disco duro, pero los motores de disco duro, los actuales (3 cables), son motores BLDC, o sea motores sin escobillas de corriente continua, ¿o estoy equivocado?

    ResponderEliminar
  2. Realmente sencillo y emocionante, gracias por el aporte!!

    ResponderEliminar
  3. me ayudarías lo intente con arduino uno y no funciono

    ResponderEliminar
  4. Tenes que cambiar las siguientes lineas
    int pin0 = 26;
    int pin1 = 24;
    int pin2 = 22;
    por
    int pin0=7;
    int pin1=8;
    int pin2=9;
    y conectar el motor a los pines 7, 8 y 9 de tu arduino, tambien modifique
    const int delayFinal = 10;
    const int incrementoDelay = 2;
    Espero te funcione.-

    ResponderEliminar
  5. Disculpa a cuantas revoluciones gira con los 25 mili segundos ?

    ResponderEliminar
  6. hermano y para hacerlo funcionar al 100% como seria

    ResponderEliminar
  7. no funciona, se queda dando toquecitos adelante y atrás cada vez mas despacio hasta pararse. tengo una placa due

    ResponderEliminar
    Respuestas
    1. prueba conectando los cables de los extremos alreves a mi me funciono

      Eliminar
    2. Arduino Due es un ARM Cortex 32bits y funciona en 3.3v. Arduino Uno/MEGA funcionan en 5v. Tienes mucha menos corriente y te arriesgas a joderlo. Para hacerlo funcionar correctamente tienes que utilizar tres transistores (los BC547 son suficientes)... Googlea y encontraràs algo.

      Eliminar
  8. por cierto, como se haría para poner mas velocidad? es que he conseguido arrancarlo tras muchos giros manuales, pero no es que corra mucho, va mas lento que un ventilador de cpu

    ResponderEliminar
  9. el motor es de 7200 rpm al vacio pero fuera de cuantos rpm es?? Muchas gracias de antemano

    ResponderEliminar
  10. hola podrías darme mas info sobre las conexiones al motor por ejemplo si es de 3 o 4 pines

    ResponderEliminar
  11. para hacerlo ir mas rapido necesitas poner los pines a un transistor y este alimente el motor cogiendo el positivo directamente de la fuente , arduino da muy pocos mA.

    ResponderEliminar
  12. Hola, yo tengo una pregunta, tengo entendido que el arduino a sus salidas envia un voltaje de 5v, pero con una limitación de corriente de 40mA, y por otro lado, tengo un motor de disco duro, medí la resistencia de sus bobinas y es de 6 ohmios, lo que al conectarlos a 5 voltios, consumiría una corriente de 0,8A o mejor dicho, 800mA, no sería peligroso (para el arduino) conectarlo directamente? No le pasó nada a tu arduino? Como podría conectarlo para evitar cortos o daños en mi arruino... Gracias :)

    ResponderEliminar
    Respuestas
    1. pues bueno si vos miras los ESC(control de velocidad) comerciales, notaras que son circuitos de potencia que conmutan señales ¨trifasicas¨ solo que en DC. Una solución para esto seria colocar a la salida de cada uno transistores, y ojala sean tipo MOSFET para lograr manejar 20 a mas Amperios

      Eliminar
  13. buenas tardes tengo un disco de tres polos no gira y no se voltaje trabaja y cual seria la conexion y saber si es ac o dc y donde seria la polaridad de conexion por favor gracias y en caso de estar dañado el motor como lo reemplazo

    ResponderEliminar
  14. Usen un L293D, para proteger al arduino

    ResponderEliminar
  15. buenas noches yo quisiera saber si es posible, en primera instancia tener un velocidad por un tiempo especifico y luego un velocidad final mas alta por otro tiempo determinado, yo tengo arduino nano v3 + l293b, estoy usando los puerto pwm 9, 10, 11 de arduino lo cuales van a los pin IN1 IN2 IN3 del L293b

    ResponderEliminar
  16. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  17. hola amigo podria realizar un diagrama mas detallado tengo varios motores de disco duro de 3 y 4 hilos pero en relaidad no los he podido hacer funcionar me podrias colaborar con el codigo para arduino uno, se lo agradeceria

    ResponderEliminar
  18. soy nuevo en esto pero como hacer que el motor tenga velocidades por ejemplo con un pontenciometro que tenga el arduino para regular la velocidad espero tu respuesta

    ResponderEliminar
  19. mi motor tiene 4 cables ue ago con el cuarto en arduino 1

    ResponderEliminar
  20. Buenas, quisiera hacer este mismo proyecto para puerto paralelo que me haria falta.

    ResponderEliminar
  21. Hola como estas par audrino uno como es el esquema del circuito gracias

    ResponderEliminar
  22. Hola yo necesitaria que me ayudes tengo varios de estos y me gustaría poder usarlos para una bici pero de que forma se lo puede controlar por bluetooth?

    ResponderEliminar
  23. Aunque lo he visto tarde espero ayudarte a entender tu error, ya que estas totalmente errado con estos motores, estos motores no son motores de pasos, estas confundiendo los motores de discos que son brushless con los de paso a paso estos ultimos son de funcionamiento digital y responden a una tabla lógica, el brushlesses responde a desfases, y aunque los motores de pasos coincidan en el tiempo en realidad son la diferencia de números lógicos no desfases

    ResponderEliminar
  24. A mí no me iba ni a la de 3 y ya he conseguido que funcione. De los 4 conectores que tienen los discos duros que yo utilizo para estas cosas, sólo utilizo 3. PRIMERO QUE NADA, EXTRAE EL MOTOR DE LA UNIDAD, PUES PUEDE FALTARLE FUERZA PARA GIRAR CON EL DISCO MONTADO. Después, mira el centro y, siguiendo el orden de las varillas del reloj, tienes que utilizar los contactos 2, 3 y 4, es decir, no utilices el primero. Luego ya conectas el 2 en pin0, el 3 en pin1 y el 4 en pin2. Yo lo utilizo en Arduino UNO y gasto los pines 7, 8, 9 pero sirven tres cualesquiera, incluso más cómodo si no son contiguos.

    Cambié un poco el código:

    /* Mi versión
    FUNCIONA pero con un motor de DD que no tenga montado el DD.
    Mirando desde el centro del disco y de izquierda a derecha (orden de un reloj): conexiones dos, tres, cuatro.
    El "uno" (positivo común, si no me equivoco) no se conecta.
    */

    int conectorDos = 7;
    int conectorTres = 8;
    int conectorCuatro = 9;

    void setup() {
    Serial.begin(9600);
    pinMode(conectorTres, OUTPUT);
    pinMode(conectorDos, OUTPUT);
    pinMode(conectorCuatro, OUTPUT);

    }

    void loop() {
    int demora;
    int i;
    for (demora = 200; demora > 30; demora = demora - 10) {
    darUnaVuelta(demora);
    }
    for (i = 0; i < 100; i++)
    darUnaVuelta(demora);
    }

    void darUnaVuelta(int demora) {
    Serial.println(demora);
    Serial.print("HLL");
    digitalWrite(conectorTres, HIGH);
    digitalWrite(conectorDos, LOW);
    digitalWrite(conectorCuatro, LOW);
    delay(demora);

    Serial.print("LHL ");
    digitalWrite(conectorTres, LOW);
    digitalWrite(conectorDos, HIGH);
    digitalWrite(conectorCuatro, LOW);
    delay(demora);

    Serial.println("LLH");
    digitalWrite(conectorTres, LOW);
    digitalWrite(conectorDos, LOW);
    digitalWrite(conectorCuatro, HIGH);
    delay(demora);

    }

    ResponderEliminar
  25. Hola a todos como están? Lo que deberían hacer el leer la bobina anterior a la exitada, lo cual le va a decir si paso al paso siguiente y así continuar girando, sería un circuito cerrado,,lo que hacen ustedes es darle corriente esperar un tiempo para que mueva, pero no saben si movió o no, espero les sirva mí comentario, Saludos

    ResponderEliminar