Arduino Uno ile Rotary Encoder Okuma

By | 12 Mayıs 2017

Çalıştığım fabrikanın laboratuarında kullanmak amacıyla iplik termal büzülme test cihazı (yarn thermal shrinkage tester) yapmak istedik. Yerli imalatı yok ve yurtdışı markaların fiyatları da oldukça yüksek. Fabrika içinde küçük bir ekip kurup cihazı imal ettik ve beklediğimizden çok daha başarılı sonuçlar üreten bir cihaz oldu. Bu noktada cihazı daha da geliştirmek istedik. Kullandığımız rotary endocer okuyucu bize sadece uzunluk cinsinden değer veriyordu. Bunu elle yüzde değerine çevirmek zorunda kalıyorduk. Bütçemiz gereği PLC kullanamadık. Bu noktada Arduion Uno ile encoder okuma işlemi yapıp hem ipliğin sıcaklık altındaki kısalma mesafesini hem de kısalma yüzdesini anlık olarak bir ekrana yazdırmayı düşündük. Sizlerle paylaşacağım kısım sadece rotary encoder ile Arduino Uno arasındaki bağlantıyı nasıl kurduğumuz ve ileri-geri dönüş açılarını alma yöntemimizdir.

Kullandığımız rotary encoder modeli piyasada en çok kullanılan modellerden biri olan e50s8-360-3-t-1. Şuradan google arama sonuçlarına ulaşabilirsiniz.

BAĞLANTI

Encoderin 5 tane ucu var. Kendi etiketi üzerinde de yazdığı gibi kahverengi olan +5v besleme, mavi olan GND ucu. Siyah olan  out-A, beyaz olan out-B, turuncu olan out-Z.

arduino-rotary-encoder

arduino uno ile rotary encoder bağlantısı

turuncu olan out-Z ucunu şimdilik kullanmıyoruz. Burada 2.pin ve 3.pine giden out-A ve out-B uçları encoderin dönüş yönünü saymamızı sağlayacak.

 KODLAMA

 Bu konuda iki farklı kod kullandık. Bunlardan birincisi kendi yazdığımız bir koddu fakat doğruluk problemleri oldu. İleri – geri dönüş açılarını okuyabildik ama sıfır noktasına geri geldiğimizde sıfır olmadı. Çok yavaş dönüşlerde problemsizdi ama hızlı çevrimlerde değer kaymaları gördük. Belki encoder markası ile problem olmuştur çünkü benzer bir kodu youtube‘da arduino encoderi ile çalıştırmışlar. Biraz araştırınca bu sorunu interrupt (kesme) işlemi ile çözebileceğimizi öğrendik. Bu konuda biraz bilgim zayıf olduğundan internetten bulduğum hazır bir kodu oynayarak aşağıdaki en yalın hale getirdim. Herhangi bir hassaslık problemi görmedik. Tam nokta atışı çalıştı.

Bu şekilde piyasada rahatlıkla bulunabilen ve endüstriyel amaçla kullanılabilen bir rotary encoderi arduino ile kullanabilirsiniz. Faydalı olması dileğiyle…

5 thoughts on “Arduino Uno ile Rotary Encoder Okuma

  1. mutlu

    merhaba encoder okuyup step motor sürmek için aşağıdaKi kodu kullanıyorum fakat encoder bir tur attığında motor bir tur atmıyor kodlarla bunu hızlandırıp yavaşlatabiliyormuyum acaba teşekkürler

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

    pinMode(Y_ENCODER_PIN_A, INPUT);
    pinMode(Y_ENCODER_PIN_B, INPUT);
    pinMode(FAKE_Y_ENCODER_PIN_A, OUTPUT);
    pinMode(FAKE_Y_ENCODER_PIN_B, OUTPUT);

    digitalWrite(Y_ENCODER_PIN_A, HIGH); //turn pullup resistor on
    digitalWrite(Y_ENCODER_PIN_B, 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, updateYEncoder, CHANGE);
    attachInterrupt(1, updateYEncoder, CHANGE);
    }

    void loop() {
    Serial.println(encoderYValue);
    delay(1000); //just here to slow down the output, and show it will work even during a delay
    }

    void updateYEncoder() {
    int MSB = digitalRead(Y_ENCODER_PIN_A); //MSB = most significant bit
    int LSB = digitalRead(Y_ENCODER_PIN_B); //LSB = least significant bit

    int encoded = (MSB << 1) | LSB; //converting the 2 pin value to single number
    int sum = (lastYEncoded << 2) | encoded; //adding it to the previous encoded value

    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
    encoderYValue ++;
    // Move my motor.
    }
    if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) {
    encoderYValue –;
    // Move my motor.
    }

    digitalWrite(FAKE_Y_ENCODER_PIN_A, MSB);
    digitalWrite(FAKE_Y_ENCODER_PIN_B, LSB);
    lastYEncoded = encoded; //store this value for next time
    }

    Reply
    1. ugokhan Post author

      Encoderden aldığın açı değerini bir katsayı ile çarparak step motorun dönüş oranını ayarlayabilirsin. Misal 0,5 ile çarparsan encoder 10 derece döndüğünde step motor 5 derece döner. Böylece hassasiyet de elde edebilirsin.

      Reply
      1. Mutlu

        Bunun neresine nasıl yapacağımi bilmiyorum yardım edermisiniz bir ornekle

    1. ugokhan Post author

      thanks Dephnne..
      We do not want this. We measure the thermal shrinkage of the yarn. The test area must be dry and hot. For example, we look at the yarn shortening amount at 177 degrees, 2 minutes, 0.05 cN / dtex. sample device

      Reply

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir