Go Down

Topic: Interrupção com encoder trava o motor (Read 1 time) previous topic - next topic

wallaaa

Olá, estou com o seguinte problema:
Estou usando um encoder optico e um servo motor, estão funcionando normalmente, porém quando giro "rapidamente" (nem chega a ser tão rapido) o motor começa a ter comportamentos estranhos.
O código:
Code: [Select]
#include <Servo.h>

Servo myservo;

void encoder () {
 static int encoder = 0;
 
 encoder++;
 Serial.println(encoder);
}

void setup() {
 attachInterrupt(0, encoder, RISING);
 myservo.attach(10);
 myservo.writeMicroseconds(2000);
 Serial.begin(9600);

}

void loop() {
}


Alguém sabe o que pode estar acontecendo, e o como posso resolver?

Desde já agradeço.

Osias Neto

Bom, eu nunca usei a lib Servo.h, portanto não sei se tem algum erro de sintaxe no seu programa, mas provavelmente você está tendo problemas com frequência pois o Serial.print é uma função bastante lenta...
tenta usar o Serial.print apenas no final da função, faça as contas e veja se o encoder perdeu alguma coisa.

Senso

Tente antes este código, pois como já disseram a função serial.print é muito lenta e de certeza que o faz falhar pulsos do encoder.
E não percebo porque declara a variavel dentro do interrupt, assim está sempre a colocar a variavel a zero.
Code: [Select]
#include <Servo.h>

Servo myservo;
volatile int encoder = 0;

void encoder () {
 encoder++;
}

void setup() {
 attachInterrupt(0, encoder, RISING);
 myservo.attach(10);
 myservo.writeMicroseconds(2000);
 Serial.begin(9600);

}

void loop() {
 Serial.println(encoder);
}


wallaaa

Testei sem usar o Serial.println() e o servo motor funcionou normal, talvez eu não tenha sido bem claro, meu problema não era ler o encoder, o problema era que quando lia o encoder os motores tinham comportamento estranho, aleatórios.
Senso, usando o static junto da variável na função void encoder () eu declaro ao programa que aquela variável não será apagada da memória quando sair da função e portanto seu valor não se alterará e assim não ira reiniciar com zero, o que não necessariamente acontece quando se cria uma variável viu Senso, a menos que ela seja global, variáveis globais quando criadas sem inicialização ficam com o valor zero, variáveis locais não necessariamente começar com o valor zero.
Por isso declarei a variável dentro da função, para que somente ela a use, e mesmo assim não perco o valor dela a cada chamada da função.

Obrigado pelas respostas e ainda consegui dar uma dica. Que bom =)

Go Up