logo elektroda
logo elektroda
X
logo elektroda

How to use a pulser (pulse encoder) connected to an Arduino

ghost666 18720 20
ADVERTISEMENT
Treść została przetłumaczona polish » english Zobacz oryginalną wersję tematu
  • How to use a pulser (pulse encoder) connected to an Arduino
    Rotary encoder - pulser - is an excellent input device for controlling e.g. menus in the device interface. In the following tutorial, we will describe how to use a typical pulser in conjunction with the Arduino module.

    Step 1. Watch the movie

    If you do not want to read the entire text below, and the English language is not a problem for you, watch the video below - it will certainly help you understand how to connect the pulser and program the Arduino so that the whole thing works together.





    How to use a pulser (pulse encoder) connected to an Arduino
    Step 2. Introduction

    Such an encoder is an electromechanical device that translates the angular position or rotation of an axis into a digital or analog output signal. There are two types of rotary encoders:

    1) Absolute - The output state of this encoder corresponds exactly to the absolute position of the axis. Thus it is an angle converter.
    2) Incremental - the signals at the output of this encoder correspond to the axis movements, so the position calculated on their basis is relative. Processing these signals into data on position, rotational speed, etc. is always carried out remotely.

    How to use a pulser (pulse encoder) connected to an Arduino
    Step 3. What is an incremental rotary encoder

    The incremental encoder gives information about changing the position and its direction (clockwise and counterclockwise rotation). In many applications this functionality is essential, however, this element does not track the absolute position. Therefore, in some encoder applications, it may be necessary to initialize the encoder by moving it to a known, fixed position.

    How to use a pulser (pulse encoder) connected to an Arduino
    Step 4. Construction and principle of operation

    An exemplary encoder that we will use in the tutorial has all the necessary resistors that pull the I / O lines. This element has five output pins:

    Clock, Data, Switch, Vcc, GND.

    Construction

    The knob we turn is internally connected to the disk inside the encoder. It will move clockwise or counterclockwise, just like the knob that the user turns. On the surface of this disk there are fields connected to the power line. The remainder of the disk is at ground potential. Above the disk there are two contacts shifted relative to each other by a certain distance - these are the outputs of the Clock and Data.

    Principle of operation

    When we turn the encoder, the state of the outputs will change with the position of the disk in the encoder. In such a situation, we can observe sequences of impulses on the Clock and Data outputs.

    If we look at these impulses, we can see that they are out of phase by 90 degrees. If the encoder turns clockwise, the clock output pulses will be first, and if the encoder turns counter-clockwise, the first pulse will be shown at the data output.

    By analyzing the state change on these two outputs, you can immediately judge which direction the encoder knob is turning. Now let's try to implement this analysis programmatically in Arduino.

    Step 5. Software

    Example 1: (Counter.ino)

    Code: C / C++
    Log in, to see the code


    In this example the clock pin is connected to pin 3 and the data pin is connected to pin 4. We have connected a switch to pin 5 which activates when we press the encoder.

    In the above program, we first defined a series of variables and set the pins to which the encoder was connected as input pins. Finally, a serial port was launched, which we will use for communication and data transmission.

    Then the main program loop is started. This is where we read the state of the encoder inputs. The current state is written to the variable state. If state! = State in any iteration, it means the encoder has turned. Then if data! = State it means the encoder turned clockwise and vice versa if the variables are equal. These encoder pulses will increment and decrement the counter accordingly.

    The current counter value is then transferred via the serial interface. If the button is pressed, the counter will be reset and the new value will also be sent via the serial port.

    At the end of the loop, the new state is written to the variable state and the cycle can start all over again.

    Example 2: (LEDBrightness.ino)

    Code: C / C++
    Log in, to see the code


    In this case, being a modification of the first program, the counter value is used to control the brightness of the LED via PWM. The counter value is directed to the analogWrite function instead of the UART interface. You should only limit the value of the counter to a value from 0 to 255, because such values are taken by the variable controlling the PWM filling.

    And that's all you need to easily handle the rotary encoder - the pulser in our device. Do you use such an element in your projects? Show off your implementations and devices, not necessarily based on Arduino modules.

    Source: https://www.instructables.com/id/How-to-Use-an-Rotary-Encoder-With-Arduino/

    Cool? Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
    About Author
    ghost666
    Translator, editor
    Offline 
    ghost666 wrote 11960 posts with rating 10224, helped 157 times. Live in city Warszawa. Been with us since 2003 year.
  • ADVERTISEMENT
  • #2 17346454
    noel200
    Level 27  
    I used the pulser several times. A graceful device. Small, and several functions can be realized on it.
    I only use the rotary.h library
  • ADVERTISEMENT
  • #3 17346461
    Slawek K.
    Level 35  
    With the encoder, the interrupt reading definitely stops, with the extended code in the polling mode (as above) it simply stops working.

    Greetings
  • ADVERTISEMENT
  • #4 17346514
    Anonymous
    Anonymous  
  • #5 17346926
    Paweł Es.
    VIP Meritorious for electroda.pl
    Incremental encoder, this is an incremental encoder in Polish, what did everyone insist on this encoder type?

    The original text is written in Polish as the teacher speaks English ;) , besides, there are errors in it (eg in the names of variables in relation to the program code). It would be preferable for the translator not to translate into a dump, but to make a substantive correction and check whether everything is correct, because yes, his work loses its value and still inexperienced readers are misled.
  • #6 17347035
    Anonymous
    Anonymous  
  • #7 17347091
    Paweł Es.
    VIP Meritorious for electroda.pl
    Double clap, it's probably only with Jan Bielecki ;)

    Let us take care of our native language where possible.

    "- Male overhang - ???
    - Night overhang - ??? "- commercial dictionary? (Aerator with a handle, splash-proof flashlight etc.) ;)
  • #8 17347169
    SylwekK
    Level 32  
    These algorithms from the article, unfortunately, are bad and would turn out to be a fraction of what's below ...
    In my project in C on Atmega32 clocked at 16MHz as of today (because the project is being developed all the time) it supports:
    - 2x 1600imp / rev encoder with a speed of max 15 rev / s,
    - 2x encoder 10imp / rev with vmax 10000 rev / min,
    - 1x encoder 25imp / rev with vmax 1000 rev / min,
    - two programmable independently regulated pulse generators,
    - buttons,
    Plus a lot of math operations, adc reading, lcd buffer support, etc.
    Nothing is lost, nothing is cut, everything counts ... Libraries, of course, their own.
    This is how the device looks and works :)
    How to use a pulser (pulse encoder) connected to an Arduino
    There is a chance that I will describe the whole thing in DIY soon :)
  • ADVERTISEMENT
  • #9 17347235
    simw
    Level 27  
    SylwekK wrote:
    Atmega32 clocked at 16MHz today (because the project is under development all the time)

    I have been using the library from Sylwek for a long time, of course the old one, probably one of the first versions. This is a great piece of code. I also use STM, because why not :)
    I used to try to lose pulses with an optical encoder 365 imp / rev, using some simple gear, but failed :) so in my humble opinion I confirm that it is quite good.
    Sylwek, be sure to publish the latest version, and it's a breeze! :)
  • #10 17347604
    Anonymous
    Level 1  
  • #11 17347642
    SylwekK
    Level 32  
    @ grafan999, nothing more to add :)
  • #12 17347888
    wniedzie
    Level 14  
    This algorithm waits for only one pulser output to be changed ("Clock"). Analyzing both outputs would double the resolution, only then the algorithm would get complicated.
  • #13 17348281
    Rayan19
    Level 10  
    Useful article, thank you :)
  • #14 17348371
    Anonymous
    Anonymous  
  • #15 17348407
    SylwekK
    Level 32  
    nowyARM wrote:
    Amateurs (Aduinists) think so. They don't know what a timer is.

    Can you develop a thought? I am not an Arduiner, I use timer interrupts for reading, not external interrupts, so I do not understand your remark too much.
  • #16 17349266
    Paweł Es.
    VIP Meritorious for electroda.pl
    In professional devices, a preliminary filter is often used to remove the effects of vibration of the rotary encoder contacts, e.g. something like this:

    How to use a pulser (pulse encoder) connected to an Arduino

    The circuit shown above was applied to each encoder in the circuit, and each four encoders were read by the HCT165 parallel-serial register, i.e. by polling. In addition, the device also detected the mere touch of the metallized encoder knob, which resulted in the highlighting of the changed size on the screen.

    Depending on the type of encoder used in the circuit, only the values of the filtering capacitors C1 and C2 (from 1n to 10n) changed.

    I don't know how often these encoders were polled, but probably 20-30 times per second (the encoders were of the 24 pulses per revolution type).
  • #17 17349296
    SylwekK
    Level 32  
    Any system with capacitors at the encoder is lost at the start for me, because it limits the speed of its reading. Maybe in less demanding applications it works well, but certainly not in PROFESSIONAL ones. Often in popular electronics and household appliances you can find an encoder covered with filters, which works properly only with slow rotation. It may even be a well-known and popular company, but there is nothing to say about professionalism.
    I can assure you that you can make a small and relatively quick program that will be great for vibrating contacts ;-)
  • #18 17349654
    Paweł Es.
    VIP Meritorious for electroda.pl
    In particular, there are 40 encoders in the device (for setting various parameters) as in the digital console from which this chip comes. This is not for drives, but for manually rotated encoders. ;)
  • #19 17349805
    SylwekK
    Level 32  
    Nevertheless, handling with capacitors, where the software part is usually neglected, irritates me, because it is enough to wear the encoder a little or a little dirt (which increases the vibrations of the contacts) and it is practically impossible to use it. My algorithm compensates for vibrations in real time and will stop counting when the mechanical damage is really serious.
  • #20 17350615
    Janusz_kk
    Level 39  
    SylwekK wrote:
    My algorithm compensates for vibrations in real time and will stop counting when the mechanical damage is really serious.

    Well, do something for the world and show off this algorithm :)
  • #21 17350670
    Janusz_kk
    Level 39  
    I looked at your links and I did not find it, but I admit that I did not search too intensively, I found the ripples but I am not interested in it because I do not duplicate
    someone's ideas, if I'm already looking for inspiration.

    Added after 1 [minutes]:

    SylwekK wrote:
    I've done it before ... Google blocked you?

    And google is a huge dumpster, I don't have time to rummage there.

Topic summary

The discussion focuses on the use of rotary encoders (also referred to as pulsers) with Arduino for controlling device interfaces. Participants share experiences with different encoder types, emphasizing the importance of using interrupt-driven methods for accurate readings, as polling can lead to missed pulses due to contact bounce. Various libraries, such as rotary.h, are mentioned for implementation. Some users critique the provided examples for lacking robustness, particularly in handling contact vibrations. The conversation also touches on the use of capacitors for filtering, with mixed opinions on their effectiveness in professional applications. Overall, the community shares insights on optimizing encoder performance and programming techniques for reliable operation.
Summary generated by the language model.
ADVERTISEMENT