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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy