Nouvelles:

25/06/2023 : Mise à jour du forum. En cas de bug, merci de contacter le Grand Sachem

Menu principal

2 servomoteurs (et plus) et 2 commandes (et plus)

Démarré par Ph Blondé, 03 Novembre 2020 à 23:06:14

« précédent - suivant »

0 Membres et 1 Invité sur ce sujet

Ph Blondé

Bonjour à tous,
Deuxième montage de commande de servomoteurs.

Je cherchais quelque chose de simple à écrire et pour les essais j'ai pris un NANO qui peut commander jusqu'à 6 servomoteurs puisque l'on dispose de 6 sorties en PWM.

Si plus de 6 sont nécessaires, il suffira de prendre un MEGA en appliquant la même recette au numéro de repère de broche près.
Philippe Blondé
Un 59 dans le 22

Ph Blondé

#1
Le projet :
     •   Chaque servomoteur est commandé par un seul contact qu'il suffit de mettre à la masse (GND) ou non.
     •   Un servomoteur doit passer d'une valeur d'angle déterminée (30° par exemple) vers un autre angle (120° par exemple) par action sur une commande qui lui est attachée ; cela peut être fait par un bouton-poussoir, un contact de relais voire la broche d'un autre Arduino.

Le scénario :
   •   La commande (le contact) est mise à la masse (GND ou LOW) puis relâchée ; le servo passe de 30° à 120°.
   •   Attente de la fin du mouvement.
   •   La commande est remise à la masse puis relâchée, le servo retourne de 120° vers 30°.
   •   Attente de la fin du mouvement.
   •   Et on recommence.

Quelques explications :
Bon, ça on sait faire me diront certains ; il y a la bibliothèque Servo pour cela.

Oui mais là plus de  boucles « for » ou « do / while » ou de « map » ; et en plus on peut contrôler la vitesse !
En fait il s'agit de l'utilisation d'une intéressante bibliothèque : VarSpeedServo.
Intéressante car tout tient dans une seule expression pour donner l'ordre de mouvement au servomoteur.

Comment utiliser cette expression ?

Prenons un exemple pour cette expression :  « Servo_Porte_Maison.write (110, 30, true) ».
   •   Servo_Porte_Maison.write (110, 30, true) : Servo_Porte_Maison  c'est le nom que l'on donne au servo.
   •   Servo_Porte_Maison.write (110, 30, true) : 110 précise la valeur de l'angle à atteindre.
   •   Servo_Porte_Maison.write (110, 30, true) : 30 précise la valeur de la vitesse de déplacement dont la plus basse valeur est 1.
   •   Servo_Porte_Maison.write(110, 30, true) : true indique que tant que le servomoteur est en déplacement, rien d'autre ne peut se faire ; c'est-à-dire que la ligne suivante du programme ne sera exécutée qu'à la fin du mouvement.

Et c'est tout ! :)
Philippe Blondé
Un 59 dans le 22

Ph Blondé

Dans le fichier .ino joint (en txt également) j'ai nommé un servo « Servo_Porte_Maison » et l'autre « Servo_Porte_Hangar » (pourquoi pas).
Une Led a été ajoutée pour me repérer dans les mouvements du servo de la porte de la maison ; elle pourrait également simuler une lampe au-dessus de la porte (re pourquoi pas).

Si on regarde le programme, on voit deux blocs, un par servo et dans chaque bloc, on voit deux paragraphes : un pour chacun des déplacements du bras du servo.

1.   Servo_Porte_Maison
   •   Ouverture Servo_Porte_Maison
   •   Fermeture Servo_Porte_Maison
2.   Servo_Porte_Hangar
   •   Ouverture Servo_Porte_Hangar
   •   Fermeture Servo_Porte_Hangar

Pour 6 servos il suffit de faire 6 fois du « copier/coller » en donnant des noms différents à chaque servo et en précisant la valeur des paramètres « angle à atteindre » et « vitesse ».
Tant dans la déclaration des variables que dans le setup, rien ne présente quelque chose de nouveau ou de difficile.

Liens pour charger la bibliothèque : https://github.com/netlabtoolkit/VarSpeedServo . Cliquer sur le rectangle vert (marqué « Code ») et choisir « Download ZIP ».


Intérêt
Ce que j'ai trouvé de plaisant c'est que c'est extrêmement simple et court à écrire car il n'y a qu'une expression à utiliser avec ses 3 paramètres. Nota : avec la vitesse à 1, cela ne va vraiment pas vite.

En pensant à ce montage, j'y voyais un intérêt pour les animations mais également pour les aiguillages.
Il suffit de « déléguer » à un NANO ce genre d'activité et de le commander par un autre Arduino (UNO ou MEGA) qui, lui, déroule un autre programme faisant appel via les broches qui correspondent aux commandes.

Bon amusement (tiens, ça rime avec confinement) ;) ;)
Philippe Blondé
Un 59 dans le 22

Ph Blondé

#3
Je donne "en clair" le code de ce programme.
On peut voir pour le servomoteur du hangar que c'est extrêmement court au niveau de la programmation.
Il y a presque plus de commentaires que de code  :) :)

Sur la photo, on peut voir un condensateur sur les lignes d'alimentation; C'est un 470µF/35V.
Il sert à absorber la toute petite pointe de courant demandée par les servomoteurs lorsqu'ils débutent un mouvement.
470µF c'est largement suffisant  ;)


// MAJ 2020-11-01
// COMMANDE DE 2 SERVOMOTEURS AVEC 2 BOUTONS POUSSOIRS PAR MISE A LA MASSE (gnd) DE CES DERNIERS
// ARDUINO : NANO
// TELECHARGEMENT : choisir NANO puis ATmega328P(oldbootloarder)
// Utilisation de la bibliothèque VarSpeedServo

#include <VarSpeedServo.h>

VarSpeedServo Servo_Porte_Maison;
VarSpeedServo Servo_Porte_Hangar;

const int Commande_Porte_Maison = 7;
int Etat_Commande_Porte_Maison;
boolean Porte_Maison = true;

const int Led_Porte_Maison = 14;

const int Commande_Porte_Hangar = 8;
int Etat_Commande_Porte_Hangar;
boolean Porte_Hangar = true;

void setup()
{
Servo_Porte_Maison.attach(9);   // NANO Broche D09 (PWM)
Servo_Porte_Hangar.attach(10);  // NANO Broche D10 (PWM)

pinMode (Commande_Porte_Maison, INPUT);
digitalWrite (Commande_Porte_Maison, HIGH);

pinMode (Led_Porte_Maison, OUTPUT);
digitalWrite (Led_Porte_Maison, HIGH);

pinMode (Commande_Porte_Hangar, INPUT);
digitalWrite (Commande_Porte_Hangar, HIGH);
}

void loop()
{
// Servo_Porte_Maison
// Si la porte de maison est fermée, alors ouverture
Etat_Commande_Porte_Maison = digitalRead (Commande_Porte_Maison);
if ((Etat_Commande_Porte_Maison == LOW) && (Porte_Maison == true))
  {
    digitalWrite (Led_Porte_Maison, LOW);
    delay (500);  // La lampe s'éclaire avant l'ouverture de la porte
    Servo_Porte_Maison.write(120, 40, true);
    Porte_Maison = false;
  }

// Si la porte de maison est ouverte, alors fermeture
Etat_Commande_Porte_Maison = digitalRead (Commande_Porte_Maison);
if ((Etat_Commande_Porte_Maison == LOW) && (Porte_Maison == false))
  {
    Servo_Porte_Maison.write(30, 30, true);
    delay (500);  // La lampe s'éteint après la fermeture de la porte
    digitalWrite (Led_Porte_Maison, HIGH);
    Porte_Maison = true;
  }


// Servo_Porte_Hangar
// Si la porte du hangar est fermée, alors ouverture
Etat_Commande_Porte_Hangar = digitalRead (Commande_Porte_Hangar);
if ((Etat_Commande_Porte_Hangar == LOW) && (Porte_Hangar == true))
  {
    Servo_Porte_Hangar.write(150, 50, true);
    Porte_Hangar = false;
  }

// Si la porte du hangar est fermée, alors ouverture
Etat_Commande_Porte_Hangar = digitalRead (Commande_Porte_Hangar);
if ((Etat_Commande_Porte_Hangar == LOW) && (Porte_Hangar == false))
  {
    Servo_Porte_Hangar.write(60, 40, true);
    Porte_Hangar = true;
  }
}
Philippe Blondé
Un 59 dans le 22