본문 바로가기

Arduino

로터리 엔코더 - Rotary Encoder

한바퀴 돌아가는데 20 스텝되는 로터리 엔코더입니다. 핀은 왼쪽에 3개 있고 오른쪽에 2개 있습니다.

//From bildr article: http://bildr.org/2012/08/rotary-encoder-arduino/

//these pins can not be changed 2/3 are special pins
int encoderPin1 = 2; // interrupt #1
int encoderPin2 = 3; // interrupt #2
int encoderSwitchPin = 4; //push button switch

int ledPin1 = 7;
int ledPin2 = 9;
bool ledStatus = false;
int defaultValue = 140;
int encoderSet = 0;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

void setup() {
  Serial.begin (9600);

  pinMode(encoderPin1, INPUT);
  pinMode(encoderPin2, INPUT);

  pinMode(encoderSwitchPin, INPUT);

  pinMode(ledPin1, OUTPUT);
  pinMode(ledPin2, OUTPUT);

  digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
  digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

  digitalWrite(encoderSwitchPin, HIGH); //turn pullup resistor on

  //call updateEncoder() when any high/low changed seen
  //on interrupt 0 (pin 2), or interrupt 1 (pin 3)
  attachInterrupt(0, updateEncoder, CHANGE);
  attachInterrupt(1, updateEncoder, CHANGE);

}

void loop() {
  //Do stuff here
  if (!digitalRead(encoderSwitchPin)) {
    Serial.println("pushed");
    ledStatus = !ledStatus;
    digitalWrite(ledPin1, ledStatus);
    encoderValue = 0;
  }
  
  Serial.println(encoderValue);
  encoderSet = defaultValue + encoderValue * 2;
  if (encoderSet <0) encoderSet = 0;
  if (encoderSet > 255) encoderSet = 255;
  analogWrite(ledPin2, encoderSet);

  delay(1000); //just here to slow down the output, and show it will work even during a delay
}

void updateEncoder() {
  int MSB = digitalRead(encoderPin1); //MSB = most significant bit
  int LSB = digitalRead(encoderPin2); //LSB = least significant bit

  int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number 
  int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value 
  if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++; 
  if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --; 
  lastEncoded = encoded; //store this value for next time
}

코드는 http://bildr.org/2012/08/rotary-encoder-arduino/ 에서 가져왔지만 약간 수정했습니다. 로터리 돌리면 밝기 조정되고 로터리 누르면 밝기가 리셋되면서 red led가 on/off 됩니다.

'Arduino' 카테고리의 다른 글

2N2222 NPN 트랜지스터 사용하기  (0) 2019.06.22
PCF8574로 입출력 확장하기  (0) 2019.06.09
SG90 서보 모터 테스트  (0) 2019.05.23
1602 LCD 세트 완성  (0) 2019.05.14
1602 LCD, DS3231, DS18B20, Nano 등 활용 셋업  (0) 2019.05.06