8000 GitHub - suapapa/rotary-encoder-embedded: A rotary encoder library for embedded Rust applications
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

suapapa/rotary-encoder-embedded

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

rotary-encoder-embedded

A rotary encoder library for embedded rust applications

rotary encoder

features

modes

The RotaryEncoder can operate in a number of different modes, these modes provide different types of feature sets and are individually gated behind feature flags to keep the binary size to a minimum. The following modes are currently p 6BF0 rovided:

Feature flag Mode Desc.
standard StandardMode Uses a state machine for transitions
angular-velocity AngularVelocityMode Same as standard but with additional angular-velocity calculations

StandardMode example

fn main() -> ! {
    // Configure DT and CLK pins, typically pullup input
    let rotary_dt = gpio_pin_1.into_pull_up_input()
    let rotary_clk = gpio_pin_2.into_pull_up_input();
    // Initialize the rotary encoder
    let mut rotary_encoder = RotaryEncoder::new(
        rotary_dt,
        rotary_clk,
    ).into_standard_mode();
    // ...timer initialize at 900Hz to poll the rotary encoder
    loop {}
}

fn timer_interrupt_handler() {
    // ... get rotary encoder 
    let rotary_encoder = ...
    // Update the encoder, which will compute its direction
    rotary_encoder.update();
    match rotary_encoder.direction() {
        Direction::Clockwise => {
            // Increment some value
        }
        Direction::Anticlockwise => {
            // Decrement some value
        }
        Direction::None => {
            // Do nothing
        }
    }
}

A note about GPIO or Timer interrupt usage

I've experimented a lot with different combinations in order to make Rotary Encoders behave predictably because generally speaking they are fickle at best. From my experimentation I've learnt that using GPIO pin based interrupts generally isn't a good idea because they are more prone to noise and increase the risk of misfires and jumps. Timers on the other hand provide a low pass filtering quality because they don't pick up higher frequency switching that GPIO interrupts do. I have found that using a Timer between 850-1000Hz seems to work best.

About

A rotary encoder library for embedded Rust applications

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 100.0%
0