Exemplo de Controle de Velocidade de um NEMA 17 (Driver A4988) utilizando Arduino

Olá!

Segui o exemplo do tópico (http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...), que por sinal é muito bom, e consegui realizar o teste com sucesso.

Porém gostaria de fazer um teste. Eu gostaria de setar uma velocidade contínua, e alterar essa velocidade através de um potenciômetro. Todos os exemplos que encontrei até agora servem para o EasyDriver, que não se aplica ao NEMA 17.

Alguns exemplos que eu vi na internet não funcionaram (a alteração do potenciometro não altera a velocidade do motor).

O motor que eu comprei possui o seguinte datasheet:

https://s3.amazonaws.com/uploads.hipchat.com/610734/4190082/QGMqPTG...

Segundo o datasheet ele consegue taxas maiores que 6000 PPS, e como ele possui 200 passos por revolução, ele consegue atingir rotações elevadas. Porém, a rotação que consegui colocar nele continuamente está muito baixa.

Alguém possui alguma ideia?


Desde já, obrigado.

Exibições: 1801

Responder esta

Respostas a este tópico

Obrigado pelo elogio Felipe. 

Me informe os links dos projetos com potenciômetro que você encontrou para o Easydriver. 

Posso tentar adapta-los para o A4988. 

Como esta medindo o RPM da sua montagem ? 

Veja que o seu motor consegue RPM alto, mas o torque fica muito baixo ! O motor perde força. 

Olá!

O código que eu vi com o EasyDriver é esse:

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper(1, 9, 8);

int pos = 150000; //amount of distance to travel

void setup()
{  
  stepper.setMaxSpeed(3000);
  stepper.setAcceleration(3000);//how fast to accelerate
}

void loop()
{
  if (stepper.distanceToGo() == 0)
  {
    delay(500);
    pos = -pos;
    stepper.moveTo(pos);
  }
  stepper.run();
}

Eu retirei esse exemplo deste link do fórum do arduino:

https://forum.arduino.cc/index.php?topic=353432.0

Sobre a velocidade: sim, eu tenho consciência da relação velocidade x torque, mas eu queria testar a possibilidade de controlar a velocidade mesmo (não importa se é a vazio, para esse caso em específico).

A medição do RPM é pelo olhômetro mesmo. Ele dá menos de 10 voltas por segundo (a vazio), sendo que ele capaz de muito mais que isso.

O código que eu utilizei para verificar essa rotação foi baseado em seu exemplo, veja:

// Controle de Motor de Passo NEMA17 com Modulo driver A4988
// http://labdegaragem.com/forum/topics/tutorial-arduino-motor-de-pass...
// Motor Minebea NEMA 17 Unipolar / Modulo A4988 / Arduino Nano / IDE 1.6.7
// OBS: Motor Unipolar 6 fios configurado como Bipolar
// Gustavo Murta 02/abr/2016

// Definições das Portas Digitais do Arduino

int RST = 8; // Porta digital D08 - reset do A4988
int SLP = 9; // Porta digital D09 - dormir (sleep) A4988
int ENA = 7; // Porta digital D07 - ativa (enable) A4988
int MS1 = 4; // Porta digital D04 - MS1 do A4988
int MS2 = 5; // Porta digital D05 - MS2 do A4988
int MS3 = 6; // Porta digital D06 - MS3 do A4988
int DIR = 3; // Porta digital D03 - direção (direction) do A4988
int STP = 2; // Porta digital D02 - passo(step) do A4988
int atraso = 0; // Atraso no pulso em microsegundos
float FREQ = 200; // Frequências dos pulsos (100.7 Hz medido com scope = 100 Hz)
boolean sentido = true; // Variavel de sentido
int CONTADOR = 200; // Número de pulsos (passos por volta)

// FULL = 200 passos / HALF = 400 passos / P1_4 = 800 passos / P1_8 = 1600 passos / P1_16 = 3200 passos

void setup()
{
Serial.begin(9600);

DDRD = DDRD | B11111100; // Configura Portas D02 até D07 como saída
digitalWrite(ENA, HIGH); // Desativa o chip A4988
FULL() ; // Configura modo de avanço do motor FULL, HALF, P1_4, P1_8 ou P1_16

DDRB = 0x0F; // Configura Portas D08,D09,D10 e D11 como saída
digitalWrite(SLP, HIGH); // Desativa sleep do A4988
rst_A4988(); // Reseta o chip A4988
digitalWrite(ENA, LOW); // Ativa o chip A4988

//FREQUENCIA(); // Calcula o período do sinal STEP
//Serial.println(atraso) ; // Imprime na Console, o tempo em microsegundos

P1_16();
FREQ = 6600;
FREQUENCIA();
CONTADOR = 3200;
HOR();

}

void rst_A4988()
{
digitalWrite(RST, LOW); // Realiza o reset do A4988
delay (10); // Atraso de 10 milisegundos
digitalWrite(RST, HIGH); // Libera o reset do A4988
}

void HOR() // Configura o sentido de rotação do Motor
{
digitalWrite(DIR, HIGH); // Configura o sentido HORÁRIO
}

void AHR() // Configura o sentido de rotação do Motor
{
digitalWrite(DIR, LOW); // Configura o sentido ANTI-HORÁRIO
}

void PASSO() // Pulso do passo do Motor
{
digitalWrite(STP, LOW); // Pulso nível baixo
delayMicroseconds (atraso); // Atraso de X microsegundos
digitalWrite(STP, HIGH); // Pilso nível alto
delayMicroseconds (atraso); // Atraso de X microsegundos
}

void MyPasso(int delaypulse){
digitalWrite(STP,LOW);
delayMicroseconds(delaypulse);
digitalWrite(STP,HIGH);
delayMicroseconds(delaypulse);

}

void FREQUENCIA() // Configura quantos pulsos por segundo (Hz)
{
atraso = 1000000 / (2*FREQ); // calculo do tempo de atraso (1/2 periodo) em us
}


void P1_16()
{
digitalWrite(MS1, HIGH); // Configura modo Micro Passo 1/16
digitalWrite(MS2, HIGH);
digitalWrite(MS3, HIGH);
}

void TesteMotor()
{
HOR();
for(int i=0; i <= CONTADOR; i++) // Incrementa o Contador
{
PASSO(); // Avança um passo no Motor
}
delay (750) ; // Atraso de 500 mseg
AHR();
for(int i=0; i <= CONTADOR; i++) // Incrementa o Contador
{
PASSO(); // Avança um passo no Motor
}
delay (1500) ; // Atraso de 500 mseg
}

void ContinuousLoop()
{
for(int i=0; i<=5000; i++){
MyPasso(30); //tempo definido experimentalmente; menor que isso o motor não gira
}
delayMicroseconds(50);
}

void loop()
{

/*
Serial.print(atraso);
Serial.println(" us Micro 1/16, 3200 passos, 6600 Hz");
Serial.println();
*/

ContinuousLoop();

}

Basicamente, eu simplifiquei o código para um teste simples, achei que a velocidade seria muito maior.

Tens alguma ideia?

Desde já, agradeço a atenção.

Não dá para confiar no olho,  para medições por exemplo de 10 rotações por segundo. 

RPM = 60 x rps = 60 x 10 = 600 RPM !!

O exemplo que citou , usa-se a Biblioteca Accelstepper. 

http://www.airspayce.com/mikem/arduino/AccelStepper/

Você conseguiu fazer o motor funcionar ? 

  AccelStepper stepper(1, 9, 8);  // configuração do driver 

    1 = driver externo ( no caso A4988) 

    STEP = pino 9   (passo) 

    DIR = píno 8  (direção) 

        

  stepper.setMaxSpeed(3000);    ( max velocidade em passos por segundos ) 

   1 volta = 200 passos 

   3000 / 200 = 15 rotações por segundo 

   RPM = 15 x 60 = 900 RPM 


  stepper.setAcceleration(3000);

  configura a taxa de aceleração/desaceleração 

  passos/seg por segundo 

    a = dV / dT 

===============================

Sugiro que faça um teste com esse outro exemplo ( não testei-o) 

http://semiengineering.weebly.com/blog/stepper-driven-by-arduino-a4988

Depois faça o mapeamento da leitura do potenciometro (terá que adaptar o código) 

void loop() {
  // read the sensor value:
  int sensorReading = analogRead(A0);
  // map it to a range from 0 to 100:
  int motorSpeed = map(sensorReading, 0, 63, 0, 100);
  // set the motor speed:
  if (motorSpeed > 0) {
    myStepper.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    myStepper.step(stepsPerRevolution / 50);

================================================

Observação importante :

No gráfico do seu motor de passo esta escrito 400 passos/segundo, isto é, o gráfico é baseado na  modo meio passo !

Qual modo de passo esta testando o seu motor ?

Passo completo, meio passo, 1/4 passo, 1/8 passo ou 1/16 passo ?

Para permitir compararação com o gráfico, sugiro que use o modo de meio passo. 

Entendeu como configura o meio passo ?

Olá!

Eu entendi como configura os passos sim!  ;)

600 RPM é uma rotação máxima baixa para esse motor, não acha não?

De acordo com o gráfico, ele pode facilmente chegar ao dobro dessa rotação (considerando o que falou sobre os 400 passos por revolução) sem carga.

Vou testar esse exemplo que me passou amanhã, obrigado!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço