Ola boa tarde!

Sou novo aqui no fórum, e novato também na area de programação/arduino.

Estou colocando um arduino para controlar o atuador de marcha lenta do meu carro. É um motor de passo bipolar com um "pino" deslizante para que possa aumentar ou diminuir a passagem do ar pelo coletor de admissão. Encontrei dezenas de postagens sobre motor de passo porem não estou conseguindo fazer minha aplicação funcionar corretamente.

Meu projeto é o seguinte: Toda vez que ligo a ignição, o motor deve ser recuado 200 passos (para garantir que esta na posição inicial) . Com a temperatura abaixo de 40 graus, ele avança 200 passos para ficar em sua posição completamente aberto, e pronto para dar partida no motor, e conforme a temperatura vai subindo ele vai recuando proporcionalmente a temperatura. Este esta sendo meu problema, pois não consigo encontrar uma condição em que o motor não caia em um loop, por exemplo a temperatura esta abaixo de 40 graus, o correto seria avançar 200 passos e parar, e a partir dai conforme a temperatura for subindo, vai recuando o atuador. Ex 50 graus, recua 30 passos e para, 60 graus, recua mais 30 passos e para, e assim sucessivamente.

Se alguém puder me dar uma dica ficarei muito grato.

Obs: Estou utilizando uma ponte H L298N.

Obs2: Nesse primeiro momento estou desconsiderando as partidas com o motor quente para facilitar minha compreensão.

Obrigado

Exibições: 320

Anexos

Responder esta

Respostas a este tópico

Olá, Rafael!

   Posso não ter entendido bem, mas parece-me que você está querendo fazer um controle de posição em que a variável de controle é a temperatura.

   Bem, como você usa um motor de passo e dependendo das características do controle, pode ser implementado em "malha aberta", i. e., sem um sensor de posição que, se existisse, "fecharia" a malha de controle.

   Se eu entendi, quando você inicia o sistema, o motor deve dar um número de passos suficientes em uma dada direção para garantir uma posição conhecida. Se a possibilidade de trancar o motor não for problema, isto pode ser usado como a rotina que chamamos "HOME", inicializar a posição do sistema e fazer o controlador conhecê-la para, a partir daí, manter a posição atual ( tracking ). Caso contrário, será necessário um sensor de HOME, como um fim-de-curso, por exemplo.

   Então o teu programa terá de ter uma variável que mantém a posição ( PV = Process Value ). Por exemplo, se a posição de HOME for zero e você comandar +200 passos, terá fazer o incremento da variável de posição relativo a este deslocamento.

   Assim, você terá uma função que tem como entradas a posição atual ( PV ) e a temperatura, e que calcula a nova posição desejada ( SP = Set Point ). A partir daí, é só comandar o motor para um deslocamento referente à diferença entre a posição atual e a posição desejada( Error ). Não esquecendo, obviamente, de atualizar a posição.

   Se a posição desejada for igual a posição real, o motor não se mexe.

   Espero ter ajudado.

D. T. Ribeiro.

Ribeiro, é exatamente isso!

Suas dicas fizeram com que em poucos minutos eu resolvesse o que não consegui fazer em dias. Alterei o código e me parece estar funcionando exatamente como eu preciso. A única ressalva é que como eu utilizo um potenciômetro para simular a temperatura, e delay para poder visualizar melhor as leituras no monitor serial, me parece que se eu faço uma variação muito rápida no potenciômetro o motor fica um pouco perdido. Segue agora o código alterado, como não entendo muito de programação, caso tenha alguma outra observação eu agradeço. A principio deixei com pouca variação para ir testando, mas o objetivo é ter uma atuação mais precisa de temperatura x posicaoalvo.

Muito obrigado!!

Olá, Rafael!

   Como não tenho os drives adequados para uso com a biblioteca Stepper, alterei o teu programa apenas para usar um Stepper drive que eu tenho e que recebe comandos de pulso e direção. Assim consegui testar.

   No mais, mantive exatamente a tua lógica e me parece estar funcionando.

   A única coisa que tive de fazer foi afastar o motor de passo do Arduino, porque estava interferindo.

   Caso você não saiba, o layout e o projeto eletrônico destas placas de Arduino não são lá grande coisa.

   Se você desconfiar de ruído, experimente substituir as bobinas do motor de passo por LEDs e verifique se o comportamento indesejado se repete.

Sucesso.

D. T. Ribeiro.

Não estou conseguindo anexar o Sketch, como é pequeno vou colar aqui:

______________________________________________________________

#include <Stepper.h>
#define STEPS 200

int pot = A0; //sinal potenciometro
int valorpot = 0;
int posicaomotor = 0; // posicao inicial do motor
int posicaoalvo;
int regulamotor;

Stepper stepper(STEPS, 4, 5, 6, 7);

void setup(){
Serial.begin(9600);
stepper.setSpeed(20); //define a velocidade do motor em RPM
stepper.step(-200); // recua o motor em seu ponto inicial
}

void regula (int regulamotor) {
valorpot = analogRead(pot); // faz a leitura do potenciometro
valorpot = map(valorpot,0,1023,0,100); // remapeia os valores do potenciometro
Serial.println ("temperatura: ");
Serial.println (valorpot); //exibe valor potenciometro

if (valorpot < 40) {
posicaoalvo = 100; // posicao alvo do motor
regulamotor = posicaoalvo - posicaomotor; //calcula os steps necessarios para atingir a posicao alvo
Serial.println ("passos: ");
Serial.println (regulamotor);
stepper.step(regulamotor); // regula o motor
posicaomotor = posicaoalvo; // atualiza a posicao do motor
}

if (valorpot >=41 && valorpot < 50 ){
posicaoalvo = 70; // posicao alvo do motor
regulamotor = posicaoalvo - posicaomotor; //calcula os steps necessarios para atingir a posicao alvo
Serial.println ("passos: ");
Serial.println (regulamotor);
stepper.step(regulamotor); // regula o motor
posicaomotor = posicaoalvo; // atualiza a posicao do motor
}

if (valorpot >=51 && valorpot < 70 ){
posicaoalvo = 40; // posicao alvo do motor
regulamotor = posicaoalvo - posicaomotor; //calcula os steps necessarios para atingir a posicao alvo
Serial.println ("passos: ");
Serial.println (regulamotor);
stepper.step(regulamotor); // regula o motor
posicaomotor = posicaoalvo; // atualiza a posicao do motor

}

if (valorpot >=71 && valorpot < 100 ){
posicaoalvo = 0; // posicao alvo do motor
regulamotor = posicaoalvo - posicaomotor; //calcula os steps necessarios para atingir a posicao alvo
Serial.println ("passos: ");
Serial.println (regulamotor);
stepper.step(regulamotor); // regula o motor
posicaomotor = posicaoalvo; // atualiza a posicao do motor

}
}


void loop(){

regula(regulamotor); // chama a funcao de regulagem
Serial.println ("posicao do motor: ");
Serial.println (posicaomotor); // exibe a posicao atual do motor
delay(5000);

}

Olá, Rafael!

   Eu também sofri muito com relação à anexação de arquivos, até que o minerin RV me deu a dica, que te passo: Não use o "Deseja carregar arquivos" porque está com problemas. Use o clips.

   Vou olhar o teu sketch para ver se descubro algo. Mas só amanhã, tá muito tarde já. :-)

   Fico feliz que você tenha progredido. Acho que logo já terá a solução.

Abração!

D. T. Ribeiro.

Controle_IAC_Motor_de_Passo_Ok.ino

Opa obrigado pela dica, agora consegui anexar. Abraços!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço