Ir ao conteúdo

Posts recomendados

Postado

ola a todos, estou com uma certa dificuldade em fazer uma lógica para fazer o Arduino girar o motor até quando o valor dele for igual ao que estou aplicando na entrada.

vou explicar

tenho um Encoder ky040 que servira como o valor desejado ele entrega valores negativos e positivos inteiros e um motor com encoder tabém, a imagem abaixo é eu mexendo manualmente para mostrar a vcs o funcionamento do Encoder. então resumindo geral o que eu desejo fazer é que quando eu girar o KY040 para um determinada posição o motor acompanhe até que seja igual ao valor ky040.

2115186377_ky040emotor.png.e72cc09ddbef5208ce90877e0d4c7c5d.png

 

em contra partida o meu motor pode ser acionado para girar para os dois sentidos eu estou utilizando um módulo ponte H L298n no pino ENA seria onde desejaria enviar o sinal PWM para que ele não gire nem muito rápido e nem muito lento pensei em utilizar a função map, mas não tenho certeza se iria funcionar para o encoder,mas sei que para um potenciômetro funciona bem  a função map para o controle de velocidade. abaixo esta o circuito montado

1437009531_ky040circuito.thumb.png.85c12187ebab6210e682fc3cceeb7171.png

aqui estou mostrando a parte da programação que faz a leitura do encode ky040 e a do motor, o setup e as variáveis globais acredito que não preciso mostrar aqui, no loop euapenas mandei escrever o ky040 e o rmotor

estar comentado as linhas espero que entendam, criei dois subprogramas void encoder e void EncoderM e depois chamei no loop.

 

/* encoder KY-040
 aqui foi criada um subprograma void Encoder*/
 void Encoder()
 {
   //Le o estadoatual do pino inputCLK na imagem acima é o pino do ky040 CLK
   estadoAtualCLK = digitalRead(pinoCLK);
   // Se estado atual for diferente do anterior, houver um pulso
  if (estadoAtualCLK != estadoAnteriorCLK)
   {
    //se inputDT for diferente, então ele gira no sentido horário
    if (digitalRead(pinoDT) != estadoAtualCLK) 
    {
      ky040[0] --; //Decrementa ky040
      encdir = "HOR";
    } else 
    {
      //Se não ele gira no sentido anti-horário
      ky040[0] ++;
      encdir = "ANTH";
    }
   }
    //Atualiza Variavel de estado anterior
  estadoAnteriorCLK = estadoAtualCLK; //ky-040
  }

  /* encoder do motor 
 aqui foi criada um subprograma void Encodermotor 
 dos fios verde e amarelo*/
 void EncoderM()
 {
   //Le o estadoatual do pino C1 do motor olhar a imagem acima para saber quem é C1
   estadoAtualC1 = digitalRead(C1);
   // Se estado atual for diferente do anterior, houver um pulso
  if (estadoAtualC1 != estadoAnteriorC1)
   {
    //se inputDT for diferente, então ele gira no sentido horário
    if (digitalRead(C2) != estadoAtualC1) 
    {
      rmotor --; //Decrementa 
      dire = "HOR";
    } else 
    {
      //Se não ele gira no sentido anti-horário
      rmotor ++;
      dire = "ANTH";
    }
   }
    //Atualiza Variavel de estado anterior
  estadoAnteriorC1 = estadoAtualC1; 
 }
  

 

agora o dificuldade que estou tendo e de fazer com que o eu falei la em cima, quando o ky040 for posicionado para um ponto o motor vai girar até ser igual ao desejado

 

image.png

Postado

 

1 hora atrás, IVO PA disse:

 

2115186377_ky040emotor.png.e72cc09ddbef5208ce90877e0d4c7c5d.png

Primeiro de tudo, você precisa entender o resultado das variáveis que o sistema te retorna.
Na sua explicação, eu não entendi se este resultado ocorreu c/ você girando o motor manualmente s/ parar ou após girar uma vez e parar.

  • Membro VIP
Postado

