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