Mover motores paso a paso con Arduino

MOVER MOTORES PASO A PASO CON ARDUINO

(28/12/13)

En este tutorial veremos que es un motor paso a paso, las diferentes maneras de conectarlos y como controlarlos con Arduino.

Material

-Arduino Uno Rev 3

-Motor paso a paso unipolar

-Motor paso a paso bipolar

-L293D

-ULN2803

-2 Transistores NPN

-Pulsadores

-4 Resistencias 10K y 2 resistencias 1K

-Potenciómetro

-Fuente alimentación

Motor paso a paso

Un motor paso a paso (también llamado stepper) es un dispositivo electromagnético que convierte impulsos eléctricos en movimientos mecánicos de rotación. La principal característica de estos motores es que se mueven un paso por cada impulso que reciben. Normalmente los pasos pueden ser de 1,8º a 90º por paso, dependiendo del motor. Por ejemplo: un motor paso a paso que se mueve 2º cada paso, quiere decir que para completar una vuelta (360º) tendrá que dar (360º/2ºpor paso) 180 pasos.

Son motores con mucha precisión, que permiten quedar fijos en una posición (como un servomotor) y también son capaces de girar libremente en un sentido u otro (como un motor DC).

Hay tres tipos de motores paso a paso:

-Motor paso a paso de imán permanente (los que usaremos en este tutorial).

-Motor paso a paso de reluctancia variable.

-Motor paso a paso hibrido.

Los Motores paso a paso están formados por dos partes:

-El estator es la parte fija del motor donde sus cavidades van depositadas las bobinas.

-El rotor es la parte móvil del motor construido por un imán permanente.

Estas dos partes van montadas sobre un eje.

 

Funcionamiento

Cuando circula corriente por una o más bobinas del estator se crea un campo magnético creando los polos Norte-Sur. Luego el rotor se equilibrará magnéticamente orientando sus polos Norte-Sur hacia los polos Sur-Norte del estator. Cuando el estator vuelva a cambiar la orientación de sus polos a través de un nuevo impulso recibido hacia sus bobinas, el rotor volverá a moverse para equilibrarse magnéticamente. Si se mantiene esta situación, obtendremos un movimiento giratorio permanente del eje. El ángulo de paso depende de la relación entre el nombre de polos magnéticos del estator y el nombre de polos magnéticos del rotor.

 

Hay dos tipos de motores paso a paso: los unipolares y los bipolares.

Los bipolares se componen de 2 bobinas y los unipolares de 4 bobinas. Para diferenciarlos físicamente basta con observar el número de terminales de cada motor. Los bipolares siempre tienen 4 terminales, dos para cada bobina, y los unipolares normalmente tienen 6 terminales, dos para cada bobina y los otro dos son los comunes de estas. Hay motores unipolares con 5 terminales en que los dos comunes están unidos internamente.

La diferencia entre los dos es que un motor paso a paso unipolar se activa una bobina a la vez mientras que un motor bipolar se activa más de una bobina a la vez. Esto hace que un motor bipolar tenga más torque que un motor unipolar. Por contra, un motor bipolar es más complejo de controlar que un unipolar.

Secuencia para controlar motores paso a paso Bipolares

Un motor paso a paso bipolar necesita invertir la corriente que circula por sus bobinas en una secuencia determinada para provocar el movimiento del eje.

Paso

Bobina 1A

Bobina 1B

Bobina 2A

Bobina 2B

Paso 1

1

0

1

0

Paso 2

1

0

0

1

Paso 3

0

1

0

1

Paso 4

0

1

1

0

Secuencia para controlar motores paso a paso Unipolares

Hay tres secuencias para controlar los motores paso a paso unipolares

Simple o wave drive: Es una secuencia donde se activa una bobina a la vez. Esto hace que el motor tenga un paso más suave pero por el contrario tenga menos torque y menos retención.

Paso

Bobina A

Bobina B

Bobina C

Bobina D

Paso 1

1

0

0

0

Paso 2

0

1

0

0

Paso 3

0

0

1

0

Paso 4

0

0

0

1

Normal: Es la secuencia más usada y la que recomiendan los fabricantes. Con esta secuencia el motor avanza un paso por vez y siempre hay dos bobinas activadas. Con esto se obtiene un mayor torque y retención.

Paso

Bobina A

Bobina B

Bobina C

Bobina D

Paso 1

1

1

0

0

Paso 2

0

1

1

0

Paso 3

0

0

1

1

Paso 4

1

0

0

1

Medio paso: Se activan primero dos bobinas y después solo una y así sucesivamente. Esto provoca que el motor avance la mitad del paso real.  Esto se traduce en un giro más suave y preciso.

Paso

Bobina A

Bobina B

Bobina C

Bobina D

Paso 1

1

0

0

0

Paso 2

1

1

0

0

Paso 3

0

1

0

0

Paso 4

0

1

1

0

Paso 5

0

0

1

0

Paso 6

0

0

1

1

Paso 7

0

0

0

1

Paso 8

1

0

0

1

Controlar motor paso a paso Bipolar con Arduino

Como hemos explicado antes, los motores bipolares son más complejos de controlar ya que el flujo de corriente tiene que cambiar de dirección a través de las bobinas con una secuencia determinada. Para esto debemos conectar cada una de las dos bobinas en un puente en H (H-Bridge). Para esto, utilizaremos el integrado L293 que contiene dos H-Bridge (datasheet).

 

Para controlar motores paso a paso con Arduino, utilizaremos la librería <Stepper.h> que viene con el software de este.

/*
  www.diymakers.es
  by A.García
  Mover motores paso a paso con Arduino
  Tutorial en: http://diymakers.es/mover-motores-paso-paso-con-arduino/
*/

#include <Stepper.h> //Importamos la librería para controlar motores paso a paso

#define STEPS 200 //Ponemos el número de pasos que necesita para dar una vuelta. 200 en nuestro caso

// Ponemos nombre al motor, el número de pasos y los pins de control
Stepper stepper(STEPS, 8, 9, 10, 11); //Stepper nombre motor (número de pasos por vuelta, pins de control)

void setup()
{
  // Velocidad del motor en RPM
  stepper.setSpeed(100);
}

void loop()
{
  //Girar una vuelta entera en un sentido
  stepper.step(200);
  delay(500); //Pequeña pausa

  //Girar una vuelta entera en sentido contrario
  stepper.step(-200);
  delay(500); //Pequeña pausa
}

Utilizando esta conexión tenemos un pequeño problema, y es que usamos cuatro pins del Arduino para controlar el motor, y eso son muchos. Si queremos controlar más de un motor paso a paso y usar otros pins para otras conexiones, nos quedaremos cortos de pins. Esto se puede solucionar con una conexión diferente que solo utiliza dos pins de control del Arduino.

Conexión dos pins

Para entender esta conexión, primero hay que fijarse en la secuencia del motor paso a paso bipolar que hemos visto antes. Si nos fijamos bien, veremos que los extremos de cada bobina están invertidos entre sí.

De esta manera solo tenemos que usar dos pins de control e invertirlos. Para invertirlos usaremos dos transistores NPN (BC547,BD139, etc…) polarizados en emisor común y que trabajen en modo saturación-corte. Así el transistor trabaja como un inversor de señal.

De este modo, usaremos solo dos pins del Arduino y con los dos NPN en modo de inversor obtendremos los cuatro pins de control necesarios para atacar el L293.

El programa es el mismo que antes, con la diferencia que cambiaremos los pins de control:

En vez de usar:

Stepper stepper(STEPS, 8, 9,10,11);

