Arduino Leonardo direksiyon yapımı: Encoder üçgeni dönmüyor

Affansen

Katılımcı Üye
Katılım
15 Ocak 2021
Mesajlar
501
Puanları
56
İlk başta çalışıyordu. Şimdi yerini değiştirdiğim zaman encoder'ın kablosuna çıplak el ile dokunmazsam çalışmıyor. Üzerimde kardeşime göre daha fazla elektrik var. Multimetre ile ölçtüm. :D

Aynı şekilde ona da dokundurttum ama onda çalışmadı. Sadece ben dokununca çalışıyor.
 
Merhaba,
Arduino Leonardo ve encoder kullanarak yaptığım bir direksiyon setim vardı. Uzun süre sorunsuz çalıştı, kullandım. Daha sonra Leonardo'yu ve encoderi sökerek (sistemi demonte ederek) kaldırdım ve yaklaşık 1 yıl sonra tekrar kurdum.
Problem şu;
Leonardo encoderi okuyamıyor.

253e8acec01e1b2fb8979901018644371a71970f_2_690x399.jpg



Kullandığım encoder 1'di.
Ben bozulduğunu düşündüm ve 2 numaralı encoderi sipariş ettim. Ama o da çalışmadı.
Daha sonra encoder 3'ü bir arkadaşımdan alarak denedim ve çalıştı.

Yani şunu anladım ki, benim devremde veya leonardo yazılımımda herhangi bir sıkıntı yok. Çünkü 3 numaralı encoder ile gayet güzel çalışıyor her şey.

Sonra 1 ve 2 numaralı encoderlerimi başka bir Arduino ve başka bir yazılımla denedim.
Yazılım şu:
---
Volatile unsigned int temp, counter = 0; //Bu değişkenleri encoder hareket ederken ve daha önceki konumu ile karşılaştırmak için kullanacağız

Void setup() {
Serial. Begin (9600);
PinMode(18, INPUT_PULLUP); // Encoderden çıkan yeşil ya da sarı kabloyu Arduino'nun 2. pinine
PinMode(19, INPUT_PULLUP); // Encoderden çıkan yeşil ya da sarıdan hangisikaldıysa kabloyu Arduino'nun 3. pinine

/* Aşağıda "interrupt" dediğimiz bölme, araya girme anlamları olan fonksiyonları tanımlıyoruz burada temel mantık şu;

  • Bu pinlerdeki sinyalde değişiklik olduğu anda işlemci yaptığı işi yarım bırakıp bu pine bağlı fonksiyonu yapıp normal işlemlerine geri dönecek.
  • Bu işlemi yaptırtabilemek için bu pinlere interrupt koyduğumuzu belirten kodu yazıyoruz.
    */
//Burada 2 numaralı pinde sinyal seviyesi yükselidinde "Interrupt_fonksiyonu1" i çalıştır diyoruz
AttachInterrupt(DigitalPinToInterrupt(18), Interrupt_fonksiyonu1, RISING);

//Burada 3 numaralı pinde sinyal seviyesi yükselidinde "Interrupt_fonksiyonu2" i çalıştır diyoruz
AttachInterrupt(DigitalPinToInterrupt(19), Interrupt_fonksiyonu2, RISING);
}

//Yukarıdaki kodda "Interrupt_fonksiyonu1" ve "Interrupt_fonksiyonu2" içerisinde ne olacağını en aşağıda belirledik

Void loop() {
// Aşağıdaki if kodunda elimizdeki "counter" değeri ile kayıtlı olan "temp" değeri aynı mı onu kontrol ediyoruz aynı ise işlem yapmıyoruz fakat farklı
// İse "counter" değerimizi Serial porta yazdırıyoruz ve yeni counter değerimizi "temp" değerine kayıt ediyoruz

İf( counter!= temp ){
Serial. Println (counter);
Temp = counter;
}
}

Void Interrupt_fonksiyonu1() {
// Bu fonksiyon 2 numaralı pinde sinyal değerimiz yükseldiğinde çalışıyor diğer pinin sinyaline bakıp saat yönünde ya da tersine döndüğünü tayin ediyoruz
// Dönüş yönüne göre değeri arttırıp azaltıyoruz
İf(DigitalRead(19)==Low) {
Counter++;
}Else{
Counter--;
}
}

Void Interrupt_fonksiyonu2() {
// Bu fonksiyonda aynı üsteki fonksiyon gibi 3 numaralı pinde sinyal değerimiz yükseldiğinde çalışıyor diğer pinin sinyaline bakıp saat yönünde ya da tersine döndüğünü tayin ediyoruz
// Dönüş yönüne göre değeri arttırıp azaltıyoruz
İf(DigitalRead(18)==Low) {
Counter--;
}Else{
Counter++;
}
}
---

Ve tüm encoderler (her 3'ü de) bu yazılımda çalıştı. Sağa dönüş, sola dönüş sorunsuz çalışıyor.
Yani buradan da şunu anladım ki aslında encoderlerin de tamamı sağlam.

Ama madem hem devrem, hem de encoderlerim sağlam neden 2'si Leonardo'da çalışmıyor da birisi çalışıyor?

Benim göremediğim, kaçırdığım problem ne?

(Bu arada devre şeklimi de ekledim resme. Pin6 ile GND bağlantım vs de var, ki dediğim gibi encoder3 ile her şey çalışıyor.)
Teşekkür ederim :)
 
