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
Last revision Both sides next revision
hardware:arduino [2015/03/04 17:35]
admin
hardware:arduino [2015/03/04 17:57]
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 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.txt · Last modified: 2015/03/04 18:07 by admin