Pages: [1]   Go Down
Author Topic: Usage combiné de AnalogWrite() et de la librairie Servo...  (Read 975 times)
0 Members and 1 Guest are viewing this topic.
Liège / Belgium
Offline Offline
Newbie
*
Karma: 1
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :-(
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) :-(

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


Logged

Conference over procrastination has been postponed to tomorrow

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged


Liège / Belgium
Offline Offline
Newbie
*
Karma: 1
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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. (http://arduino.cc/en/Reference/Servo)

Les références aux sorties 5 & 6 se trouvent ici : http://arduino.cc/en/Reference/AnalogWrite
(En dessous de "Known Issues" )

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

Bien à toi,

Michel

Logged

Conference over procrastination has been postponed to tomorrow

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oki alors dans ce cas il suffit simplement de générer une impulsion de 1-2 ms toutes les 20 ms smiley
Code:
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);
   }
}
Logged


Liège / Belgium
Offline Offline
Newbie
*
Karma: 1
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Conference over procrastination has been postponed to tomorrow

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3626
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged


Liège / Belgium
Offline Offline
Newbie
*
Karma: 1
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Merci B@tto

Michel
Logged

Conference over procrastination has been postponed to tomorrow

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5347
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

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) :-(
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).
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Pages: [1]   Go Up
Jump to: