Rotary encoder
  • arkadaşlar aşağıdaki koddan hiçbirşey anlamadım kodu bir yerden kopyalayıp yapıştırdım ve çalışıyor ama bu kısımdaki kodlar ne anlama geliyor öğrenirsem ilerde kendime lazım olcak şekilde düzenleyebilirim.

    struct rotariesdef {
    byte pin1;
    byte pin2;
    int ccwchar;
    int cwchar;
    volatile unsigned char state;
    };
    //{encoder pins,characters press
    rotariesdef rotaries[NUMROTARIES] {
    {0,1,'u','v',}, // encoder connected to pin 0 and 1 middle pin is ground
    {2,3,'w','x',}, // encoder connected to pin 2 and 3 middle pin is ground
    };

    #define DIR_CCW 0x10
    #define DIR_CW 0x20

    #define R_START 0x0
    #define R_CW_FINAL 0x1
    #define R_CW_BEGIN 0x2
    #define R_CW_NEXT 0x3
    #define R_CCW_BEGIN 0x4
    #define R_CCW_FINAL 0x5
    #define R_CCW_NEXT 0x6

    unsigned long loopCount;
    unsigned long startTime;
    String msg;

    const unsigned char ttable[7][4] = {
    // R_START
    {R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START},
    // R_CW_FINAL
    {R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW},
    // R_CW_BEGIN
    {R_CW_NEXT, R_CW_BEGIN, R_START, R_START},
    // R_CW_NEXT
    {R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START},
    // R_CCW_BEGIN
    {R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START},
    // R_CCW_FINAL
    {R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW},
    // R_CCW_NEXT
    {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},
    };

    void rotary_init() {
    for (int i=0;i pinMode(rotaries[i].pin1, INPUT);
    pinMode(rotaries[i].pin2, INPUT);
    #ifdef ENABLE_PULLUPS
    digitalWrite(rotaries[i].pin1, HIGH);
    digitalWrite(rotaries[i].pin2, HIGH);
    #endif
    }

    unsigned char rotary_process(int _i) {
    unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);<br /> rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];
    return (rotaries[_i].state & 0x30);
    }

    void CheckAllEncoders(void) {
    for (int i=0;i unsigned char result = rotary_process(i);
    if (result) {
    Keyboard.write(result == DIR_CCW ? rotaries[i].ccwchar : rotaries[i].cwchar );

    //detects array characters assigned to a specific encoders and blinks led
    // ccw = counter clockwise
    //cw =clock
    // (rotaries[i].ccwchar being used below in the if statement,
    //will call all characters in ccwchar scope.
    if(rotaries[i].ccwchar == 'u'){ // blink led from any rotation
    digitalWrite(ledpinA0,LOW);
    delay(50);
    digitalWrite(ledpinA0,HIGH);
    delay(50);
    }
    if(rotaries[i].ccwchar == 'w'){
    digitalWrite(ledpinA0,LOW);
    delay(50);
    digitalWrite(ledpinA0,HIGH);
    delay(50);
    }


    Rotary ile ilgili kodlar bunlar. Kod çalışıyor ama şu "const unsigned char ttable[7][4] =..." yazan bölüm tam olarak nedir. CCW counterclockwise falan anlamına geliyorda, benim aklıma gelen en iyi tahmin rotary encoderın çalışma prensibi gibi geldi bir nevi kütüphanesi acaba böyle birşey mi? Açıklayacak biri varsa memnun olurum. Aklımda soru işareti kalmasın bilmeden birşeyi kullanmak açıkcası istemiyorum.

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.