Programação arduino + motor de passo com A4988, controle de velocidade e direção.

Boa noite pessoal, tenho dois tópicos criados que tratam do mesmo assunto.

Tópico 1 - Melhor motor para o projeto

A seguir, defini o motor e começaram as duvidas

Tópico 2 - Motor de passo 2v com A4988

Enfim, tudo está funcionando, porem estou o dia inteiro tentando compreender a programação do que quero fazer e não consigo, sou um pouco leigo em relação a programação e estou com dificuldades em coisas que acredito serem simples para quem compreende, então vim procurar ajuda.

O que estou querendo fazer é ao ligar o arduino, o motor ja começa a girar e posso alterar duas coisas:

1 - Controlar a velocidade (que deve ser bem lenta) utilizando um trimpot de 10k.

2 - Controlar a direção (horario ou anti horario) através de um botão seletor.

Ja tentei com o stepper.h e o accelstepper.h, porem nao consigo compreender direito a comunicação do arduino com o A4988, no stepper nao sei configurar step e dir, no accelstepper nao consigo fazer o trimpot controlar a velocidade, será que alguem pode me ajudar a buscar a melhor solução?

Mais uma duvida, posso alimentar o arduino através da (vin) com a mesma fonte 12v do motordrive?

Obrigado.

Exibições: 949

Responder esta

Respostas a este tópico

Boa tarde, obrigado a todos que me ajudaram até aqui no outro tópico, consegui resolver meu problema com a seguinte sketch:

#include <AccelStepper.h>

int sentidopin = 12;
int aceleracao_motor = 100;
int leitura;


int pino_enable = 10;


AccelStepper motor1(1,7,4 );

int stepCount = 0;
void setup() {
Serial.begin(9600);
pinMode(sentidopin, INPUT_PULLUP);
motor1.setAcceleration(aceleracao_motor);
}

void loop() {
// lê valor do trimpot:
int sensorReading = analogRead(A0);
// seta o range de 0 to 100:
int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
leitura = digitalRead(sentidopin);
// seta velocidade do motor:
if (motorSpeed > 0) {

//se o botão estiver pressionado, gira em um sentido
if (leitura != 1) {
motor1.setSpeed(-motorSpeed);
motor1.setMaxSpeed(motorSpeed);
}

//se o botão nao estiver pressionado, gira no outro
if (leitura == 1) {
motor1.setSpeed(motorSpeed);
motor1.setMaxSpeed(motorSpeed);
}
motor1.run();
Serial.println(motorSpeed);
Serial.println(digitalRead(sentidopin));
}
}

Permanecem duas duvidas:

Como setar o máximo na função setAcceleration? não quero que ele acelere, quero que va direto para o maximo.

Posso alimentar o arduino através da porta vin com a mesma fonte 12v que alimenta o driver, elas ligariam "ao mesmo tempo", por isso a minha preocupação.

Cara, vou tentar dar uma ajuda, para você entender como funciona, sem bibliotecas.

O A4988 precisa ativamente de 2 sinais para rodar o motor, um chamado passo e outro direção.

Para controlar a direção você precisa definir um pino e quando o botão for pressionado esse pino fica "low" e quando pressionado novamente, fica "high" tipo um flipflop. Agora para controlar a velocidade do motor via trimpot, você tem que ter em mente que o arduino lê o o valor do pino do meio do trimpot, numa ponta do trimpot fica o 5v na outra o gnd, então a variação de voltagem sai no pino do meio. O arduino lê esse valor, se não me engano o ADC dele é 10bits, ou seja, 1023 posições. Cada transição do HIGH pro LOW no pino passo, o A4988 faz o motor andar um pouco (depende do motor 1,8º por exemplo). A velocidade do motor, é definida pela quantidade de HIGH e LOW que você mandar em um determinado período, você pode fazer desde simplesmente com delays, ou então com a leitura do ADC. Se for funções simples, esquece as bibliotecas e faça na mão.

Muito obrigado pela ajuda, realmente acabei fazendo do jeito mais complicado por desconhecer o flipflop do dir no A4988, farei as alterações para utilizar ele direto no pushbutton, assim elimina um if do código.

O controle de velocidade acredito que eu tenha acertado, embora o trimpot acabe não sendo muito preciso, acarretando em perda de passo, para o que eu necessito acho que irá atender da forma que está.

Eu montei de uma outra forma, coloquei pra cada faixa de leitura no ADC, ele gera um tipo de sinal. Ficou digamos que com 10 velocidades.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço