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

Evet bende araştırırken noInterrupts() ve interrupts() fonksiyonlarını bulup denedim ama bu seferde hem pico kilitleniyor hemde ide.
ideyi çarpıdan kapatamıyorum bile. Taaki pikonun gücünü kesene kadar.
noInterrupts() ve sei() olarak bir deneyin bence. Çünkü önceki gönderide "cli() was not declared" uyarısı almıştınız. Belki bu son kullanımınızda da interrupts() kodu bu olumsuz sonuca yol açmış olabilir...

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
noInterrupts() ve sei() olarak bir deneyin bence. Çünkü önceki gönderide "cli() was not declared" uyarısı almıştınız. Belki bu son kullanımınızda da interrupts() kodu bu olumsuz sonuca yol açmış olabilir...

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
sei()'de denedim aynı uyarıyı veriyor. Zaten yazınca renkli yapmadığı için tanınmadığı anlaşılıyor.
Sizce şu kullanım biçimi doğru mu? Bu şekilde yapınca kilitleniyor cihaz.

C++:
void encoder() {
  noInterrupts();
  boolean PinDT = digitalRead(PinDt);
  //if (millis() - oncekiZaman > 1) {
        if (PinDT == HIGH) {
          sayac++;
          Serial.print(sayac);
          Serial.println(" : sag");
        } else {
          sayac--;
          Serial.print(sayac);
          Serial.println(" : sol");
        }
   // oncekiZaman = millis();
  //}
  delay(10);
 interrupts();
}
 
sei()'de denedim aynı uyarıyı veriyor. Zaten yazınca renkli yapmadığı için tanınmadığı anlaşılıyor.
Sizce şu kullanım biçimi doğru mu? Bu şekilde yapınca kilitleniyor cihaz.

C++:
void encoder() {
noInterrupts();
boolean PinDT = digitalRead(PinDt);
//if (millis() - oncekiZaman > 1) {
if (PinDT == HIGH) {
sayac++;
Serial.print(sayac);
Serial.println(" : sag");
} else {
sayac--;
Serial.print(sayac);
Serial.println(" : sol");
}
// oncekiZaman = millis();
//}
delay(10);
interrupts();
}
Burada problem yok... Anlaşılan başka bir komut ile yapılıyor.

Burada kısaca değinmiş interrupts() ve noInterrupts() kodlarına...
Sanırım pico altyapısı ile uyuşmazlık çıkarıyor bu kodlar...


Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
sei()'de denedim aynı uyarıyı veriyor. Zaten yazınca renkli yapmadığı için tanınmadığı anlaşılıyor.
Sizce şu kullanım biçimi doğru mu? Bu şekilde yapınca kilitleniyor cihaz.

C++:
void encoder() {
  noInterrupts();
  boolean PinDT = digitalRead(PinDt);
  //if (millis() - oncekiZaman > 1) {
        if (PinDT == HIGH) {
          sayac++;
          Serial.print(sayac);
          Serial.println(" : sag");
        } else {
          sayac--;
          Serial.print(sayac);
          Serial.println(" : sol");
        }
   // oncekiZaman = millis();
  //}
  delay(10);
 interrupts();
}
earlephilhower abime telefon edeyim eklesin hemen
 
@Gokrtl abi bu pico yani rp2040 çok nazlı bir işlemci ben arduino kartıma 12 volt vermiştim yanlışlıkla dijital girişten hiiç bilgisayarda donma kilitlenme vs. olmamıştı bu rp2040'a ne yapsan hemen bağırtıyor bilgisayarı
 
finalde yine ben yaptim abi bir endüstriyel proje bakıyorum şimdi birde picoyu sahada görelim.
evde kimi koysan güzel çalışıyor
Arduino'da, main loop içerisinde herhangi bir kesmeye maruz kalmadan çalıştırılması gereken kritik kodlar noInterrupt() ve interrupts() arasında yazılıyor. Bu iki kodu kullanmadan programınızı çalıştırmayı dener misiniz sayın @Gokrtl...



Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
Arduino'da, main loop içerisinde herhangi bir kesmeye maruz kalmadan çalıştırılması gereken kritik kodlar noInterrupt() ve interrupts() arasında yazılıyor. Bu iki kodu kullanmadan programınızı çalıştırmayı dener misiniz sayın @Gokrtl...



Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
Bunları kullanmadan kodlar çalışıyor.
Bizim amacımız millis() ; fonksiyonunu kaldırmak ve bu kesme çalışırken diğer kesmeleri kapatmaktı.
 
