DC Motor Speed Measurement Using Arduino and Encoder

by sss2022 in Circuits > Arduino

124 Views, 1 Favorites, 0 Comments

DC Motor Speed Measurement Using Arduino and Encoder

20260129_111043 - Copy.jpg

In this project, I present a simple and educational setup to measure the rotational speed of a DC motor using an Arduino and an integrated rotary encoder.

The system is based on a JGB37-520 DC gear motor with an encoder and a mounted wheel. The encoder generates pulses as the motor rotates. By counting these pulses and knowing the encoder resolution, the Arduino calculates the motor’s rotational speed in real time, expressed in revolutions per minute (RPM).

To verify the accuracy of the measurement, the calculated speed is compared with the value obtained from an external tachometer. This comparison allows us to evaluate the precision of the encoder-based measurement and the reliability of the Arduino calculation.

-------------------------------------------------------------------------------------------

Dans ce projet, je présente un montage simple et pédagogique permettant de mesurer la vitesse de rotation d’un moteur à courant continu à l’aide d’une carte Arduino et d’un encodeur rotatif intégré.

Le système est basé sur un moteur à engrenages JGB37-520 équipé d’un encodeur et d’une roue. L’encodeur génère des impulsions à chaque rotation du moteur. En comptant ces impulsions et en connaissant la résolution de l’encodeur, l’Arduino calcule en temps réel la vitesse de rotation du moteur, exprimée en tours par minute (RPM).

Afin de vérifier la précision de la mesure, la vitesse calculée par l’Arduino est comparée à celle mesurée à l’aide d’un tachymètre externe. Cette comparaison permet d’évaluer la fiabilité du calcul ainsi que la précision de la mesure basée sur l’encodeur.

Supplies

-----------------------------------------------------------------------

  1. Arduino Uno development board
  2. USB Type-A to USB Type-B cable
  3. 6V DC motor with wheel and encoder ( JGB37-520)
  4. L298N motor driver module
  5. 2 × 3.7 V 18650 Li-ion batteries
  6. 18650 battery holder
  7. Jumper wires

-----------------------------------------------------------------------

  1. Carte de développement Arduino Uno
  2. Câble USB Type-A vers USB Type-B
  3. Moteur à courant continu 6 V avec roue et encodeur ( JGB37-520)
  4. Module driver de moteurs L298N
  5. 2 piles rechargeables Li-ion 18650 (3,7 V)
  6. Support pour piles 18650
  7. Fils de connexion

----------------------------------------------------------------------

How the Encoder Works? / Comment L'encodeur Fonctionne?

encoder_signals_a_b.png

The JGB37-520 motor is equipped with a built-in incremental encoder mounted at the rear of the motor. This encoder is directly coupled to the motor shaft and allows accurate measurement of its rotation. Inside the encoder, a slotted disc rotates together with the shaft and interrupts an optical sensor, generating electrical pulses on two output channels called A and B. These two signals are phase-shifted by 90 degrees, which makes it possible not only to count the pulses, but also to determine the direction of rotation of the motor. Each pulse corresponds to a small fraction of a motor revolution. By taking into account the number of pulses per revolution and the gearbox reduction ratio of the JGB37-520 motor, the Arduino can calculate the actual rotational speed of the output shaft, expressed in revolutions per minute (RPM).

-------------------------------------------------------------------------------------------

Le moteur JGB37-520 est équipé d’un encodeur incrémental intégré, monté à l’arrière du moteur. Cet encodeur est directement couplé à l’arbre du moteur et permet de mesurer sa rotation avec précision. À l’intérieur, un disque à fentes tourne avec l’axe du moteur et interrompt un capteur optique, ce qui génère des impulsions électriques sur deux sorties appelées canaux A et B. Ces deux signaux sont déphasés de 90°, ce qui permet non seulement de compter le nombre d’impulsions, mais aussi de déterminer le sens de rotation du moteur. Chaque impulsion correspond à une fraction de tour du moteur. En tenant compte du nombre d’impulsions par tour et du rapport de réduction du réducteur du JGB37-520, l’Arduino peut calculer la vitesse de rotation réelle de l’arbre de sortie du moteur, exprimée en tours par minute (RPM).

