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.
Tags:
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_16DDRB = 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 microsegundosP1_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!
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por