Bunları kullanmadan kodlar çalışıyor.
Bizim amacımız millis() ; fonksiyonunu kaldırmak ve bu kesme çalışırken diğer kesmeleri kapatmaktı.
Evet öyle yapmıştık, kodlar şimdi sağlıklı çalışıyor mu bari?

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
 
Evet öyle yapmıştık, kodlar şimdi sağlıklı çalışıyor mu bari?

Redmi Note 8 Pro cihazımdan Tapatalk kullanılarak gönderildi
Bir tutarsızlık var. Bazen kusursuz çalışıyor, bazen daha elimi değmeden atlıyor, bazen takılı kalıp sonsuza dek sayı artırıyor, bazen de 2 ekleyip 1 çıkaryor gibi çok tutarsız hareketleri var. Kodun son hali resimde. Millis yerine delay() da denedim sonuç değişmedi. Kablolardamı bir sorun var tam anlayamadım durumu. Resimdeki sayılar tek yöne çevirirken oluşuyor.

encoder.png
 
Bir tutarsızlık var. Bazen kusursuz çalışıyor, bazen daha elimi değmeden atlıyor, bazen takılı kalıp sonsuza dek sayı artırıyor, bazen de 2 ekleyip 1 çıkaryor gibi çok tutarsız hareketleri var. Kodun son hali resimde. Millis yerine delay() da denedim sonuç değişmedi. Kablolardamı bir sorun var tam anlayamadım durumu. Resimdeki sayılar tek yöne çevirirken oluşuyor.

16581 eklentisine bak
abi neden boolen kullanıyorsun direkt girişi sorgula.
sayac++ yerine sayac = sayac +1 yapsak acaba bir değişim olur mu
 
Önce basit bir programla interrupt olayını anlamaya çalışman lazım. Yoksa asıl işi yapacak program içinde olayı anlamaya çalışırsan bir sürü dikkat dağıtıcı şey araya girer yanıltır.

Bir de zaman farkını anlamak için millis fonksiyonunu öyle kullanmamak lazım. millis 50 gün içinde taşar. Onun yerine şöyle bir yapı kullanman lazım:

C++:
fark = labs(millis() - onceki_zaman);
 
Önce basit bir programla interrupt olayını anlamaya çalışman lazım. Yoksa asıl işi yapacak program içinde olayı anlamaya çalışırsan bir sürü dikkat dağıtıcı şey araya girer yanıltır.
interrupt olayını anladım gibi. Encoderi kullandığımda her halukarda değişkene bir sayı atayacak ve ben o değişkeni istediğim yerde çağırıp işleme tabi tutacağım. Bu sayede encoder tam bağımsız olarak çalışmış olacak. Yeri gelecek voltajı artıracak, yeri gelecek menüde gezinmek için seçenekleri dolaşacak. Böylesi bana mantıklı geldi.

Bir de zaman farkını anlamak için millis fonksiyonunu öyle kullanmamak lazım. millis 50 gün içinde taşar. Onun yerine şöyle bir yapı kullanman lazım:

C++:
fark = labs(millis() - onceki_zaman);
Güç kesilince millis sıfırlanıyor diye biliyorum. Bende cihazı en fazla birkaç saat kullanacağım için sıkıntı olmaz herhalde.
Önerdiğin kodu deneyeceğim. Ama önce bakayım bu labs neyin nesiymiş?
Herhalde kodu böyle kullanınca da if(fark > 5){ işlem yap } gibi bir kullanımı olacak değil mi?
 
interrupt olayını anladım gibi. Encoderi kullandığımda her halukarda değişkene bir sayı atayacak ve ben o değişkeni istediğim yerde çağırıp işleme tabi tutacağım. Bu sayede encoder tam bağımsız olarak çalışmış olacak. Yeri gelecek voltajı artıracak, yeri gelecek menüde gezinmek için seçenekleri dolaşacak. Böylesi bana mantıklı geldi.


