domingo, 11 de dezembro de 2016

Drive A4988 para motor de passo bipolar

Drive A4988



Anteriormente vimos no site uma postagem de como acionar um motor de passo utilizando um drive Ponte H L298N, hoje vamos conhecer um pouco sobre o drive A4988 para motor de passo bipolar. 


fonte: https://www.pololu.com

Esse pequeno drive permite um controle por meio de "micropassos", permitindo assim que o usuário obtenha em seu projeto posicionamentos mais exatos onde exige uma melhor precisão.


fonte: https://www.pololu.com

O módulo Drive A4988 trabalha utilizando tensões de 3V e 5V e para o acionamento dos motores permitem tensões aplicadas que podem variar de 8 à 35V. 


fonte: https://www.pololu.com

O controle básico do motor é realizado por dois pinos do modulo, o STEP (passo) e DIR (direção).
Abaixo é possível observar a função dos pinos localizados no modulo.


fonte: https://www.pololu.com


Controlando motor com drive A4988 e Arduino

Para a realização desse projeto é necessário que você tenha em mãos:

1 Arduino Uno (ou compatível, eu usei uma BlackBoard da Robocore)
1 drive A4988
1 potenciômetro 1k
1 capacitor polarizado 100uF
1 protoboard (matriz de contatos) 
1 motor de passo (na demostração estou utilizando um nema 17 PM-K047-02V)
fonte externa 12V 1A
fios jumpers

O controle do motor em questão foi a pedido de um leitor do blog para testar os motores que serão usados em uma impressora 3D.

Esquema de ligação

Vamos conectar o drive A4988 ao Arduino e controlar o movimento direcional do motor por meio do potenciômetro.
Além dos pinos STEP e DIR, utilizei também os pinos MS1 e MS2 para utilizar o recurso de micropassos que o modulo oferece possibilitando ao acionar esses pino os modos full-step, half-step, quarter-step, eight-step e sixteenth-step.


fonte: http://printersketch3d.lojaintegrada.com.br

Observar que na alimentação externa que é necessário para que o motor funcione corretamente foi inserido um capacitor de 100uF, onde pelas especificações do fabricante é indicado para compensar a sensibilidade do modulo em relação a picos de tensão.

fonte: próprio autor

Atenção ao capacitor entre os pinos VMOT e GND, e ao jumper entre os pinos SLEEP e RESET.

O código fonte

Copie e cole o código na IDE do seu Arduino e observe o funcionamento.

/** Código para Projeto DRIVE A4988 com potenciometro_Tony Emerson Marim **/
// Elaborado por Tony Emerson Marim em 11/12/2016.
/** mecatronizando@gmail.com **/
/** Controle de Motor de passo Nema17 com drive A4988 por potenciometro(direcionamento) **/

#define STEP 6 // Pino 6 conectado ao pino STEP no drive
#define DIR 7 // Pino 7 conectador ao pino Direction no drive
#define MS1 10 // Pino 10 conectado ao pino MS1 no drive
#define MS2 9 // Pino 9 conectado ao pino MS2 no drive
#define SLEEP 8 // Pino 8 conectado ao pino SLEEP no drive
#define POT A5 // Pino A5 analogico conectado ao pino de controle do potenciometro

int direction; // Variavel para setar a rotação (CW-CCW) do motor
int steps = 1025; // Posição de centro assumida

void setup() {
pinMode(MS1, OUTPUT);
pinMode(MS2, OUTPUT);
pinMode(DIR, OUTPUT);
pinMode(STEP, OUTPUT);
pinMode(SLEEP, OUTPUT);

digitalWrite(SLEEP, HIGH); // "Desperta" drive
delay(5); 

digitalWrite(MS1, LOW); // Configuração dos Passos
digitalWrite(MS2, LOW); // Configuração dos Passos

}

void loop() {
while (analogRead(POT) >= 0 && analogRead(POT) <= 100) {
if (steps > 0) {
digitalWrite(DIR, HIGH); // (HIGH = anti- horário / LOW = horário)
digitalWrite(STEP, HIGH);
delay(1);//Tempo do passo ( quanto maior mais lento)
digitalWrite(STEP, LOW);
delay(1);
steps--;
  } 
}

  while (analogRead(POT) > 100 && analogRead(POT) <= 400) {
  if (steps < 512) {
  digitalWrite(DIR, LOW); 
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps++;
} 
  if (steps > 512) {
  digitalWrite(DIR, HIGH);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps--;
  }
} 

  while (analogRead(POT) > 401 && analogRead(POT) <= 600) {
  if (steps < 1025) {
  digitalWrite(DIR, LOW);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps++;
} 
  if (steps > 1025) {
  digitalWrite(DIR, HIGH);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps--;
  } 
} 

  while (analogRead(POT) > 601 && analogRead(POT) <= 900) {
  if (steps < 1535) {
  digitalWrite(DIR, LOW);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps++;
} 
  if (steps > 1535) {
  digitalWrite(DIR, HIGH);
  digitalWrite(STEP, HIGH);
  delay(1);
  digitalWrite(STEP, LOW);
  delay(1);
  steps--;
  } 
} 

    while (analogRead(POT) > 900 && analogRead(POT) <= 1024) {
    if (steps < 2050) {
    digitalWrite(DIR, LOW);
    digitalWrite(STEP, HIGH);
    delay(1);
    digitalWrite(STEP, LOW);
    delay(1);
    steps++;
    }
  }
}


No Vídeo abaixo é possível ver o funcionamento do controle elaborado utilizando o potenciômetro como direcional.


O projeto completo pode ser baixado nesse LINK!

Curtiu? Compartilhe! 
Assine o nosso canal no YouTube!
Curta nossa página no Facebook!


Bons Estudos!!!

Nenhum comentário:

Postar um comentário