Read rotary encoder from Arduino Uno in Simulink

Hello,
I can easily read the counts in Matlab (like this: https://de.mathworks.com/help/supportpkg/arduinoio/ug/control-rotary-encoder-knob.html), but not in Sumulink! Can someone tell me how it is the correct way to read the counts in real-time in Simulink?
Thanks

 Akzeptierte Antwort

Pranav Murali
Pranav Murali am 23 Mär. 2020

0 Stimmen

I understand that you are trying to read the counts from a rotary encoder using Simulink. Although Simulink doesn't have a block to interface a rotary encoder at present, it can possibly be achieved in two ways:
  1. Write your code on MATLAB and import the function as a Simulink block. See how that is done here.
  2. Attach External Interrupt block to pins 2 and 3 to call an Interrupt Service Routine (ISR) function. The ISR will then perform bitwise comparison of the two inputs to increment/decrement the counts.
The idea behind the second approach is to implement the rotaryEncoder function through existing Simulink blocks.

9 Kommentare

Hello Pranav,
  1. I tried to import my Matlab code in Simulink but it cannot get built, because some arduino commands are not supported in Simulink.
  2. The External Interrupt can detect a change from HIGH to LOW, or the opposite, but for some reason it does not support only the LOW or only the HIGH option. I need those for defining clockwise or anticlockwise rotation, otherwise my output keeps just increasing.
Any other idea?
Thanks,
Apostolos
You can use the External Interrupt to call the ISR when the the signal at PIN 2 goes from LOW to HIGH. The ISR will detect the signal at PIN 3 to determine whether the encoder moved clockwise or counterclockwise based on the value. Please check the reference below which explains the working in detail:
With respect to approach 1, the code involves adding a library which I failed to notice earlier. Hence the model is not getting built.
The addition of an arduino library to Simulink is done through a S-function. Developing Simulink Device Driver Blocks: Step-By-Step Guide and Examples explains the process. The file also contains the example of Rotary Encoder.
Can we use the same approach for the discrete system too?
Phan Du
Phan Du am 7 Apr. 2021
Bearbeitet: Phan Du am 7 Apr. 2021
Hi! You can follow the attach file.(Version Matlab 2020a)
@Phan Du Hi, can you give me the block diagram in version R2014a. Thank you. I'm helpless doing this project. I really really appreciate your support. Thank you again <3
@Phan Du Thank you so much. I really really appreciate that. Thank you so much <3
If one doesn't care about the direction of the motor, can one just attach the External Interrupt to call the ISR when the signal at PIN 2 goes from LOW o HIGH?

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (3)

Hasan Falah
Hasan Falah am 30 Jun. 2020

0 Stimmen

Hello friends,
I’m using arduino Due to read incremental rotary encoder by simulink, there is no block in sinulink to do that.
I tried with external interrupt example in matlab 2020a but it is reading only in one direction and just increasing, so it should be readings in clockwise and counterclockwise.
Aslo I tried with encoder S-Function in Device Driver examples but also does not work.
Your help please .....
Thanks

4 Kommentare

hi hasan are you did it that if yes can you help me contact me
fatisoussi735@gmail.com
hi Hasan, did you manage to solve this problem?
if yes can you help ?
I am working with a 2dof helicopter plant, which uses incremental encoders and would like to interface with simulink
yagodeleon27@gmail.com
Hi Yago menezes, If you are able to use it using simulink please send me to harshiljani008@gmail.com
Hello Hasan did you solve this problem? if you did can you send it to me at againstmarz@gmail.com

Melden Sie sich an, um zu kommentieren.

Daniel Velazquez
Daniel Velazquez am 5 Jul. 2021

0 Stimmen

Hi, thanks for the encoder part.
Attached is a preliminary implementation of a PID Speed Controller for a DC motor with encoder.
The circuit is a low side FET to the pin 5 of the ATMEGA (PWM output) and pins 2 and 3 go to the encoders as input.
The PID parameters and scopes are tuneable.
Saludos
Daniel Velazquez

1 Kommentar

Hi, can you give me the block diagram in version R2014a. Thank you. I'm helpless doing this project. I really really appreciate your support. Thank you again

Melden Sie sich an, um zu kommentieren.

Daniel Velazquez
Daniel Velazquez am 6 Aug. 2021

0 Stimmen

Hello Azlin, unfortunately I do not have R2014a but you can easily redraw it in your version from the image attached of the Simulink diagram.
Have fun
Daniel

3 Kommentare

Thank you so anyways <3
mechali omar
mechali omar am 21 Okt. 2021
Bearbeitet: mechali omar am 21 Okt. 2021
Hola, Hello Daniel Velazquez
Thank you for providing these useful files.
May I kindly ask you to provide a small clirification about some blocs in the encoder function.
1- for the gain 60/485. Why we exactly need to choose these values. Are thery related to the encoder type, or they remain valid for any other encoder.
2- for the bloc with gain of 0.1. What is the role of this bloc with exactly 0.1 gain.
3- How to change the sampling time of the S-Function block "Ts".It remains always 0.1 even we have changed it in the workspace.
GRACIAS
Daniel could you explain how we obtain response curve?

Melden Sie sich an, um zu kommentieren.

Kategorien

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by