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í.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
The limit switch: TOUCHED The stepper motor is STOPPED The stepper motor is STOPPED The stepper motor is STOPPED The stepper motor is STOPPED
Ln 11, Col 1
Arduino Nano on COM15
2

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í.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
The limit switch: TOUCHED The direction -> ANTI-CLOCKWISE The limit switch: TOUCHED The direction -> CLOCKWISE
Ln 11, Col 1
Arduino Nano on COM15
2

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í.
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
The limit switch 1: TOUCHED The direction -> ANTI-CLOCKWISE The limit switch 2: TOUCHED The direction -> CLOCKWISE
Ln 11, Col 1
Arduino Nano on COM15
2

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!