Recents in Beach


Receba o meu conteúdo GRATUITAMENTE


Motor de Passo com Aceleração e Fim de Curso


A aceleração do motor de passo e o fim de curso. Esses assuntos que vamos tratar neste artigo, no qual vou te apresentar uma montagem de teste de movimento. Além do conceito de chaves de fim de curso, vou ainda demonstrar um exemplo de código de aceleração de motor de passo.
Eu posso mexer com motor de passo sem acelerar? Posso, sim. Basta deixar a velocidade constante. Então, qual a vantagem da aceleração? Bem, quando você monta uma router ou uma máquina CNC, elas têm um peso. Imagine você empurrando um spindle de 3cv, 4cv... Imagine a estrutura mecânica pesada... Então, o motor precisa sair de uma velocidade baixa e ir aumentando aos poucos porque isso faz bem para a saúde do equipamento. Se você não acelera e desacelera, o que ocorre? Você vai dar tranco no mecanismo, que leva uma pancada na hora que é ligado o motor de passo. Imagine todas as micropeças do mecanismo ficarem levando pancadas, por milhões e milhões de vezes... Isso vai danificando todo o equipamento. Então, deixa eu te avisar: impressora 3d, router, fresadora, tudo quanto é máquinas CNC trabalha com aceleração e desaceleração. Daí a importância deste assunto.



Hoje, portanto, vou falar de aceleração e desaceleração, com um exemplo bastante simples, mas, em breve, vou gravar um vídeo mostrando como montar uma máquina CNC passo a passo.
Sei que existem basicamente dois tipos de pessoas que se interessam por motores de passo. Tem aquelas que querem saber programar um motor de passo porque querem fazer um robô ou uma máquina seccionadora, por exemplo. Como isso não tem projeto e nem software prontos, você vai precisar conhecer esses conceitos de aceleração, entre os demais, para montar este tipo de equipamento. Há ainda aquelas pessoas que já querem pegar os passos prontos e apenas seguirem o recomendado, como uma espécie de receita de bolo. Neste caso, é possível pegar minhas aulas, por exemplo, e seguir cada fase até finalizar uma montagem.

Recursos usados


Para a montagem de hoje utilizamos esta lista de componentes:
·         Fuso trapezoidal de 8mm de diâmetro e 2mm de passo
·         Fuso trapezoidal de 8mm de diâmetro e 8mm de passo
·         Castanha flangeada para fuso 8x2
·         Castanha flangeada para fuso 8x8
·         Mancais para fusos de 8mm de diâmetro
·         Guia linear cilíndrica 10mm de diâmetro
·         Rolamentos cilíndricos  para guias 10mm
·         Suportes para guias cilíndricas de 10mm
·         Motores NEMA 17
·         Acopladores de eixo
·         Arduino Mega
·         Driver DRV8825
·         Teclado matricial 4x4
·         Display Nokia 5110
·         Peças plásticas diversas
·         Parafusos e porcas
·         Base de madeira
·         Fonte externa de alimentação 12V
·         Sensores infra-vermelho

Demonstração


Nossa montagem de hoje é muito parecida com a do vídeo Arduino Uno com Fuso e Motor de Passo. O que precisei modificar? Desta vez escolhei um Arduino Mega para poder utilizar a chave de fim de curso, que você pode ver ao lado direito do projeto, já que a chave de fim de curso é usada no fuso mais rápido. Cada menu está explicado no código fonte deste programa que está no ATmega. Na demonstração feita no vídeo fazemos o motor mover 5 centímetros para ficar evidente a aceleração e a desaceleração. Ele retorna, então, 15 centímetros e toca na chave de fim de curso, que para o motor.

Chave de Fim de Curso


Para que serve? As chaves de fim de curso são elementos mecânicos que  limitam um percurso interrompendo o movimento dos motores. São usadas nas montagens das máquinas para proteger a mecânica. Em máquinas CNC, as chaves também servem como ponto de referência para, por exemplo, zerar as coordenadas de um eixo. Há vários tipos de chaves no mercado, dentre eles: botões, sensores infravermelhos, sensores capacitivos, entre outros.


