Arduino #1: Fader motorisé 6


Longtemps réservés aux consoles de mixage audio professionnelles, les faders motorisés se sont démocratisés dans les années 2000 grâce à l’apparition de contrôleurs MIDI abordables intégrant ces dispositifs, à l’image de la BCF 2000 de Behringer qui fut jadis ma première interface MIDI.

La BCF2000 de Behringer, première interface MIDI abordable intégrant des faders motorisés.

La BCF2000 de Behringer, première interface MIDI abordable intégrant des faders motorisés.

 

L’utilité de ces dispositifs s’est considérablement accrue proportionnellement au développement de stations de travail audio-numériques ou « DAW » (Digital Audio Workstation) toujours plus puissantes à l’instar d’Ableton Live, Reason, et autres Cubase. En effet, ces studios virtuels reposent notamment sur le principe de l’automation: l’enregistrement et la reproduction automatique des mouvements (donc de variations de paramètres) d’un ensemble de commandes (volume, panning, effets, etc). Cette fonctionnalité essentielle se trouve limitée face aux surfaces de contrôles classiques qui resteront immobiles durant la lecture d’une composition malgré les multiples variations des paramètres contrôlés.

Visualisation d'automations diverses sous Ableton Live.

Visualisation d’automations diverses sous Ableton Live.

 

C’est ainsi qu’après avoir découvert la plateforme de prototypage électronique Arduino, je me suis rapidement mis en tête d’étudier et tenter de mettre en place l’asservissement d’un fader motorisé pour mieux comprendre son fonctionnement. Cet article qui résumera les recherches et les travaux effectués sera composé de trois parties: la première se concentre sur le fader motorisé utilisé et sur ses caractéristiques généraux. La deuxième partie présentera l’extension moteur utilisée pour faciliter l’utilisation du fader motorisé à partir d’un microcontrôleur Arduino. Enfin, la dernière partie rendra compte du fonctionnement final, à travers le montage électronique et le code de programmation mis au point.

 


Étude d’un fader motorisé

Présentation

Le potentiomètre linéaire motorisé étudié dans la suite est un PSM01-082A-103B2 de Bourns Pro Audio

Le potentiomètre PSM01-082A-103B2, un fader motorisé linéaire.

Le potentiomètre PSM01-082A-103B2, fader motorisé linéaire.

 

Choisit notamment pour son fonctionnement linéaire et son prix abordable, il permet de mesurer des variations de tension proportionnelles aux variations de position du curseur. Le fonctionnement de ce capteur est ainsi régit par une simple équation mathématique de type: y = ax + b

: Tension (en % de la tension fournie aux bornes du curseur).
: Coefficient directeur.
: Variations de position (en % de placement par rapport aux extremums).
: Ordonnée à l’origine, nulle dans notre cas.

Courbe caractéristique du fader étudié.

Courbe caractéristique du fader étudié.

 

Fonctionnement et intégration électronique

Le moteur intégré est un moteur à courant continu, transformant l’énergie électrique en énergie mécanique de rotation dans un sens ou dans l’autre à une certaine vitesse, en fonction de la tension appliquée à ses bornes. Le sens de rotation et la vitesse appliquée permettent de piloter la course du curseur. Ces paramètres sont contrôlés via les bornes (+) et (-) du moteur grâce à l’extension moteur, dite « Motor Shield ». Il s’agit d’une plateforme électronique disposant de l’électronique d’adaptation, d’intégration et de protection nécessaire pour permettre un contrôle aisé du moteur à partir de l’Arduino.

Le fader étudié dispose de deux connectiques dites « Snap-In ». La première intègre les bornes (+) et (-) du moteur à courant continu (permettant le contrôle en position et en vitesse du curseur grâce au Motor Shield), tandis que la deuxième intègre sept broches pour les différentes fonctionnalités du modèle.

Schéma de la connectique complète, et de ses fonctionnalités.

Schéma de la connectique complète, et de ses fonctionnalités.

 

Le contrôle du Moteur est géré grâce à la tension fournit aux bornes de ce dernier, modulé par le Motor Shield, lui même contrôlé par l’Arduino.

Le Servo Track et le Line Track ont un fonctionnement similaire à celui d’un potentiomètre classique. Dans la suite, nous n’utiliserons que le Line Track, suffisant pour mettre en place notre asservissement. Ce dernier transmet une tension proportionnelle à la position du curseur, entre 0 et 5V. Cette tension est ensuite traitée par l’Arduino qui la numérise en signal de 10 bits (entre 0 et 1023).

Enfin, le Touch Sens Track permet de définir si le curseur est en train d’être manipulé. Cette fonctionnalité repose sur le principe du tactile capacitif, abordé dans la suite.

 


Fonctionnement d’une extension moteur Arduino « Motor Shield »

Contraintes du moteur électrique

L’intégration et le contrôle électronique d’un moteur nécessitent de respecter un certain nombre de contraintes, à commencer par la séparation de l’électronique de puissance de l’électronique de contrôle à l’aide d’interfaces de puissance (des transistors de type Mosfet le plus souvent). Le moteur étant un dispositif réversible (il transforme l’énergie électrique en énergie mécanique rotative, mais il peut également faire l’inverse), il est également indispensable de protéger l’électronique de surtensions dangereuse produites lorsqu’un moteur tourne à vide, grâce notamment à l’ajout de diodes « de roue libre ».

Animation d’un moteur à courant continu en fonctionnement.

 

Contrôle de la vitesse et du sens de rotation du moteur électrique

La vitesse de rotation d’un moteur à courant continu dépend directement de la tension d’alimentation appliquée. Plus la tension à ses bornes est élevée, plus son axe tournera rapidement (dans la limite de ses caractéristiques). Pourtant, le microcontrôleur Arduino n’est capable de produire que des tensions de 0, OU 5V. La PWM, signal caractéristique de 8 bits (entre 0 et 255) générant une tension par impulsions plus ou moins longues, permet d’obtenir des tensions moyennes variables entre 0 et 5V et offre un contrôle précis de la vitesse de rotation du moteur. Finalement, lorsque la PWM est faible (des impulsions courtes à 5V), la tension moyenne l’est également et le moteur tourne doucement. Inversement, lorsque la PWM est élevé (impulsions longues à 5V), la tension moyenne s’approche des 5V et le moteur tourne rapidement.

Principe de fonctionnement d'un signal PWM.

Principe de fonctionnement d’un signal PWM.

 

La rotation de l’axe du moteur à courant continu dépend du sens du courant qui le traverse. En effet, le moteur change de sens de rotation en même temps que le courant à ses bornes. Le dispositif du « pont en H » qui contient quatre transistors dirige le courant dans un sens ou dans l’autre à travers le moteur, impliquant un sens de rotation plutôt qu’un autre, comme on peut le voir sur le schéma ci-dessous:

Grâce au pont en H, les deux sens de propagation électrique induisent deux sens de rotations opposés.

 

Ainsi un montage électronique adéquat est nécessaire pour pouvoir contrôler n’importe quel moteur à courant continu, en modulant sa vitesse et son sens de rotation, tout en le protégeant.

Les cartes d’extensions moteur « Motor Shield »

À l’heure actuelle, différents composants intègrent pont en H et diodes de roue libre et permettent une séparation aisée entre alimentation logique, et alimentation de puissance. Ces composants sont le plus souvent intégrés au sein de cartes d’extensions pour Arduino permettant de manipuler et utiliser rapidement des moteurs à courant continus. Ainsi, le contrôle d’un moteur ne nécessite plus qu’une source d’alimentation de puissance et de contrôle (pour la carte Arduino et la partie logique du Motor Shield) pour être ensuite contrôlé logiciellement grâce à l’Arduino. Il existe de nombreux modèles inspiré de l’extension Arduino officielle, j’utilise dans la suite un modèle proche, le Dual DC Motor Shield de Microbot.

Motor Shield pour plateforme Arduino « Dual DC Motor Shield ».

 

On a pu le voir, les Motor Shields disposent de l’électronique permettant un contrôle logiciel des moteurs. Ces cartes d’extensions qui se connectent directement sur la plateforme Arduino imposent un certain nombre de broches pour contrôler différents paramètres. Basé sur le circuit intégré L298P (pont en H) du fondeur STMicroelectonics, le Motor Shield étudié ici, (Réf.MR007-001.1) permet de contrôler la vitesse et la direction de deux moteurs à courant continus. Il dispose d’un certains nombre de fonctionnalités supplémentaires, à l’instar d’un thermomètre électronique permettant d’éviter une surchauffe trop importante des composants.

