Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
hardware:arduino [2015/03/04 17:35]
admin
hardware:arduino [2015/03/04 18:07] (current)
admin [Rotary encoders]
Line 19: Line 19:
   * direct attach to two (2) interrupt pins, keyword: passive waiting   * direct attach to two (2) interrupt pins, keyword: passive waiting
   * using external IO with counter, keyword: any time baby, any time :)   * using external IO with counter, keyword: any time baby, any time :)
 +
 +Huge note: dont forget 10k pull up resistors.
  
 ad 1) ad 1)
-The easiest and most straight forward method. The idea is: we are actively ​checking (sample rate) 200x per second (200Hz -> 5ms, T = 1/f) falling edge of pinA+The easiest and most straight forward method. The idea is: we are actively ​detecting ​falling edge of pinA
  
 {{:​hardware:​rotary_encoder_phase.jpg|}} {{:​hardware:​rotary_encoder_phase.jpg|}}
Line 28: Line 30:
  
 <​code>​ <​code>​
-if ((currentTime - loopTime) > 5)){+
     encoder_A = digitalRead(pin_A); ​   // Read encoder pins     encoder_A = digitalRead(pin_A); ​   // Read encoder pins
     encoder_B = digitalRead(pin_B); ​       encoder_B = digitalRead(pin_B); ​  
Line 44: Line 46:
 </​code>​ </​code>​
  
-ad 2) +An example with active checking but only 200x per second. 
 +Sample rate 200x per second (200Hz -> 5ms, T = 1/f). Useful only if you know exactly which rotary encoder you have! Some starts with 24 pulses per revolution, some have 1024. 
 + 
 +<​code>​ 
 +#​define ​ TIMESLOT ​ 5 
 +currentTime = millis(); 
 +if ((currentTime - loopTime) > TIMESLOT)){ 
 +   ​[....some code....] 
 +  lastTime=currentTime;​ 
 +
 +</​code>​ 
 +So you dont have to read it like an idiot 1000000x times  per second.  
 + 
 +ad 2) Using interrupts to read a rotary encoder is a perfect job for interrupts because the interrupt service routine (a function) can be short and quick, because it doesn'​t need to do much.  
 + 
 +<​code>​ 
 +#define encoderPinA ​ 2 
 +#define encoderPinB ​ 4 
 + 
 +volatile int encoderPos = 0; 
 + 
 +void setup() { 
 + ​attachInterrupt(0,​ MyInterrupt,​ CHANGE); 
 +
 + 
 +MyInterrupt() { 
 +if (digitalRead(encoderPinA) == digitalRead(encoderPinB)) { 
 +    encoderPos++;​ 
 +  } else { 
 +    encoderPos--;​ 
 +  } 
 +
 +</​code>​ 
 + 
 +You can print the value **outside** not inside the MyIntterupt() routine, which should be as fast&​small as possible. 
 +<​code>​ 
 +void loop() { 
 +   ​Serial.println (encoderPos,​ DEC); 
 +
 +</​code>​ 
 + 
 +the word //​volatile//​ is **very** important :-). 
 
hardware/arduino.1425486914.txt.gz · Last modified: 2015/03/04 17:35 by admin