[résolu] Utilisation de <Servo.h> dans une librairie

Bon, j'ai partiellement compris la situation.

Normalement, quand on crée un objet servo, la lib Servo va initialiser les timers hardware au moment où on appelle servo.attach() pour la 1ère fois. Une fois que le timer utilisé a été initialisé, on ne cherche plus à l'initialiser. Comme la lib Servo ne comporte pas de constructeur avec le numéro de pin, servo.attach( numPin ) est appelé dans le setup.

Or dans ta lib tu as décidé d'ajouter au constructeur le paramètre de pin et de faire servo.attach() dans le constructeur de l'objet Test.

On constate alors que si tu crée un objet Test comme variable globale par :

Test servotest(2);

ca ne marche pas. En effet si on regarde les signaux à l'analyseur logique, les signaux ne se comportent pas correctement, signe que le TIMER n'est pas configuré correctement pour la lib Servo.

Par contre si on fait cela :

Test *pservotest;
void setup()
{
  pservotest = new Test(2);
}

Alors tout marche bien.

Pourquoi ?

Parce que dans le premier, le constructeur de Test qui appelle servo.attach() est appelé durant les phases d'initialisations globales (avant l'appel à main() et à setup()) alors que dans l'autre cas, servo.attach() est appelé après le démarrage du sketch depuis setup().

Or les phases d'initialisations globales comportent d'autres initialisations que les tiennes, notamment des initialisations effectuées dans la bibliothèque Arduino Core, et certaines touchent au timer. Il se trouve que l'ordre d'exécution des initialisations globales font que servo.attach() est appelé en premier, que l'initialisation du timer par la lib Servo est effectué mais qu'ensuite une autre initialisation globale vient casser celle faites par Servo et replace le timer dans un autre mode qui est incompatible avec le fonctionnement de Servo.

Qu'elle est donc la solution :
Faire comme Servo. Ne pas passer de numero de pin au constructeur ou surtout ne pas effectuer servo.attach() dans le constructeur.
Mais ajouter une fonction attach ou begin à ta classe qui sera appelée depuis setup().
Cela assure que l'initialisation du timer nécessaire au bon fonctionnement de Servo sera effectuée après les autres initialisations globales et que le timer sera donc bien configurée correctement.

Voici par exemple un code qui marche. (attaché).

test_servo.ino (842 Bytes)