Go Down

Topic: [RÉSOLU] Servomoteur adapté à un encodeur rotatif (projet TPE) (Read 848 times) previous topic - next topic

VictorMoussally

Bonjour,

Actuellement en classe de 1ère, je fais un TPE en Sciences de l'Ingénieur, qui nécessite l'utilisation d'une carte Arduino.

Le programme permettrai la chose suivante :
Un encodeur rotatif incrémente une variable compteur lorsqu'il tourne dans un sens, et la décrémente lorsqu'il tourne dans l'autre sens.

Un servomoteur prends une certaine valeur en fonction de la variable compteur, et "s'adapte" à chaque position de l'encodeur rotatif.  

Je ne m'y connais pas assez en langage Arduino, et malgré mes nombreuses tentatives mon programme de fonctionne pas.

Je demande donc votre aide pour m'aider à faire ledit programme...

Je peux vous donner mon programme actuel si vous voulez le voir (je ne souhaitais pas surcharger mon post...).

Merci d'avance

Victor

solfra

On ne vas pas de donner un code tous fait !
Montre nous ton programme pour regarder ce qui ne fonctionne pas.

Que-ce qui ne fonctionne pas ? L'incrémentation ? Le placement du servomoteur ?

VictorMoussally

#2
Jan 15, 2017, 08:00 pm Last Edit: Jan 15, 2017, 08:23 pm by VictorMoussally
Le soucis c'est que je n'arrive même pas à compiler le programme...
Mon code d'erreur est le suivant :

Code: [Select]
C:\Program Files (x86)\Arduino\libraries\RotaryEncoder\RotaryEncoder.cpp:7:20: fatal error: wiring.h: No such file or directory

 #include "wiring.h"

                    ^

compilation terminated.

exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno


