Servo moteur Arduino: souci enchaînement d'actions

Résolu
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020 - Modifié le 19 mai 2020 à 01:12
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020 - 19 mai 2020 à 18:06
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

Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
Modifié le 18 mai 2020 à 19:35
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
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
18 mai 2020 à 19:41
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.
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
18 mai 2020 à 19:41
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.
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
18 mai 2020 à 19:45
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 ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
18 mai 2020 à 19:49
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.
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
18 mai 2020 à 20:17
Ok, donc mon hypothèse est fausse.

Est ce qu'il répond quand tu lui donnes des instructions?
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
18 mai 2020 à 21:18
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 !
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
18 mai 2020 à 21:48
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 »
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
18 mai 2020 à 22:00
Non, il est juste connecté a l'arduino et au recepteur infrarouge donc je ne peux pas savoir ce qu'il dit.
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
18 mai 2020 à 22:04
Et merci d'essayer de m'aider encore à cette heure-ci !
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
19 mai 2020 à 07:29
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
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
19 mai 2020 à 12:39
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 ?
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
19 mai 2020 à 13:13
Oui ben, tu adaptes.
Et si ça fonctionne, alors tu ajoutes ta pause de 500ms entre les 2 boucles
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
Modifié le 19 mai 2020 à 17:40
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 ?
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
19 mai 2020 à 17:40
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
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
19 mai 2020 à 17:42
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 ?
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
19 mai 2020 à 17:46
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
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
19 mai 2020 à 17:53
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 !
0
Whismeril Messages postés 18416 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 1 juin 2023 624
19 mai 2020 à 18:02
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.
0
Jojon2711 Messages postés 20 Date d'inscription samedi 16 mai 2020 Statut Membre Dernière intervention 13 juin 2020
19 mai 2020 à 18:06
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 !
0