1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Optical Rotary Encoder Index issue

Discussion in 'Programming/Internet' started by Bkukuk62, Oct 8, 2018.

  1. Bkukuk62

    Bkukuk62 Guest

    I have the following code working correctly except for the Index portion. I am not sure if I have the syntax correct for the hardware. The end result I am looking for is to have the encoder reset to 0 degrees every time the index comes around (360 degrees). I am also looking for any comments on the code as I would like the encoder output to be as accurate and efficient as possible.

    Here is the code:

    // Wiring connections for my encoder:
    // Brown : VCC = 5V
    // Blue + Shield : 0V = GND
    // Black : ENCODER0PINA, Pin 20
    // White : ENCODER0PINB, Pin 17
    // Orange : ENCODER0PINI, Pin 19

    #define ENCODER0PINA 20 // this pin needs to support interrupts
    #define ENCODER0PINB 17 // no interrupt required
    #define ENCODER0PINI 19 // this pin needs to support interrupts
    #define CLOCKWISE 1 // direction constant
    #define COUNTER_CLOCKWISE 2 // direction constant

    // variables modified by interrupt handler must be declared as volatile
    volatile long encoder0Position = 0;
    volatile long interruptsReceived = 0;
    volatile byte INTFLAG1 = 0;

    // track last position so we know whether it's worth printing new output
    long previousPosition = 0;

    void setup()
    {

    // inputs
    pinMode(ENCODER0PINA, INPUT_PULLUP);
    pinMode(ENCODER0PINB, INPUT_PULLUP);
    pinMode(ENCODER0PINI, INPUT_PULLUP);

    // interrupts
    attachInterrupt(3, onInterrupt, RISING);
    attachInterrupt(4, onReset, CHANGE);

    // enable diagnostic output
    Serial.begin (9600);
    Serial.println("Ready.");
    }

    void loop()
    {
    // only display position info if has changed
    if (encoder0Position != previousPosition )
    {
    Serial.println(encoder0Position, DEC);

    previousPosition = encoder0Position;
    }
    }

    // interrupt function needs to do as little as possible
    void onInterrupt()
    {
    // read both directional inputs
    int a = digitalRead(ENCODER0PINA);
    int b = digitalRead(ENCODER0PINB);

    if (a == b )
    {
    // b is leading a (counter-clockwise)
    encoder0Position--;
    if (encoder0Position < 0)
    {
    encoder0Position = (encoder0Position + 360);
    }
    }
    else
    {
    // a is leading b (clockwise)
    encoder0Position++;
    if (encoder0Position >= 360)
    {
    encoder0Position = (encoder0Position - 360);
    }
    }

    void onReset()
    {
    // read Index input
    int i = digitalRead(ENCODER0PINI);

    if (i = 1)
    {
    encoder0Position = 0;
    }
    }

    Login To add answer/comment
     

Share This Page