Mon programme (il n'est presque pas commenté, shame on me)

Code: [Select]
#include <Servo.h> //inclue la bibliothèque pour les servomoteurs
#include <RotaryEncoder.h> //inclue la bibliothèque pour l'encodeur rotatif
#include <MsTimer2.h> //inclue la bibliothèque pour l'interruption du programme

int _ABVAR_1_compt = 0 ;
Servo servo_pin_5;

RotaryEncoder encodeur;

void setup()
{
  encodeur.init();
  servo_pin_5.attach(5);
  MsTimer2::set(1, InterruptTimer2); // période 1ms
  MsTimer2::start(); // active Timer 2
}

void loop()
{
  if (( ( _ABVAR_1_compt ) < ( 0 ) ))
  {
    _ABVAR_1_compt = 0 ;
  }
  else
  {
    if (( ( _ABVAR_1_compt ) > ( 25 ) ))
    {
      _ABVAR_1_compt = 0 ;
    }
    else
    {
      if (( ( _ABVAR_1_compt ) == ( 0 ) ))
      {
        servo_pin_5.write( 0 );
      }
      if (( ( _ABVAR_1_compt ) == ( 1 ) ))
      {
        servo_pin_5.write( 13.8 );
      }
      if (( ( _ABVAR_1_compt ) == ( 2 ) ))
      {
        servo_pin_5.write( 27.7 );
      }
      if (( ( _ABVAR_1_compt ) == ( 3 ) ))
      {
        servo_pin_5.write( 41.5 );
      }
      if (( ( _ABVAR_1_compt ) == ( 4 ) ))
      {
        servo_pin_5.write( 55.2 );
      }
      if (( ( _ABVAR_1_compt ) == ( 5 ) ))
      {
        servo_pin_5.write( 69.1 );
      }
      if (( ( _ABVAR_1_compt ) == ( 6 ) ))
      {
        servo_pin_5.write( 83.9 );
      }
      if (( ( _ABVAR_1_compt ) == ( 7 ) ))
      {
        servo_pin_5.write( 96.7 );
      }
      if (( ( _ABVAR_1_compt ) == ( 8 ) ))
      {
        servo_pin_5.write( 110.5 );
      }
      if (( ( _ABVAR_1_compt ) == ( 9 ) ))
      {
        servo_pin_5.write( 124.3 );
      }
      if (( ( _ABVAR_1_compt ) == ( 10 ) ))
      {
        servo_pin_5.write( 138.1 );
      }
      if (( ( _ABVAR_1_compt ) == ( 11 ) ))
      {
        servo_pin_5.write( 151.9 );
      }
      if (( ( _ABVAR_1_compt ) == ( 12 ) ))
      {
        servo_pin_5.write( 165.7 );
      }
      if (( ( _ABVAR_1_compt ) == ( 13 ) ))
      {
        servo_pin_5.write( 180 );
      }
      if (( ( _ABVAR_1_compt ) == ( 14 ) ))
      {
        servo_pin_5.write( 165.7 );
      }
      if (( ( _ABVAR_1_compt ) == ( 15 ) ))
      {
        servo_pin_5.write( 151.9 );
      }
      if (( ( _ABVAR_1_compt ) == ( 16 ) ))
      {
        servo_pin_5.write( 138.1 );
      }
      if (( ( _ABVAR_1_compt ) == ( 17 ) ))
      {
        servo_pin_5.write( 124.3 );
      }
      if (( ( _ABVAR_1_compt ) == ( 18 ) ))
      {
        servo_pin_5.write( 110.5 );
      }
      if (( ( _ABVAR_1_compt ) == ( 19 ) ))
      {
        servo_pin_5.write( 96.7 );
      }
      if (( ( _ABVAR_1_compt ) == ( 20 ) ))
      {
        servo_pin_5.write( 82.9 );
      }
      if (( ( _ABVAR_1_compt ) == ( 21 ) ))
      {
        servo_pin_5.write( 69.1 );
      }
      if (( ( _ABVAR_1_compt ) == ( 22 ) ))
      {
        servo_pin_5.write( 55.3 );
      }
      if (( ( _ABVAR_1_compt ) == ( 23 ) ))
      {
        servo_pin_5.write( 41.5 );
      }
      if (( ( _ABVAR_1_compt ) == ( 24 ) ))
      {
        servo_pin_5.write( 27.7 );
      }
      if (( ( _ABVAR_1_compt ) == ( 25 ) ))
      {
        servo_pin_5.write( 13.8 );
      }
    }
  }
}

void InterruptTimer2() { // debut de la fonction d'interruption Timer2

encodeur.service(); // appel de la routine de gestion de l'encodeur

int test=encodeur.step(); // lit une seule fois l'état de step

if (test==1) // si rotation + encodeur
{
  _ABVAR_1_compt=_ABVAR_1_compt+1; // incrémente le compteur
  Serial.println(_ABVAR_1_compt);

}

else if (test==-1) // si rotation - encodeur
{
  _ABVAR_1_compt=_ABVAR_1_compt-1; // décrémente le compteur
  Serial.println(_ABVAR_1_compt);

}


}


Pourtant j'ai bien les les librairies...  :smiley-confuse:

EDIT : Pour les libraries, le RotaryEncoder, je l'ai télécharger depuis le site  mon-club-elec.fr (s65-shield_v014_modified).
Je ne sais pas si cela peut vous être utile pour m'aider.


solfra

Où as-tu trouver ces librairies ?

Avec celle-la, tu peux repérer deux erreur en comparant l'exemple et ton code. Chez moi cette librairie fonctionne bien.

VictorMoussally

Ok merci, je vais essayer de suite...

Je les avais trouvé sur le site "mon-club-elec.fr" (je l'ai EDIT dans mon dernier post).

Encore merci de votre aide, je vous tiens au courant.

VictorMoussally

J'ai bien téléchargé et installé ta bibliothèque, mais j'ai toujours des erreurs...
Est-ce que cela vient de mon code ? Il semble qu'Arduino de "connais" plus certaines fonctions liées à l'encodeur...


Rapport d'erreur Arduino :
Code: [Select]
Arduino : 1.8.1 (Windows 10), Carte : "Arduino/Genuino Uno"

TPE_0.1:8: error: no matching function for call to 'RotaryEncoder::RotaryEncoder()'

 RotaryEncoder encodeur;

               ^

C:\Users\Victor\AppData\Local\Temp\arduino_modified_sketch_304435\TPE_0.1.ino:8:15: note: candidates are:

In file included from C:\Users\Victor\AppData\Local\Temp\arduino_modified_sketch_304435\TPE_0.1.ino:1:0:

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:22:3: note: RotaryEncoder::RotaryEncoder(int, int)

   RotaryEncoder(int pin1, int pin2);

   ^

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:22:3: note:   candidate expects 2 arguments, 0 provided

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:18:7: note: constexpr RotaryEncoder::RotaryEncoder(const RotaryEncoder&)

 class RotaryEncoder

       ^

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:18:7: note:   candidate expects 1 argument, 0 provided

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:18:7: note: constexpr RotaryEncoder::RotaryEncoder(RotaryEncoder&&)

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:18:7: note:   candidate expects 1 argument, 0 provided

C:\Users\Victor\AppData\Local\Temp\arduino_modified_sketch_304435\TPE_0.1.ino: In function 'void setup()':

TPE_0.1:12: error: 'class RotaryEncoder' has no member named 'init'

   encodeur.init();

            ^

C:\Users\Victor\AppData\Local\Temp\arduino_modified_sketch_304435\TPE_0.1.ino: In function 'void InterruptTimer2()':

TPE_0.1:142: error: 'class RotaryEncoder' has no member named 'service'

 encodeur.service(); // appel de la routine de gestion de l'encodeur

          ^

TPE_0.1:144: error: 'class RotaryEncoder' has no member named 'step'

 int test=encodeur.step(); // lit une seule fois l'état de step

                   ^

exit status 1
no matching function for call to 'RotaryEncoder::RotaryEncoder()'

Artouste

bonsoir
perso j'utilise depuis pas mal de temps la lib rotary encoder de PJRC
c'est pour moi la plus versatile

VictorMoussally

Bonsoir,

perso j'utilise depuis pas mal de temps la lib rotary encoder de PJRC

Permet-elle d'utiliser un encodeur rotatif, avec les commandes présentent dans mon programme ?

Victor

Artouste

Bonsoir,

Permet-elle d'utiliser un encodeur rotatif, avec les commandes présentent dans mon programme ?

Victor
un (ton) programme doit s'adapter à libairie que  tu utilise. :smiley-mr-green:


VictorMoussally

Le soucis est bien là... :smiley-confuse:

Je suis incapable d'adapter mon programme aux différentes libraires, car je n'ai pas les connaissances nécessaire...
Je sais que j'en demande beaucoup, mais pensez-vous que vous pourriez adapter mon programme à "vos" bibliothèques ? Avec la description + le programme que j'ai donné ?

Je comprends parfaitement que ce n'est pas un site où je demande un programme et vous le faites, mais cela serait d'une aide inconsidérable...

Victor

VictorMoussally

J'ai fait des test, et il semble bien que ce soit la bibliothèque qui cause les erreurs de compilation : j'ai crée un sketch avec rien, sauf le corps du programme et le "#include <RotaryEncoder.h>" et ça n'a pas voulu compiler, en affichant toujours l'erreur

Code: [Select]

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder\RotaryEncoder.cpp:7:20: fatal error: wiring.h: No such file or directory

 #include "wiring.h"


J'ai beau cherché sur internet, je ne trouve pas de correctif pour cette librairies...
Des idées ?

EDIT : Pour les libraries, le RotaryEncoder, je l'ai télécharger depuis le site  mon-club-elec.fr (s65-shield_v014_modified).

-> Lien de ledit site
http://www.mon-club-elec.fr/pmwiki_reference_arduino/pmwiki.php?n=Main.LibrairieS65ShieldTelecharger

fdufnews

La librairie doit être ancienne (et pas mise à jour). Le fichier Wiring.h n'est plus dans la chaîne de développement depuis plusieurs années.
Il vaudrait mieux utiliser une librairie à jour comme le propose Artouste et adapter ton programme.
Tu dis ne pas avoir les connaissances nécessaires pour adapter le programme. Les connaissances s'acquièrent par la pratique. Donc le mieux c'est de pratiquer. On t'aidera à mettre ton programme au point.

solfra

J'ai bien téléchargé et installé ta bibliothèque, mais j'ai toujours des erreurs...
Est-ce que cela vient de mon code ? Il semble qu'Arduino de "connais" plus certaines fonctions liées à l'encodeur...


Rapport d'erreur Arduino :
Code: [Select]
Arduino : 1.8.1 (Windows 10), Carte : "Arduino/Genuino Uno"

TPE_0.1:8: error: no matching function for call to 'RotaryEncoder::RotaryEncoder()'

 RotaryEncoder encodeur;

               ^

C:\Users\Victor\AppData\Local\Temp\arduino_modified_sketch_304435\TPE_0.1.ino:8:15: note: candidates are:

In file included from C:\Users\Victor\AppData\Local\Temp\arduino_modified_sketch_304435\TPE_0.1.ino:1:0:

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:22:3: note: RotaryEncoder::RotaryEncoder(int, int)

   RotaryEncoder(int pin1, int pin2);

   ^

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:22:3: note:   candidate expects 2 arguments, 0 provided

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:18:7: note: constexpr RotaryEncoder::RotaryEncoder(const RotaryEncoder&)

 class RotaryEncoder

       ^

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:18:7: note:   candidate expects 1 argument, 0 provided

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:18:7: note: constexpr RotaryEncoder::RotaryEncoder(RotaryEncoder&&)

C:\Users\Victor\Documents\Arduino\libraries\RotaryEncoder-master/RotaryEncoder.h:18:7: note:   candidate expects 1 argument, 0 provided

C:\Users\Victor\AppData\Local\Temp\arduino_modified_sketch_304435\TPE_0.1.ino: In function 'void setup()':

TPE_0.1:12: error: 'class RotaryEncoder' has no member named 'init'

   encodeur.init();

            ^

C:\Users\Victor\AppData\Local\Temp\arduino_modified_sketch_304435\TPE_0.1.ino: In function 'void InterruptTimer2()':

TPE_0.1:142: error: 'class RotaryEncoder' has no member named 'service'

 encodeur.service(); // appel de la routine de gestion de l'encodeur

          ^

TPE_0.1:144: error: 'class RotaryEncoder' has no member named 'step'

 int test=encodeur.step(); // lit une seule fois l'état de step

                   ^

exit status 1
no matching function for call to 'RotaryEncoder::RotaryEncoder()'

Regarde les exemples de la librairie et regardes les différence aux endroits qui poses problème. C'est en comparent et en modifiant que l'on comprend !

VictorMoussally

Tu dis ne pas avoir les connaissances nécessaires pour adapter le programme. Les connaissances s'acquièrent par la pratique. Donc le mieux c'est de pratiquer. On t'aidera à mettre ton programme au point.
Ça me va  :)  ;)
Le soucis c'est que je suis assez short niveau temps, on a reçu la carte tard donc j'ai une échéance qui avance à grands pas (le 27.01, soit vendredi en  8 )
Je sais que le délais est court et que je m'y suis pris à la bourre...

Regarde les exemples de la librairie et regardes les différence aux endroits qui poses problème. C'est en comparent et en modifiant que l'on comprend !
OK, je vais essayer de regarder tout ça.

Merci pour votre aide,
Victor

68tjs

Je ne sais pas où tu as copié ce code mais il n'est pas prévu pour l'IDE arduino mais pour l'IDE Wiring.
Wiring.h  existe toujours c'est le fichier de configuration pour l'IDE Wiring.

En résumé :
2004 : publication de l'IDE Wiring qui utilise le fichier d'initialisation Wprogram.h
2005 : fork de Wiring sous le nom d'Arduino qui utilise toujours le fichier d'initialisation Wprogram.h

201? : Publication de Wiring en version 1.0 le fichier Wprogram.h s'appelle maintenant Wiring.h
1 mois plus tard publication (précipitée) d'arduino en version 1.0 le fichier Wprogram.h s'appelle maintenant Arduino.h.

Je pense que si tu remplace Wiring.h par Arduino.h cela pourrait fonctionner, sauf s'il y a encore d'autre différences.

Go Up