Aller au contenu


Photo
- - - - -

telecommande 20 bouton pour arduino


  • Veuillez vous connecter pour répondre
33 réponses à ce sujet

#21 Taupiot_Jr

Taupiot_Jr

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male

Posté 17 décembre 2014 - 06:52

Alors dans ton code tu as écris plusieurs if à la suite, essaie de les remplacer par un switch. Petit indice: la condition serait codeTouche ;)

Concernant controlServo, ce n'est pas une libraire, c'est une fonction. C'était une idée que tu peux appliquer plus tard si tu ne la comprends pas bien.

Essaie de remplacer tes if par un case, tu devrais y arriver je pense :)

#22 Jean-luc83

Jean-luc83

    Nouveau membre

  • Membres
  • 20 messages

Posté 17 décembre 2014 - 05:24

Salut,

 

bon donc voila c'est ce que j'avais fait avant de te demander de l'aide, je n'arrive pas a mettre en pratique le switch pour ce que je désire car je suis trop novice dans ce domaine....c'est pour ca que je te demande de l'aide car il me manque des choses que je ne gère pas.

 

 

 

 

 

 

 

#define TOUCHE_On/Off 16753245
#define TOUCHE_MENU 16769565
#define TOUCHE_TEST 16720605
#define TOUCHE_PLUS  16712445 
#define TOUCHE_Annuler 16761405
#define TOUCHE_Retour rapide 16769055
#define TOUCHE_Lecture 16754775
#define TOUCHE_Avance rapide 16748655
#define TOUCHE_0 16738455
#define TOUCHE_MOINS 16750695  
#define TOUCHE_C 16756815
#define TOUCHE_1 16724175
#define TOUCHE_2 16718055
#define TOUCHE_3 16743045
#define TOUCHE_4 16716015
#define TOUCHE_5 16726215
#define TOUCHE_6 16734885
#define TOUCHE_7 16728765
#define TOUCHE_8 16730805
#define TOUCHE_9 16732845

int brocheRecepteur = 3;
int brocheLED = 13;

#include <Servo.h>
Servo servo1;         
Servo servo2;
Servo servo3;
int pos = 0;

#include <IRremote.h> 
IRrecv monRecepteur(brocheRecepteur);
decode_results serieImpulsions;

unsigned long codeTouche = 0;
 
void setup()
   { 
   servo1.attach(10); 
   servo2.attach(9);
   pinMode(brocheRecepteur, INPUT);  
   pinMode(brocheLED, OUTPUT);
   monRecepteur.enableIRIn();
   Serial.begin(9600);
   } 

void loop()
   { 
   if ( monRecepteur.decode( &serieImpulsions ) ) 
   {
     codeTouche = serieImpulsions.value ; 
     monRecepteur.resume();
   }
switch (codeTouche) {
  {
    case 16724175:
    servo1.write(90); 
    break;
  }
  {
    case 16718055:
    servo2.write(90);
    break;
  }
  {
    case 16748655:
    for(pos = 0; pos <= 180; pos += 1)
    {
      servo1.write(pos);
      delay(15);
      }
      for(pos = 180; pos>=0; pos-=1)
      {
        servo1.write(pos);
        delay(15);
      }
      for(pos = 0; pos <= 180; pos += 1)
    {
      servo2.write(pos);
      delay(15);
      }
      for(pos = 180; pos>=0; pos-=1)
      {
        servo2.write(pos);
        delay(15);
      }
  }
}
   }
   
   
  

 

 

  



#23 Taupiot_Jr

Taupiot_Jr

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male

Posté 17 décembre 2014 - 07:20

Okay,

 

Alors à la place de tous les numéros, tu peux écrire le nom de tes constantes (TOUCHE_1,...).

 

Ensuite à la place de tes pos += 1 et pos -= 1, tu peux écrire pos++ et pos-- ;)

 

Est-ce que les servos réagissent ou pas du tout?

Que se passe-t-il en sortie?

 