Les circuits logiques de cette carte d’extension sont directement  alimentés par la carte Arduino (5V, 37mA max), tandis que les moteurs peuvent l’être soit par l’entrée Vin de l’Arduino (alimentation auxiliaire de l’Arduino) ou bien par une alimentation externe (dite « PwrIn » )qui n’alimente que le ou les moteurs (jusqu’à  46V). C’est cette dernière solution que j’ai choisi, à ce titre, il est important de noter que cette alimentation externe doit être relié à l’entrée injustement notée « Vin », et que le jumper (switch électronique) de sélection permettant de choisir entre la broche VIN de l’Arduino et l’entrée externe « PwrIn » devra donc être installé sur cette dernière.

Les dispositifs d’alimentations auxiliaires du « Moteur Dual DC Motor Shield ».

Les dispositifs d’alimentations auxiliaires du « Dual DC Motor Shield ».

 

Le Motor Shield « Dual DC Motor Shield » possède comme son nom l’indique deux sorties moteurs permettant de piloter ces derniers en vitesse et sens de rotation.

Branchement des deux moteurs contrôlables en vitesse et en sens de rotation.

Branchement des deux moteurs contrôlables en vitesse et en sens de rotation.

 

Différentes broches reliées à la plateforme Arduino permettent ainsi de contrôler logiciellement la vitesse et le sens de rotation des moteurs. Elles varient en fonction des Motor Shield utilisés, le tableau récapitulatif suivant résume l’ensemble de ces broches et leurs fonctions pour l’extension utilisé:

Tableau associant les fonctionnalités contrôlables à leurs broches.

Tableau associant les fonctionnalités contrôlables à leurs broches.

 

Ainsi, la vitesse de chaque moteur sera directement accessible via l’association logicielle d’une valeur entre 0 et 255 aux broches numériques 3 et 5 pour les moteurs 1 et 2 respectivement, sous la forme «analogWrite(*broche 3 ou 5* , *PWM entre 0 et 255*); »

En ce qui concerne le sens de direction, deux broches doivent être paramétrés. Le tableau ci dessous récapitule les quatre états possibles :

Tableau associant les états des entrées 1,2,3 et 4 aux états des moteurs.

Tableau associant les états des entrées 1,2,3 et 4 aux états des moteurs.

 


Intégration finale

Les chapitres précédents m’ont permis de décrire les caractéristiques et le fonctionnement du fader motorisé PSM01-082A-103B2 et de sa carte électronique de contrôle moteur « Dual DC Motor Shield ». Cette dernière partie se concentre sur la mise au point d’un prototype d’électronique programmable permettant l’utilisation, donc l’asservissement en vitesse et en position du fader motorisé.

 

Fonctionnalité Touch Sens Track

La fonctionnalité « Touch Sens Track » fonctionne grâce à un circuit électronique de type RC (Résistance – Condensateur) dans lequel le corps humain joue le rôle de condensateur.

Schématisation du montage électronique faisant intervenir la fonctionnalité « Touch Sens Track ».

Schématisation du montage électronique faisant intervenir la fonctionnalité « Touch Sens Track ».

Pour bénéficier de cette fonctionnalité, il faut utiliser la bibliothèque CapacitiveSensor qui permet de transformer deux broches numériques d’une carte Arduino en un capteur capacitif capable de détecter la contact électrique d’un corps humain. Ainsi, après intégration d’une résistance d’au moins un Méga Ohm au sein du circuit, le fader est désormais capable d’émuler le fonctionnement d’un capteur tactile capacitif.

Lors de l’initialisation, on introduit la bibliothèque CapacitiveSensor.h, puis on initialise les deux broches numériques de réception et d’envoi, avant d’introduire l’objet touchLine.

Initialisation de la bibliothèque CapacitiveSensor et de l'objet touchLine.

Initialisation de la bibliothèque CapacitiveSensor et de l’objet touchLine.

 

Pour pouvoir bénéficier de la fonctionnalité Touch Sens Track, on initialise au sein de la loop Arduino la variable long mvtFader, qui permet de définir si le curseur est touché ou non. Ainsi, grâce à la bibliothèque CapacitiveSensor.h, on pourra considérer que le curseur est touché lorsque l’instruction touchLine.capacitiveSensor(30); renvoie un nombre (qui sera contenu au sein de la variable mvtFader) strictement supérieur à 50, et non touché à l’inverse.