Cambiamos por:

Stepper stepper(STEPS, 8, 9);

/*
  www.diymakers.es
  by A.García
  Mover motores paso a paso con Arduino
  Tutorial en: http://diymakers.es/mover-motores-paso-paso-con-arduino/
*/

#include <Stepper.h> //Importamos la librería para controlar motores paso a paso

#define STEPS 200 //Ponemos el número de pasos que necesita para dar una vuelta. 200 en nuestro caso

// Ponemos nombre al motor, el número de pasos y los pins de control
Stepper stepper(STEPS, 8, 9); //Stepper nombre motor (número de pasos por vuelta, pins de control)

void setup()
{
  // Velocidad del motor en RPM
  stepper.setSpeed(100);
}

void loop()
{
  //Girar una vuelta entera en un sentido
  stepper.step(200);
  delay(500); //Pequeña pausa

  //Girar una vuelta entera en sentido contrario
  stepper.step(-200);
  delay(500); //Pequeña pausa
}

 

Controlar motor paso a paso Unipolar con Arduino

Un motor paso a paso unipolar es más sencillo que controlar. Utilizaremos el integrado ULN2803 que es un array de 8 transistores tipo Darlington capaz de soportar cargas de hasta 500mA (datasheet). Conectaremos los cuatro pins del Arduino a las entradas del ULN2803 y las salidas de este a las bobinas. Los comunes a 12V.

El programa es el mismo que hemos usado antes con el motor bipolar de 4 pins:

/*
  www.diymakers.es
  by A.García
  Mover motores paso a paso con Arduino
  Tutorial en: http://diymakers.es/mover-motores-paso-paso-con-arduino/
*/

#include <Stepper.h> //Importamos la librería para controlar motores paso a paso

#define STEPS 200 //Ponemos el número de pasos que necesita para dar una vuelta. 200 en nuestro caso

// Ponemos nombre al motor, el número de pasos y los pins de control
Stepper stepper(STEPS, 8, 9, 10, 11); //Stepper nombre motor (número de pasos por vuelta, pins de control)

void setup()
{
  // Velocidad del motor en RPM
  stepper.setSpeed(100);
}

void loop()
{
  //Girar una vuelta entera en un sentido
  stepper.step(200);
  delay(500); //Pequeña pausa

  //Girar una vuelta entera en sentido contrario
  stepper.step(-200);
  delay(500); //Pequeña pausa
}

Controlar velocidad y sentido de un motor paso a paso Bipolar con Arduino

Ahora que ya sabemos las diferentes maneras y conexiones de controlar los motores paso a paso, vamos a hacer un pequeño proyecto con un motor bipolar. Con un potenciómetro regularemos la velocidad de este, y con dos pulsaremos seleccionaremos el sentido de giro.

-Ajuntar las masas del Arduino y de la fuente de alimentación.

-Los dos pulsadores conectados en modo Pull-Down.

-Para detectar las bobinas, basta con conectar el tester en continuidad  en dos terminales, cuando marque continuidad o una baja carga ohmica quiere decir que entre esos dos terminales hay una bobina.

-Un consejo: mejor no alimentar el Arduino solo con el cable USB, sino con la fuente de alimentación a través del pin Vin o del conector jack. Esto es para que no haya errores, sobre todo a la hora de controlar motores. El cable USB solo conectarlo cuando se use la comunicación serie con el PC. Si no es así, desconectarlo.

Programa

/*
  www.diymakers.es
  by A.García
  Mover motores paso a paso con Arduino
  Tutorial en: http://diymakers.es/mover-motores-paso-paso-con-arduino/
*/

#include <Stepper.h> //Importamos la librería para controlar motores paso a paso

#define STEPS 200 //Ponemos el número de pasos que necesita para dar una vuelta. 200 en nuestro caso

// Ponemos nombre al motor, el número de pasos y los pins de control
Stepper stepper(STEPS, 8, 9); //Stepper nombre motor (número de pasos por vuelta, pins de control)

int pot;  //Variable lectura potenciómetro
int derecha=3;  //Pulsador derecha
int izquierda=2;  //Pulsador izquierda
int direccion;  //Variable para indicar la direccón

void setup()
{
  pinMode(derecha,INPUT);
  pinMode(izquierda,INPUT);
}

void loop()
{
  pot=analogRead(A0); //Lectura potenciómetro
  pot = map(pot, 0, 1023, 30, 150); //Establecemos la velocidad entre 30 y 150 rpm

  stepper.setSpeed(pot); //Indicamos la velocidad al motor

  stepper.step(direccion); //Indicamos la dirección al motor

  if(digitalRead(izquierda)==HIGH)
  {
     direccion=200;  //Si pulsamos el pulsador izquierdo, el motor gira a la izquierda
  }

  if(digitalRead(derecha)==HIGH)
  {
     direccion=-200;  //Si pulsamos el pulsador derecho, el motor gira a la derech
  }
}
Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0Email this to someone