Na nossa montagem usamos sensores infravermelhos, conforme a imagem mostrada acima.

Código de exemplo

Aqui tenho um código fonte no arduino que mostra o Setup e como mover o motor de passo com a chave de fim de curso e a aceleração. Aqui tratamos da biblioteca StepMotor, que é uma biblioteca que eu mesmo fiz, que mexe com os drivers DRV8825, A4988 e TB6600, e te possibilita tocar motores maiores, como o Nema 23 ou 34, por exemplo. Ela está disponível para download logo abaixo.
Configuramos, então, os pinos do driver, os passos por milímetro e por volta, bem como o micropasso. Configuro ainda o movimento de aceleração com velocidade máxima e mínima e ativo as portas de saída de potência do motor. Por fim, os pinos das chaves de fim de curso são ativados.

#include <StepMotor.h>

DRV8825 d1;
void setup() {
  //Configuracao dos pinos do driver
  d1.pinConfig(2,3,4,5,6,7,8,9);
  
  //configuracao de passos por milimetro
  d1.stepPerMm(100);
  
  //configuracao de passos por volta
  d1.stepPerRound(200);
  
  //configuracao de micropasso
  d1.stepConfig(1);
  
  //configuracao do movimento (aceleracao, velocidade maxima, velocidade minima)
  // tempos em uSegundos
  // Aceleração é o decremento de tempo a cada novo passo
  d1.motionConfig(20,1500,5000);
  
  //reseta o driver
  d1.reset();
  
  //ativa as portas saídas de potencia do motor
  d1.enable(HIGH);
  
  //Pinos das chaves de fim de curso e se ativam em nivel alto ou baixo
  // d1.endstopConfig(min,max,HIGH ou LOW);
  d1.endstopConfig(10,11,HIGH);

}

Abaixo temos o exemplo do código do motor. O responsável pelo movimento é o comando motorMoveTo.

void loop() {
  //move o motor 100mm em direcao crescente
  d1.motorMoveTo(100, HIGH);
  //aguarda 1 segundo
  delay(1000);
  
  //move o motor 100mm em direcao decrescente
  d1.motorMoveTo(100, LOW);
  //aguarda 1 segundo
  delay(1000);
}


Chave de Fim de Curso

Código: no nosso código iremos atuar diretamente no movimento do motor, desabilitando-o quando acionada a chave de fim de curso.

bool DRV8825::canGo(bool direction)
{
 
 if(LVL) // se: as chaves de fim de curso ativam em nível alto
 {

  if(direction && !digitalRead(EMAX)) //se: move positivamente E o fim de curso máximo NÃO está ativado 
   return true;
  
  if(!direction && !digitalRead(EMIN)) //se: NÃO move positivamente E o fim de curso mínimo NÃO está ativado
   return true;
 
 }
 else //senão: as chaves de fim de curso ativam em nível baixo
 {
 
  if(direction && digitalRead(EMAX)) //se: move positivamente E o fim de curso máximo está ativado
   return true;
    
  if(!direction && digitalRead(EMIN)) //se: NÃO move positivamente E o fim de curso mínimo está ativado
   return true;
 
 }
  return false;

}

Aceleração


Os passos dos motores são controlados com pulsos alto e baixo entre um intervalo de tempo. Para que o motor não comece diretamente em velocidade máxima, usamos a aceleração. A aceleração muda o tempo do pulso a cada passo para mudar a velocidade do motor, aumentando gradativamente até a velocidade máxima para acelerar, e diminuindo até parar para desacelerar. A aceleração pode ser implementada de várias formas. O código que criamos exemplifica o uso da aceleração em motores de passo.

Aceleração - Código

Nesse exemplo simples de código de aceleração o tempo do pulso é diminuído a cada passo com um valor escolhido pelo usuário até a metade do percurso ou até que o motor alcance a velocidade máxima, ou seja, o menor tempo de pulso definido.

