Ir para conteúdo
View in the app

A better way to browse. Learn more.

EletrônicaBR.com

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Navegação Limpa e Sem Anúncios! (Cadastre-se)

O melhor fórum técnico do mundo está de cara nova e de portas abertas! Estamos de cara nova e com ferramentas ainda mais poderosas para a sua bancada. Faça o seu cadastro de forma rápida e simples para acessar o maior e mais atualizado acervo de Esquemas Elétricos, BIOS e Firmwares da internet.

Aqui, o conhecimento vale muito: através do nosso sistema de créditos, membros participativos ganham acesso totalmente gratuito aos downloads. Venha trocar experiências com os melhores especialistas do mercado!

👉 Técnico sem o EletrônicaBR não é um técnico completo!

 

Controle de Motor de Passo com Arduino

Featured Replies

Postado

Olá pessoal,

Recentemente comecei a explorar o uso de motores de passo com Arduino e queria compartilhar um pouco da minha experiência com vocês, especialmente para quem está começando na área de automação ou robótica DIY.

Utilizei um Você não tem permissão para visualizar links. Faça login ou cadastre-se., bastante comum em impressoras 3D e projetos de CNC, junto com o driver A4988 e uma placa Arduino Uno. Meu objetivo era controlar o giro do motor com precisão e criar movimentos repetitivos para um sistema de posicionamento simples.

Materiais utilizados:
Arduino Uno

Motor de passo NEMA 17

Driver A4988

Fonte de alimentação de 12V

Protoboard e jumpers

Ligações básicas:
O A4988 é ligado ao Arduino com os pinos STEP e DIR conectados aos pinos digitais (por exemplo, 2 e 3).

A alimentação do motor vem de uma fonte externa de 12V ligada ao Vmot do driver.

Não se esqueçam de ligar os GNDs da fonte e do Arduino em comum!

Código básico:

#define STEP 2
#define DIR 3

void setup() {
  pinMode(STEP, OUTPUT);
  pinMode(DIR, OUTPUT);
  digitalWrite(DIR, HIGH); // Sentido horário
}

void loop() {
  for (int i = 0; i < 200; i++) {
    digitalWrite(STEP, HIGH);
    delayMicroseconds(800);
    digitalWrite(STEP, LOW);
    delayMicroseconds(800);
  }
  delay(1000);
  digitalWrite(DIR, !digitalRead(DIR)); // Inverter direção
  delay(1000);
}


Esse código faz o motor girar 200 passos (equivalente a uma volta completa, se for 1.8° por passo), para um lado e depois para o outro, com uma pequena pausa entre os sentidos.

Dicas:
Ajustem o potenciômetro do A4988 para limitar a corrente, evitando aquecer o motor ou o driver.

Verifiquem sempre a fiação antes de ligar a alimentação!

Alguém aqui já tentou usar controle microstepping para maior suavidade no movimento? Ou integrar sensores para feedback de posição?

Fico feliz em trocar experiências e aprender com os projetos de vocês!

Postado

Entendo que esteja iniciando e que seu exemplo seja simples, mas recomendo algumas dicas para que o programa fique melhor estruturado e de fácil utilização, manutenção e reuso:

 

#include <Arduino.h>
// Definições dos pinos (estrutura mais organizada)
constexpr int STEP_PIN = 2;
constexpr int DIR_PIN = 3;

// Configurações de movimento do motor com constantes
constexpr int NUMERO_PASSOS = 200;
constexpr int ESPERA_800_MICROSEGUNDOS = 800;
constexpr int ESPERA_1_SEGUNDO = 1000;

// Declaração dos Prototipos usados após o loop
void executarMovimentoMotor(int quantidadePassos, int delayUs);

void inverterSentidoMotor();

void setup() {
    pinMode(STEP_PIN, OUTPUT); // Configura pino como saída, a referencia do numero do pino fica na constate
    pinMode(DIR_PIN, OUTPUT); // Configura pino como saída, a referencia do numero do pino fica na constate
    digitalWrite(DIR_PIN, HIGH); // Seta pino com nivel logico 1 -  Começa em sentido horário
}

void loop() {
    executarMovimentoMotor(NUMERO_PASSOS, ESPERA_800_MICROSEGUNDOS);
    delay(ESPERA_1_SEGUNDO);
    inverterSentidoMotor();
    delay(ESPERA_1_SEGUNDO);
}

// Esses metodos abaixo podem ainda serem movidos para um novo arquivo, facilitando posteriormente a reutilização de codigo

// Executa uma sequência de passos no motor
void executarMovimentoMotor(const int quantidadePassos, const int delayUs) {
    for (int i = 0; i < quantidadePassos; i++) {
        digitalWrite(STEP_PIN, HIGH);
        delayMicroseconds(delayUs);
        digitalWrite(STEP_PIN, LOW);
        delayMicroseconds(delayUs);
    }
}

// Inverte o sentido de rotação do motor
void inverterSentidoMotor() {
    digitalWrite(DIR_PIN, 1 ^ digitalRead(DIR_PIN)); // Alterna o estado do pino DIR_PIN: Se estiver em HIGH (1), passa para LOW (0). Se estiver em LOW (0), passa para HIGH (1)
}

 


Ou se quiser depois reaproveitar o código em outras aplicações, utilizando a reusabilidade das classes:

Arquivo MotorPasso.ino ( ou MotorPasso.cpp no Platformio)

