Arduino - Motor paso a paso y interruptor de fin de carrera

En este tutorial de Arduino, vamos a aprender a usar Arduino, interruptor de límite, controlador L298N y un motor paso a paso. En detalle, aprenderemos:

Acerca del motor paso a paso y del interruptor de fin de carrera

Si no conoces el motor paso a paso y el interruptor de fin de carrera (disposición de pines, cómo funciona, cómo programarlo...), aprende sobre ellos en los siguientes tutoriales:

Diagrama de Cableado

Este tutorial proporciona los códigos de Arduino para dos casos: un motor paso a paso y un interruptor de fin de carrera, un motor paso a paso y dos interruptores de fin de carrera.

  • Diagrama de cableado entre el motor paso a paso y un final de carrera
Diagrama de cableado de Arduino para motor paso a paso y interruptor de fin de carrera

This image is created using Fritzing. Click to enlarge image

  • Diagrama de cableado entre el motor paso a paso y dos finales de carrera
Diagrama de cableado para Arduino, motor paso a paso y dos interruptores de fin de carrera

This image is created using Fritzing. Click to enlarge image

※ Nota:

Dependiendo del motor paso a paso, la conexión de cableado entre el motor paso a paso y el L298N puede ser diferente. Por favor, consulte detenidamente este tutorial Arduino - Motor Paso a Paso para ver cómo conectar el motor paso a paso al controlador de motor L298N.

Código de Arduino - Detener el motor paso a paso mediante un interruptor de límite

Hay varias formas de hacer que un motor paso a paso se detenga:

  • Llamar a la función stepper.stop(): De esta manera NO detiene el motor paso a paso de inmediato, sino gradualmente
  • No llamar a la función stepper.run(): De esta manera detiene el motor paso a paso de inmediato

El código de abajo hace que un motor paso a paso gire indefinidamente y se detenga de inmediato cuando se acciona un interruptor de fin de carrera.

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-stepper-motor-and-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limitSwitch(A0); // create ezButton object that attach to pin A0; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); bool isStopped = false; void setup() { Serial.begin(9600); limitSwitch.setDebounceTime(50); // set debounce time to 50 milliseconds stepper.setMaxSpeed(500.0); // set the maximum speed stepper.setAcceleration(50.0); // set acceleration stepper.setSpeed(100); // set initial speed stepper.setCurrentPosition(0); // set position stepper.moveTo(MAX_POSITION); } void loop() { limitSwitch.loop(); // MUST call the loop() function first if (limitSwitch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); isStopped = true; } if (isStopped == false) { // without this part, the move will stop after reaching maximum position if (stepper.distanceToGo() == 0) { // if motor moved to the maximum position stepper.setCurrentPosition(0); // reset position to 0 stepper.moveTo(MAX_POSITION); // move the motor to maximum position again } stepper.run(); // MUST be called in loop() function } else { // without calling stepper.run() function, motor stops immediately // NOTE: stepper.stop() function does NOT stops motor immediately Serial.println(F("The stepper motor is STOPPED")); } }

Pasos R\u00e1pidos

  • Conecta Arduino al PC mediante un cable USB
  • Abre Arduino IDE, selecciona la placa y el puerto correctos
  • Navega hasta el icono Bibliotecas en la barra izquierda del Arduino IDE
  • Busca “ezButton”, luego encuentra la biblioteca de botones de ArduinoGetStarted.com
  • Haz clic en el botón Instalar para instalar la biblioteca ezButton.
librería de botones para Arduino
  • Buscar “AccelStepper”, luego encuentra la biblioteca AccelStepper de Mike McCauley
  • Haz clic en el botón Instalar para instalar la biblioteca AccelStepper.
Biblioteca AccelStepper de Arduino
  • Copie el código anterior y ábralo con el IDE de Arduino.
  • Haga clic en el botón Subir en el IDE de Arduino para subir el código al Arduino.
  • Si el cableado es correcto, verá que el motor gira en sentido horario.
  • Toque el interruptor de fin de carrera.
  • Verá que el motor se detiene de inmediato.
  • El resultado en el Monitor Serial se ve a continuación.
COM6
Send
The limit switch: TOUCHED The stepper motor is STOPPED The stepper motor is STOPPED The stepper motor is STOPPED The stepper motor is STOPPED
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Explicación del código

Puedes encontrar la explicación en las líneas de comentarios del código Arduino anterior.

Código de Arduino - Cambiar la dirección del motor paso a paso mediante un interruptor de límite

