ESP32 - Motor de Passo e Chave Fim de Curso

Neste tutorial de ESP32, vamos explorar como usar o ESP32, uma chave fim de curso, o driver L298N e um motor de passo. Especificamente, vamos abordar:

Esses tópicos vão permitir que você crie aplicações de movimento controladas e versáteis com o seu ESP32.

Sobre o Motor de Passo e a Chave Fim de Curso

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

Diagrama de Ligação

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

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

This image is created using Fritzing. Click to enlarge image

Se você não sabe como alimentar o ESP32 e outros componentes, veja as instruções no tutorial a seguir: Como alimentar o ESP32.

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

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. Veja com atenção este tutorial ESP32 - Motor de Passo para saber como conectar o motor de passo ao driver de motor L298N.

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

Há várias maneiras de fazer um motor de passo parar:

  • Chamar a função stepper.stop(): Este jeito NÃO para o motor de passo imediatamente, mas aos poucos
  • NÃO chamar a função stepper.run(): Este jeito para o motor de passo imediatamente

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

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-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(25); // ESP32 pin: GPIO25 AccelStepper stepper(AccelStepper::FULL4WIRE, 19, 18, 17, 16); // ESP32 pin: GPIO19, GPIO18, GPIO17, GPIO16 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

  • Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente do ESP32 no Arduino IDE.
  • Faça a ligação como na imagem acima.
  • Conecte a placa ESP32 ao seu PC por um cabo micro USB
  • Abra o Arduino IDE no seu PC.
  • Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
  • Conecte o ESP32 ao PC por um cabo USB
  • Abra o Arduino IDE, selecione a placa e a porta corretas
  • Clique no ícone Libraries na barra à esquerda do Arduino IDE.
  • Pesquise “ezButton” e encontre a biblioteca de botão de ArduinoGetStarted.com
  • Clique no botão Install para instalar a biblioteca ezButton.
Biblioteca de botão para ESP32
  • Pesquise “AccelStepper” e encontre a biblioteca AccelStepper de Mike McCauley
  • Clique no botão Install para instalar a biblioteca AccelStepper.
Biblioteca AccelStepper para ESP32
  • Copie o código acima e abra no Arduino IDE
  • Clique no botão Upload no Arduino IDE para carregar o código no ESP32
  • Se a ligação estiver correta, você vai ver o motor girar no sentido horário.
  • Toque na chave fim de curso
  • Você vai ver o motor parar imediatamente
  • O resultado no Serial Monitor fica assim
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' 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
ESP32 Dev Module 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 ESP32 - Mudar a Direção do Motor de Passo com uma Chave Fim de Curso

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

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-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(25); // ESP32 pin: GPIO25 AccelStepper stepper(AccelStepper::FULL4WIRE, 19, 18, 17, 16); // ESP32 pin: GPIO19, GPIO18, GPIO17, GPIO16 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 no Arduino IDE
  • Clique no botão Upload no Arduino IDE para carregar o código no ESP32
  • Se a ligação estiver correta, você vai ver o motor girar no sentido horário.
  • Toque na chave fim de curso
  • Você vai ver a direção do motor de passo mudar para o sentido anti-horário
  • Toque na chave fim de curso novamente
  • Você vai 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
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' 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
ESP32 Dev Module on COM15
2

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

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

/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-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(25); // ESP32 pin: GPIO25 ezButton limitSwitch_2(26); // ESP32 pin: GPIO26 AccelStepper stepper(AccelStepper::FULL4WIRE, 19, 18, 17, 16); // ESP32 pin: GPIO19, GPIO18, GPIO17, GPIO16 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 no Arduino IDE
  • Clique no botão Upload no Arduino IDE para carregar o código no ESP32
  • Se a ligação estiver correta, você vai ver o motor girar no sentido horário.
  • Toque na chave fim de curso 1
  • Você vai ver a direção do motor de passo mudar para o sentido anti-horário
  • Toque na chave fim de curso 2
  • Você vai 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
ESP32 Dev Module
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'ESP32 Dev Module' 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
ESP32 Dev Module 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!