iron man suite

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

désolé il manquait un bout du programme, le voilà complet

bonjour à toutes et tous

je reprends un projet mené par mon fils et pour lequel il n'a plus le temps pour l'instant il s'agit de motorisé la visière du casque d'iron man le casque est fini, toute l'installation aussi, ne reste plus que le programme. voici un petit bout du programme qui ne donne pas satisfaction. Le servo est commandé par télécommande, mais en position 0 (visière fermé) il continue à fonctionner (bruit de grésillement) et chauffe (accessoirement il use la pile). Par contre le fait qu'il continue à maintenir la position à 180 (visière ouverte) est primordial sinon la visière se referme sous son poids. j'ai trouvé sur le net des fonctions int myServo_Repos = 0 ou servo.detach()mais rien ne fonctionne.

voici le programme:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <Servo.h> 
#include <IRremote.h>
#include <IRremoteInt.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results; 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 

int pos = 0;    // variable to store the servo position 

void setup() 
{ 
  Serial.begin(9600);
  irrecv.enableIRIn();
  myservo.attach(2);  // attaches the servo on pin 9 to the servo object 
} 


void loop() 
{ 

  if (irrecv.decode(&results)) 
  { 
    switch (results.value) 
    {

      case (0xFD807F)://touche vol +  

      for(pos = 0; pos < 180; pos += 1) 
      {                                   
        myservo.write(pos);              
        delay(15);                       
      }
     break;

     case (0xFD906F)://touche vol - 

     for(pos = 180; pos>=1; pos-=1)
     {                            
       myservo.write(pos);               
       delay(15); 

     } 
      break;
    }
    irrecv.resume(); 
  }
 }

d'avance merci pour votre aide.

Édité par raphaelsud

+0 -0

C'est quoi la position de repos du servo (mécaniquement) ? Un servo qui chauffe et qui grésille c'est pas bon, en général c'est qu'il force. Je n'ai pas les spécificités de ton projet, tu pourrais nous en dire plus sur le mécanisme actionné par le servo ?

Un truc important quand on utilise des servos c'est de faire attention à régler les fins de courses correctement et prendre des servos assez coupleux pour ce que tu veux faire. Tu n'as pas besoin de servos rapides, ça c'est plutôt pour une utilisation aéromodéliste. Tu peux nous donner les caractéristiques du servo et la masse de la visière ?

Si tu as acheté des micro servos, (souvent en boîtier bleu transparent et qui coûtent que dalle), c'est possible qu'ils soient sous-dimensionnés. Si jamais tu dois racheter des servos plus bourrins, va dans une boutique locale d'aéromodélisme et montre-leur le casque. À mon avis un servo taille standard (et pas un micro) suffit largement, et pas besoin de pignons métal ni de servos HV/numériques pour ton cas d'utilisation.

Avant tout, vérifie donc tes fins de courses et l'adéquation du couple servo avec ton application.

Pour clarifier ce que je disais sur les fins de course, je pense que ton servo force alors que la verrière déjà fermée l'empêche d'aller plus loin. Je suis presque sûr que c'est juste ça le problème, essaie de jouer sur le paramètre qui donne la position du servo quand la visière est fermée.

Édité par anonyme

+0 -0
Auteur du sujet

merci pour ta réponse, malheureusement:

  • le servo est un Hitec hs 125 mg, pigons métal (super plat pour répondre à l'encombrement disponible)
  • le circuit est dupliqué sur une plaque d'essai (aucun effort, ni limite sur le servo) et pourtant il force en position 0 (en fait il fait des aller retour micrométriques)alors qu'il n'a rien à déplacer (juste son palonnier)
  • pour info, le servo agit sur une tringlerie "meccano" collée à la visière (poids de l'ensemble 150 gr) cordialement
+0 -0

Ah oui je vois, c'est un bon servo pour aile de planeur apparemment. Les ajustements micrométriques ça m'est déjà arrivé sur des servos Hitec HS35B, et je n'ai pas réussi à régler ça correctement. Tu peux appeler le SAV Hitec pour leur demander ce qu'ils en pensent, j'ai entendu parler de défauts de fabrication sur certains de leurs servos. Ça peut arriver si le potar du servo est pas précis et fait donc frétiller le servo, qui passe son temps à corriger sa position. Si ça frétille quand c'est sur la plaque d'essai et en commande directe, c'est probablement le servo qui est foireux. Va voir une boutique, ils ont typiquement des testeurs de servos ou tu peux en acheter un, c'est pas cher et très pratique si tu fais pas mal de projets du genre: comme celui-ci.

+0 -0

Il est possible aussi que ce soit simplement le fait que le servo respecte pas pile poil le standard de 1-2 ms et du coup ca "gresille". Pour cela tu peux essayer de trouver toi-même ses "vrais butés" et ensuite tu pourras correctement l'initialiser. J'avais écris une petite méthode à ce sujet ici : https://zestedesavoir.com/tutoriels/686/arduino-premiers-pas-en-informatique-embarquee/747_le-mouvement-grace-aux-moteurs/3438_un-moteur-qui-a-de-la-tete-le-servomoteur/#6-10710_tester-un-servomoteur-non-standard

ZdS, le best du Zeste ! Tuto Arduino, blog, etc

+0 -0
Auteur du sujet

bonjour
merci pour vos réponses
voici ce que j'ai concocté ce week end (j'y ai passé le week end)
1 pb est réglé: le servo s'arrête quand la visière est fermée à 0, et il maintient la position ouverte à 180

par contre, au démarrage le servo se positionne à 90°
j'ai lu que cela venait de la bibliothèque servo. Peut-on la modifier pour qu'il reste en position 0 au démarrage?

d'avance merci

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <Servo.h> 
#include <IRremote.h>
#include <IRremoteInt.h>

int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results; 
Servo myservo;  // create servo object to control a servo 
                // a maximum of eight servo objects can be created 
const int MAX_ARRIERE=2100;
const int ARRET=850;
const int broche_myservo=2;
int pos = 0;


void setup() 
{ 
  Serial.begin(9600);
  irrecv.enableIRIn();
  myservo.attach(2);  // attaches the servo on pin 9 to the servo object 
pinMode (broche_myservo, OUTPUT);
} 


void loop() // celui la fonctionne, reste pb 90 au démarrage plus longévité
{ 

  if (irrecv.decode(&results)) 
  { 
    switch (results.value) 
    {

      case (0xFD807F)://touche vol +  

{
 if (!myservo.attached()) myservo.attach(2);
 myservo.writeMicroseconds(2100);
 delay (1000);
 break;
 }

     case (0xFD906F)://touche vol - 


 {                            
 if  (!myservo.attached())myservo.attach(2); 
 myservo.writeMicroseconds(850);              
  delay(1000);
  myservo.detach();
  delay(1000);
  break;

     } 


    }
    irrecv.resume(); 
  }
 }
+0 -0

Tu veux bien nous montrer ton patch et nous expliquer super vite fait des fois que quelqu'un d'autre puisse s'en servir ? Si c'est un vrai bug de la bibliothèque tu pourrais le faire corriger.

Bonne chance avec le reste du projet !

+0 -0
Auteur du sujet

c'est pas un bug de la bibliothèque
j'ai ouvert servo.h dans arduino/Library/servo
ligne 90 j'ai modifié la valeur: 850 à la place de 1500 (# define DEFAULT_PULSE_WIDTH)

elle était simplement écrite pour que le servo se mette à 90 au démarrage

à+

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte