Tuşlu Rotary Encoder Modül Yapımı

Sayın @Gokrtl Interrupt vasıtasıyla bir Rotary Encoder uygulamasına örnek olmak üzere aşağıdaki kodları hazırladım.
Elimdeki Arduino'dabirkaç sene evvel kendi hazırladığım Rotary Encoder Modülü ile denerken bazı sayı kaçırmalar oldu. Sanırım pek korunaklı bir durumda olmadığından kontaklarının maruz kaldığı haller buna sebep oldu. Ancak yeni bir rotary encoder ile deneyince neredeyse hiç bir hata vermeden çalıştı.
Bununla birlikte Pico için herhangi bir katkıda bulunabileceğimi sanmıyorum, bu konuda sizin deneyimlerinizden istifade etmeye çalışacağım.
Umarım incelemelerinizde faydası olur...

Arduino IDE 1.8.13 Üzerinde Arduino UNO İçin Yazıldı:
 int RE_B = 7; //(DATA Pini Olarak:) Arduino UNO'nun 7. Pinini Rotary Encoder'ın B Pinine Atadık
 int RE_A = 2; //(CLK Pini Olarak:) Arduino UNO'nun 2. Pinini (0 Nolu Yani 1. İnterrupt Pinini) Rotary Encoder'ın A Pinine Atadık
 int RE_Bt = 3; // Arduino UNO'nun 3. Pinini (1 Nolu Yani 2. İnterrupt Pinini) Rotary Encoder'ın Button Pinine Atadık
 int PinB; //PinB RE_B Pininin Durumunu Kaydetmek İçin PinB Değişkenini Tanımladık
 int Sayac1 = 0; //Rotary Encder Buttonu'nun Hareketini Saymak İçin Sayac1 Değişkenini Tanımladık
 int Sayac = 0; //Rotary Encder Dönüş Hareketini Saymak İçin Sayac Değişkenini Tanımladık
 int DebounceSuresi = 100;
 String Yon="Bos"; //Rotary Encder Dönüş Yönünü Belirlemek İçin Yon Değişkenini Tanımladık
 boolean Oldu = 0; //Kesme Meydana Gelip Gelmediği Bilgisini Bazı İşlemlerde Kullanmak Üzere Tutmak İçin "Oldu" Değişkenini Tanımnladık

 void setup() {
   cli();//Kurulum Tamamlanana Kadar Tüm Interrupt'ları Durdurduk
   pinMode (RE_A,INPUT_PULLUP); //RE_A Pinini INPUT ve PULLUP Olarak Ayarladık
   pinMode (RE_B,INPUT_PULLUP); //RE_B Pinini INPUT ve PULLUP Olarak Ayarladık
   pinMode (RE_Bt,INPUT_PULLUP); //RE_Bt Pinini INPUT ve PULLUP Olarak Ayarladık
   attachInterrupt(0, Encoding, FALLING);
    //Arduino UNO 2. Pinine Bağlı 0 Nolu Interrupt'a Encoding Fonksiyonunu Atadık. Kesme Tetiklenince Bu Fonksiyona Dallanacak
    //Pin PULLUP Olarak Ayarlandığı İçin FALLING İle Sinyalin GND'ye Çekildiğinde Kesmenin Aktif Olmasını Ayarladık
   attachInterrupt(1, Bt_Pushed, FALLING);
    //Arduino UNO 3. Pinine Bağlı 1 Nolu Interrupt'a Bt_Pushed Fonksiyonunu Atadık. Kesme Tetiklenince Bu Fonksiyona Dallanacak
    //Pin PULLUP Olarak Ayarlandığı İçin FALLING İle Sinyalin GND'ye Çekildiğinde Kesmenin Aktif Olmasını Ayarladık
   Serial.begin (9600);
//Burada Değişkenlerimizin Taşıdıkları Değerleri Herhangi Bir Kesme Meydana Gelinceye Kadar Gözleyebilmemiz İçin Kontrol Amacıyla Ekrana Yazdırıyoruz
   Serial.print(Yon);
   Serial.print("; Sayac: ");
   Serial.println(Sayac);
   Serial.print("Button: ");
   Serial.println(Sayac1);
   sei();//Kurulum Tamamlandığı İçin Tüm Interrupt'ları Aktive Ettik
 }

