Pages: [1]   Go Down
Author Topic: Interrupção com encoder trava o motor  (Read 1002 times)
0 Members and 1 Guest are viewing this topic.
Brasil
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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.
Logged

Curitiba PR, Brazil
Offline Offline
Sr. Member
****
Karma: 0
Posts: 259
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Portugal
Offline Offline
God Member
*****
Karma: 6
Posts: 962
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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);
}

Logged

Brasil
Offline Offline
Newbie
*
Karma: 0
Posts: 7
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 =)
Logged

Pages: [1]   Go Up
Jump to: