collapse

* Posts Recentes

O que é isto ? por SerraCabo
[12 de Abril de 2024, 14:20]


Amplificador - Rockboard HA 1 In-Ear por almamater
[11 de Abril de 2024, 20:46]


Emulador NES em ESP32 por dropes
[10 de Abril de 2024, 15:30]


Meu novo robô por josecarlos
[29 de Março de 2024, 18:30]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Rotary Encoder Com arduino  (Lida 8980 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Rotary Encoder Com arduino
« Responder #15 em: 07 de Outubro de 2012, 22:29 »
Está perfeito faltam apenas duas coisas, tem de começar em zero, mas eu já mudei a variavel
Código: [Seleccione]
int oldsteps=-5, logo quando inicia é difirente dos steps e envia o valor 0.
Não sei se recorda mas tinha falado que queria o estilo de um circulo, chegava a 99 voltava a 0, e abaixo de 0 volta para 99. Fui capaz de passar de 99 para 0 sem qualquer problema atraves de
Código: [Seleccione]
if(steps>99){
    encoderValue=0;
  }
Mas o contrário de 0 para 99 dá-me o mesmo erro que sempre falei desdo o inicio de saltar do 0 para 98 sem passar pelo 99, eu usei o seguinte.
Código: [Seleccione]
if(encoderValue<0){
    encoderValue=396;    //  encoderValue=396   ( steps= 99)
  }

Agradeço o seu esforço, muito obrigado a sério.

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Rotary Encoder Com arduino
« Responder #16 em: 07 de Outubro de 2012, 22:57 »
Está perfeito faltam apenas duas coisas, tem de começar em zero, mas eu já mudei a variavel
Código: [Seleccione]
int oldsteps=-5, logo quando inicia é difirente dos steps e envia o valor 0.
Não sei se recorda mas tinha falado que queria o estilo de um circulo, chegava a 99 voltava a 0, e abaixo de 0 volta para 99. Fui capaz de passar de 99 para 0 sem qualquer problema atraves de
Código: [Seleccione]
if(steps>99){
    encoderValue=0;
  }
Mas o contrário de 0 para 99 dá-me o mesmo erro que sempre falei desdo o inicio de saltar do 0 para 98 sem passar pelo 99, eu usei o seguinte.
Código: [Seleccione]
if(encoderValue<0){
    encoderValue=396;    //  encoderValue=396   ( steps= 99)
  }

Agradeço o seu esforço, muito obrigado a sério.

Antes de mais trata-me por tu, de certeza que sou mais novo que tu (eu trato toda a gente por tu, não quero estar a faltar ao respeito)  :)

Antes de mais coloca essas mudanças do encoderValue dentro da interrupção, porque se por acaso passarem 2 valores abaixo de 0 (-2) ele vai passar para 396 e vão-se perder fases, depois os steps já não vão estar correctos!

Acho que o problema está em passares de -1 para 396. Como disseste, 396 = 99 steps. O que está a acontecer é que quando passas do step 0 para -1 estás a subtrair 4 ao encoderValue, ficando com -4.
Como sempre que o valor é negativo passa a 396, quando encoderValue = -1, este muda para 396. Ainda falta subtrair 3, logo no final vais ficar com 393. O valor inteiro da divisão de 393 por 4 é igual a 98. Logo ficas com 98 steps e não 99. Para além disto ainda perdes uma fase, visto que deverias ter passado de -1 para 395 e não 396. Logo tens de alterar o 396 para 399. Assim quando o encoderValue estiver em -1, vai passar a 399. Ainda falta subtrair 3 para completares o step. Logo 399-3 = 396. 396/4 = 99 steps.

Espero ter ajudado!

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Rotary Encoder Com arduino
« Responder #17 em: 07 de Outubro de 2012, 23:19 »
Qual é interrupção?

Offline rglove

  • Mini Robot
  • *
  • Mensagens: 527
Re: Rotary Encoder Com arduino
« Responder #18 em: 07 de Outubro de 2012, 23:41 »
O void updateEncoder  :)

Mete no final do void, acho que antes tinhas no void loop...
« Última modificação: 07 de Outubro de 2012, 23:44 por rglove »

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Rotary Encoder Com arduino
« Responder #19 em: 14 de Outubro de 2012, 19:01 »
O código final que me ajudaram a construir encontra-se aqui abaixo, funciona na perfeição se trabalhar sozinho, ao juntar com outros codigos para funcionar em conjunto com um botao e um touchscreen apenas funciona o rotary encoder e nada do resto da sinal :/ porque?
Código: [Seleccione]
int encoderPin1 = 3;
int encoderPin2 = 2;

int oldsteps = -5;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

 

void setup() {
  Serial.begin (31250);

  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

  //call updateEncoder() when any high/low changed seen
  //on interrupt 0 (pin 2), or interrupt 1 (pin 3)
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);

}

void loop(){
 
  int resto = 0;
    int steps = 0;
    if (encoderValue >= 4) {
        resto = encoderValue % 4;
        steps = (encoderValue-resto)/4;       
    }
    if (steps != oldsteps) {
        Serial.println(steps);
        midiCC(0xC0, 0, steps);
    }
    oldsteps = steps;
    if(steps>99){
    encoderValue=0;
  }
   if(encoderValue<0){
    encoderValue=399;    //  encoderValue=396   ( steps= 99)
  }
   
   
}

void updateEncoder(){
 
 
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
  int sum  = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;

  if(lastEncoded != encoded){
   lastEncoded = encoded;
}
}

void midiCC(char command, char value1, char value2){
  Serial.print(command, BYTE);
  Serial.print(value1, BYTE);
  Serial.print(value2, BYTE);
}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Rotary Encoder Com arduino
« Responder #20 em: 14 de Outubro de 2012, 23:28 »
Tens de mostrar como é que estás a juntar o código..
Avr fanboy

Offline joaobernardino

  • Mini Robot
  • *
  • Mensagens: 59
Re: Rotary Encoder Com arduino
« Responder #21 em: 15 de Outubro de 2012, 00:18 »
Já está resolvido, como ainda não percebo muito disto, meti o void updateEncoder() dentro do void loop ().

obrigado na mesma.