Servo moteur Arduino: souci enchaînement d'actions [Résolu]

Signaler
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020
-
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020
-
Bonjour,
Je suis actuellement en train de développer un projet dans lequel j'inclus un servo moteur et un capteur infrarouge avec sa télécommande et bien sur une carte arduino mega 2560.
J'aimerais qu'en appuyant sur le bouto, power de la télécommande le servo moteur fasse une rotation de 110° puis revienne à sa position d'origine ( 0 ) après une demie seconde.
J'ai donc fais le code et inclus la fonction " delay( 500 ) " pour le temps du servo moteur.
Une fois le code sur la carte, je clique sur le bouton power et là le moteur tourne bien à 110° mais y reste au lieu de retourner a 0 après une demie seconde. J'ai essayé de mettre des acolades... Rien de marche ! S'il vous plaît, j'aimerais vraiment pouvoir réaliser ce projet !
Si quelqu'un peut m'aider ?
Merci beaucoup d'avance !!

Le code :

#include <IRremote.h> // Bibliothèque IR
#include <IRremoteInt.h> // Bibliothèque IR
#include <Servo.h>  // Bibliothèque Servo

const char DIN_RECEPTEUR_INFRAROUGE = 12;  // Déclare l'emplacement sur la broche

decode_results message; // décode les résultats

Servo monServo;  // renomme Servo
int positionDuServo = 0;  // Initialise la postition de départ du servo
IRrecv monIr(DIN_RECEPTEUR_INFRAROUGE); // renomme IRrecv

void setup() 
{
   monServo.attach(8); // Déclare que le servo est sur la broche 9
   monServo.write(positionDuServo);   // Met le servo a 0
   monIr.enableIRIn();  // Démarre le IRreceiver
}

void loop() {
   if ( monIr.decode( &message ) ) {
      if ( message.value == 0xFFA25D ) { //FFA25D est le code du bouton power
         monServo.write( 110 ); {  // déplace servo a 110
         delay( 500 ); // C'EST A PARTIR DE LA QUE CA NE MARCHE PAS
         monServo.write( positionDuServo );  // Puis servo revient a 0
         }
      }
   }
}

20 réponses

Messages postés
14720
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Bonjour

écrire que c'est urgent est contre productif.

D'abord que soit écrit ou non ne change rien au fait que les membres passent sur le forum quand ils veulent.

Ensuite, un membre qui pourrait savoir répondre (ça n'est pas mon cas), peut se dire
Encore un qui s'y prend au dernier moment
et ne pas lire ton message.

Bref, au mieux ça ne sert à rien, au pire ça te dessert.

Donc je l'enlève de ton titre.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Bonjour, d'accord.
Je marquais ça car ça fait déjà 1 semaine que j'ai posté ce message sur ccm et je n'ai eu aucune réponse donc ça devenait un peu "urgent" pour moi.
Mais vous avez sans doute raison.
Merci, Bonne soirée.
Messages postés
14720
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Cela dit j'ai peut-être une idée.
Si le servo moteur met plus de 500 ms à aller de 0 à 110 (admettons 750 ms), et qu'il ignore les ordres qu'il reçoit tant qu'il est en mouvement, alors ta seconde instruction est ignorée.

Pour vérifier (c'est du bricolage), chronomètre a peut près le temps de déplacement et mets un délais de ce temps + 500.
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Donc si je comprend bien je dois chronométrer a partir du moment ou j'appuis sur le bouton, le temps que met le servo moteur pour déplacer son éguille à 110 ? Je vais essayer mais il le fait très rapidement en moin d'une seconde !
Et ensuite une fois que j'ai le temps qu'il met pour tourner en milli seconde je l'additionne à 500 ?
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Après, j'avais aussi essayer de mettre le temps à 2000 ce qui correspond à 2 secondes mais il restait toujours à 110° en ignorant les autres instructions.
Par contre quand j'ai mis 3 ce qui est extremement rapide, il fesait des aller retours très rapides sans s'arrêter.
Messages postés
14720
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Ok, donc mon hypothèse est fausse.

Est ce qu'il répond quand tu lui donnes des instructions?
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

c'est-à-dire ?
Oui il répond à tout le code sauf la dernière partie .
Dites-moi si je ne réponds pas à votre question !
Messages postés
14720
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Non, quand tu lui demandes d’aller à 11, est ce qu’il te renvoie un message pour te dire « OK, j’y vais » ou encore mieux « ça y est »
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Non, il est juste connecté a l'arduino et au recepteur infrarouge donc je ne peux pas savoir ce qu'il dit.
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Et merci d'essayer de m'aider encore à cette heure-ci !
Messages postés
14720
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Bonjour
As tu essayé ça ?
https://www.arduino.cc/en/Tutorial/Sweep

Ps: là
Servo monServo;  // renomme Servo
....
IRrecv monIr(DIN_RECEPTEUR_INFRAROUGE); // renomme IRrecv

Tu ne renommes rien, tu initialises 2 variables de type Servo et IRrecv
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Bonjour,
Merci je vais essayer ! La je ne peux pas car j'ai une coupure de courant mais dès que je peux j'essaie et je vous dit !
Par contre, pour inclure la réception infrarouge, je dois mettre
if ( monIr.decode( &message ) ) {
      if ( message.value == 0xFFA25D ) {

Dans vois loop avant le début du code que vous m'avez mis en lien pour que ça exécute le code des que j'appuis sur la télécommande ?
Messages postés
14720
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Oui ben, tu adaptes.
Et si ça fonctionne, alors tu ajoutes ta pause de 500ms entre les 2 boucles
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Merci ! J'ai donc maintenant ce code :

#include <Servo.h>
#include <IRremote.h> // Bibliothèque IR
#include <IRremoteInt.h> // Bibliothèque IR

const char DIN_RECEPTEUR_INFRAROUGE = 12;  // Déclare l'emplacement sur la broche

decode_results message; // décode les résultats

Servo myservo;  // create servo object to control a servo
IRrecv monIr(DIN_RECEPTEUR_INFRAROUGE); // renomme IRrecv

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

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo.write(0);   // Met le servo a 0
   monIr.enableIRIn();  // Démarre le IRreceiver
}

void loop() {
   if ( monIr.decode( &message ) ) {
      if ( message.value == 0xFFA25D ) { //FFA25D est le code du bouton power
  for (pos = 0; pos <= 110; pos += 1) { // goes from 0 degrees to 180 degrees
    // in steps of 1 degree
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(5);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 110; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(5);                       // waits 15ms for the servo to reach the position
      }
    }
  }
}


Et il marche, quand j'appuis sur power le servo moteur se met a touner de 0 à 110 mais il fait des tours a l'infini. comment faire pour qu'il ne fasse qu'un tour et qu'il revienne au début du code afin de refaire le code la prochaine fois que j'appuis sur power ?
Messages postés
14720
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Dans ce que tu montres là, il ne devrait le faire qu'une fois.
Si ça recommence, c'est que loop est appelée plusieurs fois et &message vaut toujours 0xFFA25D
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Comment je peux faire pour que le loop soit éxécuté qu'une fois et revienne au début en attente d'un autre appui sur le bouton power ?
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Même quand il n'y avait pas encore tout le code pour la réception ir, qu'il y avait juste le code copié sur le site le moteur faisait des allers retours sans s'arrêter
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

On y est presque ! Merci en tout cas pour tout ! Je n'aurais surement pas pu réaliser mon projet si vous n'aviez pas été là où je l'aurais réalisé dans longtemps !
Messages postés
14720
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
2 septembre 2020
432
Je ne sais pas te dire plus, je ne fais pas d'arduino, et très peu de C++

le nom loop laisse à penser que c'est une méthode appelée à répétition.
Donc peut-être devrait tu essayer de "vider" le récepteur IR.
Messages postés
20
Date d'inscription
samedi 16 mai 2020
Statut
Membre
Dernière intervention
13 juin 2020

Ok d'accord, je vais essayer ou aller voir sur le forum arduin il y a surement la réponse !
Merci beaucoup pour tout !! Bonne fin d'après midi !
Au revoir !