112 thoughts on “Mover motores paso a paso con Arduino

  • John Bravo

    Buen dia, quiero controlar un motor paso a paso bipolar con la condicion que al aplastar un pulsador o un interruptor el motor gire en un sentido, cuando deje de ser accionado el motor pare. Debe funcionar en los dos sentidos. Voy a controlar un brazo hidraulico, si me ayudan les quedare completamente agradecido.

    Reply
    • DIYMakers

      DIYMakers Post author

      Hola John
      Lo que quieres hacer parece ser muy parecido al último programa que hacemos en el tutorial. Lo único que tienes que hacer es poner una condición que cuando no se pulse el pulsador, el motor deje de girar. Si quieres mandarnos más información, contacta con nosotros a través del formulario en el apartado contacto para así poder ayudarte mejor.

      Reply
  • John Bravo

    Si exactamente comprendo que se debe tener esa condicion, no tengo conocimientos de la programacion de arduino, necesito saber cual es la sentencia para deter al motor. Saludos desde Quito.
    Cual es el formulario del apatardo del contacto?

    Reply
  • victor

    hola!!!

    he usado la librería recomendada para mover motores pap, según lo recomendado, me pregunto si existe alguna librería que permita mover el motor en medios pasos, ya que la librería Stepper solo lo hace en modo normal.

    y si no existe… cómo podría modificarla para que se comporte cómo yo quiero???

    gracias de antemano

    Reply
    • DIYMakers

      DIYMakers Post author

      Hola Victor
      Pues no se de ninguna librería para poder hacer medio paso en los steppers. Una forma de hacerlo sería manual, sin usar la librería “Stepper” y activar las bobinas de cada paso manualmente a través de código.

      Reply
      • victor

        hola, gracias por responder.

        si, eso pensé, también pensé en modificar la librería stepper a mis necesidades, que seguramente termine siendo una librería nueva. supuse que este dilema ya lo tuvo otra persona antes que yo, y antes de ponerme a hacer lios pregunto…

        bueno muchas gracias nuevamente!!! ya veré como lo soluciono

        Reply
        • RudbenXC

          hola, hacer un paso fraccionado es cosa de harward, asi es que trabaja con algun pololu o solo que tengas que controles el flujo de energia entrante con una librerai, pero eso siempre es menos fuerza por eso es mejro trabajar con ambos lados tanto sof. como harw. Saludos

          Reply
  • Jesus Perez Iglesias

    Querria automatizar el movimiento de una maquina de hobbie, una fresadora pequeña, mi intencion es montar en el eje X un motor pap Nema23 de unos 4Nm que se puede conectar en polar y en bipolar (paraleo o serie) y con un comsumo entre 2 y 4A, y por otra parte el eje Z con um motor Nema 34 de las mismas posibilidades de conexion que el anterior y con un consumo entre 3 y 6A dependiendo como se conecte. La idea es poder manejarlos a traves de unos pulsadores o joystick o bien poder ponerlos en funcionamiento continuo sin usar los pulsadores. Por otra parte necesitaria la posibilidad de poder montar limit switch de posicion ¿Que Arduino me recomiendas?, ¿cual seria la instalacion?,
    Gracias de antemano

    Reply
    • DIYMakers

      DIYMakers Post author

      Puedes hacerlo con drivers parecidos a los que usamos en este tutorial, o steppers drivers que solo tienes que dar dirección y pulsos de pasos. El funcionamiento es solo indicar el numero de pasaos en los dos motores, el sentido y la velocidad de giro (con un potenciometro por ejemplo). Cualquier Arduino te irá bien, si son solo dos motores no necesitas muchos pins.

      Reply
  • victor

    la librería stepper de arduino es perfecta para mover en cualquier sentido los motores que quieras, pero no tan práctica para setear distintas velocidades, la rutina que determina o fija la velocidad es una sola, supongamos que quieres fijar tres velocidades distintas para tres motores pap, tendrás la última velocidad seteada (no importa en cual motor) en los tres motores.

    otro tema es si necesitas desconectar algún motor en algún momento, la librería no tiene una rutina para tal fin, pero es muy fácil de implementar:

    void Stepper::motorOff(void)
    {
    digitalWrite(motor_pin_1, LOW);
    digitalWrite(motor_pin_2, LOW);
    digitalWrite(motor_pin_3, LOW);
    digitalWrite(motor_pin_4, LOW);
    }

    por ejemplo, para el caso de comandar al motor con cuatro pines.

    para comandar motores de hasta 2A podrías usar el MP4303, pero hay otras soluciones, para corrientes más elevadas no conozco.

    en cuanto a “que arduino usar”… diría que tengas en cuenta cuantos pines destinarás en tu circuito, dos o cuatro pines por motor? usarás seis pulsadores para comandar manualmente los tres motores? usarás tres finales de carrera para indicar el cero de tu máquina y contarás pulsos hasta llegar al final de los ejes? o usarás otros tres finales de carrera para seguridad al alcanzar los límites de la máquina? algún sensor extra, para detectar una mano donde no debería estar, por ejemplo?

    todo suma si no quieres desarrollar mucha electrónica, y puede que hasta un mega te quede chico… en principio, te sugiero que diseñes muy bien tus entradas y salidas a efectos de usar un arduino uno, las prestaciones del uno son más que suficientes para una fresadora 3D (o router CNC) casero, se acostumbra usar el mega ya en una impresora 3D.

    exitos en tu proyecto!!!

    Reply
    • salvador

      hola. yo estoy intentando cambiar la dirección de un pap mediante un joystick analógico… pero tengo problemas para decirle al motor que parta sin ningún movimiento y que al mover en sentido opuesto el joystick el motor cambie de dirección. me imagino a que se debe por que la librería tiene algunos problemas con condiciones como esta. de ser asi, tendría que realizar el funcionamiento del motor sin la libreria, cosa que desconozco ya que no tengo casi nada de experiencia con arduino y recien estoy aprendiendo a usar un motor paso a paso. se agradece cualquier ayuda

      Reply
    • victor

      según donde tengas instalado, en mi caso:
      C:\Program Files (x86)\Arduino\libraries\Stepper

      hay tres archivos que modificar.

      Editas el archivo Stepper.cpp con cualquier editor de texto enriquecido, por ejemplo el WordPad (no el bloc de notas) y agregas al final la nueva función, salvas y cierras.
      luego debes editar de la misma forma el archivo de encabezados Stepper.h y agregar la referencia a la nueva función:

      // speed setter method:
      void setSpeed(long whatSpeed);

      // mover method:
      void step(int number_of_steps);

      int version(void);

      //Liberar motor:
      void motorOff(void); // <– el encabezado de la nueva función

      private:
      void stepMotor(int this_step);

      Con eso ya funciona, puedes editar el archivo keywords.txt y agregar:
      step KEYWORD2
      setSpeed KEYWORD2
      version KEYWORD2
      motorOff KEYWORD2

      (tecla TAB separando entre motorOff y KEYWORD2, no espacios)

      esto para que al usar en tus programas la nueva función cambie de color y mantener así el estilo propio de la programación de Arduino.

      por último, y optatívo, en el subdirectorio mencionado encontrarás la carpeta "examples", puedes escribir un pequeño programa de prueba y uso de la nueva función y gurdarlo dentro de esta carpeta.

      exitos!!!!!

      Reply
  • Nelson

    Hola, antes que nada muchas gracias por el tutorial, está muy bueno. Me ha ocurrido lo siguiente, he utilizado un arduino MEGA 2560 para implementar este sistema pero ha ocurrido que mi arduino se ha empezado a sobre calentar, menos mal lo desconecte a tiempo, probé otro código y sigue funcionando bien mi arduino, pero en este sistema siempre se calienta, quisiera saber si se requiere de un acople control-potencia adicional. De antemano gracias por tu respuesta.

    Reply
      • Nelson

        Si claro, el montaje que implemente es el que esta presenté en la sección subtitulada como “Conexión dos pins”, el único cambio que hice fue el de utilizar transistores NPN de referencia BC548 a diferencia de los sugeridos, pero no creo que ese sea el problema; según el datasheet son semejantes, utilice las resistencias sugeridas a igual que el driver (L293) y una fuente variable que fije a 12v, inicialmente se calentaba el chip del arduino como mencione anteriormente pero después utilice dos diodos entre los pins 8 y 9 del arduino y los nodos que van hacia el driver (IN1 IN2′ IN3′ IN4), ya no se calentaba pero no ocurría nada, después deje el circuito como estaba inicialmente (sin diodos) pero al parecer el driver (L293) quedo en corto porque tumbó la tensión de la fuente; de 12v a 3v. Quedo a la espera de una posible solución, gracias por tu pronta respuesta!

        Reply
        • victor

          y calienta arduino??? no debería, entiendo que se te pudo dañar el 293, pero aún así no veo porque caliente arduino, como lo alimentas? en vacío (el arduino desconetado de todo y alimentado) calienta?
          los motores pap son medio “jodidos” (perdón por la expresión) en cuanto a conseguir el mejor torque con la menor temperatura de trabajo, pero no es ese tu problema.

          Reply
          • Nelson

            La alimentación del arduino es por medio del PC… El arduino al vacío no se calienta, sólo se calienta con la conexión del motor paso a paso, en otras condiciones o con otros programas tampoco se calienta, conseguiré de nuevo el driver y probare mañana debido a que hoy no tengo presente con migó el sistema, si de pronto tienes un video del circuito que estoy implementando te lo agradecería, veo que en el circuito que se muestra en el video a lo último del tutorial no se perciben problemas, depronto viendo el montaje que estoy usando encuentre mi problema. Gracias.

  • Fernando Alemanno

    Hola, perfecto tutorial!!! Yo quisiera mover un motor pap pero mediante un potenciómetro en vez de dos pulsadores, osea que el sentido de giro al motor se lo de el sentido de giro del pote. Como podría hacerlo?
    Desde ya muchas gracias.
    Saludos. FA

    Reply
  • agustin

    hola buenas tardes. me da como error al querer programar la parte
    “stepper.setSpeed(pot); //Indicamos la velocidad al motor

    stepper.step(direccion); //Indicamos la dirección al motor”

    que puedo hacer para lo acepte? espero su respuesta!

    Reply
  • pablo zapata

    Buenas compadre, me a servido de gran ayuda tu tutorial, tengo algunas dudas para el control del motor atra vez de un sensor, te explico debo hacer un ascensor automatico, el cual consta de 3 pisos y t3 columnas, el cual por intermedio de motores bipolares y sensor ultra sonico que me vera si en el estacionamiento hay auto o no se pueda mover segun las señales o condiciones de cada sensor, no se si me podrías ayudar, estaría gratamente agradecido, atte pablo zapata mi ocrreo de contacto por cualquier cosa o si te interesa es pablo.zapata05@inacapmail.cl

    Reply
  • Black

    Hola buenos días, estoy trabajando con un motor unipolar de 5 salidas, me gustaría saber como adaptarlo al circuito que propones.

    Reply
  • Grp71

    Hola! arme el circuito,de driver use en L298 el circuito funciona pero a velocidad alta solo me deja invertir el giro,ya que si disminuyo la velocidad no tienen acción los touch,igualmente el pote lo giro para aumentar o disminuir tiene un retado bastante notorio (el arduino lo alimenté externamente para descartar errores).Si funcionara correctamente sería bueno que también tenga un touch de frenado del motor.Saludos!

    Reply
  • Carlos

    Hola amigos!, quisiera saber si hay alguna forma de que por ejemplo pulsando un boton el stepper de n cantidad de pasos y luego automaticamente pare, solo si vuelvo a pulsar el boton volvera a dar los n pasos. Me pasa que con el void loop el vuelve a dar hasta que yo accione otro boton, pero quisiera que el se pare despues de completar la cantidad determinada de pasos. Muchas gracias por la ayuda

    Reply
    • victor

      con un bucle, algo así:

      if(digitalRead(El_Pulsador_Que_Quieras)==HIGH)
      {
      for(int i = 0; i >= LOS_PULSOS_QUE_QUIERAS; i++)
      {
      stepper.step(1); //o -1, si quieres que gire en sentido opuesto
      }
      }

      Reply
  • Pingback: Motor paso a paso Unipolar | Ingenia Oaxaca

  • Adan

    Hola, que tal, excelente proyecto amigo, de casualidad no sabrás como controlar dos motores paso a paso con un solo arduino ya que si lo hago con diferentes drivers al mismo tiempo tiene a haber una caída de tensión no se si sea mi programa o el circuito, pero si tuvieras un proyecto parecido me seria de gran utilidad

    te dejo mi correo parea estar en contacto becorron@hotmail.com

    Reply
  • marcos

    hola compi me da un error al programar el arduino podrias darme una solucion soy nuebo es este mundo y llevo varios dias intentando hacer funcionar tu proyecto pero nada ….
    imput was not declared in this scope
    motorknob.inc.in function’ void setup () ‘ :
    motorknob: error : ‘IMPUT’ was not declared in this scope

    Reply
  • Pingback: Tema 3 – Conceptos básicos de microcontroladores y electrónica (3) | Aprendiendo Arduino

  • Efrain Garzon Bello

    disculpe tengo una pregunta como puedo enviar la informacion a a arduino de un sensor ultrasonico que mide una distancia por ejemplo dos cm y que envia a un motor bipolar y se mueva dos cm o dos vueltas

    Reply
  • douglas

    necesito crear una secuencia de marcha y paro de motor pap unipolar y reinicio con diferentes posiciones y con diferentes pulsadores , que al pulsar un pulsador por ejemplo (1, 9 , 2 ,7, 3 , 4)pero solo 6 posiciones a la vez sin importa el orden sino que haga lo pre programado en cada sub-rutina y se empiece a ejecutar hasta que se pulse el boton de inicio ; gracias espero que alguno de ustedes puedan ayudarme con mi dilema

    Reply
  • rigoberto

    hola necesito una ayuda el tutorial esta muy bien explicado pero alguien me podria hacer modificarlo para que al soltar el pulsador deje de girar o que se detenga con un final de carrera ocupo para un proyecto de unas percianas se los agradeceria mucho mi correo es mecatronicayrobotica@outlook.com gracias.. espero que me ayuden

    Reply
  • Pingback: Actuadores y periféricos de salida | Aprendiendo Arduino

  • diomer

    hola amigo interesante tu trabajo,
    soy pichon en esto quisiera que recomendes algun tutorial o informacion sobre motores paso a paso

    Reply
  • leo

    tengo una pregunta por que razon el l293 se puede calentar estaria muy agradecido si me puede responder la pregunta profesor
    es que mi integrado se esta calentado y

    Reply
  • sergio

    Hola !! yo ejecuto el codigo para controlar motor con 4 hilos con el driver unl2003 y no consigo que el motor cambie el sentido de giro.
    Un saludo

    Reply
  • JUAN JOSE DE LA CRUZ

    buenas, estoy intentando manejar un motor paso a paso unipolar con un arduino y al ser nuevo en esto no se muy bien el programa, si fuerais tan amables de pasarme dicho programa os lo agradeceria mucho, gracias.

    Reply
  • Brandon Vásquez

    Hola buenas noches, estoy intentando controlar un motor a pasos bipolar pero solo con el potenciometro que cuando el potenciometro lo mueva a la izq, el motor se mueva hacia un lado, y cuando el potenciometro se mueva a la derecha, el motor se mueva al otro lado

    Reply
    • Francisco Jose Forcada Tirado

      #include //Importamos la librería para controlar motores paso a paso

      #define motorPin1 8 // IN1 em el driver
      #define motorPin2 9 // IN2 en el driver
      #define motorPin3 10 // IN3 en el driver
      #define motorPin4 11 // IN4 en el driver

      #define STEPS 200 //Ponemos el número de pasos que necesita para dar una vuelta. 200 en nuestro caso

      // Ponemos nombre al motor, el número de pasos y los pins de control
      Stepper stepper(STEPS, 8, 9, 10, 11); //Stepper nombre motor (número de pasos por vuelta, pins de control)

      int potenciometro; // Variable lectura potenciómetro
      int Velocidad; // Variable de la velocidad.
      int direccion; // Variable para indicar la direccón

      void setup()
      {
      // Velocidad del motor en RPM
      stepper.setSpeed(100);
      pinMode(motorPin1, OUTPUT); // Configuración de los PIN-es como salida digital
      pinMode(motorPin2, OUTPUT);
      pinMode(motorPin3, OUTPUT);
      pinMode(motorPin4, OUTPUT);
      }

      void loop()
      {
      potenciometro = analogRead(A0); // Lectura potenciómetro
      potenciometro = map(potenciometro, 0, 1023, -100, 100); // Mapeamos para ajustar a nuestros valores.

      if(potenciometro>10) {
      Velocidad=potenciometro*2;
      direccion=potenciometro*2; // Si el potenciometro esta a la derecha, el motor gira a la derecha.
      stepper.setSpeed(Velocidad); // Indicamos la velocidad al motor
      stepper.step(direccion); // Indicamos la dirección al motor
      }
      if(potenciometro<10) {
      Velocidad=potenciometro*(-2);
      direccion=potenciometro*2; // Si el potenciometro esta a la izquierdo, el motor gira a la izquierda.
      stepper.setSpeed(Velocidad); // Indicamos la velocidad al motor
      stepper.step(direccion); // Indicamos la dirección al motor
      }
      }

      Reply
      • Francisco Jose Forcada Tirado

        Perdon, hay algun errorcillo aunque compila bien. Ya los he corregido, espero te funcione bien.
        Igual tendras que variar los valores del mapeado para adaptarlos a tu motor.

        #include //Importamos la librería para controlar motores paso a paso

        #define motorPin1 8 // IN1 em el driver
        #define motorPin2 9 // IN2 en el driver
        #define motorPin3 10 // IN3 en el driver
        #define motorPin4 11 // IN4 en el driver

        #define STEPS 200 //Ponemos el número de pasos que necesita para dar una vuelta. 200 en nuestro caso

        // Ponemos nombre al motor, el número de pasos y los pins de control
        Stepper stepper(STEPS, 8, 9, 10, 11); //Stepper nombre motor (número de pasos por vuelta, pins de control)

        int potenciometro; // Variable lectura potenciómetro
        int Velocidad; // Variable de la velocidad.
        int direccion; // Variable para indicar la direccón

        void setup() {
        // Velocidad del motor en RPM
        stepper.setSpeed(100);
        pinMode(motorPin1, OUTPUT); // Configuración de los PIN-es como salida digital
        pinMode(motorPin2, OUTPUT);
        pinMode(motorPin3, OUTPUT);
        pinMode(motorPin4, OUTPUT);
        }

        void loop() {
        potenciometro = analogRead(A0); // Lectura potenciómetro
        potenciometro = map(potenciometro, 0, 1023, -100, 100); // Mapeamos para ajustar a nuestros valores.

        if(potenciometro>10) {
        Velocidad=potenciometro*2;
        direccion=potenciometro*2; // Si el potenciometro esta a la derecha, el motor gira a la derecha.
        stepper.setSpeed(Velocidad); // Indicamos la velocidad al motor
        stepper.step(direccion); // Indicamos la dirección al motor
        }
        if(potenciometro=(-10) && potenciometro<=10) {
        Velocidad=0;
        direccion=0; // El motor no se mueve.
        stepper.setSpeed(Velocidad);
        stepper.step(direccion);
        }
        }

        Reply
        • Boris Mantilla

          Hola Francisco.
          Te cuento que probé tu código con un motor unipolar pero no me funciona, sera que debo reformarle algo par que me funcione con este tipo de motor?.

          Reply
  • Marcelo

    Hola tengo un arduino y un arduino motor shield tengo que hacer funcionar un motor pap unipolar de 6 cables . Funciones que necesito pulsar un pulsador y que el motor de x vueltas a una velocidad controlada por un potencio metro cuando de esas vueltas pare y al pulsar otro pulsador haga lo mismo hacia el otro lado. Si alguien me puede ayudar ? Muchas gracias. Marcelo

    Reply
  • Fredy

    Las explicaciones muy claras, excelente tutorial.

    Hice el circuito para el control de velocidad y dirección, trabajo perfecto.

    Adicione un motor al circuito con un L293D y sus propios pulsadores, para el cambio de sentido; los dos motores trabajan pero, cuando lo hace uno el otro no.

    ¿Qué modificaciones tengo que hacer en el programa para que los dos trabajen continuamente y respondan a sus propios pulsadores de cambio de dirección?

    Gracias y espero pueda ayudarme.

    Este es como quedo el programa:

    #include
    #define STEPS 200
    Stepper stepper(STEPS, 8, 9);
    Stepper stepper1(STEPS, 10,11);
    int pot;
    int derecha=3;
    int izquierda=2;
    int direccion;
    int derecha1=4;
    int izquierda1=5;
    int direccion1;

    void setup()
    {
    pinMode(derecha,INPUT);
    pinMode(izquierda,INPUT);
    pinMode(derecha1,INPUT);
    pinMode(izquierda1,INPUT);
    }

    void loop()
    {
    pot=analogRead(A0);
    pot = map(pot, 0, 1023, 30, 150);

    stepper.setSpeed(pot);

    stepper.step(direccion);

    if(digitalRead(izquierda)==HIGH)
    {
    direccion=200;
    }

    if(digitalRead(derecha)==HIGH)
    {
    direccion=-200;
    }
    stepper1.setSpeed(pot);

    stepper1.step(direccion1);

    if(digitalRead(izquierda1)==HIGH)
    {
    direccion1=200;
    }

    if(digitalRead(derecha1)==HIGH)
    {
    direccion1=-200;
    }
    }

    Reply
  • raul

    Hola para hacer un control de posicion con dos motores pap, pretendo construir una paqueña fresadora, por ahora quiero mover los moteres dandoles yo cantidad de pasos a dar y en que direccion. encuentro programas que los mueven pero niguno con cotrol de pasos . me podrias dar una pista para seguir adelante Gracias

    Reply
  • miguel angel baez

    hola una pregunta a lo mejor suene tonta pero necesito sabes que son las N que aparecen en el pro-tobar

    Reply
  • Pingback: Programacion | Pearltrees

  • Pingback: ELECTRÓNICA - sandinotorres | Pearltrees

  • Pingback: ELECTRÓNICA - sandinotorres | Pearltrees

  • eugui

    Ayuda pls, Esta bien editado mi programa? uso el atmega 328p.

    #include //Importamos la librería para controlar motores paso a paso

    #define STEPS 200 //Ponemos el número de pasos que necesita para dar una vuelta. 200 en nuestro caso

    // Ponemos nombre al motor, el número de pasos y los pins de control
    Stepper stepper(1.8, 8, 9); //Stepper nombre motor (número de pasos por vuelta, pins de control)

    int pot=A0; //Variable lectura potenciómetro
    int derecha=3; //Pulsador derecha
    int izquierda=2; //Pulsador izquierda
    int direccion; //Variable para indicar la direccón

    void setup()
    {
    pinMode(derecha,3);
    pinMode(izquierda,2);
    }

    void loop()
    {
    pot=analogRead(A0); //Lectura potenciómetro
    pot = map(pot, 0, 1023, 30, 150); //Establecemos la velocidad entre 30 y 150 rpm

    stepper.setSpeed(pot); //Indicamos la velocidad al motor

    stepper.step(direccion); //Indicamos la dirección al motor

    if(digitalRead(izquierda)==HIGH)
    {
    direccion=200; //Si pulsamos el pulsador izquierdo, el motor gira a la izquierda
    }

    if(digitalRead(derecha)==HIGH)
    {
    direccion=-200; //Si pulsamos el pulsador derecho, el motor gira a la derech
    }
    } // put your setup code here, to run once:

    Reply
  • artanis

    Hola buena noches a todos , disculpen puedo utilizar este circuito si quiero mover un Motor a pasos M42SP-7 con arduino?
    La verdad no tengo muchos conocimientos de programación y de electrónica.

    Reply
  • Rodrigo Garcia

    Hola Buenas noches, Tengo una pegunta? Soy nuevo en esto del los motores paso a paso, Quería saber si el circuito integrado ULN2803 soporta mi motor de 1.5 A o eso ya depende de mi Fuente de Alimentación? o tengo que cambiar de Circuito Integrado?

    Reply
  • Diego

    Hola, buenas noches, tengo una duda, el motor que quiero controlar dice en su etiqueta que trabaja a 24V, le pasará algo a mi arduino si conecto ese motor? Es unipolar

    Reply
  • ricardo

    Hola que tal tengo una pregunta necesito hacer el mismo control de velocidad y giro del ejemplo pero con un motor unipolar mi pregunta es que si solo se le agrega la parte del potenciómetro y los botones para el cambio de giro

    Reply
  • Pingback: Control de un motor paso a paso bipolar (de un lector dvd) con Arduino UNO | Bajando de la tarima

  • Born Piano

    Tengo una duda, quiero manejar la funcion del potenciometro desde la computadora, pero no se que parte del programa se necesita modificar para enviar los datos al data_rate…

    Reply
  • roberto rene salguero hidalgo

    Hola felicidades muy bueno el tutorial, tengo la misma inquietud que Ricardo, deseo controlar el motor paso a paso bipolar con desplazamieto de cada cinco ò diez grados y dos botones para que el sentido de su giro cambie. gracias

    Reply
  • roberto rene salguero hidalgo

    Hola felicidades por el tutorial, tengo la misma inquietud que Ricardo, deseo controlar el motor paso a paso bipolar cada cinco ò diez grados y dos botones de pulzacion para cambiar el sentido de giro. Gracias

    Reply
  • raul

    hola necesito ayuda para programar el motor a pasos con arduino y poder hacer el cambio de giro pero que al iniciar el motor a pasos inicie de un punto establecido o marcado y que no inicie de otra posicion sino que regrese al mismo punto establecido y que parta de ahi mismo

    Reply
  • MariaAN

    Hola!
    Estoy trabajando con un arduino y un motor paso a paso y quería preparar un código que me permitiese empezar con una velocidad de giro baja y que con el tiempo fuese augmentando. Es decir, que por ejemplo estubiese 10 segundos a una velocidad baja, después 20 segundos a una velocidad un poco más alta y así sucessivamente hasta establecer la velocidad que deseo. El problema es que no se que función definir en el delay() para poder establecer esta rampa de velocidades. Muchas gracias!

    Reply
  • Fernanda

    Hola por ejemplo mi motor paso a paso es de dos entradas como podria conectarlo hay, tendria que usar diodos para porder distribuir la conexion???

    Reply
    • Angel

      A que te refieres que tu motor tiene dos entradas. Si en realidad tiene solo dos cables no es un motor paso a paso. Los motores paso a paso tienen si o si más de dos entradas.

      Reply
  • Maor

    Buenas tardes,
    Me gustaría saber si es que puedo (con el Arduino UNO) controlar el motor de paso con un sensor de movimiento. Ejemplo: Si se detecta movimiento (con el sensor PIR) el motor gira 90 grados. Y también me gustaría saber si es que se puede conectar 4 sensores PIR (en el Arduino UNO) para darle ordenes a un mismo motor de paso.

    Reply
  • sds

    quiero programar un motor paso a paso con velocidad variable de mas a menos, si alguien tuiviera el programa

    Reply
  • FRANCISCO SOTO

    HOLA ES LA PRIMERA VEZ QUE INTECTO CONTACTAR CON ALGUIEN, LA PREGUNTA ES LA SIGUIENTE TENGO UNA MAQUINA LA MARCA MAX_NC 15 SE ME QUEMO UNA DE LAS SALIDAS DE EJE (ESTA MAQUINA FUNCIONABA CON SERVO MOTORES) LO QUE HICE FUE QUE COMPRE OTRA TARGETA CON MOTORES A PASO QUE ME RESULTABA MAS ECONOMICA PORQUE LA ORIGINAL ME SALIA BASTANTE CARA INSTALE TODO Y FUNCIONA PERO AUNQUE LE PONGA EN CONFIGURACION QUE TRABAJE EN MILIMETROS ME TABAJA EN PULGADAS AUNQUE EN EL PAQUETE DE DATOS EXISTA EL CODIGO G21 REFERENCIANDO A MILIMETROS E ESTADO LEYENDO EN FOROS QUE TENGO QUE CONFIGURAR LOS MOTORES MIS MOTORES SON 180 PASOS MONTADOS EN UN TORNILLO DE 1/4 MI PREGUNTA ES EN MOTOR TUNING QUE CANTIDAD DE PASOS DEBO COLOCAR ALGUIEN ME PODRIA AYUDAR O EXPLICAR COMO LE HAGO PARA TRABAJAR EN MILIMETROS NO EN PULGADAS AGRADECERIA QUE ME PUDIERAN AYUDAR A LA BREVEDAD POSIBLE YA QUE TENGO LA NECESIDAD DE TRABAJAR LA MQUINITA ME DESPIDO MUCHAS GRACIAS. FRANCISCO DE LEON.GTO.

    Reply
  • jorge charry

    hola, la verdad es que no tengo conocimientos de arduino, pero estoy muy interesado en meterme. Hago iluminación para eventos y tengo ganas de hacer algunos experimentos. Hago una consulta, me gustó la nota sobre los motores, para comandar los motores via dmx, es mucho mas complejo de lo que vi en esta nota? Agradecería si me dan una idea general como para poder captar la idea. muchas gracias

    Reply
  • Nestor

    Hola, si alguien puede ayudarme, con una plaqueta Arduino UNO, necesito hacer el código para que al activarse un sensor de movimiento se enciendan dos relay (con sus tempoerizaciones propias, delay); luego de mantenerse unos 10 minutos este encendido-apagado de los reles, deben detenerse hasta la nueva activación del sensor de movimiento.
    Desde ya muchas gracias y el post esta muy bueno

    Reply
  • Delfor

    Hola a todos. Estoy trabajando con lo mismo. Dos motores paso a paso y con dos puentes H. Pero no se como hacer para que funcionen simultáneamente ya que el código es secuencial. Agradecería que alguien aporte a mi duda. Desde ya muchas gracias.!

    Reply
  • antonio lazcano

    saludos intento controlar un motos a pasos solo con un pin conectado a un contolador.,el cotrolador solo tiene dos salidas la de dirección 1y0 y la de control solo son dos pines los que conecto .. espero me puedan ayudar ..

    Reply
  • Faidher Arley Galindo Rodriguez

    Hola que tal, he tenido problemas al momento de mover dos motores paso a paso al tiempo no lo he conseguido, lo que deben hacer lo motores es moverse hacia una misma dirección al tiempo, luego un motor hacia una dirección y el otro hacia la otra dirección pero ambos al tiempo, si me pudieras ayudar seria grandioso lo que pasa es que estoy tratando de hacer un proyecto pero programando en arduino ó en “C++” solo me permite hacer el movimiento de un solo motor por lo que su funcionamiento es secuencial, no se si de casualidad exista una librería o una forma de hacer que esto sea posible, de nuevo muchas gracias si me puedes ayudar, y por cierto gran explicación la que tienes aquí muy completa.

    Saludos desde Colombia-Bogotá D.C.

    Reply
  • Leonardo

    buenas quiero controlar 3 motores paso a paso unipolares de 24v 3A. que es lo que necesito?

    desde ya, muchas gracias-

    Reply
    • Víctor

      lo único que encontré realmente bueno para simular arduino es proteus 8.4

      en líneas generales, una vez instalado proteus pasás a instalar la librería Arduino, la que tendrá bastantes versiones de arduino para simular, luego en las propiedades del modulo arduino que uses en tu simulación, tendrás que poner el path y nombre de archivo (con extensión .hex)

      en youtube hay varios tutoriales que explican cómo se hace, no es dificil.

      hay también varios módulos disponibles para usar en las simulaciones, como por ejemplo el SFR04 (sensor de ultrasonidos de 5 pines) o motores PAP entre otros.

      éxitos!!!

      Reply
  • Rui

    Hola, tengo este Codico que sólo funciona con Arduino, pero quería aplicar más motores y el uso de signos A4988 pero no funciona. ¿Me puede ayudar a golpear el Codico. Hace las tarjetas A4988 trabajan el mismo esquema que se presenta con L293D ????
    Nota: Yo soy portugués y por lo que mi español no es la mejor.
    Agradezco su ayuda. Un abrazo.
    ————————————————
    #include
    // My motor es un Mercury Motor 12V 200 Steps 1.8 Step angle
    #define STEPS 200

    Stepper stepper1(STEPS, 2, 3, 4, 5);
    Stepper stepper2(STEPS, 6, 7, 8, 9);
    Stepper stepper3(STEPS, 10, 11, 12, 13);

    //Necesito cambiar a este formulario, pero no funciona de la misma manera.

    //Stepper stepper1(STEPS, 2, 3); //2 dir e 3 step
    //Stepper stepper2(STEPS, 6, 7); //6 dir e 7 step
    //Stepper stepper3(STEPS, 10, 11); //10 dir e 11 step

    void setup()
    {
    stepper1.setSpeed(60);
    stepper2.setSpeed(60);
    stepper3.setSpeed(300);
    }
    void loop()
    {
    stepper1.step(30);
    stepper2.step(-30);
    delay(2000);
    stepper1.step(70);
    stepper1.step(-100);
    stepper2.step(-70);
    stepper2.step(100);
    stepper3.step(1200);
    stepper3.step(-1200);
    }

    Reply
  • Erik Serrato Hernandez

    Hola que tal, tengo una gran duda, lo que pasa es que quiero hacer un brazo motion control para stop motion, navegando eh investigado eh dado que se puede realizar mediante el Arduino Mega 2560, Easydriver y codigo que entrga Dragonframe (http://www.dragonframe.com/moco-3d.php) lo que quiero hacer es poder manejar seis movimientos, Paneo, tilt, ejes X, Y, Z y zoom con un brazo suspendido al estilo DIY, (seis motores pap, seis Easydriver y una arduino) pero realmente no se si se pueda realizar tal cosa, espero me puedas asesorar un poco en esta cuestión, Saludos.

    Reply
  • Pingback: Motores | Aprendiendo Arduino

  • Daniel ramirez madrid

    buen dia, si quisiera que el motor a pasos nema 23 de 4 hilos diera giros por horario, tengo un RTC el cual me gustaria usar para que el motor a determinada hora gire tantos grados.

    Reply
  • Felix

    Hola buenas tardes… una colsulta… tengo un motor paso a paso unipolar …. el problema es que el motor no funciona con el programa de libreria … pero cuando hago un programa para que cada bobina encienda … funciona… el problema es que me sale muy largo …. alguien podria ayudarme con ese problema … se lo agradeceria de ante mano..

    Reply
  • Joel Garay

    buenas .. me gustaria hacer una consulta,, La tension de 12 voltios para que se utilizaria? si la tension es correspondiente a la velocidad deberia de aumentarla ? gracias

    Reply
  • julio

    Hola, tengo un nema 17 hs 3001 20 b sigo el tutorial para que gire en un sentido y después en otro, varío los pasos, porque según pude leer este motor tiene 1,8 así que introduzco en el programa 200 todo lo demás creo que esta bien controlado. El motor vibra, y gira siempre para un lado. Lo estoy alimentando desde una fuente a 10 vcc y la fuente, en su display varian los valores cada vez que el arduino inyecta una orden de giro hacia un sentido u otro… ¿podeis indicarme que estoy haciendo mal? con otros motores 16py-q203-g2 no tengo problema. Estoy usando un driver l298n

    Reply
  • Jorge Lessio

    se pueden administrar grupos de 4 o 6 motores paso a paso con un solo sistema Arduino, el sistema soporta trabajar hasta 12 hs continuada, el sistema Arduino se puede administrar por medio de un Software Mach 3

    Reply
  • Luis Miguel

    Como van, disculpen se puede controlar 4 motores bipolares mediante la configuracion de transistores y a demas que se utilize la libreria Stepper, ya que solo funciona los pines 8,9,10,11 como puedo controlar mas motores bipolares les agradeceria la informacion

    Reply
  • marcobra1602

    Hola amigos soy de santiago de chile. me estoy fabricando una cnc y deseo saber si con arduino uno se puede controlar un cuarto eje independiente, para poder manejar un mini torno dentro de la fresa.

    Reply
  • anilandro

    Estoy comenzando con los motores paso a paso, y con la librería al controlar un bipolar con el módulo L298 me encuentro que siempre está dando corriente a una bobina del motor, incluso con el motor parado, lo cual hace que éste esté un poco frenado, pero que consuma bastante corriente en este estado, lo cual es un problema con sistemas alimentados por baterías. La solución ha sido pasar de esta librería y hacer mis propias funciones, con las cuales el giro es incluso más regular, ya que la stepper genera en el motor un ruido cíclico sincopado que indica falta de regularidad.

    También hice otras funciones para controlar los unipolares con el ULN2003, que permiten los tres modos de control, el wave drive, el normal y el medio paso.

    Saludos a todos

    Reply
  • Cristobal

    buenas
    muy buena explicacion.
    Estoy intentando controlar la velocidad y el sentido de un motor en este caso unipolar (28BYJ-48) como has hecho el la ultima práctica, y no lo consigo ,la velocidad si pero la direccion no. Pido una ayudita .
    Un saludo

    Reply
  • Carlos

    Hola buen día… Soy algo nuevo en esto, si quisiera controlar 4 motores PAP con un solo arduino bastará y solo debería armar 4 circuitos iguales al montado en el protoboard y despues modificar el programa, es aqui donde me confundí un poco

    Reply
  • Juan

    Buenas tarde es que tengo un problema para mover el motor paso a paso es de 48 pasos por vuelta y cuando lo conecto a la fuente o al computador se demora en dar oa vuelta y da media vuelta que puede ser?

    Reply
  • edudi

    Buenas noches, excelente tutorial, me ha ayudado muchísimo. Gracias a la simplicidad del uso de GPIO’s (por comandos: echo 1/0 > /sys/class/gpio/gpio29/value) me he hecho una mini-impresora 2D con un bolígrafo (uso eje X e Y con 2 motores bipolares). El dispositivo no es Raspberry, ni Arduino, pero si tiene Linux y se pueden hacer cosas en C, obviamente. Por lo que lo que pretendo es totalmente compatible para cualquier dispositivo que tenga GPIO’s que podamos usar. De ahí que les puede valer a quien quiera.

    He ido consiguiendo hacer un cuadrado perfecto, rombos (escalonados por 1 vuelta completa por eje), digonales (escalonados por 1 vuelta completa por eje), diagonales perfectas (bucle de moviento de 1 paso X hacia la izquierda y luego 1 paso Y subiendo), un mini-casi-círculo (por último), …todo esto ha sido programado y no exportado, obviamente no es la forma de hacer una impresión, aunque si para comprobar la exactitud de los movimientos y la geometría de cada figura. Esto se ha conseguido para mi sorpresa.

    Quisiera poder tener/modificar el driver y librerías necesarias para que por GPIO’s ya sea con “C” o por otro lenguaje consiga que los motores realicen los movimientos que deban en función del dibujo exportado desde cualquier programa de impresión 3D en el cual limite a usar sólo ejes X e Y (2D), en este caso un bolígrafo como pudiera ser también un láser (a posteriori), de momento el eje Z no me hace falta.

    La idea no es tener conectado un PC al dispositivo, sino meterle en la memoria el modelo exportado a imprimir (ya sea en formato G-CODE, o cualquier otro…desde el inkscape, etc…) y que gracias al driver y librerías, él se encargue de realizar los movimientos necesarios para seguir la trayectoria.

    Yo consigo mover un sólo motor a la vez, ya que es un script, y en el caso de una diagonal consigo que genere el movimiento de los 2 motores pero no es simultaneo, no sé si es necesario que sea así o realmente las impresoras 3D en realidad simultaneamente no hacen nada (que hagan o no 1 paso por cada eje en la línea de tiempo), que lo dudo, pero no me extrañaría, ya que si fuera secuencial como veo en el código del G-CODE, o tiene varios hilos para poder atender de forma sincronizada 2 motores mínimo, o no lo entiendo ni para atrás como lo hace.

    Me he topado con la problemática de que en G-CODE se usan funciones tipo G0, G1, G90, etc….para diferentes movimientos y es un completo follón tratar de adaptar mi “driver” a lo que es cada función (que hay cientos). Por lo que si el driver/programa con las librerías que publican aquí o uno más específico me sirviera, se los agradecería en el alma si me ayudaran a localizarlo. Para nada es necesario que tenga que usar mi “driver” casero, ya que es lo más básico del mundo aunque me haya servido para los primeros pinitos.

    Un saludo a todos y gracias por compartir conocimiento. De esta forma se llega muy lejos.

    ==================================================================================================
    Mi “driver” casero para manejarlo está hecho en formato script, de momento (este es usando como paso 1 vuelta completa):

    Bobina1=”/sys/class/gpio/gpio4/value” // Bobina 1 asignada a ese GPIO4
    Bobina2=”/sys/class/gpio/gpio5/value” // Bobina 2 asignada a ese GPIO5
    Bobina3=”/sys/class/gpio/gpio29/value” // Bobina 3 asignada a ese GPIO29
    Bobina4=”/sys/class/gpio/gpio32/value” // Bobina 4 asignada a ese GPIO32

    VUELTAS=`expr $1`
    TIME=`expr $2`
    DIRECCION=`expr $3`
    COUNTER=$VUELTAS

    echo 0 > $Bobina1 ; echo 0 > $Bobina2 ; echo 0 > $Bobina3 ; echo 0 > $Bobina4
    .
    .
    . Para no añadir 100 líneas de código, es activar en bucles de 1 vuelta, cada una de las bobinas por orden, a la derecha tiene un orden, y a la derecha tiene el mismo pero invertido….si lo quieren me lo piden, pero se aprende y es entretenido sacarlo uno mismo, no tiene ciencia y es más un mini puzzle que otra cosa.

    1º B1, 2º B1 y B2, 3º B2, 4º B2 y B3, 5º B3, 6º B3 y B4, 7º B4, 8º B4 y B1 –> Giro hacia la derecha
    “……………lo mismo pero invertido” —–> Giro hacia la derecha
    .

    El script se lanza indicando el número de vueltas, velocidad y dirección que se quiere lo hace: sh ./motor_gira.sh 5 100 1 (5 = 5 vueltas, 100 = velocidad de giro, 1 derecha)

    ======================================================================================================

    Reply
  • julio cesar gorosito

    hola ,,buenísimo el tutorial ,,,los molesto con una consulta,,,necesito mover un paso a paso unipolar,,con arduino y drv 8825,,,y quería saber si puedo usar ese mismo programa para controlar velocidad y dar vueltas indefinidas es para una mesa rotatoria para soldar con mig,,,agradecido

    Reply
  • Pingback: Motores Arduino | Aprendiendo Arduino

  • JULIAN GALEANO

    Hola a todos.

    Estoy construyendo un slider con un LEONARDO, un paso a paso (creo que es un nema 17, lo saqué de una luz robótica, es de 500 pasos por giro), un driver L298 y un teclado 3×4, es problema es que quiero que al introducir distancia en centímetros y tiempo en segundos, el haga la división y distribuya los pasos para recorrer esa distancia entre los milisegundos de la lectura de tiempo. El problema es que el motor empieza a vibrar mucho y a veces como loco gira en todos los sentidos.

    ¿Alguna solución?

    //LIBRERIAS
    //#include
    #include //librería para controlar motores paso a paso
    #define STEPS 500 //Número de pasos para 360 grados.
    #include //librería para controlar

    // PINES CONTROL MOTOR
    Stepper stepper(STEPS, 8, 9,10, 11);
    //AccelStepper motor(STEPS, 13, 11, 10, 9);// https://www.youtube.com/watch?v=b_bA5Ha_mec&t=622s

    // VARIABLES
    String D, T;
    float dur;
    char op, buffer;
    boolean valOnePresent = false;
    boolean final = false;
    ;
    //int keyfullnumber=0; //variabes almacenada para calcular distacia final
    //int key;

    //TECLADO NUMÉRICO
    //VARIABLES DE TECLADO
    const byte FILA = 4; //variables de fila
    const byte COL = 3; //variables de columna
    char keypadEvent;

    //MATRIZ
    char hexaKeys[FILA][COL] = {
    {‘1′,’2′,’3’},
    {‘4′,’5′,’6’},
    {‘7′,’8′,’9’},
    {‘*’,’0′,’#’}
    };

    // PINES CONTROL TECLADO
    byte rowPins[FILA] = {7,6,5,4};
    byte colPins[COL] = {3,2,1};

    // INICIALIZAR CLASE NewKeypad
    Keypad mykeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, FILA, COL );

    // SETUP / PREPARAR
    void setup(){
    Serial.begin(9600);
    stepper.setSpeed(60);// revoluciones por minuto
    }

    // LOOP / VACÍO
    void loop()
    {
    char key = mykeypad.getKey();//Obtener números del teclado

    // ENTRADA NUMÉRICA DE VARIABLES DISTANCIA Y TIEMPO
    if(key != NO_KEY &&( key==’1’||key==’2’||key==’3’||key==’4’||key==’5’||key==’6’||key==’7’||key==’8’||key==’9’||key==’0′))
    if (valOnePresent != true){
    Serial.print(“DISTANCIA A RECORRER EN CM: “);
    D= D + key;// Digitar y almacenar números para la DISTANCIA IN
    Serial.println(D);
    }
    else {
    Serial.print(“TIEMPO DE TRABAJO EN SEGUNDOS: “);
    T = T + key;//Digitar y almacenar números para el TIEMPO IN
    Serial.println(T);
    final = true;
    }

    // ENTER (#) DE PRIMERA VARIABLE (D) PARA PASAR A ALMACENAR SEGUNDA VARIABLE (T)
    else if (valOnePresent == false && key != NO_KEY && (key == ‘#’|| key == ‘#’)){//SALTO ENTRE (D) Y (T)
    if (valOnePresent == false){
    valOnePresent = true;
    op = key;
    Serial.println(” ” );
    Serial.println(” SOBRE: ” );
    Serial.println(” ” );
    }
    }

    // OBTENER DISTANCIA EN PASOS
    else if (final == true && key != NO_KEY && (key == ‘*’)) { // FUNCION IGUAL (=)
    if (op == ‘#’) {

    int DistPasos = D.toInt()*112; // T.toInt(); // 201.6 grados son aprox los pasos por cm lineal.
    int DELAY = (T.toInt()*1000) / DistPasos; // tiempo del delay entre pasos.
    int revol = D.toInt() / 4.6; // revoluciones por minuto.

    for (int i = 1; i <= DistPasos; i++)

    {
    //Serial.println(V, i);
    Serial.println(" " );
    Serial.print("SUS REVOLUCIONES POR MINUTOS SON: ");
    Serial.println(revol);
    Serial.print("PASOS TOTALES: ");
    Serial.println(DistPasos);
    Serial.print("DELAY EN MILÍMETROS ENTRE DE PASOS: ");
    Serial.println(DELAY);

    stepper.step(1) ; // Avanza un paso
    delay (DELAY);

    Reply

Deja un comentario