El código a continuación hace que un motor paso a paso gire indefinidamente y cambie su dirección cuando se activa un interruptor de fin de carrera.

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-stepper-motor-and-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define DIRECTION_CCW -1 #define DIRECTION_CW 1 #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limitSwitch(A0); // create ezButton object that attach to pin A0; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); int direction = DIRECTION_CW; long targetPos = 0; void setup() { Serial.begin(9600); limitSwitch.setDebounceTime(50); // set debounce time to 50 milliseconds stepper.setMaxSpeed(500.0); // set the maximum speed stepper.setAcceleration(50.0); // set acceleration stepper.setSpeed(100); // set initial speed stepper.setCurrentPosition(0); // set position targetPos = direction * MAX_POSITION; stepper.moveTo(targetPos); } void loop() { limitSwitch.loop(); // MUST call the loop() function first if (limitSwitch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); direction *= -1; // change direction Serial.print(F("The direction -> ")); if (direction == DIRECTION_CW) Serial.println(F("CLOCKWISE")); else Serial.println(F("ANTI-CLOCKWISE")); targetPos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // set position stepper.moveTo(targetPos); } // without this part, the move will stop after reaching maximum position if (stepper.distanceToGo() == 0) { // if motor moved to the maximum position stepper.setCurrentPosition(0); // reset position to 0 stepper.moveTo(targetPos); // move the motor to maximum position again } stepper.run(); // MUST be called in loop() function }

Pasos R\u00e1pidos

  • Copia el código anterior y ábrelo con el IDE de Arduino
  • Haz clic en Subir botón en el IDE de Arduino para cargar el código en Arduino
  • Si el cableado es correcto, verás que el motor gira en sentido horario
  • Toca el interruptor de límite
  • Verás que la dirección del motor paso a paso cambia al sentido antihorario
  • Vuelve a tocar el interruptor de límite
  • Verás que la dirección del motor paso a paso cambia al sentido horario
  • El resultado en el Monitor Serial se ve a continuación
COM6
Send
The limit switch: TOUCHED The direction -> ANTI-CLOCKWISE The limit switch: TOUCHED The direction -> CLOCKWISE
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Código de Arduino - Cambiar la dirección del motor paso a paso mediante dos interruptores de límite

El código de abajo hace que un motor paso a paso gire indefinidamente y cambie su dirección cuando se active uno de los dos interruptores de límite.

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-stepper-motor-and-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define DIRECTION_CCW -1 #define DIRECTION_CW 1 #define STATE_CHANGE_DIR 1 #define STATE_MOVE 2 #define STATE_MOVING 3 #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limitSwitch_1(A0); // create ezButton object that attach to pin A0; ezButton limitSwitch_2(A1); // create ezButton object that attach to pin A1; AccelStepper stepper(AccelStepper::FULL4WIRE, 7, 6, 5, 4); int stepperState = STATE_MOVE; int direction = DIRECTION_CW; long targetPos = 0; void setup() { Serial.begin(9600); limitSwitch_1.setDebounceTime(50); // set debounce time to 50 milliseconds limitSwitch_2.setDebounceTime(50); // set debounce time to 50 milliseconds stepper.setMaxSpeed(500.0); // set the maximum speed stepper.setAcceleration(50.0); // set acceleration stepper.setSpeed(100); // set initial speed stepper.setCurrentPosition(0); // set position } void loop() { limitSwitch_1.loop(); // MUST call the loop() function first limitSwitch_2.loop(); // MUST call the loop() function first if (limitSwitch_1.isPressed()) { stepperState = STATE_CHANGE_DIR; Serial.println(F("The limit switch 1: TOUCHED")); } if (limitSwitch_2.isPressed()) { stepperState = STATE_CHANGE_DIR; Serial.println(F("The limit switch 2: TOUCHED")); } switch (stepperState) { case STATE_CHANGE_DIR: direction *= -1; // change direction Serial.print(F("The direction -> ")); if (direction == DIRECTION_CW) Serial.println(F("CLOCKWISE")); else Serial.println(F("ANTI-CLOCKWISE")); stepperState = STATE_MOVE; // after changing direction, go to the next state to move the motor break; case STATE_MOVE: targetPos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // set position stepper.moveTo(targetPos); stepperState = STATE_MOVING; // after moving, go to the next state to keep the motor moving infinity break; case STATE_MOVING: // without this state, the move will stop after reaching maximum position if (stepper.distanceToGo() == 0) { // if motor moved to the maximum position stepper.setCurrentPosition(0); // reset position to 0 stepper.moveTo(targetPos); // move the motor to maximum position again } break; } stepper.run(); // MUST be called in loop() function }

Pasos R\u00e1pidos

  • Copia el código anterior y ábrelo con Arduino IDE
  • Haz clic en el botón Subir en Arduino IDE para cargar el código en Arduino
  • Si el cableado es correcto, verás que el motor gira en sentido horario.
  • Toca el interruptor de límite 1
  • Verás que la dirección del motor paso a paso cambia a antihorario
  • Toca el interruptor de límite 2
  • Verás que la dirección del motor paso a paso cambia a sentido horario
  • El resultado en el Monitor Serial se ve a continuación
COM6
Send
The limit switch 1: TOUCHED The direction -> ANTI-CLOCKWISE The limit switch 2: TOUCHED The direction -> CLOCKWISE
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!