6. Un peu de mécanique


L'Arduino n'est pas seulement utile pour faire clignoter des LEDs, il peut servir à bien d'autres choses comme activer des moteurs... On trouvera de nombreuses applications comme la création de petites animations ou la motorisation d'un aiguillage...

Je ne m'étendrai pas énormément sur le sujet car la mise en oeuvre de ces moteurs est très simple et les exemples nombreux. Il existe des librairies incluses dans l'environnement de programmation de l'Arduino comme Servo (servo moteur) et Stepper (moteur pas-à-pas), ou d'autres qu'il est possible de trouver sur internet. Nous allons utiliser ces dernières dans les prochains exemples...

Avant toute chose, je profite de l'occasion pour décrire brièvement la raison d'être des librairies. Jusqu'à maintenant, nous n'avons utilisé que des fonctions élémentaires de l'Arduino. Mais il existe aussi des librairies regroupant des fonctionnalités supplémentaires à ajouter à un programme. Celles-ci sont le plus souvent développées pour un matériel ou des composants électroniques spécifiques.

Il y a deux raisons principales à l'utilisation des librairies. D'une part, un programmeur ayant développé des fonctions pour supporter le protocole DCC ou commander un MAX7219 (afficheur numérique à LED), peut regrouper son travail dans une librairie et la diffuser sur internet. Chacun peut alors la réutiliser, lui évitant ainsi de reprogrammer les mêmes fonctionnalités...

D'autre part, cela limite la taille des programmes compilés. En effet, afin de pouvoir fonctionner, un programme doit être compilé avec toutes les fonctionnalités dont il a besoin. Par exemple, si digitalWrite() est appelée, et même si l'utilisateur n'a pas programmé son contenu, un peu de code compilé est inséré dans le résultat "sans que le programmeur le sache" (en simplifiant le concept à l'extrême...) Si on devait inclure toutes les fonctions existantes alors qu'elles ne sont pas appelées par le programme, cela donnerait des résultats beaucoup trop gands pour la mémoire des micro-contôleurs. Ceci est tout aussi vrai lorsqu'on parle de développement logiciel en général. Donc, pour éviter cela, seules les librairies nécessaires sont incluses, minimisant ainsi la taille du programme compilé...

Attention: un petit point de droit concernant les librairies qu'il est possible de trouver sur internet et qui ne font pas partie de l'environnement de base de l'Arduino: elles ne sont pas nécessairement libres de droits. Le développeur d'une librairie peut décider de limiter son usage, en interdisant par exemple son utilisation dans un produit commercial qu'il n'aurait pas lui-même développé. C'est le cas le plus fréquent. Il est à noter qu'il peut aussi interdire la rediffusion de son code dans une autre librairie. Il est préférable de bien se renseigner auprès du ou des auteurs avant de les utiliser.




6.1. Les servo-moteurs

Entrons rapidement dans le vif du sujet... Il en existe plusieurs types mais au contraire d'un moteur classique, un servo-moteur ne peut tourner que sur un intervalle angulaire précis: en général de 0 à 180°, soit un demi-tour seulement. On retrouve généralement de tels servo-moteurs en aéro-modélisme, où ils sont utilisés pour actionner les volets ou les dérives des appareils.

Une des applications pratiques pour notre hobby est la manipulation des aiguillages. En effet, nous avons besoin d'un moteur ayant assez de couple et dont l'angle de rotation puisse être contrôlé avec suffisamment de précision. En voici un de petite taille mais suffisant pour nos besoins:


Pour le contrôle, nous disposons de trois fils: en général de couleur marron, rouge et orange, ou équivalent. On peut aussi trouver: noir, rouge et jaune. Le fil marron se connecte au ground, le fil rouge au +5V et le fil orange à un port de l'Arduino. C'est aussi simple que cela. On fera attention de choisir un servo dont la tension est 5V. Dans le cas d'un servo alimenté en 12V, il faut alors opter pour une alimentation externe... Aucun autre composant est nécessaire comme le montre ce montage:


Maintenant, passons à la programmation... Voici un premier exemple de programme qui permet d'actionner le servo-moteur entre deux angles: 45 et 90°.

#include <Servo.h>

Servo moteur;
int commande = 7;