Pour t'aider, essaie peut-être avec un seul case, je pense que ça peut t'aider dans le sens où il y a moins de sources d'erreurs.

Tu peux aussi faire varier la position sur la valeur 60, petite pause puis la valeur 120 du servo que tu testes.



#24 Jean-luc83

Jean-luc83

    Nouveau membre

  • Membres
  • 20 messages

Posté 17 décembre 2014 - 08:50

Pour les noms à la place des chiffres je le C , j ai juste fais un copier coller pour aller plus vite.
Pour pos++ et -- C est cool merci je ne savais pas.
Les servos réagissent:

Touche 1 rien
Touche 2 rien
touche av rapide il fait bouger servo1 à 180 jusqu'à 0, puis la mm chose pour servo2
touche 1 servo1 90
Touche 2 servo2 90

Pour ta proposition de déplacement avec une pause ça peut être comme ça je pense

for(pos = 0; pos <= 60; pos ++)
    {
      servo1.write(pos);
      delay(15);
      }
delay (2000);

      for(pos = 60; pos>=120; pos++)
      {
        servo1.write(pos);
        delay(15);
}
Delay (2000);

for(pos = 120; pos <= 180; pos ++)
    {
      servo1.write(pos);
      delay(15);
      }
Delay (2000);

      for(pos = 180; pos>=0; pos--)
      {
        servo1.write(pos);
        delay(15);

Je ne sais pas comment faire avec le case pour juste attribuer un servo sur un bouton et le faire bouger d un pas de 1(horaire et anti horaire ) avec les deux autres boutons en appui continu.
Et pareil pour servo 2.
As tu une idée?

#25 Taupiot_Jr

Taupiot_Jr

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male

Posté 18 décembre 2014 - 10:10

Hello,

 

Quand tu dis :

 

 

Touche 1 rien
Touche 2 rien
touche av rapide il fait bouger servo1 à 180 jusqu'à 0, puis la mm chose pour servo2
touche 1 servo1 90
Touche 2 servo2 90

Pour les deux premiers cas, où les servos ne bougent pas, je pense que c'est parce qu'au démarrage ils sont déjà à cette valeur. Essaie de mettre 180 ou autre chose ;)

 

Concernant le code pour un mouvement de 60 à 120, c'était plus pour aider à débugger en cas de problèmes.

 

Pour sélectionner puis faire bouger un servo tu y es presque!

Dans ton code tu arrives déjà à sélectionner un servo. Donc avec ces deux case tu peux choisir sur quel servo travailler et donc y écrire autre chose que :

servo1.write(90);

A la place tu pourrais mettre quelque chose comme :

 

 int i = 90; // Commence au milieu

 if ( TOUCHE_PLUS ) 
   {
     servo1.write(i++);
   }

 

 elseif ( TOUCHE_MOINS ) 
   {
     servo1.write(i--);
   }

Ainsi à chaque pression de TOUCHE_PLUS ou MOINS, ton servo avancera ou reculera d'un pas (attention aux extrémités de l'échelle, fais une condition pour ne pas écrire en dehors de 0-180).

 

Ensuite pour bouger avec les touches rapides ça sera un principe similaire, sauf que tu bougeras tant que tu appuies sur la touche ;)

 

J'espère avoir été assez clair ^^



#26 Jean-luc83

Jean-luc83

    Nouveau membre

  • Membres
  • 20 messages

Posté 18 décembre 2014 - 06:34

OK avec ton exemple j ai pas de réaction , servo bouge pas avec les touches plus et moins...
Sinon oui t es clair dans tes explications.

#27 Jean-luc83

Jean-luc83

    Nouveau membre

  • Membres
  • 20 messages

Posté 18 décembre 2014 - 06:39