#include <Arduino.h>
#include "ControleMotorPasso.hpp" // include para a classe responsavel pelo controle do motor de passos

constexpr int STEP_PIN = 2;
constexpr int DIR_PIN = 3;

constexpr int NUMERO_PASSOS = 200;
constexpr int ESPERA_800_MICROSEGUNDOS = 800;
constexpr int ESPERA_1_SEGUNDO = 1000;

ControleMotorPasso motorPasso(STEP_PIN, DIR_PIN); // Cria uma instancia, setando os pinos utlizados para o controle do motor de passos

void setup() {
    // Neste caso, não há nada aqui para se fazer!!!
    // O controle dos pinos será feita dentro da classe de ControleMotorPasso
}

void loop() {
    motorPasso.executarMovimentoMotor(NUMERO_PASSOS, ESPERA_800_MICROSEGUNDOS);  // chama o metodo que realiza o movimento
    delay(ESPERA_1_SEGUNDO);
    motorPasso.inverterSentidoMotor();
    delay(ESPERA_1_SEGUNDO);
}


Arquivo ControleMotorPasso.hpp

 

#ifndef CONTROLEMOTORPASSO_HPP
#define CONTROLEMOTORPASSO_HPP
#include <Arduino.h>

class ControleMotorPasso {
public:    
    ControleMotorPasso(int stepPin, int dirPin); // Construtor da classe

    /**
    * @brief Executa o movimento do motor de passo enviando pulsos aos pinos.
    *
    * Esta função envia uma sequência de pulsos para o pino STEP, gerando o deslocamento do motor
    * em uma determinada quantidade de passos, com um intervalo definido em microssegundos entre os pulsos.
    *
    * @param quantidadePassos Quantidade de passos que o motor deve realizar.
    * @param delayUs Tempo de espera em microssegundos entre o estado alto e baixo do pulso.
    *
    * @note O motor se movimenta no sentido definido previamente pelo pino DIR.
    */
    void executarMovimentoMotor(int quantidadePassos, int delayUs); // classe que faz o motor girar

    /**
    * @brief Inverte o sentido de rotação do motor.
    *
    * Altera o valor do pino de direção para que o motor
    * passe a girar no sentido oposto.
    */
    void inverterSentidoMotor(); // metodo para inverter sentido de rotação do motor
    /**
    * @brief Seleciona o sentido horário de rotação do motor.
    * Verifique a documentação do controlador de motor de passos!!!
    */
    void sentidoMotorHorario(); // metodo para deixar o motor em sentido horario
    /**
    * @brief Seleciona o sentido anti-horário de rotação do motor.
    * Verifique a documentação do controlador de motor de passos!!!
    */
    void sentidoMotorAntiHorario(); // metodo para deixar o motor em sentido anti horario

private:
    int _stepPin; // Variável interna da classe
    int _dirPin; // Variável interna da classe
};
#endif //CONTROLEMOTORPASSO_HPP

 

Arquivo ControleMotorPasso.cpp

#include "ControleMotorPasso.hpp"

ControleMotorPasso::ControleMotorPasso(const int stepPin, const int dirPin) {
    _stepPin = stepPin;
    _dirPin = dirPin;
    // Seta os pinos como saida e inicia o sentido original de rotacao
    pinMode(_stepPin, OUTPUT);
    pinMode(_dirPin, OUTPUT);
    digitalWrite(_dirPin, HIGH);
}

void ControleMotorPasso::executarMovimentoMotor(const int quantidadePassos, const int delayUs) {
    for (int i = 0; i < quantidadePassos; i++) {
        digitalWrite(_stepPin, HIGH);
        delayMicroseconds(delayUs);
        digitalWrite(_stepPin, LOW);
        delayMicroseconds(delayUs);
    }
}

void ControleMotorPasso::inverterSentidoMotor() {
    digitalWrite(_dirPin, 1 ^ digitalRead(_dirPin));
}

void ControleMotorPasso::sentidoMotorHorario() {
    digitalWrite(_dirPin, HIGH);
}

void ControleMotorPasso::sentidoMotorAntiHorario() {
    digitalWrite(_dirPin, LOW);
}

 

image.png.18d47c32a8fc2d46c11052e0ba2e8dea.png


Para reutilizar este código em outros projetos, basta copiar os arquivos ControleMotorPasso.cpp e ControleMotorPasso.hpp.


Sobre sensores de feedback de posição, geralmente é feito sabendo a quantidade de voltas do motor de passos, não necessitando de sensores!!!
Pode ainda adicionar duas chaves para delimitar o ponto zero, assim sempre iniciará procurando o ponto zero.

Pode ainda visualizar a documentação do controlador:  

Você não tem permissão para visualizar links. Faça login ou cadastre-se.

 

Flw...

Editado: por nagkiller

Postado

Um exemplo bem consolidado (usando em muitas impressoras 3D, por exemplo) é o firmware Merlin:

Você não tem permissão para visualizar links. Faça login ou cadastre-se.

Pode estudar o código fonte e assim ter um entendimento melhor.


Pode também estudar esse, que é o firmware gravado em placas com arduino nano para serem usadas em CNC 3018, por exemplo:

image.png.c9b38705bb31fcaf3fb219eb6a564c29.png


Flw...

Editado: por nagkiller

Participe agora da conversa!

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, faça login para postar com sua conta.

Visitante
Responder

Account

Navigation

Pesquisar

Pesquisar

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.