Güç kesilince millis sıfırlanıyor diye biliyorum. Bende cihazı en fazla birkaç saat kullanacağım için sıkıntı olmaz herhalde.
Önerdiğin kodu deneyeceğim. Ama önce bakayım bu labs neyin nesiymiş?
Herhalde kodu böyle kullanınca da if(fark > 5){ işlem yap } gibi bir kullanımı olacak değil mi?
labs komutu @taydin abiye özel sanırım arattığımda birşey bulamıyorum.

hee buldum ya

eee.png
 
Bir tutarsızlık var. Bazen kusursuz çalışıyor, bazen daha elimi değmeden atlıyor, bazen takılı kalıp sonsuza dek sayı artırıyor, bazen de 2 ekleyip 1 çıkaryor gibi çok tutarsız hareketleri var. Kodun son hali resimde. Millis yerine delay() da denedim sonuç değişmedi. Kablolardamı bir sorun var tam anlayamadım durumu. Resimdeki sayılar tek yöne çevirirken oluşuyor.
Sayın @Gokrtl,
Bahsettiğiniz problemleri sırasıyla değerlendirerek neden kaynaklandığını anlamalıyız.
1- "Bazen elimi değmeden atlıyor" dediğinize göre (bu ifadeniz eğer mecazi bir kullanım değilse) sayaç değişmesinin tek anlamı var: Elinizin elektrik yükünden etkilenecek derecede devrenin enterferansa açık oluşu. Bunu, yaptığınız modülü inceleyerek aşmak gerekecek.
2- Birinci şıkla ilgili problem yok ise Pico üzerindeki interrupt pininin istikrarsız değişimi sonucu kesme gerçekleşerek encoder fonksiyonuna dallanma meydana gelmektedir. "bazen takılı kalıp sonsuza dek sayı artırıyor, bazen de 2 ekleyip 1 çıkaryor" ifadeniz, encoder fonksiyonu içerisinde kurduğunuz if-else yapısı ile kontrol edilen değişkenlerin, encoderdeki bir harekete bağlı olmadan gerçekleştiğini göstermekte. Bu durumda Pico'ya ait interrupt pininin doğru şekilde pull-up veya pull-down yapılıp yapılmadığını anlamak gerekiyor.
Bende herhangi bir sorun olmadan çalışmaya devam eden kod bloğunu yorumlar çıkarılmış halde yeniden paylaşıyorum...
Daha önce de dediğim gibi cli() ve sei() ile hiçbir problem yaşamadan üstelik Arduino UNO'nun interrupt pinlerinin pull-up yapılmasına binaen rotary encoder'ı yalın olarak kullandığım halde bu kod bende problemsiz çalışmakta.

Arduino IDE 1.8.13 Üzerinde Arduino UNO İçin Yazıldı:
 int RE_B = 7;
 int RE_A = 2;
 int RE_Bt = 3;
 int PinB;
 int Sayac1 = 0;
 int Sayac = 0;
 int DebounceSuresi = 100;
 String Yon="Bos";
 boolean Oldu = 0;

 void setup() {
   cli();
   pinMode (RE_A,INPUT_PULLUP);
   pinMode (RE_B,INPUT_PULLUP);
   pinMode (RE_Bt,INPUT_PULLUP);
   attachInterrupt(0, Encoding, FALLING);
   attachInterrupt(1, Bt_Pushed, FALLING);
   Serial.begin (9600);
   Serial.print(Yon);
   Serial.print("; Sayac: ");
   Serial.println(Sayac);
   Serial.print("Button: ");
   Serial.println(Sayac1);
   sei();
 }

void Encoding(){
  cli();
  PinB=digitalRead(RE_B);
  if (PinB) {
    Yon="Sag";
    Sayac++;
  } else {
    Yon="Sol";
    Sayac--;
  }
  delay(DebounceSuresi);
  Oldu = 1;
  sei();
}

void Bt_Pushed(){
  cli();
  Sayac1+=1;
  delay(DebounceSuresi);
  Oldu = 1;
  sei();
}

void loop() {
  if (Oldu) {
    Serial.print(Yon);
    Serial.print("; Sayac: ");
    Serial.println(Sayac);
    Serial.print("Button: ");
    Serial.println(Sayac1);
    Oldu = 0;
  }
}
 