#define TOUCHE_On/Off 16753245
#define TOUCHE_MENU 16769565
#define TOUCHE_TEST 16720605
#define TOUCHE_PLUS  16712445
#define TOUCHE_Annuler 16761405
#define TOUCHE_Retour rapide 16769055
#define TOUCHE_Lecture 16754775
#define TOUCHE_Avance rapide 16748655
#define TOUCHE_0 16738455
#define TOUCHE_MOINS 16750695 
#define TOUCHE_C 16756815
#define TOUCHE_1 16724175
#define TOUCHE_2 16718055
#define TOUCHE_3 16743045
#define TOUCHE_4 16716015
#define TOUCHE_5 16726215
#define TOUCHE_6 16734885
#define TOUCHE_7 16728765
#define TOUCHE_8 16730805
#define TOUCHE_9 16732845
int brocheRecepteur = 3;
int led = 13;

#include <Servo.h>
Servo servo1;        
Servo servo2;
int pos = 0;

#include <IRremote.h>
IRrecv monRecepteur(brocheRecepteur);
decode_results serieImpulsions;

unsigned long codeTouche = 0;
 
void setup()
   {
   servo1.attach(10);
   servo2.attach(9);
   pinMode(brocheRecepteur, INPUT); 
   pinMode(led, OUTPUT);
   monRecepteur.enableIRIn();
   Serial.begin(9600);
   }

void loop()
{
   if ( monRecepteur.decode( &serieImpulsions ) )
   {
     codeTouche = serieImpulsions.value ;
     monRecepteur.resume();
   }
  
 
switch (codeTouche)
  {
    case TOUCHE_1:
   
    int i=90;
    if(TOUCHE_PLUS)
 {
      servo1.write(i++);
 }
    else if(TOUCHE_MOINS)
{
      servo1.write(i--);
         }
break;
  
  
 
}
}
    



#28 Taupiot_Jr

Taupiot_Jr

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male

Posté 18 décembre 2014 - 11:11

Okay, alors le code que j'ai donné n'était qu'un exemple de principe.
Il faut donc l'adapter à ton application ;)
Le but est qu'à chaque pression tu aies une action sur le servo. Il faut donc modifier la valeur de la position du servo (nommons la posServo1) qui permet d'indiquer au servo sa position.
Donc il faut que quand tu appuies sur ton bouton tu modifies posServo1 et qu'ensuite tu donnes cette valeur au servo.

#29 Jean-luc83

Jean-luc83

    Nouveau membre

  • Membres
  • 20 messages

Posté 19 décembre 2014 - 05:59

je comprends pas!!!

 

#define TOUCHE_On/Off 16753245
 #define TOUCHE_MENU 16769565
 #define TOUCHE_TEST 16720605
 #define TOUCHE_PLUS  16712445
 #define TOUCHE_Annuler 16761405
 #define TOUCHE_Retour rapide 16769055
 #define TOUCHE_Lecture 16754775
 #define TOUCHE_Avance rapide 16748655
 #define TOUCHE_0 16738455
 #define TOUCHE_MOINS 16750695
 #define TOUCHE_C 16756815
 #define TOUCHE_1 16724175
 #define TOUCHE_2 16718055
 #define TOUCHE_3 16743045
 #define TOUCHE_4 16716015
 #define TOUCHE_5 16726215
 #define TOUCHE_6 16734885
 #define TOUCHE_7 16728765
 #define TOUCHE_8 16730805
 #define TOUCHE_9 16732845
 int brocheRecepteur = 3;
 int led = 13;
int angleMin = 0;
int angleMax = 180;
#include <Servo.h>
Servo servo1;        
Servo servo2;
int posServo1 = 90;
#include <IRremote.h>
 IRrecv monRecepteur(brocheRecepteur);
 decode_results serieImpulsions;

unsigned long codeTouche = 0;
 
 void setup()
    {
    servo1.attach(10);
    servo2.attach(9);
    pinMode(brocheRecepteur, INPUT);
    pinMode(led, OUTPUT);
    monRecepteur.enableIRIn();
    Serial.begin(9600);
    }

