Arduino - Motor de Passo e Chave de Fim de Curso

Neste tutorial de Arduino, vamos aprender a usar o Arduino, a chave de fim de curso, o driver L298N e o motor de passo. Em detalhes, vamos aprender:

Sobre o Motor de Passo e a Chave de Fim de Curso

Se você ainda não conhece o motor de passo e a chave de fim de curso (pinagem, como funciona, como programar ...), aprenda sobre eles nos seguintes tutoriais:

Diagrama de Ligação

Este tutorial fornece os códigos Arduino para dois casos: um motor de passo + uma chave de fim de curso, e um motor de passo + duas chaves de fim de curso.

  • Diagrama de ligação entre o motor de passo e uma chave de fim de curso
Diagrama de ligação do Arduino com motor de passo e chave de fim de curso

This image is created using Fritzing. Click to enlarge image

  • Diagrama de ligação entre o motor de passo e duas chaves de fim de curso
Diagrama de ligação do Arduino com motor de passo e duas chaves de fim de curso

This image is created using Fritzing. Click to enlarge image

※ Nota:

Dependendo do motor de passo, a ligação entre o motor de passo e o L298N pode ser diferente. Por favor, veja com atenção o tutorial Arduino - Motor de Passo para saber como conectar o motor de passo ao driver de motor L298N.

Código Arduino - Parar o Motor de Passo com uma Chave de Fim de Curso

Existem várias formas de fazer um motor de passo parar:

  • Chamar a função stepper.stop(): Esta forma NÃO para o motor de passo imediatamente, mas sim gradualmente
  • NÃO chamar a função stepper.run(): Esta forma para o motor de passo imediatamente

O código abaixo faz um motor de passo girar infinitamente e parar imediatamente quando uma chave de fim de curso é tocada

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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")); } }

Passos Rápidos

  • Conecte o Arduino ao PC por meio do cabo USB
  • Abra o Arduino IDE, selecione a placa e a porta corretas
  • Vá até o ícone Libraries na barra esquerda do Arduino IDE.
  • Pesquise “ezButton” e encontre a biblioteca de botão da ArduinoGetStarted.com
  • Clique no botão Install para instalar a biblioteca ezButton.
Biblioteca de botão no Arduino
  • Pesquise “AccelStepper” e encontre a biblioteca AccelStepper de Mike McCauley
  • Clique no botão Install para instalar a biblioteca AccelStepper.
Biblioteca AccelStepper no Arduino
  • Copie o código acima e abra-o no Arduino IDE
  • Clique no botão Upload no Arduino IDE para carregar o código no Arduino
  • Se a ligação estiver correta, você verá o motor girar no sentido horário.
  • Toque na chave de fim de curso
  • Você verá o motor parar imediatamente
  • O resultado no Serial Monitor fica assim:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' 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 Uno on COM15
2

Explicação do Código

Leia a explicação linha por linha nas linhas de comentário do código!

Código Arduino - Mudar a Direção do Motor de Passo com uma Chave de Fim de Curso

O código abaixo faz um motor de passo girar infinitamente e mudar sua direção quando uma chave de fim de curso é tocada

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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 }

Passos Rápidos

  • Copie o código acima e abra-o no Arduino IDE
  • Clique no botão Upload no Arduino IDE para carregar o código no Arduino
  • Se a ligação estiver correta, você verá o motor girar no sentido horário.
  • Toque na chave de fim de curso
  • Você verá a direção do motor de passo mudar para o sentido anti-horário
  • Toque na chave de fim de curso novamente
  • Você verá a direção do motor de passo mudar para o sentido horário
  • O resultado no Serial Monitor fica assim:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' 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 Uno on COM15
2

Código Arduino - Mudar a Direção do Motor de Passo com duas Chaves de Fim de Curso

O código abaixo faz um motor de passo girar infinitamente e mudar sua direção quando uma das duas chaves de fim de curso é tocada

/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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 }

Passos Rápidos

  • Copie o código acima e abra-o no Arduino IDE
  • Clique no botão Upload no Arduino IDE para carregar o código no Arduino
  • Se a ligação estiver correta, você verá o motor girar no sentido horário.
  • Toque na chave de fim de curso 1
  • Você verá a direção do motor de passo mudar para o sentido anti-horário
  • Toque na chave de fim de curso 2
  • Você verá a direção do motor de passo mudar para o sentido horário
  • O resultado no Serial Monitor fica assim:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' 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 Uno on COM15
2

Vídeo

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!