Dans le cas de ce premier prototype, on cherche à interrompre tout mouvement motorisé du curseur s’il est touché, on aura donc au sein de la loop (void loop() {}) :

Conditionnement du tactile capacitif.

 

Potentiomètres de position et de vitesse, curseur linéaire

Pour pouvoir mettre en place un asservissement en position et un contrôle de la vitesse, il est nécessaire d’intégrer deux dispositifs capteurs. Pour chaque capteur, on initialise au moins deux variables : la première correspond à la broche analogique, la deuxième contient la valeur numérisée entre 0 et 1023 du potentiomètre.

Seule exception, le potentiomètre de vitesse nécessitera une seconde variable convertissant les données captées et numérisées (entre 0 et 1023) en signal exploitable sous la forme d’une PWM (entre 0 et 255).

Initialisation des capteurs.

 

Dans le cadre de l’électronique programmable Arduino, la plupart des capteurs nécessitent d’être branchés sur le pôle positif au +5V que fournit nativement la plateforme, et au pôle négatif à la terre de la plateforme, ou GND. Les variations de tensions obtenues à partir de la mesure d’une grandeur physique sont exploitées grâce à une troisième connexion, reliée à une broche obligatoirement analogique de l’Arduino. Attention, certaines broches analogiques (et numériques) peuvent posséder des fonctionnalités particulières suivant les Motor Shield utilisés, celles-ci sont donc à réserver. Je ne tiendrais pas compte dans certains schémas de ces spécificités, d’autant qu’elles varient en fonction des cartes d’extension utilisées.

On a ainsi pour les potentiomètres de position et de vitesse ainsi que pour la fonctionnalité de mesure linéaire du curseur motorisé :

Schématisation du montage électronique faisant intervenir les potentiomètres de position et de vitesse ainsi que le curseur linéaire.

Schématisation du montage électronique faisant intervenir les potentiomètres de position et de vitesse ainsi que le curseur linéaire.

 

L’utilisation de capteurs au sein de l’environnement Arduino est relativement simple : il suffit d’extraire la grandeur mesurée grâce à l’instruction variableValeur = analogRead(*broche du capteur*); La tension mesurée, quantification d’une grandeur mesurée est ensuite convertie en variable numérique sur 10 bits (entre 0 et 1023). Ainsi, pour utiliser au sein de la loop les valeurs des potentiomètres et du curseur linéaire, on aura :

Initialisation des variables capteurs.

Initialisation des variables capteurs.

 

Pour pouvoir s’assurer du bon fonctionnement de l’ensemble des capteurs, il peut être nécessaire d’observer les valeurs renvoyées à tout moment. On utilise pour cela la voie série, initialisée à 9600 bauds au sein du set up : void setup(){Serial.begin( 9600 ); …*etc*}

On introduit ensuite au sein de la loop, immédiatement après les éléments précédents (qui implémentent la récupération et la conversion des valeurs captées) le renvoi via la liaison série de ces valeurs :

Utilisation de la voie série pour observer les variations de valeurs.

Utilisation de la voie série pour observer les variations de valeurs.

 

Contrôle et asservissement du fader motorisé

Conformément à ce qui a été présenté sur le fonctionnement du Motor Shield, celui-ci nécessite l’initialisation d’une broche numérique PWM de vitesse, et de deux broches numériques contrôlant le sens de rotation. Comme on a pu le voir, ces deux dernières broches permettront un sens de rotation lorsque leurs états seront respectivement 0 et 1, et le second sens lorsqu’elles seront mises aux états 1 et 0. J’utilise pour cela un booléen « sens » initialisée à False (0) :

  • sens = 1
  • !sens = 0
Initialisation des variables de contrôle du moteur.

Initialisation des variables de contrôle du moteur.

 

On l’a vu, la carte d’extension moteur, se fixe directement sur la carte Arduino, dans mon cas une Arduino Mega 2560. Les deux partagent ainsi un certain nombre de broches, tout particulièrement les broches numériques qui permettent le contrôle de la vitesse et du sens de rotation des moteurs. Ainsi, le schéma ci-dessous explicite ces connexions dans le cas du contrôle d’un seul moteur, en channel A.

