Catégories
Arduino Asservissement Asservissement Arduino automatique capteur Commande des moteurs Projets Arduino

Commande d’un actionneur linéaire #2 : Commande manuelle

Objectifs

  1. Savoir l’utilité d’un actionnaire linéaire
  2. Savoir les caractéristiques d’un actionnaire linéaire
  3. Savoir le fonctionnement d’un actionnaire linéaire
  4. Savoir commander un actionnaire linéaire
  5. Etc.

Applications

  1. Déplacement linéaire d’une charge, pièce
  2. Systèmes de translation : Portière, fenêtre, tables mobiles, etc.
  3. Procédés avec mouvement de translation précis
  4. Automatismes industriels
  5. Et, d’autres applications !

Principe de fonctionnement

Dans cette partie, on abordera la commande manuelle d’un actionneur linéaire avec Arduino. L’idée consiste à faire varier le sens ou la vitesse de déplacement de l’arbre d’une façon manuelle. Autrement dit, l’utilisateur va effectuer une manœuvre dans les deux sens, ainsi une inspection visuelle afin d’assurer le bon déplacement de l’arbre en utilisant un Joystick. Le schéma est constitué des éléments suivants :

  • Joystick: La manette est branchée dans le pin A0. La tension au repos du pin est égale à 2.5 V  (moitié de la tension d’alimentation). L’utilisateur peut faire croitre la tension (plage 2.5-5 V, Sens 1), ou le décroitre (plage 2.5-0 V, Sens 2).
  • Module PWM: Il permet de faire varier la vitesse de l’actionneur ainsi le changement de la polarité (sens de rotation). Le module est constitué d’un pont H complet avec une logique de commande. La partie commande nécessite 4 pins comme indiqué dans la figure. Les pins ( 6,7) dédiés à l’activation des bras droite/gauche du pont. Les pins (8, 9) sont des sorties PWM droite/gauche.  Par exemple, pour activer le sens 1, on positionne les pins (6, 7) à ‘1’ logique, ensuite, on envoie un signal PWM dans la sortie (8). La sortie  (9) en revanche reste à 0.
  • Actionneur linéaire : Il est alimenté avec la sortie du pont H
  • Arduino : Génération de la commande en fonction de l’état du Joystick (voir le tuto pour plus de détails).

Commande d'un actionneur linéaire - Partie 2 Commande manuelle

Caractéristiques du pont H complet BTS7960

  • Pont H complet aux transistors MOSFET (x4) avec les diodes  (pour les charges inductives)
  • La tension d’alimentation (partie puissance) : 5.5V à 27V
  • Alimentation partie commande : 3.3-5V
  • Courant maximal (partie puissance) : 43A
  • Insolation entre la partie commande et la partie puissance
  • Le module peut être utilisé pour les charges DC (Inversion du sens/vitesse des moteurs DC) ou AC (onduleur)
  • Fréquence maximale des entrées PWM : DC-25KHz
  • Protection contre surtension/surintensité
  • Module intègre deux capteurs du courant (Sens 1 / Sens 2)
  • Regarder la vidéo pour plus de détails

A quoi sert le composant BTS6960 ?

Le pont H est constitué de deux composants BTS7960 identiques sous forme de deux demi-ponts à base des transistors MOS complémentaires. Chaque transistor est muni d’une diode de roue libre pour les charges inductives pour permettre la circulation du courant de la bobine de la charge lorsque l’ensemble des transistors sont en circuit ouvert. Chaque circuit protège la charge contre la surtension, surintensité, etc. et un capteur du courant. Ci-dessous le datasheet du mo.

Obtenir le datasheet du composant

Commentaires sur le code

Pinout

#define L_EN            6         // Left Enable   
#define R_EN 7 // Right Enable
#define L_PWM 8 // Left PWM
#define R_PWM 9 // Right PWM
#define RapCyc 90.0 // Duty Cycle (%)

Initialisation

void setup() 
{
// Pinout Module PWM
pinMode(L_EN, OUTPUT);
pinMode(R_EN, OUTPUT);
pinMode(L_PWM, OUTPUT);
pinMode(R_PWM, OUTPUT);

// Init Module PWM
digitalWrite(L_EN, LOW);
digitalWrite(R_EN, LOW);
analogWrite(L_PWM, 0);
analogWrite(R_PWM, 0);

// Init tableau des pins
PinOut[0]=L_EN;
PinOut[1]=R_EN ;
PinOut[2]=L_PWM;
PinOut[3]=R_PWM;

// Init rapport cyclique
RP=(unsigned short)(RapCyc*255.0/100.0);

// Affichage (Test)
Serial.begin(115200);
}

Définition de la fonction UpDown()

