Servo-moteur et Sioc

On ne trouve pas grand chose sur le Net concernant la programmation Sioc de servo-moteurs. Ces petites bêtes ayant tendance à faire un peu ce qu'elles veulent, vous trouverez ci-dessous quelques explications.

 

Une fois le moteur dans son emplacement (gauges ou autre) et à l'aide des logiciels "iocards test" ou "Sioc Monitor" déterminez les positions basses, hautes et de travails.

Pour les positions hautes et basses, il est inutile que l'aiguille de votre gauge descende en dessous de zéro ou au dessus de maxi.

Les positions de travail nous donnent la ou les valeurs du servo lorsque la gauge doit indiquer quelque chose, une température par exemple.

 

Le plus simple, le servo du crochet de la manette de train.

 

Petit cahier des charges avant de rentrer dans le vif du sujet :

1. Il doit rester en position fermé lorsque l'avion est au sol et s'ouvrir en vol. Il restera ouvert tout le long du vol pour d'éventuels essais de fonctionnement du train.

2. Pour éviter des fonctionnements à répétition, il ne se fermera qu'une fois l'avion vraiment posé après un atterrissage à rebondissements . On utilisera donc la fonction Delay.

3. Le servo devra revenir en position fermé après un arrêt du simulateur en plein vol. J'entends ma femme me dire "A table !!!" alors que je suis au dessus des volcans d'Auvergne.

4. Il ne pourra être alimenté que s'il y a du courant.

 

Voici l'Offset qui détermine si l'avion est en vol ou non :

Var 0014, name ACFT_ON_GND, Link FSUIPC_IN, Offset $0366, Length 2     // Avion au sol ou en l'air

On déclare notre servo qui se trouve sur la sortie 1 (Output 1) de ma carte USB_Servo. Les valeurs des PosL, C et R sont standards. Les positions basse et haute dans mon cas sont 516 et 910. Je les indique toujours dans les commentaires pour ne pas les oublier.

Var 1010, name CROCHET_SERV, Link USB_SERVOS, Output 1, PosL 1, PosC 512, PosR 1023     // Servo du crochet de train 516 à 910

Puis la variable en SUBRUTINE
Var 1011, name CROCHET_TRAIN, Link SUBRUTINE     // Servo du crochet de train 516 à 910
{
  IF &BATTERY_SW = 1
  {
    IF &ACFT_ON_GND = 0     // Si l'avion à décollé
    {
      &CROCHET_SERV = 516         // Crochet ouvert
    }
    ELSE     // Si l'avion est au sol
    {
      &CROCHET_SERV = DELAY 910 ,3000     // Crochet fermé après 30s
    }
  }
  ELSE     // Si l'inter batterie est sur Off
  {
    &CROCHET_SERV = 0     // Alim servo coupée
  }
}

On insère ensuite un CALL &CROCHET_TRAIN dans la variable 0000 d'initialisation et dans celle de l'Offset Var 0014.

Var 0000, name iNITIALISATION
{
  CALL &CROCHET_TRAIN     // Var 1011

}

Var 0014, name ACFT_ON_GND, Link FSUIPC_IN, Offset $0366, Length 2     // Avion au sol ou en l'air
{
  CALL &CROCHET_TRAIN     // Sub 1011
}

Tout ça c'est bien joli mais les servos ont la fâcheuse habitude de se caler sur des positions qui les fait vibrer. C'est très désagréable. Donc une fois le travail terminé, on va les éteindre avec la position zéro.

&CROCHET_SERV = 516     // Crochet ouvert

&CROCHET_SERV = 0     // Servo éteint

Sioc allant plus vite que le servo cela ne fonctionne pas. L'alimentation sera coupée avant qu'il n'ai atteint la position demandé. Ce sera pire pour la fermeture puisqu'on utilise la fonction Delay avec 30 secondes d'attente. La solution est à nouveau Delay et cela se présente ainsi :

&CROCHET_SERV = 516         // Crochet ouvert
&CROCHET_SERV = DELAY 0 ,50     // Alim servo coupée après 50 centièmes

et

&CROCHET_SERV = DELAY 910 ,3000     // Crochet fermé après 30s
&CROCHET_SERV = DELAY 0 ,3050     // Alim servo coupée après 50 centièmes

3050 au second Delay car il faut laisser le temps au premier de s'écouler.

 

Ce qui nous donne au final :

Var 1011, name CROCHET_TRAIN, Link SUBRUTINE     // Servo du crochet de train 893 à 516
{
  IF &BATTERY_SW = 1
  {
    IF &ACFT_ON_GND = 0     // Si l'avion à décollé
    {
      &CROCHET_SERV = 516         // Crochet ouvert
      &CROCHET_SERV = DELAY 0 ,35     // Alim servo coupée après 35 centièmes
    }
    ELSE     // Si l'avion est au sol
    {
     
      &CROCHET_SERV = DELAY 910 ,3000     // Crochet fermé après 30s
      &CROCHET_SERV = DELAY 0 ,3050     // Alim servo coupée après 50 centièmes
    }
  }
  ELSE     // Si l'inter batterie est sur Off
  {
  
    &CROCHET_SERV = 0     // Alim servo coupée
  }
}

 

Pour finir, on insère un Call dans la variable Battery pour remettre le crochet en position après un arrêt brutal parce-qu'il est l'heure d'aller manger.

 

Comment ralentir un servo-moteur

Il peut arriver que l'on ai besoin de ralentir le déplacement d'une aiguille. En effet, certaines gauge n'affiche la bonne valeur qu'au bout d'un certain temps. Par exemple, celle de "CABIN AIR" met environ 2 secondes pour atteindre sa valeur lorsque l'interrupteur est actionné.

Pour plus de réalisme dans le déplacement de ces aiguilles nous allons utiliser la fonction "TIMER"

 

Var 1045, name CABIN_AIR, Link SUBRUTINE     // Réglage gauge Cabin Air 678 à 160 (déclaration de ma variable)
{
  IF &BATTERY = 1
  {
    IF &CABIN_AIR_SW = 1 si mon inter est sur ON
    {
      &CABIN_AIR_SERV = 160  Mon servo est placé en position basse. En effet, souvenez-vous que pour éviter les vibrations, les servos sont coupés avec la position "0" à la fin de chaque variable. Si je ne lui indique pas à quel endroit il doit commencer (pos. basse de ma gauge 160) il va descendre sur zéro est commencer son incrémentation a partir de "1".

 
      &CABIN_AIR_SERV = TIMER 510 ,2 ,1 Fonction TIMER pour aller à la position 510, 2 pas par 2 tout les un centième de seconde. Donc, pour passer de la position 160 à la position 510 il faudra 175 centièmes de secondes.
    }
    ELSE
    {
      &CABIN_AIR_SERV = TIMER 160 ,-2 ,1 Si mon inter est basculé en ouverture, on retourne à la position 160 (ou 0°F) avec la même fonction mais cette fois en sens inverse en indiquant "-2 pas" touts les centièmes de secondes.

    {

    &CABIN_AIR_SERV = DELAY 0 ,195 Une fois l'une ou l'autre des positions atteintes, on coupe l'alimentation du servo avec la position "0" après 195 centièmes de secondes (175 pour atteindre la position + 20 de marge de manoeuvre).
   } 
  }
}

Il est possible de compléter ce code avec un &CABIN_AIR_SERV = TIMER 160 ,-20 ,1 en cas de coupure de courant alors que l'inter est resté sur "ON". Dans ce cas la descente sera beaucoup plus rapide.

 

A bientôt