Sayın @Gokrtl,
Bahsettiğiniz problemleri sırasıyla değerlendirerek neden kaynaklandığını anlamalıyız.
1- "Bazen elimi değmeden atlıyor" dediğinize göre (bu ifadeniz eğer mecazi bir kullanım değilse) sayaç değişmesinin tek anlamı var: Elinizin elektrik yükünden etkilenecek derecede devrenin enterferansa açık oluşu. Bunu, yaptığınız modülü inceleyerek aşmak gerekecek.
2- Birinci şıkla ilgili problem yok ise Pico üzerindeki interrupt pininin istikrarsız değişimi sonucu kesme gerçekleşerek encoder fonksiyonuna dallanma meydana gelmektedir. "bazen takılı kalıp sonsuza dek sayı artırıyor, bazen de 2 ekleyip 1 çıkaryor" ifadeniz, encoder fonksiyonu içerisinde kurduğunuz if-else yapısı ile kontrol edilen değişkenlerin, encoderdeki bir harekete bağlı olmadan gerçekleştiğini göstermekte. Bu durumda Pico'ya ait interrupt pininin doğru şekilde pull-up veya pull-down yapılıp yapılmadığını anlamak gerekiyor.
Bende herhangi bir sorun olmadan çalışmaya devam eden kod bloğunu yorumlar çıkarılmış halde yeniden paylaşıyorum...
Daha önce de dediğim gibi cli() ve sei() ile hiçbir problem yaşamadan üstelik Arduino UNO'nun interrupt pinlerinin pull-up yapılmasına binaen rotary encoder'ı yalın olarak kullandığım halde bu kod bende problemsiz çalışmakta.

Arduino IDE 1.8.13 Üzerinde Arduino UNO İçin Yazıldı:
 int RE_B = 7;
 int RE_A = 2;
 int RE_Bt = 3;
 int PinB;
 int Sayac1 = 0;
 int Sayac = 0;
 int DebounceSuresi = 100;
 String Yon="Bos";
 boolean Oldu = 0;

 void setup() {
   cli();
   pinMode (RE_A,INPUT_PULLUP);
   pinMode (RE_B,INPUT_PULLUP);
   pinMode (RE_Bt,INPUT_PULLUP);
   attachInterrupt(0, Encoding, FALLING);
   attachInterrupt(1, Bt_Pushed, FALLING);
   Serial.begin (9600);
   Serial.print(Yon);
   Serial.print("; Sayac: ");
   Serial.println(Sayac);
   Serial.print("Button: ");
   Serial.println(Sayac1);
   sei();
 }

void Encoding(){
  cli();
  PinB=digitalRead(RE_B);
  if (PinB) {
    Yon="Sag";
    Sayac++;
  } else {
    Yon="Sol";
    Sayac--;
  }
  delay(DebounceSuresi);
  Oldu = 1;
  sei();
}

void Bt_Pushed(){
  cli();
  Sayac1+=1;
  delay(DebounceSuresi);
  Oldu = 1;
  sei();
}

void loop() {
  if (Oldu) {
    Serial.print(Yon);
    Serial.print("; Sayac: ");
    Serial.println(Sayac);
    Serial.print("Button: ");
    Serial.println(Sayac1);
    Oldu = 0;
  }
}
Benim enkoder üzerinde pullup dirençleri ve 100nF smd kondansatörler var. Onları söküp piconun pullup olayını yapmayı deneyeceğim.
 

Çevrimiçi personel

Forum istatistikleri

Konular
6,004
Mesajlar
102,470
Üyeler
2,525
Son üye
Emretrk

Son kaynaklar

Son profil mesajları

deneyci wrote on hakan8470's profile.
Sibonge uNkulunkulu ngokuhlukahluka asinike kona.

Bu hangi dil? :)
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?
gruptaki arkadaşlara selamlar. sıteyi bu gün fark ettim. Asansör için 2x7 segment LCD gösterge üretmek istiyorum. acaba bu sayfadaki arkadaşlardan destek alabilirmiyim. LCD nin mantık açılımı ektedir.
deneyci wrote on TA3UIS's profile.
Selam.
Amatör telsiz lisansı nasıl alınıyor?
Lisansı olmayanı forumlarına almıyorlar. :)
Bilgi alamıyoruz.
Back
Top