Rotary Encoder avec gestion de l'accélération.

Ici on parle code, configuration matériel, bibliothèques Arduino ou comment utiliser les modules e-licktronic...

Rotary Encoder avec gestion de l'accélération.

Postby Philippe » Sep 3rd, '13, 16:38

Juste un petit programme pour utiliser un encodeur avec gestion de la vitesse de rotation de celui-ci.
Je l'utilise dans mon contrôleur midi pour aller plus vite sur les valeurs extrêmes d'un paramètre par exemple.

Code: Select all
//---------------------------------------------------------------------
// Copyright (c) Philippe MARY
char Version[] = {"Encoder Acc v10"}; 
// Carte Arduino Mega 2560
// Utilisation des composants suivants:
//      Carte Arduino Mega 2560 ou autre
//      1 x Rotary Encoder Led Ring Mayhew Labs ou autre
//----------------------------------------------------------------------

int POS = 0;
int OLDPOS = 0;
int COUNT=0;
int CPT = 0; // CPT est la variable utile incrémentée ou décrémentée par l'encodeur
int CPTOLD = 0;
unsigned long time = 0;
unsigned long timeold = 0;
unsigned long delta = 0;
int vitesse = 1;
int v = 1;
int i = 0;

void setup() 
{
  Serial.begin(115200);
  //Dans le cas de gestion de l'encodeur sur interruption, méthode beaucoup plus efficace.
  //attachInterrupt (2, EncoderE1, CHANGE); //Interruption gestion encoder sur pins 2.
  //attachInterrupt (3, EncoderE1, CHANGE); //Interruption gestion encoder sur pins 3.
}

void loop() // Juste un petit programme exemple pour tester la fonction
{
  EncoderE1(); // Si appel de la fonction dans une boucle (à supprimer si gestion par interruption).
  if(CPT != i) // juste pour ne pas transmettre trop de données au sérial monitor.
  {
   Serial.println(CPT,DEC);
   i=CPT;
  } 
  
}

void EncoderE1() 
{
      switch(PIND & 0x03)
      {
      case(3): POS = 0; break;
      case(2): POS = 1; break;
      case(0): POS = 2; break;
      case(1): POS = 3; break;
      }
      if (POS-OLDPOS == -|| POS-OLDPOS == 3) COUNT--;
      if (POS-OLDPOS == 1 || POS-OLDPOS == -3) COUNT++;
      if (POS == 0) // on inc ou dec uniquement si l'encodeur est en position 0
      { 
        if 
(COUNT > 0)
        {
        if(CPT > 0)
        vitesse = Calcul_Vitesse_Enc();
        CPT = CPT - vitesse; // Dec du compteur d'une valeur proportionnelle à la vitesse de rotation de l'encodeur
        }
        if (COUNT < 0)
        {
        if(CPT < 127)
        vitesse = Calcul_Vitesse_Enc();
        CPT = CPT + vitesse; // Inc du compteur d'une valeur proportionnelle à la vitesse de rotation de l'encodeur
        }
      COUNT = 0;
      }
      OLDPOS = POS;
}
 

int Calcul_Vitesse_Enc
()
{
        time = millis(); // Il est possible d'utiliser l'instruction time = micros();
        delta = time-timeold; //Delta represente le temps entre deux rotation de l'encodeur
        timeold=time;
        v=1;
        if(delta < 200) v=2; // C'est ici que l'on peut régler les valeurs de l'accélération en fonction des besoins
        if(delta < 100) v=3;
        if(delta < 50) v=4;
        if(delta < 20) v=10;
        return v;
}
 
Ground control to Major Tom
User avatar
Philippe
 
Posts: 20
Joined: Feb 27th, '13, 20:08
Location: Yvelines (78) France


Return to E-licktronic rencontre Arduino

Who is online

Users browsing this forum: No registered users and 1 guest

cron