void setup()
{
  moteur.attach( commande );
}

void loop()
{
  moteur.write( 90 );
  delay( 1000 );
  moteur.write( 45 );
  delay( 1000 );
}


Remarque préliminaire: pour les besoins de ce tutoriel, nous utilisons une librairie spécifiquement développée pour simplifier le contrôle des servos. Cependant, un tel moteur peut être commandé sans elle, en envoyant le bon nombre de pulsations, à intervalles réguliers. Je pourrai ajouter quelques lignes sur le sujet si nécessaire...

Tout d'abord, examinons la première ligne. C'est une nouveauté par rapport aux exemples précédents, et elle illustre l'utilisation d'une librairie externe qui est incluse spécifiquement pour ce programme par la directive #include. Il s'agit de la librairie Servo.h. Notez que le nom commence par une majuscule. Il est très important d'épeler les librairies exactement. Contrairement à d'autres environnements de programmation plus permissifs où les majuscules peuvent être omises, ici les noms doivent être écrits précisément.

Ensuite, nous déclarons les variables: un servo moteur de type Servo, puis un port commande de type entier.

Puis, dans la fonction setup(), nous initialisons le servo en lui assignant un port de contrôle ou de commande (7) en appelant la méthode attach() de l'objet moteur. Il n'est pas nécessaire d'utiliser un port PWM. N'importe quel port digital fera l'affaire.

Ensuite, dans la fonction principale loop(), nous commandons au servo de se déplacer à la position 90° en invoquant la méthode write() avec le paramètre 90. Nous imposons un petit délai d'une seconde puis, à nouveau, nous commandons au servo de se déplacer à la position 45° avec la méthode moteur.write( 45 ). Le résultat de ce petit programme est un va-et-vient entre les positions 90° et 45°.

Deux remarques importantes concernant le fonctionnement des servo-moteurs:
  • il n'y a pas de "sens" ou de "direction" de déplacement. Chaque position est identifiée par un angle de 0 à 180°. En faisant une analogie avec une horloge, on commandera à celle-ci de se placer à 6h puis à 2h en lui indiquant horloge.write( 6 ) et horloge.write( 2 ). On ne lui demandera pas se déplacer de -4h avec horloge.write( -4 )... Nous verrons qu'il n'en est pas de même avec les moteurs pas-à-pas.
  • dans le même ordre d'idée, il n'y a aucune indication de "vitesse" de déplacement. Le servo-moteur se déplace à sa vitesse nominale.
Suite à la dernière remarque, comment peut-on dans ce cas appliquer ce montage à la commande d'un aiguillage? Habituellement, une simulation réaliste voudrait que le mouvement des rails soit relativement lent... Et bien ceci est simplement effectué en déplaçant le servo-moteur à des positions successives par petits incréments. Nous avons introduit précédemment l'utilisation d'une boucle for() qui permettait d'illuminer une LED par étapes successives dans l'exemple du phare côtier ou du fader. Ici, nous allons simplement indiquer une suite de positions au servo-moteur en intercalant un delay() entre chaque commande... et ainsi la boucle principale devient:

void loop()
{
  for ( int i = 90; i >= 45; i-- )
  {
    moteur.write( i );
    delay( 30 );
  }
  delay( 1000 );
}

Le délai dépendra du type de servo-moteur utilisé. On peut aussi modifier la valeur en fonction des goûts... Quant au dernier appel delay( 1000 ), il permet de faire une pose après le déplacement lent, afin de bien examiner le résultat.

Aussi, on remarquera qu'une fois arrivé à 45°, le moteur se repositionnera à 90° rapidement, puisque si on déroule la suite des étapes, la dernière commande moteur.write( 45 ) est directement suivie de moteur.write( 90 )... Si vous n'êtes plus tout-à-fait sûr de la raison, retournez à l'exemple du fader pour vous remémorer le fonctionnement de la boucle loop().

Petit exercice: remplacer le delay( 1000 ) et ajouter une seconde boucle for() afin de repositionner le moteur de 45° à 90°. Ainsi le mouvement de va-et-vient lent sera complet.




6.2. Les moteurs pas-à-pas

A venir...


Aucun commentaire:

Publier un commentaire