Olá novamente caros companheiros, seguindo meu projeto, quase no fim, eis que surge mais um obstáculo, e venho a esta meca, perante vossos gurus tentar obter respostas para seguir em frente.

Um problema que achei que fosse fácil, mas to travado nele a dias e não saio do lugar. O bom e velho encoder rotativo parece funcionar pra todo mundo menos pra mim, rs.

Já peguei todos os códigos da internet, do lab de garagem, de sites gringos, googleando sem parar, fui mexendo nos códigos, tentei desenvolver um do zero sozinho, até que ficou marromeno. Mas ainda neca de pitibiriba. 

Achei que o encoder estivesse com defeito, troquei, esperei 5 dias pra chegar, e acontece a mesma coisa. Já tentei ligar eles de várias formas, com filtro capacitivo, sem, com resistor de pull-up, sem, com pull-up interno, sem, com atachInterrupt, sem, com debounce, sem, só falta levar pra benzer, rs.

Claramente, o problema está em mim, mas se alguém já teve experiências mais agradáveis com esse dispositivo agradeceria muito se compartilhassem comigo.

O sketch que to usando é esse. O encoder que to usando é esse da foto. E na notinha dele diz que o código do componente é: ED1112S-20P-15F. 

Meu objetivo é fazer um contador que vai alterar uma variável em +1 ou -1 a cada passo do encoder, e o que está acontecendo é que cada passo altera 2 ou 3, as vezes até quatro, muito inconstante, e as vezes até vai e volta no mesmo passo, tipo, a variável está em 100, eu giro um passinho pra aumentar, e ela vai pra 102, depois 103, e volta pra 100, do mesmo passo, estranho não?

Enfim, parece ridículo, mas é o que é, alguém sabe como resolver?

Exibições: 2028

Anexos

Responder esta

Respostas a este tópico

Anexei o Data sheet 

Rotary Encoder With Push-On Switch

Conectou o pino comum ao terra ?

http://playground.arduino.cc/Main/RotaryEncoders

http://www.arduinoos.com/2010/06/rotary-encoders/

Anexos

Conectei sim, fiz várias testes de ligação, nenhum funcionou. 

Neste momento estou com o comum no GND, A e B nos pinos 2 e 3 respectivamente, e um capacitor de 10nF entre A e GND e B e GND. 

Porque não habilitou os resistores de pullup?

  1. pinMode(encoderA, INPUT);
  2.   //digitalWrite(encoderA, HIGH);   <=====
  3.   pinMode(encoderB, INPUT);
  4.   //digitalWrite(encoderB, HIGH);   <=====

https://www.arduino.cc/en/Reference/DigitalWrite

Se o pino é configurado como uma entrada, digitalWrite () irá permitir (HIGH) ou desativar (LOW) o pullup interno no pino de entrada. Recomenda-se a definir o pinMode () para INPUT_PULLUP para habilitar o resistor de pull-up interno

Obrigado José, eu havia feito isso conforme comentei, mas o resultado não foi diferente. 

Obrigado Carlos, mas já tentei esse código e os demais dos comentários, tentei fazer algumas alterações, mas ainda assim nada adiantou.

Oi RMM, boa tarde,

gostaria de entender melhor como voce esta' usando o encoder.

Este seu encoder tem uma sequencia de pulsos que define se ele gira CCW ou CW.

Ele produz 20 pulsos por cada volta, e dependendo da velocidade que voce gira o eixo dele,

produzira' pulsos com tempos diferentes, e o usos de delay no codigo fica inapropriado.

Sugiro voce usar o recurso de interrupt para saber qdo acontece o pulso.

Lamentavelmente  estou fora e nao consigo testar um codigo.

Mas  assim que voltar se voce ainda tiver problema, prontifico a escrever um codigo para voce.

Rui

Grande Rui! Obrigado, acho que esse problema vai longe. Ontem dei mais uma varredura na internet atrás de solução mas ainda não consegui. 

Existe a possibilidade do defeito ser no arduino? Muito improvável não é?

Outra pergunta, no caso de usar interrupt posso fazer isso de forma interna, ou seja, sem utilizar os pino 2 e 3? Pois já estou usando essas duas entradas para aquele esquema da pausa, lembra?  (Uso arduino uno R3 que tem apenas essas duas portar pra usar interrupt). 

Não tenha pressa, assim que voltar nos falamos. Obrigado pela ajuda!

Muito estranho Rafael, 

Mande uma foto com as ligações feitas com o encoder.

Vou montar o sistema novamente e posto foto aqui para verificarem, posto o resultado que estou tendo também.

Lamentavelmente os pinos onde pode usar interrupt são o 2 e 3 no caso do UNO, você tem que relocar os pinos, ou o que é melhor, comece a pensar na aquisição de um MEGA, mais memoria, mais portas, o UNO tem varias limitações quando se trata de um projeto que requer muita implementação.

Veja o link sobre interrupções:  https://www.youtube.com/watch?v=VOpXVVrKVB0

Abs.

Valeu Carlos, realmente vou acabar tendo que adquirir um Mega, já senti falta dele outras vezes, não é a primeira. 

O projeto que estou fazendo já possui dois attachInterrupt nessas entradas.

Vc sabe como funciona as interrupções internas interrupst() e noInterrupts() ??

Andei lendo sobre elas, tentei implementá-las mas não deu certo. Neste caso elas não podem substituir a interrupção externa attachInterrupt?

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço