Энкодер из мышки.

Евгений 79
Евгений 79 аватар
Offline
Зарегистрирован: 15.06.2014

Пытаюсь считать кол-во прерываний. Вот время одного препятствия происходит множество ложных срабатываний.

А как заставить программу увеличить переменную на 1 и ОЖИДАТЬ,пока не уберу препятствие?

Код:

#include <SoftwareSerial.h>

int pin = 3;                                                
unsigned int encoder = 0;//начальное значение шагов энкодера
int X;


void setup()
{
  pinMode(pin, INPUT);
  attachInterrupt(1,Probeg,CHANGE);
  Serial.begin(9600);
}
 
void loop()
{
}
 
void Probeg() //пробег
{
  X=digitalRead(pin);

  if (X == LOW){
    encoder = encoder+1;
    Serial.println(encoder);
    Serial.println("LOW");
}
   else if (X == HIGH)   {
    encoder = encoder+1;
    Serial.println(encoder);
    Serial.println("HIGH");
   }
   
 else 
   {
    Serial.println("ERROR");
   }
}

 

Евгений 79
Евгений 79 аватар
Offline
Зарегистрирован: 15.06.2014

Евгений 79
Евгений 79 аватар
Offline
Зарегистрирован: 15.06.2014

Куча значений вывелось во время одного и того же препятствия. Может это аппаратный вопрос?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Приведённый код можно сократить, убрав ненужные условия:

#include <SoftwareSerial.h>

int pin = 3;                                                
unsigned int encoder = 0;//начальное значение шагов энкодера
int X;


void setup()
{
  pinMode(pin, INPUT);
  attachInterrupt(1,Probeg,CHANGE);
  Serial.begin(9600);
}
 
void loop()
{
}
 
void Probeg() //пробег
{
  X=digitalRead(pin);
    encoder++;
    Serial.println(encoder);
    Serial.println(X == HIGH ? "High" : "Low");
}

Теперь, если с этим разобрались - какие именно проблемы? Вам надо, чтобы прерывание срабатывало по изменению фронта? Чтобы срабатывало однократно? Чтобы вообще не срабатывало? Что значит "пока не уберу препятствие"? Постарайтесь донести свою мысль в более понятной форме, пожалуйста.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Евгений 79 пишет:

Куча значений вывелось во время одного и того же препятствия. Может это аппаратный вопрос?

Нет, куча значений вывелось во время многократного срабатывания прерывания по изменению фронта. Почему фронт менялся так часто? Так это уже аппаратный вопрос ;)

Евгений 79
Евгений 79 аватар
Offline
Зарегистрирован: 15.06.2014

Спасибо! Изменения с High на Low происходили многократно только во время препятствия. Потом отключил пин от Ардуинки,и COM порт стал выдавать значения постоянно,без остановки. Я думаю,что фототранзистор от комп. мышки слишком чувствительный и стоит поискать ему замену.

+ иногда выводятся 2 раза подряд Low или High(а бывает,что и по 10 раз подряд!) 

Если есть варианты,посоветуйте пожалуйста,какой приемник подходит для этой задачи.

MacSim
Offline
Зарегистрирован: 28.11.2012

Евгений 79 пишет:

 слишком чувствительный и стоит поискать ему замену.

зачем же сразу к хирургу, сначала к терапевту сходите. подтяжку резистора к ноге пин включите записав туда 1 между 10 и 11 строками. или внешнее подтягивающее можно 4,7K куды хотите +- но правьте тогда прерывания по спаду или возрастанию.