L’alimentation est ici représentée par deux piles reliée aux bornes PwrIn du MotorShield (injustement annotées « Vin » sur le modèle utilisé). Dans la réalité, conformément aux caractéristiques du moteur à courant continu du fader motorisé, j’utilise une alimentation variable paramétrée pour une tension de 10V et un courant d’environ 1A.

Schématisation du montage électronique faisant intervenir la motorisation à courant continu du curseur motorisé PSM01-082A-103B2, sa carte de contrôle « Dual DC Motor Shield » et son alimentation représentée par deux piles « AA ».

Schématisation du montage électronique faisant intervenir la motorisation à courant continu du curseur motorisé PSM01-082A-103B2, sa carte de contrôle « Dual DC Motor Shield » et son alimentation représentée par deux piles « AA ».

 

Le moteur électrique permet de déplacer le curseur via une courroie, comme on a pu le voir précédemment. En contrôlant à tout moment le sens (et optionnellement la vitesse) de rotation de celui-ci, on peut programmer un asservissement en position basique qui réagira face à trois cas de figures simples :

Le potentiomètre de position indique une valeur entre 0 et 1023. Si la valeur donnée par le curseur (elle aussi entre 0 et 1023) est identique, rien ne se passe : le curseur est bien à la position que lui « impose » le potentiomètre de position.

Schématisation du curseur linéaire et motorisé PSM01-082A-103B2 ainsi que du potentiomètre de position.

Schématisation du curseur linéaire et motorisé PSM01-082A-103B2 ainsi que du potentiomètre de position.

 

Pourtant, si les deux valeurs ne sont pas égales, le curseur va alors être mis en mouvement par l’action du moteur jusqu’à ce que les deux valeurs soient enfin égales : la valeur donnée par la position du curseur correspond bien à la valeur imposée par le potentiomètre de position. On observe ainsi deux types de mises en mouvement :

Si le curseur offre une valeur de position inférieure à la valeur imposée par le potentiomètre, alors le moteur déplacera le curseur de la gauche vers la droite, tant que ladite valeur n’est pas atteinte.

Lorsque la valeur imposée par le potentiomètre est supérieure au curseur, celui-ci est déplacé vers la droite jusqu’à atteindre la position requise par le potentiomètre.

Lorsque la valeur imposée par le potentiomètre est supérieure au curseur, celui-ci est déplacé vers la droite jusqu’à atteindre la position requise par le potentiomètre.

Conditionnement de l'asservissement en position lorsque le potentiomètre est supérieur au fader.

Conditionnement de l’asservissement en position lorsque le potentiomètre est supérieur au fader.

 

Inversement, si le curseur offre une valeur de position supérieure à la valeur imposée par le potentiomètre, alors le moteur déplacera le curseur de la droite vers la gauche et ainsi de suite.

Lorsque la valeur imposée par le potentiomètre est inférieure au curseur, celui-ci est déplacé vers la gauche jusqu’à atteindre la position requise par le potentiomètre.

Lorsque la valeur imposée par le potentiomètre est inférieure au curseur, celui-ci est déplacé vers la gauche jusqu’à atteindre la position requise par le potentiomètre.

Conditionnement de l'asservissement en position lorsque le potentiomètre est inférieur au fader.

Conditionnement de l’asservissement en position lorsque le potentiomètre est inférieur au fader.

 

Il est finalement possible de modifier la vitesse de déplacement du curseur en faisant varier la valeur de valVitesse grâce au potentiomètre de vitesse.

 

Prototype final

Encore une fois, ce montage ne fera pas apparaître explicitement les broches partagées entre le Motor Shield et la carte Arduino Mega 2560 qui ne sera donc pas représentée. Il faudra prendre soin de cet aspect tout particulièrement pour les broches GND, +5V ainsi que les broches de PWM moteur et de directions.

Montage électronique complet permettant l’utilisation et le contrôle du curseur linéaire motorisé PSM01-082A-103B2.

Montage électronique complet permettant l’utilisation et le contrôle du curseur linéaire motorisé PSM01-082A-103B2.

 

Prototype d’électronique programmable utilisant et contrôlant le potentiomètre linéaire et curseur motorisé PSM01-082A-103B2.

 

MotorizedFader.ino

Une démonstration vidéo sera bientôt disponible. Je poursuivrais également ce projet avec la mise au point d’un prototype MIDI implémentable avec les automations d’Ableton Live. Affaire à suivre donc.


Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

6 commentaires sur “Arduino #1: Fader motorisé