Arduino Encoder
  • Merhaba,
    Benim bir tane encoderli dc motorum var. 360 derecede 8400 pulse yapıyor. Benim yapmak istediğim ise 180 derece hareket etmesi. Yani kısaca 0 dan 4200 pulse'a kadar gelicek sonra ters yönde dönecek.Bu şekilde 180 derece gidip gelicek. Bunun kodunu bir türlü yazamadım. if else denedim olmadı do while denedim olmadı. Yardım edecebilecek varsa çok sevinirim.
  • interupt ile pin change durumuna bakın , volatile keyword de bir değişken tanımlayın +1 yaptırın.
  • #include < Wire.h>
    #include "Arduino.h"

    Hocam ne demek istediğini inanki anlamadım ama kod bu.


    #define MD22ADDRESS 0x58 // address of md 22 (all mode switches on)
    #define SOFTREG 0x07 // Byte for reading software register
    #define MOTOR1 0x01 // Byte for first motor
    #define MOTOR2 0x02 // Byte for second motor
    #define ACCELLREG 0x03 // Byte to set acelleration
    #define AEncoderInterrupt 0
    #define BEncoderInterrupt 1
    #define EncoderPinA 2 // enkoder 2 ve 3 numaralı pine bağlanacak
    #define EncoderPinB 3
    volatile bool EncoderBSet;
    volatile bool EncoderASet;
    long pozisyon = 0;
    void setup() {
    Serial.begin(115200);
    Wire.begin();
    delay(100);

    pinMode(EncoderPinA, INPUT); // sets pin A as input
    digitalWrite(EncoderPinA, HIGH); // turn on pullup resistors
    pinMode(EncoderPinB, INPUT); // sets pin B as input
    digitalWrite(EncoderPinB, HIGH); // turn on pullup resistors
    attachInterrupt(AEncoderInterrupt, HandleMotorInterruptA, CHANGE);
    attachInterrupt(BEncoderInterrupt, HandleMotorInterruptB, CHANGE);
    setMode();
    }
    void loop(){
    Serial.println(pozisyon);
    delay(10);
    Wire.beginTransmission(MD22ADDRESS); // Set first motor to a speed of 255
    Wire.write(MOTOR1);
    Wire.write(220);
    Wire.endTransmission();
    }

    void setMode(){
    Wire.beginTransmission(MD22ADDRESS); // Set a value of 255 to the acceleration register
    Wire.write(ACCELLREG);
    Wire.write(0xFF);
    Wire.endTransmission();
    }
    void HandleMotorInterruptA()
    {

    if (digitalRead(EncoderPinB) == digitalRead(EncoderPinA))
    {
    if(pozisyon == 0) pozisyon = 8400;
    else pozisyon--;
    }
    else
    {
    if(pozisyon == 8400) pozisyon = 0;
    else pozisyon++;
    }
    }

    void HandleMotorInterruptB()
    {
    if (digitalRead(EncoderPinB) == digitalRead(EncoderPinA))
    {
    if(pozisyon == 8400) pozisyon = 0;
    else pozisyon++;
    }
    else
    {
    if(pozisyon == 0) pozisyon = 8400;
    else pozisyon--;
    }
    }
  • şu 8400 leri 4200 yapıp denedinizmi, birde tam eşit olmayabilir belki pulse kaçırıyordur 4200>=pozisyon gibi bir mantık da işe yarabilir ek olarak
  • 8400'leri 4200 yaptığımda motorun dönüş açısına herhangi bir etkisi olmuyor yine 360 derece dönüyor.Sadece encoder verisi 0 dan 4200 e kadar sayıyor.
  • 8400 pulse enkoder çok hızlı çıkış yapacaktır. Arduino bunu yakalayabilecekmi ? pin change interupta kullansan busefer interuplarda kasılıp kalacakmış gibime geliyor..
    bu kadar hızlı encoder için bence quadrate decoder devreleri yada entegresi kullanman gerekir diye düşünüyorum..

Howdy, Stranger!

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

Login with Facebook

Tagged

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