void Encoding(){//0 Nolu Interrupt Arduino UNO 2. Pinindeki Sinyalin GND'ye Çekilmesiyle Tetiklendi ve Buraya Dallandı
  cli(); //Bu Interrupt İçindeki İşlemleri Tamamlayana Kadar Yeni bir Interrupt Meydana Gelmemesi İçin Tüm Interrupt'ları Durdurduk
  PinB=digitalRead(RE_B); //Kesme Meydana Geldiği Anda DATA Pini Durumunu Bu Komutla PinB Değişkenine Atadık
    //Rotary Encoder Herbir Tık Hareketinde CLK (Yani A Pini) ve DATA (Yani B Pini) Pinlerini Sıralı Olarak Tetikler.
    //Bu Pinler Tıpkı Binary Sayılar Gibi 0 (LOW) ve 1 (HIGH) Durumlar Aldığı İçin 2 Bitlik/Basamaklı BINARY Bir Sayı Gibi Okunabilir
    //Soldan İlk Bit/Basamak CLK Pini ve Diğer Bit/Basamak DATA Pini Değerini Tutar
    //Pinler PULLUP Olduğu İçin Kesme Öncesi İlk Durumlarının Karşılığı 11 Olacaktır. CLK Pini GND'ye Çekildiğinde Interrupt Tetiklenir
    //Encoder'in SAĞ'a (Saat Yönünde) Dönüşünde:
    /*------------------------------
    0- CLK: 1, DATA: 1 => BINARY: 11 Burası Kesme Meydana Gelmeden Hemen Önceki Durum
    1- CLK: 0, DATA: 1 => BINARY: 01 Burası Kesme Meydana Geldiği Andaki Durum
    2- CLK: 0, DATA: 0 => BINARY: 00
    3- CLK: 1, DATA: 0 => BINARY: 10
    4- CLK: 1, DATA: 1 => BINARY: 11
    --------------------------------*/
    //Şeklindeki Akışla Bir Tık Tamamlanır

    //Encoder'in SOL'a (Saatin Tersi Yönde) Dönüşünde:
    /*------------------------------
    0- CLK: 1, DATA: 1 => BINARY: 11
    1- CLK: 1, DATA: 0 => BINARY: 10 Burası Kesme Meydana Gelmeden Hemen Önceki Durum
    2- CLK: 0, DATA: 0 => BINARY: 00 Burası Kesme Meydana Geldiği Andaki Durum
    3- CLK: 0, DATA: 1 => BINARY: 01
    4- CLK: 1, DATA: 1 => BINARY: 11
    --------------------------------*/
    //Şeklindeki Akışla Bir Tık Tamamlanır
    //Bu Tetikleme Esnasında Pinlerin Birbirbiri İle Olan Durumlarına Göre Dönüş Yönünü Belirlenir.

    //Interrupt, CLK Pininin LOW'a Çekilmesiyle Tetikleneceğinden Yukarıdaki BINARY Verilerden CLK Pininin 0'a Döndüğü Anlar Kesmenin Meydana Geldiği Anlar Olacaktır.
    //***** EĞER Interrupt FALLING Yerine RISING Olarak Yani CLK Pininin LOW'dan HIGH'a (0'dan 1'e) Döndüğünde Tetiklenecek Olsaydı Bu Akışlar Tersine Dönecekti.*****
    //Buna Göre:
    //SAĞ Yönde CLK Pininin 1'den 0'a Dönmesiyle Kesmenin Tetiklendiği 1. Durumda DATA Pininin 1
    //SOL Yönde CLK Pininin 1'den 0'a Dönmesiyle Kesmenin Tetiklendiği 2. Durumda DATA Pininin 0 Değerinde Olduğu Görülecektir.
    //CLK Pininin 1'den 0'a Dönüşü Kesmeyi Tetiklerken DATA Pininin 1 veya 0 Oluşu Dönüş Yönünü Göstermektedir
    //Biz de Aşağıdaki IF-ELSE Yapısı İle DATA Pininin İki Durumunu Karşılaştırarak Dönüş Yönünü Tespit Edecğiz
  if (PinB) {
    Yon="Sag"; //PinB Kesme Anında 1 Durumunda İSE Dönüşün SAĞ Yönde Olduğunu Tespit Ediyoruz
    Sayac++; //PinB Kesme Anında 1 Durumunda İSE Sayac Değişkenini Artırıyoruz
  } else {
    Yon="Sol"; //PinB Kesme Anında 1 Durumunda DEĞİL İSE Dönüşün SOL Yönde Olduğunu Tespit Ediyoruz
    Sayac--; //PinB Kesme Anında 1 Durumunda DEĞİL İSE Sayac Değişkenini Azaltıyoruz
  }
  delay(DebounceSuresi); //Kesmeye Kontrolümüz Dışında Fazla Kesme Meydana Gelmemesi İçin Bir Nevi Yazılımsal Bir DEBOUNCE Uyguluyoruz
  Oldu = 1; //Kesme Olduğu Bilgisini Değişkene Atadık
  sei(); //İşlemler Tamamlandığı İçin Yeni Interrupt Beklemek Üzere Tüm Interrupt'ları Aktive Ettik
}