Calculating Speed in Rpm / Calcul De La Vitesse En Rpm

To measure the rotational speed of the JGB37-520 motor, an incremental encoder mounted on the motor shaft is used. The encoder produces a series of electrical pulses as the motor turns. By counting the number of pulses over a short time interval, the motor speed can be calculated.

The elapsed time between measurements is converted to seconds to ensure correct units. The total number of pulses per revolution of the motor’s output shaft takes into account both the encoder resolution and the gearbox reduction ratio:

CPR_TOTAL=CPR_MOTOR×Gearbox_Ratio

where (CPR_MOTOR) is the number of pulses per motor shaft revolution, and the Gearbox-Ratio is the mechanical reduction of the JGB37-520.

The rotational speed in revolutions per minute (RPM) is then calculated using:

RPM=(ΔP/ΔT)​×(60​/CPR_TOTAL)

where (ΔP) is the number of pulses counted during the measurement interval (ΔT) (in seconds). This formula converts the pulses per second into RPM of the motor’s output shaft, accurately reflecting the real-time rotational speed while considering both encoder resolution and gearbox ratio.

This method allows the measured speed to be compared with an external tachometer to verify precision and reliability.

-------------------------------------------------------------------------------------------

Pour mesurer la vitesse de rotation du moteur JGB37-520, un encodeur incrémental monté sur l’arbre du moteur est utilisé. Cet encodeur génère une série d’impulsions électriques lorsque le moteur tourne. En comptant le nombre d’impulsions sur un court intervalle de temps, il est possible de calculer la vitesse du moteur.

Le temps écoulé entre deux mesures est converti en secondes afin de garantir la cohérence des unités. Le nombre total d’impulsions par tour de l’arbre de sortie du moteur prend en compte à la fois la résolution de l’encodeur et le rapport de réduction du réducteur :

CPR_TOTAL=CPR_MOTOR×Repport_de_réduction

où CPR_MOTOR représente le nombre d’impulsions générées pour un tour de l’arbre moteur, et le rapport de réduction correspond à la réduction mécanique du moteur JGB37-520.

La vitesse de rotation, exprimée en tours par minute (RPM), est alors calculée à l’aide de la formule suivante :

RPM=(ΔP/ΔT)​×(60​/CPR_TOTAL)

où ΔP est le nombre d’impulsions comptées pendant l’intervalle de temps ΔT (en secondes). Cette formule permet de convertir les impulsions par seconde en tours par minute de l’arbre de sortie du moteur, tout en tenant compte de la résolution de l’encodeur et du rapport de réduction.

Cette méthode permet ensuite de comparer la vitesse mesurée avec celle fournie par un tachymètre externe, afin de vérifier la précision et la fiabilité de la mesure.

Encoder Wiring / Câblage De L'encodeur

encodeur.png

Wiring:

  1. M1: Red wire => positive power supply to the motor (+) (reversing the positive and negative terminals of the motor will change the rotation)
  2. M2: White wire => negative power supply to the motor (-) (reversing the positive and negative terminals of the motor will change the rotation)
  3. C1: Yellow wire => First output of the encoder.
  4. C2: Green wire => Second output of the encoder.
  5. 3.3V - 5V: Blue wire => positive power supply to the encoder (+), cannot be wrong
  6. GND: Black wire => negative power supply to the encoder (-), cannot be wrong

-------------------------------------------------------------------------------------------

Câblage :

  1. M1 : Fil rouge => alimentation positive du moteur (+)(changer le positif et le négatif du moteur, la rotation changera)
  2. M2 : Fil blanc => alimentation négative du moteur (-)(changer le positif et le négatif du moteur, la rotation changera)
  3. C1 : Fil jaune => Première sortie de l’encodeur.
  4. C2 : Fil vert => Deuxième sortie de l’encodeur.
  5. 3.3V - 5V : Fil bleu => positif de l'alimentation de l’encodeur (+), ne peut pas être erroné
  6. GND : Fil noir => négatif de l'alimentation de l’encodeur (-), ne peut pas être erroné