void DRV8825::motorMoveTo(double distance, bool direction) //(distância, direção, tempo da largura do pulso em microssegundos (metade do tempo em nível alto, metade em nível baixo))
{
  
 
 digitalWrite(DIR, direction);
 long accSpeed = SMIN;
 long steps = distance*SPM;
 long stepsToStop;
 bool flag = true;

 for(long i = 0; i < steps; i++){

   if(i < (steps)/2){
    
    if(accSpeed>SMAX){
     
     if(canGo(direction)){
      digitalWrite(STP, HIGH);
      delayMicroseconds(accSpeed/2);
      digitalWrite(STP, LOW);
      delayMicroseconds(accSpeed/2);
     }
     else{
      delayMicroseconds(accSpeed);
     }
     accSpeed = accSpeed - ACC;
    }


Nesse ponto abaixo é guardada a quantidade de pulsos que o motor realizou para alcançar a velocidade máxima naquele percurso.

 else
    {
     if(flag){
     stepsToStop = i;
     flag = false;
     }
     
     if(canGo(direction)){
      digitalWrite(STP, HIGH);
      delayMicroseconds(SMAX/2);
      digitalWrite(STP, LOW);
      delayMicroseconds(SMAX/2);
     }
     else{
      delayMicroseconds(SMAX);
     }
    }
    
     
   }


Essa quantidade será a mesma usada para desacelerar o motor antes que ele chegue no fim de seu percurso. Para desacelerar o motor o tempo do pulso é aumentado a cada passo até que o motor pare, conforme você vê abaixo.

else
   {
    if(i < steps-stepsToStop){
     
     if(canGo(direction)){
      digitalWrite(STP, HIGH);
      delayMicroseconds(SMAX/2);
      digitalWrite(STP, LOW);
      delayMicroseconds(SMAX/2);
     }
     else{
      delayMicroseconds(SMAX);
     }
    }
    else
    {
     if(canGo(direction)){
      digitalWrite(STP, HIGH);
      delayMicroseconds(accSpeed/2);
      digitalWrite(STP, LOW);
      delayMicroseconds(accSpeed/2);
     }
     else{
      delayMicroseconds(accSpeed);
     }
     accSpeed = accSpeed + ACC;
    }
    
   } 
 }
}



Faça o download dos aquivos:





Postar um comentário

