Arduino Nano - Interruptor de límite para motor paso a paso

Este tutorial explica cómo usar Arduino Nano para controlar un motor paso a paso mediante un interruptor de límite y un controlador L298N. En concreto, cubriremos:

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

Si no estás familiarizado con el motor paso a paso y el interruptor de límite (incluyendo la disposición de pines, la funcionalidad y la programación), los siguientes tutoriales pueden ayudarte a aprender:

Diagrama de Cableado

Este tutorial proporciona el diagrama de cableado para dos casos: un motor paso a paso + un interruptor de fin de carrera, un motor paso a paso + dos interruptores de fin de carrera.

  • Diagrama de cableado entre el ESP8266, el motor paso a paso y un interruptor de fin de carrera.
Diagrama de cableado de Arduino Nano para motor paso a paso e interruptor de fin de recorrido

This image is created using Fritzing. Click to enlarge image

  • Diagrama de cableado entre ESP8266, el motor paso a paso y dos interruptores de fin de carrera.
Diagrama de cableado de Arduino Nano, motor paso a paso y dos interruptores de fin de carrera

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Nano y otros componentes.

※ Nota:

La conexión de cableado entre el motor paso a paso y el L298N puede variar según el tipo de motor paso a paso. Para garantizar una conexión exitosa, consulte el tutorial Arduino Nano - Motor paso a paso para obtener instrucciones sobre cómo conectar el motor paso a paso al controlador de motor L298N.

Código para Arduino Nano - Detener el motor paso a paso mediante un fin de carrera

Se puede detener un motor paso a paso de varias maneras:

  • Invocar la función stepper.stop(): Esto no detendrá el motor de inmediato, sino que hará que desacelere gradualmente
  • No llame a la función stepper.run(): Esto hará que el motor paso a paso se detenga de inmediato

El código a continuación hace que un motor paso a paso gire de forma continua hasta que se active un interruptor de límite.

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-stepper-motor-limit-switch */ #include <ezButton.h> #include <AccelStepper.h> #define MAX_POSITION 0x7FFFFFFF // maximum of position we can set (long type) ezButton limit_switch(5); // create ezButton object for pin D5 AccelStepper stepper(AccelStepper::FULL4WIRE, A3, A2, A1, A0); bool is_stopped = false; void setup() { Serial.begin(9600); limit_switch.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() { limit_switch.loop(); // MUST call the loop() function first if (limit_switch.isPressed()) { Serial.println(F("The limit switch: TOUCHED")); is_stopped = true; } if (is_stopped == 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 { // If the stepper.run() function is not invoked, the motor stops immediately // NOTE: invoking the stepper.stop() does NOT stop the motor immediately. Serial.println(F("The stepper motor is STOPPED")); } }

Pasos R\u00e1pidos

  • Conecta el Arduino Nano a una computadora usando un cable USB.
  • Abre el IDE de Arduino, elige la placa correcta y el puerto correcto.
  • Haz clic en el icono de Bibliotecas en la barra izquierda del IDE de Arduino.
  • Busca “ezButton” y localiza la biblioteca de botones de ArduinoGetStarted.com.
  • Presiona el botón Instalar para instalar la biblioteca ezButton.
Librería de botones para Arduino Nano
  • Busca “AccelStepper” y localiza la biblioteca AccelStepper creada por Mike McCauley.
  • Luego, presiona el botón Instalar para añadirla.
Biblioteca AccelStepper para Arduino Nano
  • Copia el código anterior y ábrelo en el IDE de Arduino.
  • Haz clic en el botón Subir en el IDE de Arduino para compilar y cargar el código al Arduino Nano.
  • Si el cableado es correcto, el motor debería girar en sentido horario.
  • Cuando se active el interruptor de fin de carrera, el motor debe detenerse de inmediato.
  • El resultado mostrado en el Monitor Serial debería verse así.
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

¡Consulta la explicación línea por línea contenida en los comentarios del código fuente!

Código para Arduino Nano - Cambiar la dirección del motor paso a paso mediante un interruptor de fin de carrera

Un motor paso a paso se hace girar de forma continua, y su dirección se altera cuando se acciona un interruptor de límite. Esto se logra con el siguiente código:

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-stepper-motor-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 limit_switch(5); // create ezButton object for pin D5 AccelStepper stepper(AccelStepper::FULL4WIRE, A3, A2, A1, A0); int direction = DIRECTION_CW; long target_pos = 0; void setup() { Serial.begin(9600); limit_switch.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 target_pos = direction * MAX_POSITION; stepper.moveTo(target_pos); } void loop() { limit_switch.loop(); // MUST call the loop() function first if (limit_switch.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")); target_pos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // set position stepper.moveTo(target_pos); } // 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(target_pos); // move the motor to maximum position again } stepper.run(); // MUST be called in loop() function }

Pasos R\u00e1pidos

  • Copia el código y ábrelo con el IDE de Arduino.
  • Haz clic en el botón Subir en el IDE para cargar el código al Arduino Nano.
  • Si el cableado es correcto, el motor girará en sentido horario.
  • Toca el interruptor de límite y la dirección del motor paso a paso se invertirá en sentido antihorario.
  • Toca el interruptor de límite de nuevo y el motor paso a paso girará en sentido horario.
  • El resultado en el Monitor Serial debería verse así.
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 Nano - Cambiar la dirección del motor paso a paso mediante dos finales de carrera

Haz que un motor paso a paso gire de forma continua y cambie su dirección cuando se active cualquiera de los dos interruptores de límite.

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-stepper-motor-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 limit_switch_1(5); // create ezButton object for pin D5 ezButton limit_switch_2(12); // create ezButton object for pin D12 AccelStepper stepper(AccelStepper::FULL4WIRE, A3, A2, A1, A0); int stepper_state = STATE_MOVE; int direction = DIRECTION_CW; long target_pos = 0; void setup() { Serial.begin(9600); limit_switch_1.setDebounceTime(50); // set debounce time to 50 milliseconds limit_switch_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() { limit_switch_1.loop(); // MUST call the loop() function first limit_switch_2.loop(); // MUST call the loop() function first if (limit_switch_1.isPressed()) { stepper_state = STATE_CHANGE_DIR; Serial.println(F("The limit switch 1: TOUCHED")); } if (limit_switch_2.isPressed()) { stepper_state = STATE_CHANGE_DIR; Serial.println(F("The limit switch 2: TOUCHED")); } switch (stepper_state) { 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")); stepper_state = STATE_MOVE; // after changing direction, go to the next state to move the motor break; case STATE_MOVE: target_pos = direction * MAX_POSITION; stepper.setCurrentPosition(0); // set position stepper.moveTo(target_pos); stepper_state = 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(target_pos); // move the motor to maximum position again } break; } stepper.run(); // MUST be called in loop() function }

Pasos R\u00e1pidos

  • Haz clic en el botón Subir para enviar el código al Arduino Nano.
  • Si el cableado es correcto, el motor debería girar en sentido horario.
  • Al tocar el interruptor de límite 1, la dirección del motor paso a paso debería invertirse a antihorario.
  • Al tocar el interruptor de límite 2, la dirección del motor paso a paso debería volver a la dirección horaria.
  • El resultado en el Monitor Serial debería verse así.
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!