Circuit Diagram and Source Code / Schéma Et Code Source

Schéma_moteur_encodeur.png

The schematic was created using Tinkercad and Fritzing, as the L298D module is not available on Tinkercad.

-------------------------------------------------------------------------------------------

Le schéma a été réalisé avec Tinkercad et Fritzing, car le module L298D n’est pas disponible sur Tinkercad.


Low-Pass Filter for Speed Signal / Filtre Passe-bas Pour Le Signal De La Vitesse

low_pass.png

In this project, we used a first-order low-pass filter to smooth the noisy motor speed signal and obtain a more stable measurement. In discrete form, the filter is written as:

y[n]=α y[n−1]+(1−α) x[n]

where y[n] is the filtered speed, x[n] the noisy speed, and the constant α\alphaα is related to the filter time constant tau and the sampling period Ts​ by:

α=tau / (tau+Ts)

This method helps reduce rapid signal variations and provides a more reliable estimate of the motor speed.

-------------------------------------------------------------------------------------------

Dans ce projet, nous avons utilisé un filtre passe-bas du premier ordre pour lisser le signal de vitesse bruité du moteur et ainsi obtenir une mesure plus stable. En version discrète, le filtre s’écrit :

y[n]=α y[n−1]+(1−α) x[n]

y[n] est la vitesse filtrée, x[n] est la vitesse bruitée, et la constante α est reliée à la constante de temps du filtre tau et à la période d’échantillonnage Ts par :

α=tau / (tau+Ts)

cette approche permet d’atténuer les variations rapides du signal et d’obtenir une estimation plus fiable de la vitesse du moteur.

Displaying and Visualizing the DC Motor Speed / Affichage Et Visualisation De La Vitesse Du Moteur DC

The calculated motor speed is displayed using Arduino’s serial communication tools, namely the Serial Monitor and the Serial Plotter.

The Serial Monitor is used to display the numerical values of the motor speed, expressed in revolutions per minute (RPM), in text form. It is useful for checking that the program is running correctly, observing the calculated values in real time, and directly comparing the encoder-based speed with the value measured using an external tachometer.

The Serial Plotter provides a graphical representation of the motor speed as a function of time. It allows an easy visualization of speed variations, helping to identify fluctuations, noise, or instability in the measurements. This graphical display is especially helpful for analyzing the dynamic behavior of the motor and evaluating the quality and consistency of the encoder signal.

-------------------------------------------------------------------------------------------

Les résultats du calcul de la vitesse de rotation sont affichés à l’aide des outils de communication série de l’Arduino, à savoir le Moniteur Série et le Traceur Série.

Le Moniteur Série permet d’afficher les valeurs numériques de la vitesse du moteur, exprimées en tours par minute (RPM), sous forme de texte. Il est particulièrement utile pour vérifier le bon fonctionnement du programme, observer les valeurs calculées en temps réel et comparer directement la vitesse mesurée par l’encodeur avec celle indiquée par le tachymètre externe.

Le Traceur Série, quant à lui, offre une représentation graphique de l’évolution de la vitesse en fonction du temps. Il permet de visualiser facilement les variations de la vitesse du moteur, d’identifier les éventuelles fluctuations, instabilités ou retards de mesure, et d’évaluer la régularité du signal fourni par l’encodeur. Cette visualisation graphique est très utile pour analyser le comportement dynamique du moteur et la qualité du calcul de la vitesse.

Results / Résultats

20260129_113531.jpg
plot_vitesse_encodeur.png

The measured motor speed is very close to the value obtained using the tachometer (around 327 rpm for a duty cycle of 150). This confirms the accuracy of the speed estimation based on the encoder measurements and the implemented processing method. Minor differences may be due to measurement noise and sampling effects.

-------------------------------------------------------------------------------------------

La vitesse du moteur mesurée est très proche de la valeur obtenue à l'aide du tachymètre (au alentours de 327 rpm pour un rapport cyclique de 150). Ceci confirme la précision de l'estimation de la vitesse basée sur les mesures de l'encodeur et la méthode de traitement mise en œuvre. De légères différences peuvent être dues au bruit de mesure et aux effets d'échantillonnage.