interaction pin 9 et servo sur pin on PWM

Bonjour,

Pour un projet, je manque de pins PWM sur un arduino UNO.
Il me faut 3 servos et 4 sorties analogique. Donc 7 PWM alors que le UNO n’en propose que 6.

J’ai remarqué qu’on peut brancher un servo sur une pin non PWM. Si je fais ça tout seul, ça marche très bien, en utilisant la librairie servo de façon classique.

Mais quand je veux avoir les servo ET les sorties analogiques, pour une raison inconnue, il y a une interaction entre la pin 9 et le servo à part :

  • si je ne demande rien à la pin 9 (en commentant le code concerné), tout fonctionne parfaitement (tous les servos fonctionnent et les autres sorties analogiques aussi)
  • si je ne demande pas le servo sur la pin non PWM (en commentant le code correspondant), Tout fonctionne parfaitement (les deux servos restants et les 4 sorties analogiques)
  • Si je demande les deux à la fois, le servo a un comportement saccadé et la pin 9 délivre 0V.

Ce qui m’étonne, c’est qu’on dirait que la pin 9 a un comportement particulier par rapport aux autres pins PWM.

J’ai donc cherché à isoler le problème :
Montage basique : Un servo sur la pin 4 (non PWM), un volt-mètre sur la pin 9, rien d’autre.
J’obtiens le même comportement.

#include <Servo.h>
Servo monServo4;
int i;

void setup() {
    i = 1500;
    monServo4.attach(4);
}

void loop() {
    if(i<2000){  //je fais des sweep pour le servo
      i++; 
    }else{
      i=1000;
    }
    monServo4.writeMicroseconds(i);
    delay(10);
    analogWrite(9, 127);   //doit me sortir du 2.5V à peu près
}

Avec le code ci-dessus, sweep saccadé du servo et 0V sur la pin 9.

#include <Servo.h>
Servo monServo4;
int i;

void setup() {
    i = 1500;
    monServo4.attach(4);
}

void loop() {
    if(i<2000){  //je fais des sweep pour le servo
      i++; 
    }else{
      i=1000;
    }
    monServo4.writeMicroseconds(i);
    delay(10);
    //analogWrite(9, 127);   //doit me sortir du 2.5V à peu près
}

Avec ça, sweep parfaitement linéaire. (Toujours 0V sur la pin 9 mais c’est normal vu que je l’ai commenté)

#include <Servo.h>
Servo monServo4;
int i;

void setup() {
    i = 1500;
    //monServo4.attach(4);
}

void loop() {
    if(i<2000){  //je fais des sweep pour le servo
      i++; 
    }else{
      i=1000;
    }
    //monServo4.writeMicroseconds(i);
    delay(10);
    analogWrite(9, 127);   //doit me sortir du 2.5V à peu près
}

Et enfin, avec ça, 2.48V sur la pin 9 (ça me va) et le servo ne bouge pas, logique.

J’ai essayé la même chose en mettant le servo sur les pins 7 et 8, même chose.
J’ai essayé de mettre des pinMode(x, OUTPUT); sur la 4 et la 9, même chose.

Si j’essaie de faire la sortie analogique sur une autre pin PWM (3, 5, 6 ou 11), tout fonctionne. Seule exception : avec la 10, je n’ai pas le côté saccadé du servo mais elle sort 0V.

Voilà, J’ai vraiment essayé tout ce qui me venait à l’esprit.
J’espère avoir été clair dans l’explication de mon problème.
Merci d’avance pour votre aide !

Bonjour jccarre;

Tu n'as pas fait de configurations de broches dans le setup().
Il est préférable de définir qui est en sortie et qui est en entrée.

Essai déjà cela.

Salutations.

Salut,

Merci beaucoup ! C'était en effet ça.
Du coup, j'ai mis mes servos sur la 4, la 9 et la 10 et mes PWM sur les autres sorties PWM. Ca marche !!!

J'avais essayé de définir ces pins comme étant des sorties mais ça ne changait rien.

En tout cas, merci beaucoup !