Usage combiné de AnalogWrite() et de la librairie Servo...

Bonjour ou Bonsoir à toutes et tous,

Je suis occupé sur un projet qui combine la commande d'un ruban de LEDs RGB et le pilotage d'un contrôleur de moteur Brushless (ESC) via la librairie Servo. J'ai besoin également de détecter les interruptions générées par un capteur à effet Hall et une liaison I2C avec une horloge temps réel de type DS1307.
Je compte, pour ce faire, utiliser un arduino pro mini 5V (pour des raison de taille)

Mon problème est le suivant :
En consultant la documentation de la librairie Servo, je vois que son utilisation entraîne la non disponibilité des sorties 9 et 10 en mode analogique.
Pas grave, il me reste 3,5,6 t 11 pour piloter les LED
Oui..Mais la doc d'AnalogWrite() indique que les sorties 5 et 6 auront des rapports cycliques plus grands que prévu suite à l'interaction entre la fonction et les fonction millis() et delay(). Il en résulte une difficulté à obtenir une sortie égale à "0" sur ces deux portes :frowning:
Gasp... il ne reste que les sorties 11 et 3...en espérant que la pin 2 permette de gèrer mon interruption...
Et il me manque toujours une sortie...

Une autre option est d'utiliser un 555 pour générer le signal de commande du contrôleur et d'utiliser une sortie en mode digital pour alimenter le 555 (le circuit ne consommerait que 5-10 mA) Mais le contrôleur fonctionne alors en mode tout ou rien... (plus de contrôle de la largeur d'impulsion. Possible mais dommage) :frowning:

Bref...

  • Quelqu'un a-t-il plus d'info concernant le problème des sortie 5 et 6 en analogique ?
  • Il y a-t-il une autre option pour piloter mon unique sortie servo ?
  • Il y a probablement un option que j'ai ratée...

Au plaisir de vous lire et d'en apprendre plus sur cette petite merveille d'Arduino.

Michel

Je suis pas sûr d'avoir tout saisi, d'abord pour commander un moteur avec la lib servo ??

Ensuite au sujet des pin 5 et 6, de quelle doc parles-tu ?

Hello B@to,

Désolé si je n'ai pas été assez clair.
Un contrôleur de type ESC est prévu pour être branché sur un récepteur de voiture ou d'avion téléguidé. Il est donc piloté par une impulsion de 1 à 2 ms qui est envoyée toutes les 20 ms. La largeur de l'impulsion est proportionnelle à la position du manche de la télécommande.
La librairie Servo permet de générer une impulsion de ce type. (Servo - Arduino Reference)

Les références aux sorties 5 & 6 se trouvent ici : analogWrite() - Arduino Reference
(En dessous de "Known Issues" )

j'espère que ce sera plus clair ainsi...

Bien à toi,

Michel

Oki alors dans ce cas il suffit simplement de générer une impulsion de 1-2 ms toutes les 20 ms :slight_smile:

long time;
boolean state=LOW;

...
void setup(){

Time=millis()+20;
pinMode(5,OUTPUT);
digitalWrite(5,state);
...

}


void loop(){

if(millis()>time){
    if(state=HIGH) {
    Time=millis()+20;
    } else {
    Time=millis()+2;
    }
state ^= state
digitalWrite(5,state);
   }
}

Hello B@to,

Merci pour le code.
Mais cela ne fonctionne que si ma boucle loop() n'est pas occupée à quelque chose d'autre...
Il n'y a aucune garantie que la largeur d'impulsion ne dépassera pas 2 ms. En fait, la durée de celle-ci sera au minimum de 2ms et au max de 2ms + durée d'un cycle dans loop() qui peut être variable en fonction de la situation.
D'où l'intérêt d'utiliser une librairie sensée garantir cette précision.

Je vais continuer à creuser...

Bien à toi,

Michel

Après il faut garder le sens des proportions, la plupart des instructions s'executent en moins d'1 µs, donc quoiqu'il se passe dans le reste de la boucle l'incidence sera invisible

Ok...
Je vais essayer d'intégrer cela dans tout ce qu'il y aura à faire...

Merci B@tto

Michel

Bonjour,

coyotte:
Une autre option est d'utiliser un 555 pour générer le signal de commande du contrôleur et d'utiliser une sortie en mode digital pour alimenter le 555 (le circuit ne consommerait que 5-10 mA) Mais le contrôleur fonctionne alors en mode tout ou rien... (plus de contrôle de la largeur d'impulsion. Possible mais dommage) :frowning:

Sinon tu peut déléguer la partie PWM à un circuit externe.
Exemple: utiliser un ATtiny45 (avec le firmware BlinkM) pour pouvoir contrôler les 3 pwm en I2C.

Une autre solution, faire de la PWM software, avec un seul timer hardware faisant commuter (via une interruption) trois broches à des timings précis (équivaut à faire un timer dans le timer).