La fonction UpDown() permet de générer les signaux de commande du module PWM en fonction du type de la commande. Elle prend en entrée le nom du tableau de 4 éléments content la numérotation des pins. La numérotation doit respecter l’ordre suivant : (L_EN, R_EN, L_PWM, R_PWM) (voir le code). Ensuite, le Type de la commande :

  • Type=1: Sens 1
  • Type=2: Sens 2
  • Type=0 ou autres valeurs : Arrêt

La fonction prend également la valeur du rapport cyclique comprise entre 0 et 255. Par conséquent, grâce à la fonction, on peut faire varier le sens ainsi la vitesse du déplacement !  Ci-dessous la définition de la fonction.

void UpDown(int* Pins, int Type,  unsigned int rapCyc)
{
switch (Type)
{
// Sens 1
case 1:
digitalWrite(Pins[0], HIGH);
digitalWrite(Pins[1], HIGH);
analogWrite(Pins[2], rapCyc);
analogWrite(Pins[3], 0);
break;

// Sens 2
case 2:
digitalWrite(Pins[0], HIGH);
digitalWrite(Pins[1], HIGH);
analogWrite(Pins[2], 0);
analogWrite(Pins[3], rapCyc);
break;

// Arrêt
default:
digitalWrite(Pins[0], LOW);
digitalWrite(Pins[1], LOW);
analogWrite(Pins[2], 0);
analogWrite(Pins[3], 0);
}
}

Application de la commande

La génération de la commande est effectuée d’une façon permanente en fonction de l’état du Joystick. Au repos, la tension est égale à 2.5 V. On agit sur l’actionneur uniquement lorsque la tension dépasse de 1 V la tension au repos dans les deux sens pour être sûre que la variation n’est pas due au bruit et pour éviter de chauffer l’actionneur et consommer du courant (réduire la durée de vie). En effet, si on fixe un seuil égal à 2.5 V, on risque de solliciter l’actionneur en permanence à cause d’une faible variation de la tension dans le pin A0 qui peut être due au bruit.

  • Sens 1: Tension A0 >2.5+1
  • Sens 2: Tension A0<2.5-1
  • Arrêt : Sinon (désactivation du module PWM, pas de consommation à vide de l’actionneur).
  // Sens 1 
if (Vin> 2.5+1.0)UpDown(PinOut, 1, RP);

// Sens 2
else if (Vin< 2.5-1.0) UpDown(PinOut, 2, RP);

// Arrêt
else UpDown(PinOut, 0, RP);

Programme complet

#define L_EN            6         // Left Enable   
#define R_EN 7 // Right Enable
#define L_PWM 8 // Left PWM
#define R_PWM 9 // Right PWM
#define RapCyc 90.0 // Duty Cycle (%)

float Vin=0.0;
unsigned short RP= 0;
int PinOut[4];

void setup()
{
// Pinout Module PWM
pinMode(L_EN, OUTPUT);
pinMode(R_EN, OUTPUT);
pinMode(L_PWM, OUTPUT);
pinMode(R_PWM, OUTPUT);

// Init Module PWM
digitalWrite(L_EN, LOW);
digitalWrite(R_EN, LOW);
analogWrite(L_PWM, 0);
analogWrite(R_PWM, 0);

// Init tableau des pins
PinOut[0]=L_EN;
PinOut[1]=R_EN ;
PinOut[2]=L_PWM;
PinOut[3]=R_PWM;

// Init rapport cyclique
RP=(unsigned short)(RapCyc*255.0/100.0);

// Affichage (Test)
Serial.begin(115200);
}

void loop()
{
// Lecture & Affichage du pin A0
Vin=(float)analogRead(A0)*5.0/1023.0;
//Serial.println(Vin); return; // Test A0

// Sens 1
if (Vin> 2.5+1.0)UpDown(PinOut, 1, RP);

// Sens 2
else if (Vin< 2.5-1.0) UpDown(PinOut, 2, RP);

// Arrêt
else UpDown(PinOut, 0, RP);
}

void UpDown(int* Pins, int Type, unsigned int rapCyc)
{
switch (Type)
{
// Sens 1
case 1:
digitalWrite(Pins[0], HIGH);
digitalWrite(Pins[1], HIGH);
analogWrite(Pins[2], rapCyc);
analogWrite(Pins[3], 0);
break;

// Sens 2
case 2:
digitalWrite(Pins[0], HIGH);
digitalWrite(Pins[1], HIGH);
analogWrite(Pins[2], 0);
analogWrite(Pins[3], rapCyc);
break;

// Arrêt
default:
digitalWrite(Pins[0], LOW);
digitalWrite(Pins[1], LOW);
analogWrite(Pins[2], 0);
analogWrite(Pins[3], 0);
}
}

On verra  prochainement la partie commande. N’oublie pas de laisser un commentaire, ça nous encourage pour continuer  à partager des projets 🙂

Laisser un commentaire