void Bt_Pushed(){//1 Nolu Interrupt Arduino UNO 3. Pinindeki Sinyalin GND'ye Çekilmesiyle Tetiklendi
  cli(); //Bu Interrupt İçindeki İşlemleri Tamamlayana Kadar Yeni bir Interrupt Meydana Gelmemesi İçin Tüm Interrupt'ları Durdurduk
  Sayac1+=1; //Rotary Encoder Button'u Kullanılarak İle Sayac1 Değişkenini Artırıyoruz
  delay(DebounceSuresi); //Kesmeye Kontrolümüz Dışında Fazla Kesme Meydana Gelmemesi İçin Bir Nevi Yazılımsal Bir DEBOUNCE Uyguluyoruz
  Oldu = 1; //Kesme Olduğu Bilgisini Değişkene Atadık
  sei(); //İşlemleri Tamamlandığı İçin Yeni Interrupt Beklemek Üzere Tüm Interrupt'ları Aktive Ettik
}

void loop() {
  if (Oldu) {//Kesme Oldu İse Verilerimizde Değişiklik Meydana Geleceğinden Verileri Bu Durumda Yazdırıyoruz
              // Böylece Serial Ekrandan Sürekli Bir Akış Nedeniyle Anormallikleri Kaçırmış Olmayacağız
    Serial.print(Yon);
    Serial.print("; Sayac: ");
    Serial.println(Sayac);
    Serial.print("Button: ");
    Serial.println(Sayac1);
    Oldu = 0; //En Son Kesme Nedeniyele Verilerimizde Meydan Gelen Değişikliği Ekrana Yazdık Yeni Bir Değişikliğe Kadar Ekrana
              //Veri Yazmamak İçin Kontrol Değişkenini Değiştiriyoruz
  }
}
Çok teşekkürler. Bu projemde olmasa da diğer projelerimde mutlaka kullanacağım. Sormak istediğim birşey var. Encoder üzerinde pullup dirençler var mı? Kullanırken ona göre hareket edeyim.
 
Çok teşekkürler. Bu projemde olmasa da diğer projelerimde mutlaka kullanacağım. Sormak istediğim birşey var. Encoder üzerinde pullup dirençler var mı? Kullanırken ona göre hareket edeyim.
Evet modülde var. Ancak yukarıda da belirttiğim gibi bazı kaçırmalar yapması üzerine modülün kontaklarından şüphelendiğim için yalın bir tane encoder kullandım onda yoktu. Arduino pinlerinin dahili pullup olması yeterli oluyor sanırım...

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
Abi bakıyorum da bir lise bulamuyorum hangi pinler interupt destekliyor
interrupt şart gibi duruyor. O işi çözmemiz lazım.
Olmazsa phytonda nasıl yapıldığına bakıp oradan birşeyler çıkarabiliriz belki.
 