Merhaba,
Arduino Leonardo ve encoder kullanarak yaptığım bir direksiyon setim vardı. Uzun süre sorunsuz çalıştı, kullandım. Daha sonra Leonardo'yu ve encoderi sökerek (sistemi demonte ederek) kaldırdım ve yaklaşık 1 yıl sonra tekrar kurdum.
Problem şu;
Leonardo encoderi okuyamıyor.

Ekli dosyayı görüntüle 95138


Kullandığım encoder 1'di.
Ben bozulduğunu düşündüm ve 2 numaralı encoderi sipariş ettim. Ama o da çalışmadı.
Daha sonra encoder 3'ü bir arkadaşımdan alarak denedim ve çalıştı.

Yani şunu anladım ki, benim devremde veya leonardo yazılımımda herhangi bir sıkıntı yok. Çünkü 3 numaralı encoder ile gayet güzel çalışıyor her şey.

Sonra 1 ve 2 numaralı encoderlerimi başka bir Arduino ve başka bir yazılımla denedim.
Yazılım şu:
---
Volatile unsigned int temp, counter = 0; //Bu değişkenleri encoder hareket ederken ve daha önceki konumu ile karşılaştırmak için kullanacağız

Void setup() {
Serial. Begin (9600);
PinMode(18, INPUT_PULLUP); // Encoderden çıkan yeşil ya da sarı kabloyu Arduino'nun 2. pinine
PinMode(19, INPUT_PULLUP); // Encoderden çıkan yeşil ya da sarıdan hangisikaldıysa kabloyu Arduino'nun 3. pinine

/* Aşağıda "interrupt" dediğimiz bölme, araya girme anlamları olan fonksiyonları tanımlıyoruz burada temel mantık şu;

  • Bu pinlerdeki sinyalde değişiklik olduğu anda işlemci yaptığı işi yarım bırakıp bu pine bağlı fonksiyonu yapıp normal işlemlerine geri dönecek.
  • Bu işlemi yaptırtabilemek için bu pinlere interrupt koyduğumuzu belirten kodu yazıyoruz.
    */
//Burada 2 numaralı pinde sinyal seviyesi yükselidinde "Interrupt_fonksiyonu1" i çalıştır diyoruz
AttachInterrupt(DigitalPinToInterrupt(18), Interrupt_fonksiyonu1, RISING);

//Burada 3 numaralı pinde sinyal seviyesi yükselidinde "Interrupt_fonksiyonu2" i çalıştır diyoruz
AttachInterrupt(DigitalPinToInterrupt(19), Interrupt_fonksiyonu2, RISING);
}

//Yukarıdaki kodda "Interrupt_fonksiyonu1" ve "Interrupt_fonksiyonu2" içerisinde ne olacağını en aşağıda belirledik

Void loop() {
// Aşağıdaki if kodunda elimizdeki "counter" değeri ile kayıtlı olan "temp" değeri aynı mı onu kontrol ediyoruz aynı ise işlem yapmıyoruz fakat farklı
// İse "counter" değerimizi Serial porta yazdırıyoruz ve yeni counter değerimizi "temp" değerine kayıt ediyoruz

İf( counter!= temp ){
Serial. Println (counter);
Temp = counter;
}
}

Void Interrupt_fonksiyonu1() {
// Bu fonksiyon 2 numaralı pinde sinyal değerimiz yükseldiğinde çalışıyor diğer pinin sinyaline bakıp saat yönünde ya da tersine döndüğünü tayin ediyoruz
// Dönüş yönüne göre değeri arttırıp azaltıyoruz
İf(DigitalRead(19)==Low) {
Counter++;
}Else{
Counter--;
}
}

Void Interrupt_fonksiyonu2() {
// Bu fonksiyonda aynı üsteki fonksiyon gibi 3 numaralı pinde sinyal değerimiz yükseldiğinde çalışıyor diğer pinin sinyaline bakıp saat yönünde ya da tersine döndüğünü tayin ediyoruz
// Dönüş yönüne göre değeri arttırıp azaltıyoruz
İf(DigitalRead(18)==Low) {
Counter--;
}Else{
Counter++;
}
}
---

Ve tüm encoderler (her 3'ü de) bu yazılımda çalıştı. Sağa dönüş, sola dönüş sorunsuz çalışıyor.
Yani buradan da şunu anladım ki aslında encoderlerin de tamamı sağlam.

Ama madem hem devrem, hem de encoderlerim sağlam neden 2'si Leonardo'da çalışmıyor da birisi çalışıyor?

Benim göremediğim, kaçırdığım problem ne?

(Bu arada devre şeklimi de ekledim resme. Pin6 ile GND bağlantım vs de var, ki dediğim gibi encoder3 ile her şey çalışıyor.)
Teşekkür ederim :)
Hatamı buldum. Encoder A ve B uçlarında pull-up direnci olmalı ama ben devrede pull-down tasarlamışım. Düzeltince çalıştı...
 
Güzel Bir çalışma.
Resimlerin ayrıntısı yok.
Daha iyi fotoğraflar eklemeniz ve sakıncası yoksa projeyi payşalmanız mümkün mü?
 

Forum istatistikleri

Konular
127,963
Mesajlar
913,927
Kullanıcılar
449,609
Son üye
cherrywine

Yeni konular

Geri
Üst