20 Comentários

  1. Fernando parabéns pelo canal e o blog, muito bom o material e é muito legal você explicar o código fonte.
    O arquivo INO "http://download.fernandok.com/Comandomotor2.0.zip" está dando "404 Not Found", poderia subir o arquivo novamente.

    ResponderExcluir
    Respostas
    1. Olá, amigo. Atualizei o arquivo. Pode tentar novamente, por favor? Abraço! Obrigado pelo toque.

      Excluir
    2. Bom dia, tem o codigo completo com a parte do teclado e Display? Obrigado excelente trabalho

      Excluir
  2. Meu amigo, obrigado pelo seu trabalho!! O link do arquivo PDF: http://download.fernandok.com/MotorAceleraçãoFimCurso.pdf também está com erro 404. Abraço!

    ResponderExcluir
  3. Olá, boa noite. Eu não encontrei a parte do fim de curso neste arquivo ino que o senhor disponibilizou para download! Qual é a linha que começa esse código do fim de curso?

    ResponderExcluir
  4. Bom dia fernando blz? como posso usar essa biblioteca usando o driver tb6560?

    ResponderExcluir
  5. Boa noite Fernando k eu fiz um cnc caseiro esta tudo pronto a montagem .Mais estou com problemas na Chaves de fim de curso .Quando eu coloco a máquina pra fazer o home o eixo z da topia sobe certo ele sobe até tocar na chave de fim de curso até ai ok dai ele da uma pequena decida pra livrar a chave e para até ai está ok.Os outros eixos X e Y começa a se movimentar os 2 juntos um deles chega primeiro a tocar na chave de fim de curso mais não para não sei o que pode estar acontecendo. Mais tem algum interessante fiz o sistema de pull Ap e os fios de ligação da Chaves e blindado para evitar indiferença ok .Agora a pergunta? Quando eu faço o home e o eixo X Y começa a se mover eu dou toque com a mao na chave na hora para fiz teste em todos os eixos acionando as chaves com toque com as minhas mão para na hora .Um amigo me disse que tem algum lugar o sowfterware do GRBL que da pra mudar a sensibilidade de acionamento das chaves e verdade isso é onde posso achar isso sobre esse assunto ?????????

    ResponderExcluir
  6. Vc pode me ajudar nesse dúvida pra poder resolver isso é me ajudar ...

    ResponderExcluir
  7. Boa noite Fernando k eu fiz um cnc caseiro esta tudo pronto a montagem .Mais estou com problemas na Chaves de fim de curso .Quando eu coloco a máquina pra fazer o home o eixo z da topia sobe certo ele sobe até tocar na chave de fim de curso até ai ok dai ele da uma pequena decida pra livrar a chave e para até ai está ok.Os outros eixos X e Y começa a se movimentar os 2 juntos um deles chega primeiro a tocar na chave de fim de curso mais não para não sei o que pode estar acontecendo. Mais tem algum interessante fiz o sistema de pull Ap e os fios de ligação da Chaves e blindado para evitar indiferença ok .Agora a pergunta? Quando eu faço o home e o eixo X Y começa a se mover eu dou toque com a mao na chave na hora para fiz teste em todos os eixos acionando as chaves com toque com as minhas mão para na hora .Um amigo me disse que tem algum lugar o sowfterware do GRBL que da pra mudar a sensibilidade de acionamento das chaves e verdade isso é onde posso achar isso sobre esse assunto ?????????

    Responder

    ResponderExcluir
  8. Boa tarde Fernando K, sigo atentamente os seus videos aqui em Portugal e desde ja lhe envio os parabens pela forma como apresenta todos os projectos.
    Estou a tentar executar uma regua automatica de medição em milimetros, até 6500 milimetros de distancia maxima com espera utilizando um motor stepper para colocar a espera na medida que eu prtenda , sendo essa medida em milimetros e estava a pensar utilizar este tipo de projecto com motor passo com acelaração e fuso roscado. Já sei que a velocidade da espera depende do passo do fuso e a actribuição da equivalencia de medida vais depender mesmo disso. Mas a questão é a seguinte : com este projecto que aqui nos demonstra faz movimentar dois fusos e eu so necessito de um . Como devo alterar todo o código fonte para que funcione bem?
    Desde já agradeço a amabilidade.

    ResponderExcluir
  9. Fernando como vai tudo bem !!, imagino que receba inúmeras mensagens, se puder me responder agradeceria muito , tentando realizar um projeto seguindo seu tutorial motor de passo com aceleração e fim de curso porém no arquivo .ino disponibilizado , não tem pinagem nem nada falando sobre o fim de curso nem o display , agradeceria muito se pudesse me ajudar Desde já agradeço Alex

    ResponderExcluir
  10. Amigo,
    Poste sua dúvida no www.forum.fernandok.com.
    Vamos formar uma comunidade e ajudar uns aos outros.

    ResponderExcluir
  11. Bom dia, Fernando, parabéns pelo conteúdo. O link INO quando verifico no arduino, dá erro de compilação para mega 2560? o que poderia causar isso? grato.

    ResponderExcluir
  12. Parabéns Fernando, muito boa esta solução. Estou projetando uma faca de corte com arduino e o DRV8825 e pretendo usar aceleração da faca no projeto e gostaria de testar sua solução para isso, só que os arquivos para download não estão mais disponíveis, poderia disponibilizar novamente? Obrigado

    ResponderExcluir
  13. Gostaria de baixar os arquivos mas não encontrei em lugar algum.
    Se alguém tiver e puder me mandar djjulioreis@yahoo.com.br
    Obrigado

    ResponderExcluir