void loop()
 {
    if ( monRecepteur.decode( &serieImpulsions ) )
    {
      codeTouche = serieImpulsions.value ;
      monRecepteur.resume();
    }
  
 
 switch (codeTouche)
   {
     case TOUCHE_1:
   
     posServo1 = 120;
    
     if(TOUCHE_PLUS)
  {
       for(posServo1 =0; posServo1 <= 40; posServo1 ++);
       servo1.write(posServo1);
       delay(15);
  }
 
     else if(TOUCHE_MOINS)
 {
       for(posServo1 =40; posServo1 >= 0; posServo1 --);
       servo1.write(posServo1);
       delay(15);
     }
 break;
  
  
 
 }
 }



#30 Taupiot_Jr

Taupiot_Jr

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male

Posté 20 décembre 2014 - 09:50

Hello,

 

Ce que tu as écrit n'est pas tout à fait correct, regarde bien la syntaxe de ton if

 

Ensuite, avec la boucle que tu as écrite, à chaque pression sur la touche + ou -, tu vas faire "balayer" le servo de 0° à 40° ou l'inverse..

Ce code ressemble donc un peu plus à l'autre fonctionnement que tu veux, lorsque tu appuies sur avance/retour rapide ;)

 

Et pour finir, qu'est-ce que tu ne comprends pas? Je suppose que tu ne comprends pas où il y a un problème.

Dans tous les cas, donne le plus d'infos possible sur ce que tu as essayé, ce que tu as compris, etc..

 

Et utilise les balises code pour en afficher ;)

// Petit exemple au hasard
for (int i = 0; i < w; i++)
	for (int j = 0; j < h; j++) {
		int c = pixels[i][j] << 16 | pixels[i][j] << 8 | pixels[i][j];
		backgroundBitmap.setRGB(i, j, c);
	}
}


#31 Jean-luc83

Jean-luc83

    Nouveau membre

  • Membres
  • 20 messages

Posté 20 décembre 2014 - 11:05

Salut,
Quand je dis je ne comprends pas c'est que je suis perdu.
Je me répète je suis novice, faire bouger un servo à un point donner ok, avec posServo et l ir remote je nage.
Pour info le dernière code que j ai mis il y a rien qui marche.
un jour j'y arriverai ...

#32 Taupiot_Jr

Taupiot_Jr

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male

Posté 21 décembre 2014 - 09:54

Alors ici posServo est une variable qui te permet de donner la position de ton servo. Elle permet de rendre le code plus propre et plus pratique à manipuler.

Donc quand tu modifies cette variable à un certain endroit et qu'ensuite tu donne cette variable comme paramètre à la fonction servo.write(posServo), la fonction va lire la valeur de la variable et ensuite écrire cette valeur sur le servo.

Exemple:

/* Morceau de code qui pourrait être dans le tient */

// Initialisation de la variable à 53
posServo = 53;
// Positionnement du servo à la valeur donnée par posServo
servo.write(posServo);

/* Autre exemple */
/* Avec ce code, le servo va augmenter sa position jusqu'à 90°
   et ensuite faire un bond à 145° */

//SI la position du servo est égale ou au-delà de 90°
if(posServo >= 90){
  // ALORS sa nouvelle position est 145°
  posServo = 145;
  servo.write(posServo);
}
// SINON il actualise sa position
else{
  posServo++;
  servo.write(posServo);
}

Donc, dans la dernière version de ton code, il y a une erreur de syntaxe au if. Pour la corriger, consulte ce lien: référence Arduino

Dans ce lien il y a des explications et des exemples des fonctionnalités de l'Arduino.

 

Concernant irRemote, tu t'en est bien sorti, tu as réussi à utiliser ta télécommande ;)



#33 Jean-luc83

Jean-luc83

    Nouveau membre

  • Membres
  • 20 messages

Posté 01 janvier 2015 - 08:56

Salut, je te souhaite une très bonne année 2015, je suis toujours en déplacement je vois ça dès mon retour.
A bientôt.

#34 Taupiot_Jr

Taupiot_Jr

    Habitué

  • Membres
  • PipPip
  • 232 messages
  • Gender:Male

Posté 02 janvier 2015 - 03:05

Hello,

Merci, à toi aussi ^^




0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users