Arduino Playground is read-only starting December 31st, 2018. For more info please look at this Forum Post

Arduino и енкодер за ротация

Енкодерът за ротация е устройство, което позволява неограничено завъртане. В потребителската електроника намира приложение в аудио системи, компютърна периферия и др.

Има два изхода А и B, които могат да са в състояние 1 или 0. Това означава че по изхода на енкодера се различават общо 4 състояния.

Изходът на енкодера се разчита чрез т.нар. грей код.

Например ако А и В са преминали от 01 на 11, това означава че енкодерът е завъртян една позиция по часовниковата стрелка.

Пример

Ардуино брои завъртанията на енкодера и извежда информация в Serial Monitor. Средният пин се свързва към пин GND на Arduino, пин А към А0, а пин B към А1. Ако пин А и В се разменят, показанието ще намалява по часовниковата стрелка и ще се увеличава в противоположната посока.

/*
 Описание:
  * Получава информиция от енкодер за това дали е завъртян,
    в каква посока и колко пъти

  Свързване:
  * Pin A -> A0
  * GND -> GND
  * Pin B -> A1

  * Tihomir Trifonov (09-2011)
  * email:tisho@inbox.com

  * с подкрепата на Robotev.com

*/

#define ENC_A 14  // А0
#define ENC_B 15  // А1
#define ENC_PORT PINC

void setup()
{
  pinMode(ENC_A, INPUT);     //задава А0 като вход
  digitalWrite(ENC_A, HIGH); //вдига PullUp
  pinMode(ENC_B, INPUT);     //задава А1 като вход
  digitalWrite(ENC_B, HIGH); //вдига PullUp
  Serial.begin (115200);     //серийна комуникация 
                             //със скорост 115200
}

void loop()
{
 static uint8_t counter = 0; //брояч      
 int8_t tmpdata;

  tmpdata = read_encoder();// прочита състоянието на енкодера
  if( tmpdata ) {
    Serial.print("Counter value: ");
    Serial.println(counter, DEC); //извежда брояча
    counter += tmpdata; // добавя -1,0 или 1
  }
}

int8_t read_encoder()// връща -1, 0 или 1
{
// масив с възможни състояния
  static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
  static uint8_t old_AB = 0;// съхранява предходното състояние
  old_AB <<= 2;                   
  old_AB |= ( ENC_PORT & 0x03 ); // прочита новото състояние на А и B
// връща -1,0 или 1 в зависимост от старото и новото им състояние 
 return ( enc_states[( old_AB & 0x0f )]); 
}

Примерът е взет от: http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino