• Welcome to LusoRobótica - Robótica em Português.
 

Rotary Encoder Com arduino

Started by joaobernardino, 06 de October de 2012, 16:10

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

joaobernardino

Está perfeito faltam apenas duas coisas, tem de começar em zero, mas eu já mudei a variavel 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 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.
if(encoderValue<0){
    encoderValue=396;    //  encoderValue=396   ( steps= 99)
  }


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

rglove

Quote from: joaobernardino on 07 de October de 2012, 22:29
Está perfeito faltam apenas duas coisas, tem de começar em zero, mas eu já mudei a variavel 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 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.
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!

joaobernardino


rglove

#18
O void updateEncoder  :)

Mete no final do void, acho que antes tinhas no void loop...

joaobernardino

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?
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);
}

senso

Tens de mostrar como é que estás a juntar o código..
Avr fanboy

joaobernardino

Já está resolvido, como ainda não percebo muito disto, meti o void updateEncoder() dentro do void loop ().

obrigado na mesma.