Burda'da istediğim gibi yok ben datasheet'e gidiyorum

a:
from pyb import Pin, ExtInt

callback = lambda e: print("intr")
ext = ExtInt(Pin('Y1'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)
Elindeki kodu, herhangi bir pinde dene. Belki hangi pini kullanırsan onda kesmeye müsade ediyordur. Yada elşndeki kodun çalıştığına emin olabiliyorsan. Pinleri tek tek dene. Basit bir butonla led yakma devresi kurarak ve sadece pinler arası jumper kablo atlatarak hızlıca test edebilirsin.
 
asıougeufıew.png

Bak abi ne diyor
Hepsi olur usta kafana göre diyor
 
@Gokrtl boşa direnç takmışlar senin encodere.
içinde hem pull-up hem pull-down direnci varmış bunun

73trguhweıofjmwe.png
 
Sen kodu çalışır hale getir, sökeriz dirençleri.
çalışıyorum abi ama bu earlephilhower abimiz tırcı mı gemici mi bilmiyorum buraya yazdığı

int:
attachInterrupt(pin_size_t interruptNum, voidTemplateFuncPtrParam<T> userFunc, PinStatus mode, T& param)

şu en sondaki "T& param" bunun etiketlendiği yere bakınca "struct __container__ " böyle yazmış bunun ne olduğunu anlasam çalıştırcam
 
int:
attachInterrupt(pin_size_t interruptNum, voidTemplateFuncPtrParam<T> userFunc, PinStatus mode, T& param)

şu en sondaki "T& param" bunun etiketlendiği yere bakınca "struct __container__ " böyle yazmış bunun ne olduğunu anlasam çalıştırcam
Benim anladığım bu bir kütüphane. Bunu include etmek lazım. Dışarıda yazılan kod bu kadar uzun olmamalı. Bir example olsa iyi olurdu. Dosyalar arasına bakar mısın keyword gibi bir txt dosyası filan var mı?
 
Benim anladığım bu bir kütüphane. Bunu include etmek lazım. Dışarıda yazılan kod bu kadar uzun olmamalı. Bir example olsa iyi olurdu. Dosyalar arasına bakar mısın keyword gibi bir txt dosyası filan var mı?
abi bunlar core'ye include olmuş şekilde geliyor.
örnek kullanım olarak emin olmamak birlikte şöyle kullanıyoruz
asdsa:
attachInterrupt(0, kesme , LOW, T&?????????? param)
ŞU T& param yerine ne yazıcaz bulsam çalıştırdım da bulamıyom
 
abi bunlar core'ye include olmuş şekilde geliyor.
örnek kullanım olarak emin olmamak birlikte şöyle kullanıyoruz
asdsa:
attachInterrupt(0, kesme , LOW, T&?????????? param)
ŞU T& param yerine ne yazıcaz bulsam çalıştırdım da bulamıyom
Anladım. Yinede dosyalar arasına bir bak. Keyword dosyası varsa oradan örnek kullanım çıkabilir.
 

Forum istatistikleri

Konular
6,168
Mesajlar
105,287
Üyeler
2,564
Son üye
Levcho

Son kaynaklar

Son profil mesajları

hakan8470 wrote on Dede's profile.
1717172721760.png
Dedecim bu gul mu karanfil mi? Gerci ne farkeder onu da anlamam. Gerci bunun anlamini da bilmem :gulus2:
Lyewor_ wrote on hakan8470's profile.
Takip edilmeye başlanmışım :D ❤️
Merhaba elektronik tutsakları...
Lyewor_ wrote on taydin's profile.
Merhabalar. Elektrik laboratuvarınız varsa bunun hakkında bir konunuz var mı acaba? Sizin laboratuvarınızı merak ettim de :)
Lyewor_ wrote on taydin's profile.
Merhabalar forumda yeniyim! Bir sorum olacaktı lcr meterler hakkında. Hem bobini ölçen hemde bobin direnci ölçen bir lcr meter var mı acaba?
Back
Top