Encoderli Dc Motor Kontrolü
  • Merhabalar, Makina Mühendisliği son sınıf öğrencisiyim robot kol projesi için encoderli Dc motor aldık ve bunu arduino mega ve motor shield ile kontrol etmek istiyoruz. Encoderli Motorlar hakkında biraz araştırma yaptım artımlı ve mutlak encoder tiplerinin olduğunu gördüm. bizim aldığımız motorda çıkan 5 kablonun 3?ü (Mavi-turuncu-sari) encoder için diger 2 kablo ise Dc motorun güç girisleridir. Turuncu 5V encoder beslemesi, Mavi Toprak, Sarı Encoder Sinyal çıkışıdır. Bu motordan devir sayısını okumak istiyorum nasıl yapacağımı bilmiyorum. Buna benzer bir örnek buldum ama bu 2 kanallılar için olanı. Mutlak encoderli için nasıl devir sayısını okuyabilirim? Yardımlarınız için şimdiden teşekkürler.

    /* Read Quadrature Encoder
    * Connect Encoder to Pins encoder0PinA, encoder0PinB, and +5V.
    */


    int val;
    int encoder0PinA = 3;
    int encoder0PinB = 4;
    int encoder0Pos = 0;
    int encoder0PinALast = LOW;
    int n = LOW;

    void setup() {
    pinMode (encoder0PinA,INPUT);
    pinMode (encoder0PinB,INPUT);
    Serial.begin (9600);
    }

    void loop() {
    n = digitalRead(encoder0PinA);
    if ((encoder0PinALast == LOW) && (n == HIGH)) {
    if (digitalRead(encoder0PinB) == LOW) {
    encoder0Pos--;
    } else {
    encoder0Pos++;
    }
    Serial.print (encoder0Pos);
    Serial.print ("/");
    }
    encoder0PinALast = n;
    }
  • Arduino Forum sayfasına aynı soruyu sordum, bana aşağıdaki arayüzü verdiler. Sinyal kablosunu 2.pine bağladım, motor durunca devir sayısı azalıyor ama sıfır olmuyor neden acaba? Önerisi olan var mı? 2.pin bozulmuş olabilir mi nasıl anlarız.

    volatile unsigned long time = 0;

    const int countsPerRevolution = 4;

    const int rpmCount = 5;
    int rpmArray[rpmCount];
    int rpmIndex = 0;
    int rpmTotal = 0;

    void setup()
    {
    Serial.begin(115200);
    //Digital Pin 2 Set As An Interrupt
    attachInterrupt(0, fan_interrupt, FALLING);

    for (int i=0; i rpmArray[i] = 0;

    Serial.println("Current RPM:");
    }

    //Main Loop To Calculate RPM and Update LCD Display
    void loop()
    {
    int rpm = 0;
    if(time > 0) {
    rpmTotal -= rpmArray[rpmIndex];
    rpmArray[rpmIndex] = 60000000UL/(time * countsPerRevolution);
    rpmTotal += rpmArray[rpmIndex];
    rpmIndex = (rpmIndex+1) % rpmCount;
    rpm = rpmTotal / rpmCount;
    Serial.println(rpm);
    delay(1000);
    }
    }

    //Capture The IR Break-Beam Interrupt
    void fan_interrupt()
    {
    static unsigned long time_last = 0;
    unsigned long now = micros();
    time = (now - time_last);
    time_last = now;
    }
  • enkoder boşta iken enkoder(sarı) çıkışından nasıl bir dalga şekli var? sizin enkoder tek çıkışlı sanırım ozaman motorun her turunda eksiye düşen veya artıya çıkan bir pik olabilir bunları saymanız yeterli ? eğer enkoder çift çıkışlıysa yön bilgiside geliyordur verdiğiniz ilk örnek çalışması lazım. motorun datasheeti inceledinizmi bilgi vardır orada...
  • iyi günler ben enkoderli dc motoru doksan derece döndürmek istiyorum nasıl yapabilirim yardımcı olur musunuz?
  • Mavi-turuncu-sarı , 3 çıkışlı enkoder var ise.

    BELLİ BİR ÇÖZÜNÜRLÜKTE (datasheette yazar) 2 adet kablodan kare dalga çıkar.

    Bunlar genelde tur başına 360 adet pik verir.

    Geriye kalan 1 adet kablodan da her tur bitiminde 1 adet kare dalga alınır.(düzeltme ve doğrulama için) Genelde piyasada bu kablodan rpm'de okunur.

    Ancak diğer her devirde 360 pulse veren (bunlar TTL sinyal dolayısyla arduino'ya uyumu önemli) iki kablo arasında 90 derece FAZ FARKI vardır. Buradan da motorun hangi yöne döndüğü anlaşılır.

    Bakınız: http://en.wikipedia.org/wiki/Rotary_encoder (Incremental rotary encoder)
  • Bir de sonuç olarak dinamik bir sistemden bahsediyoruz. Yani kapalı çevrim kontrol olmadığı için (sadece on/off gibi bir kontrol var) konum kontrolü hassas yapılabilir mi bilemiyorum.
    Sonuçta sistem 90 dereceye gelmeden evvel yavaşlamaya başlamalı. Birden durduğunda konum kontrolü yapılamaz.
    sistemin transfer fonksiyonu bilinmeli (elektro-mekanik sistemdir kendisi :) System Identification yapabilecek varsa yapsın:) ) ve bu fonksiyona uygun geri besleme algoritması kurulmalı.
  • 90 derece dönüş isteniyorsa bu tür kontroller için servo motor icat edilmiş durumda :)
    servo niye kullanılmıyor anlamadım.
  • Öncelikle cevaplar için teşekkür ederim. Sorunu çözdüğümden dolayı cevap yazmadım ama bana ulaşıp soran arkadaşlar için tekrar bilgilendirmek istedim. Motorun özellikleri;
    MODEL: DME34BE50G
    Company: Japan Servo CO LTD.
    Web Site: http://catalog.nidec-servo.com/digital/english/general/b_dme/

    Motor Özellikleri: http://catalog.nidec-servo.com/digital/english/general/pdf/b_dme_ftrs.pdf
    Technical Data: http://catalog.nidec-servo.com/digital/english/general/pdf/b_technical.pdf
    Katalog: http://catalog.nidec-servo.com/digital/english/general/pdf/DME34_4.pdf
    Resim: http://robotus.net/wp-content/uploads/2012/07/japan-servoco-encoder-motor.jpg

    Bu motor katalogda yazdığı gibi bir arttırımlı-incremental veya quadrature encoder değil. Bu yüzden 3 encoder kablosu için A,B ve index Z kanalları yerine sadece tek bir kanaldan gelen kare dalga sinyali bulunmaktadır. Sarı kablo puls, turuncu ve mavi olan besleme ve topraktır. Her ne kadar optik encoder diye belirtilmiş olsada tek kanaldan kare dalga gelmektedir, bu da bizim konum kontrolü yapamayacağımızı göstermektedir. Bu yüzden bu encoder ile yalnızca pulsları saydırarak hız ölçümü yapabildim. Yukarıda sorduğum soru için yaptığım hata arduino karttaki interrupt girişini yanlış belirlemem olmuş. Bunun çözümü için kullanacağınız arduino kartın modeline göre pinlerin numaralarını doğru belirlemeniz gereklidir: http://arduino.cc/en/Reference/AttachInterrupt sayfasında detaylı bilgi bulunmaktadır. En son yazdığım kod ile pulsları okuyabilirsiniz ancak yanlış hatırlamıyorsam rpm olarak okumak için 60s ye bölüyordum. Kurcalayarak bulabilirsiniz ;)

    Encoder uygulaması yapacak arkadaşlara tavsiyem 2 veya 3 kanallı incremental encoder almaları. Mutlak encoder veya bu motor gibilerle vakit kaybetmeyin. Arttırımlı encoderler hem piyasada daha çok hem de kontrol örneklerini daha kolay bulabilirsiniz. Endüstriyel olarak daha çok arttırımlı optik encoderler ile karşılaştım. Aşağıdaki linkte arttırımlı encoderler için güzel bir örnek bulunmaktadır:
    http://www.dfrobot.com/wiki/index.php/12V_DC_Motor_146rpm_w/Encoder(SKU:FIT0277)

    Eğer benim gibi robot kol kontrolü yapmak istiyorsanız RC Servolar ile işe başlamanız. Diğer türlü encoderli DC motorlar ile yalnızca pozisyon ve hız bilgisi aldığınızla kalırsınız. Ancak endüstriyel robotlarda ise DC Sevo motor kullanılır ve tabiki encoderlidir. İleri uygulamalar için encoder önemlidir. Pozisyon bilgisi ile kontrol yapılmaktadır. Her ne kadar forward and inverse kinematic ile kontrol yazılımı yapmak için pozisyon bilgisine ihtiyaç varsada bunu yaptığımız takdirde başka bir sorunla karşılaşıyoruz. İnverse ( ters ) kinematik denklemleri bulduğumuzda yaklaşık 4 adet sonuç denklemi çıkmakta ve bunlardan en az birisi hatalı olmakta. Örnekle açıklamak gerekirse sol kulağımızı sağ elimizle tutmak için kolumuzu sağdan sola doğru başımızın üstünden, başımızın arkasından, başımızın önünden götürerek tutabiliriz ancak kolumuzu gövdemizin içinden geçirip kulağımıza ulaşmak mümkün değil. İşte tam da bu durumu kinematik denklemlerde görebiliyoruz. Hatalı olacak denklemi belirlemek içinde bir algoritma gerekli ve işler karmaşıklaşıyor. Aslında burada tek bir hatalı denklem yok, gidilecek konumuna ve sizin manipulatörünüze göre denklemlerdeki hatalılık değişiyor. Yine örnek vermek gerekirse aynı sağ kolumuz için sol kulağı tutmak yerine bu sefer burnumuzu tutmak isteyelim. Denklemlerimiz aynı ancak bu sefer hem gövdemizden hemde başımızın arkasından konuma ulaşamayacağımız görülecektir. Yani eliminasyon algoritmasi gereklidir. Bu yüzden bu işte eğer yeniyseniz ilk olarak RC servolar ile kontrol etmeye başlamalısınız. Arduino ile bu işlem çok basit ve örnekleri bol miktardadır. Sonra bu işlemi C# veya Processing IDE ile görsel hale getirebilirsiniz. Daha sonra işi biraz daha ileriye taşımak için PID kontrol işlemine geçebilirsiniz. Buradaki sorunu baştan diyim, internette çok fazla gereksiz bilgi olduğundan PID kontrolü tam anlamıyla yapmanız çok zaman alıcı bir süreç. Her ne kadar derste teorisini öğrensemde kendi başınıza devresini ve yazılımını yapmanız çok zahmetli. Tavsiye vermem gerekirse FESTO sitesine bir göz atıp servo motor kontrolü ve PID kontrolcüleri araştırıp hazır almanız.

    Umarım yeni başlayanlar için açıklayıcı bir bilgi olmuştur...
  • Furkan ellerine sağlık çok makbule geçti yazdıkların.

    ben daha sürünmeye çalışan bebek gibiyim henüz sadece temel ihtiyaçlarım için ağlamayı biliyorum ama inşallah zamanla az buçuk bişeyler öğreneceğim sen ve senin gibi gönlü ve aklı zengin insanlar sayesinde.

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Login with Facebook
Açık kaynak kültürü gereği, çözdüğünüz problemlerin çözümlerini paylaşmayı lütfen unutmayın.