Que tipo de dado é retornado pelo C1 e C2 encoder? Tem e leu o manual do tal motor?

1 hora atrás, IVO PA disse:

um Encoder ky040 que servira como o valor desejado ele entrega valores negativos e positivos inteiros

Vá por partes... entenda primeiro como o tal ky040 (clique) funciona e como ler seus dados. Me parece não ser necessariamente um sensor de posição mas de direção

 

Em mais uma tradicional coincidência temporal, olha isso que pode ter alguma relação com tua inquietação

🤪

Postado
36 minutos atrás, Thiago Miotto disse:

 

Primeiro de tudo, você precisa entender o resultado das variáveis que o sistema te retorna.
Na sua explicação, eu não entendi se este resultado ocorreu c/ você girando o motor manualmente s/ parar ou após girar uma vez e parar.

@.if isso if, girando o Encoder ky040 manualmente e girando o moto Encoder manualmente, para saber se o código estava me retornando o que eu queria como você pode ver na imagem  da Serial.  

34 minutos atrás, .if disse:

Que tipo de dado é retornado pelo C1 e C2 encoder? Tem e leu o manual do tal motor?

Vá por partes... entenda primeiro como o tal ky040 (clique) funciona e como ler seus dados. Me parece não ser necessariamente um sensor de posição mas de direção

 

Em mais uma tradicional coincidência temporal, olha isso que pode ter alguma relação com tua inquietação

🤪

não necessariamente, mas cada caso um caso, nesse trabalho ele servira com um sensor de posição, poderia ser um potenciômetro sim também, poderia ser um sensor ultrassônico sim, o motor não é de passo para começa ele é um motor DC simples de escova com redutor.

M1 MOTOR  -  = GND ALIMENTAÇÃO 12V

M2 MOTOR +  = POSITIVO ALIMENTAÇÃO 12V

GND ENCODER = GND ALIMENTAÇÃO DO ENCODER DO MOTOR

3.3V ENCODER = POSITIVO ALIMENTAÇÃO 3.3V DO ENCODER

C1 ENCODER = CANAL A DO ENCODER SINAL DE RESPOSTA DO MOTOR

C2 ENCODER = CANAL B DO ENCODER SINAL DE RESPOSTA DO MOTOR

image.thumb.png.a7679ee0ca93c5de1d8b65a3d651407d.png

image.png.0012278e3d8a2b83c30e33c05c8adde1.png

  • Membro VIP
Postado

Entendi amigo no entanto me permita re mencionar que há alguma relação sim... mas isso não é importante.

Vejamos...

você mesmo percebe que na sua

6 horas atrás, IVO PA disse:

imagem  da Serial

... só retorna 2 dados ou seja sentido horário e antihorário. Então pra...

8 horas atrás, IVO PA disse:

fazer é que quando eu girar o KY040 para um determinada posição o motor acompanhe até que seja igual ao valor ky040

... hás de lançar mão de algum outro tipo de retorno tipo daquele tópico. Ou algo como um encoder absoluto ou resolver (lê-se resôlver). Google encoder vs resolver.

Postado

@IVO PA ,

 

Os sinais C1 e C2 são fundamentais para você saber o sentido de rotação o encoder, e claro, a sua posição relativa também !

 

Um encoder tem um certo numero de "clicks" por revolução, por exemplo eu uso um encoder vagabundo que tem cerca de 18 "clicks" por volta, isto é, a sequência de troca de fases entre os sinais C1 e C2 se repetem 18 vezes em uma volta. Isto significa que a cada click eu sei que o encoder se movimentou 18 graus para a esquerda ou para a direita.

 

Um excelente site com ilustrações para você entender está aqui :

 

https://www.allaboutcircuits.com/projects/how-to-use-a-rotary-encoder-in-a-mcu-based-project/

 

Lembre-se : é fundamental você saber quantos "clicks" o seu encoder dá em uma volta !

 

Atualização : achei, são 20 clicks completos por volta !

 

Paulo

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...