Arduino Nano - Interrupteur de fin de course pour moteur pas à pas

Ce tutoriel vous explique comment utiliser un Arduino Nano pour contrôler un moteur pas à pas via un interrupteur de fin de course et un pilote L298N. Nous aborderons spécifiquement :

Préparation du matériel

1×Arduino Nano
1×USB A to Mini-B USB cable
1×Limit Switch (KW12-3)
1×Limit Switch (V-156-1C25)
1×Stepper Motor Nema 17
1×L298N Motor Driver Module
1×12V Power Adapter
1×DC Power Jack
1×Jumper Wires
1×(Optional) 9V Power Adapter for Arduino Nano
1×(Recommended) Screw Terminal Adapter for Arduino Nano

Or you can buy the following sensor kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgation : Certains des liens fournis dans cette section sont des liens affiliés Amazon. Nous pouvons recevoir une commission pour tout achat effectué via ces liens, sans coût supplémentaire pour vous. Nous vous remercions de votre soutien.

À propos du moteur pas à pas et de l'interrupteur de fin de course

Si vous n'êtes pas familier avec le moteur pas à pas et l'interrupteur de fin de course (y compris le brochage, les fonctionnalités et la programmation), les tutoriels suivants peuvent vous aider à apprendre :

Diagramme de câblage

Ce tutoriel fournit le schéma de câblage pour deux cas : Un moteur pas à pas + un interrupteur de fin de course, Un moteur pas à pas + deux interrupteurs de fin de course.

  • Schéma de câblage entre l'ESP8266, le moteur pas à pas et un interrupteur de fin de course.
Schéma de câblage du moteur pas à pas et de l'interrupteur de fin de course pour Arduino Nano

This image is created using Fritzing. Click to enlarge image

  • Schéma de câblage entre l'ESP8266, le moteur pas à pas et deux interrupteurs de fin de course.
Schéma de câblage d'un moteur pas à pas Arduino Nano et de deux interrupteurs de fin de course.

This image is created using Fritzing. Click to enlarge image

※ NOTE THAT:

La connexion du câblage entre le moteur pas à pas et le L298N peut varier selon le type de moteur pas à pas. Pour garantir une connexion réussie, veuillez consulter le tutoriel Arduino Nano - Moteur Pas à Pas pour des instructions sur la façon de connecter le moteur pas à pas au pilote de moteur L298N.

Code Arduino Nano - Arrêt du moteur pas à pas par un interrupteur de fin de course

On peut arrêter un moteur pas à pas de plusieurs manières :

  • Appelez la fonction stepper.stop() : Cela n'arrêtera pas immédiatement le moteur, mais le fera décélérer progressivement
  • Ne pas appeler la fonction stepper.run() : Cela provoquera l'arrêt immédiat du moteur pas à pas

Le code ci-dessous provoque la rotation continue d'un moteur pas à pas jusqu'à ce qu'un interrupteur de fin de course soit touché.

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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")); } }

Étapes rapides

  • Connectez l'Arduino Nano à un ordinateur à l'aide d'un câble USB.
  • Ouvrez l'IDE Arduino, choisissez la carte et le port corrects.
  • Cliquez sur l'icône Libraries sur la barre latérale gauche de l'IDE Arduino.
  • Recherchez "ezButton" et localisez la bibliothèque de boutons sur ArduinoGetStarted.com.
  • Appuyez sur le bouton Install pour installer la bibliothèque ezButton.
Bibliothèque de boutons Arduino Nano
  • Recherchez « AccelStepper » et localisez la bibliothèque AccelStepper créée par Mike McCauley.
  • Ensuite, appuyez sur le bouton Install pour l'ajouter.
Bibliothèque AccelStepper pour Arduino Nano
  • Copiez le code ci-dessus et ouvrez-le dans l'IDE Arduino.
  • Cliquez sur le bouton Upload dans l'IDE Arduino pour compiler et téléverser le code vers l'Arduino Nano.
  • Si le câblage est correct, le moteur devrait tourner dans le sens des aiguilles d'une montre.
  • Lorsque l'interrupteur de fin de course est touché, le moteur doit s'arrêter immédiatement.
  • Le résultat affiché sur le moniteur série devrait ressembler à ceci.
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  

Explication du code

Découvrez l'explication ligne par ligne contenue dans les commentaires du code source !

Code Arduino Nano - Changer la direction d'un moteur pas à pas par un interrupteur de fin de course

Un moteur pas à pas est conçu pour tourner continuellement, et sa direction est modifiée lorsqu'un interrupteur de fin de course est touché. Ceci est réalisé avec le code suivant :

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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 }

Étapes rapides

  • Copiez le code et ouvrez-le avec l'IDE Arduino.
  • Cliquez sur le bouton Upload dans l'IDE pour téléverser le code vers l'Arduino Nano.
  • Si le câblage est correct, le moteur tournera dans le sens horaire.
  • Touchez l'interrupteur de fin de course et la direction du moteur pas à pas sera inversée pour tourner dans le sens antihoraire.
  • Touchez à nouveau l'interrupteur de fin de course et le moteur pas à pas tournera dans le sens horaire.
  • Le résultat sur le moniteur série devrait ressembler à cela.
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  

Code Arduino Nano - Changer la direction du moteur pas à pas avec deux interrupteurs de fin de course

Faites tourner un moteur pas à pas en continu et inversez sa direction lorsque l'un des deux interrupteurs de fin de course est touché.

/* * Ce code Arduino Nano a été développé par newbiely.fr * Ce code Arduino Nano est mis à disposition du public sans aucune restriction. * Pour des instructions complètes et des schémas de câblage, veuillez visiter: * https://newbiely.fr/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 }

Étapes rapides

  • Copiez le code ci-dessus et ouvrez-le dans l'IDE Arduino.
  • Cliquez sur le bouton Upload pour envoyer le code à l'Arduino Nano.
  • Si le câblage est correct, le moteur devrait tourner dans le sens horaire.
  • Lorsque vous touchez l'interrupteur de fin de course 1, le sens du moteur pas à pas doit être inversé en sens antihoraire.
  • Lorsque vous touchez l'interrupteur de fin de course 2, le sens du moteur pas à pas doit être remis en sens horaire.
  • Le résultat sur le moniteur série devrait ressembler à ceci.
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  

Vidéo

※ OUR MESSAGES

  • Please feel free to share the link of this tutorial. However, Please do not use our content on any other websites. We invested a lot of effort and time to create the content, please respect our work!