Arduino Nano - Motor de Passo com Chave Fim de Curso

Este tutorial ensina como usar o Arduino Nano para controlar um motor de passo por meio de uma chave fim de curso e de um driver L298N. Especificamente, vamos abordar:

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 (incluindo pinagem, funcionamento e programação), os tutoriais a seguir podem ajudar você a aprender:

Diagrama de Ligação

Este tutorial apresenta o diagrama de ligação 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 ESP8266, o motor de passo e, e uma chave fim de curso.
Diagrama de ligação do Arduino Nano com motor de passo e chave fim de curso

This image is created using Fritzing. Click to enlarge image

  • Diagrama de Ligação entre o ESP8266, o motor de passo e, e duas chaves fim de curso.
Diagrama de ligação do Arduino Nano com motor de passo e duas chaves fim de curso

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

※ Nota:

A ligação entre o motor de passo e o L298N pode variar conforme o tipo de motor de passo. Para garantir uma conexão bem-sucedida, consulte o tutorial Arduino Nano - Motor de Passo para ver como conectar o motor de passo ao driver de motor L298N.

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

É possível parar um motor de passo de várias maneiras:

  • Chamar a função stepper.stop(): Isso não leva o motor a uma parada imediata, mas faz com que ele desacelere gradualmente
  • Não chamar a função stepper.run(): Isso faz o motor de passo parar imediatamente

O código abaixo faz um motor de passo girar continuamente até que uma chave fim de curso seja tocada.

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

Passos Rápidos

  • Conecte o Arduino Nano a um computador usando um cabo USB.
  • Abra o Arduino IDE e escolha a placa e a porta corretas.
  • Clique no ícone Libraries na barra esquerda do Arduino IDE.
  • Pesquise “ezButton” e localize a biblioteca de botão do ArduinoGetStarted.com.
  • Pressione o botão Install para instalar a biblioteca ezButton.
Biblioteca de botão do Arduino Nano
  • Procure por “AccelStepper” e localize a biblioteca AccelStepper criada por Mike McCauley.
  • Em seguida, pressione o botão Install para adicioná-la.
Biblioteca AccelStepper do Arduino Nano
  • Copie o código acima e abra-o no Arduino IDE.
  • Clique no botão Upload no Arduino IDE para compilar e fazer upload do código para o Arduino Nano.
  • Se a ligação estiver correta, o motor deve girar no sentido horário.
  • Quando a chave fim de curso for tocada, o motor deve parar imediatamente.
  • O resultado exibido no Serial Monitor deve ser parecido com este.
∞
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

Explicação do Código

Veja a explicação linha por linha contida nos comentários do código-fonte!

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

Um motor de passo é feito para girar continuamente, e a sua direção é alterada quando uma chave fim de curso é tocada. Isso é feito com o código a seguir:

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

Passos Rápidos

  • Copie o código e abra-o com o Arduino IDE.
  • Clique no botão Upload no IDE para fazer upload do código para o Arduino Nano.
  • Se a ligação estiver correta, o motor vai girar no sentido horário.
  • Toque na chave fim de curso e a direção do motor de passo será invertida para o sentido anti-horário.
  • Toque na chave fim de curso novamente e o motor de passo vai girar no sentido horário.
  • O resultado no Serial Monitor deve ser parecido com este.
∞
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 Arduino Nano - Mudar a Direção do Motor de Passo com duas Chaves Fim de Curso

Faça um motor de passo girar continuamente e mudar de direção quando qualquer uma das duas chaves fim de curso for tocada.

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

Passos Rápidos

  • Copie o código acima e abra-o no Arduino IDE.
  • Clique no botão Upload para enviar o código ao Arduino Nano.
  • Se a ligação estiver correta, o motor deve girar no sentido horário.
  • Quando você tocar na chave fim de curso 1, a direção do motor de passo deve ser invertida para o sentido anti-horário.
  • Quando você tocar na chave fim de curso 2, a direção do motor de passo deve voltar para o sentido horário.
  • O resultado no Serial Monitor deve ser parecido com este.
∞
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

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!