Olá pessoal,
Estou precisando de uma ajudinha, pois os pulsos gerados estão fora do esperado.
Meu disco encoder tem 20 buracos e teoricamente ao completar 1 volta ele teria gerado 20 pulsos.
Mas ocorre que ele só está completando 1 volta com +/-70 pulsos e fora que o motor nunca para na mesma posição.
Meu objetivo em suma é controlar essa posição do motor com base nos pulsos gerados pelo encoder.
Meu código está disponível no anexo.
Outra coisa... Vocês tem alguma dica para melhorar o contato do jumper macho com o slot no arduino? Notei que isso também tem grande influência na leitura dos pulsos, pois tem uma pequena folga na conexão.
Estou usando:
- Arduino UNO R3
- Optocoupler module with LM393 comparator
- Motor DC
- Disco Encoder
Tags:
Boa noite FP,
sugestão:
Remova o code que colou na área de texto e anexe como arquivo.
Rui
Feito. Obrigado.
Qual é a rotação (RPM) desse motor ? É bem lento?
Como consegue identificar que uma volta corresponde à 70 pulsos?
Acho interessante que envie uma foto visível da sua montagem - encoder + disco ótico.
Qual é a rotação (RPM) desse motor ? Acredito que a velocidade de rotação esteja ligada ao PWM. Não fiz medições, mas considero, da forma como estou usando, como rápida.
Como consegue identificar que uma volta corresponde à 70 pulsos? A velha técnica da tentativa e erro (empiricamente). E também para confirmar o número usei um print fora da rotina de interrupt.
Acho interessante que envie uma foto visível da sua montagem - encoder + disco ótico. Feito. O D0(fio azul) do sensor vai no Digital 2 do arduino.
Oi FP,
sugiro você reduzir o code para identificar o problema do encoder.
Faça um code simples que gire o motor de forma lenta e tente identificar qtos pulsos o
arduino recebe do encoder..
Rui
Rui,
Segui seu conselho e fiz um teste de código mínimo...
E também retirei a roda (evitar interferência do atrito com o chão) e alinhei bem o disco encoder entre o emissor e receptor do sensor óptico. Conclusões:
"analogWrite( pino_B_IA, 255-PWM )"
PWM = 110 => analogWrite( pino_B_IA, 145)
Se D0 liga no pino Dig2, então 1 volta = 75 pulsos
Se D0 liga no pino Dig3, então 1 volta = 110 pulsos (Bizarro isso)
Muitas vezes ele conta 75 pulsos, mas não concluiu a volta.
Substitui o sensor óptico por outro igual...
Se D0 liga no pino Dig2, então 1 volta = 75 pulsos
Se D0 liga no pino Dig3, então 1 volta = 140 pulsos...
PWM = 190 => analogWrite( pino_B_IA, 65 )
Se D0 liga no pino Dig2, então 1 volta = 62 pulsos
O sistema está totalmente imprevisível no momento =(
Primeiro teste :
Gire o disco ótico com a mão e conte os pulsos com o seu programa .
A fresta do emissor ou do sensor otico é estreita o bastante para captar apenas um pulso quando o buraco do disco ótico passa entre eles?
RPM = RPS x 60
Uma rotação = 20 pulsos .
1 RPM = 3 pulsos/segundo - correto ?
Consegui resolver!
O problema era no código onde eu estava iniciando a interrupção com um dos argumentos errado.
Era: attachInterrupt(0, contador, FALLING);
Ficou: attachInterrupt(digitalPinToInterrupt(pino_SenOP), contador, FALLING);
Onde o primeiro argumento é o pino configurado para interrupção (No caso do UNO vc pode usar o d2 e o d3).
Segundo é o método de rotina, que no meu caso é um contador de pulso.
Terceiro é quando ocorre. No meu projeto vai ser nas bordas de descida.
A precisão ainda não é 100%, mas pelo menos está dentro do aceitável.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por