Catégories
Algorithme Arduino capteur Commande des moteurs Composant électronique électronique Projets Arduino Variateur de vitesse

Projet Commande de l’Intensité LASER avec un Encodeur Rotatif

Applications

  • Capteur de vitesse & sens de rotation (encodeur optique)
  • Capteur angulaire
  • Asservissement de l’angle
  • Commutateur électromécanique multipositions
  • Curseur/ Slider électronique
  • Potentiomètre électromécanique linéaire
  • Etc.

Principe de fonctionnement

Le tuto est une application directe de l’utilisation d’un encodeur rotatif comme potentiomètre linéaire numérique. En effet, l’encodeur permet d’ajuster l’intensité d’un laser d’une façon progressive et linéaire. L’objectif est d’incrémenter ou décrémenter la valeur du rapport cyclique d’un signal PWM sur  8-bits avec un pas constant. Le pas est défini par l’utilisateur dans le programme. La valeur du rapport cyclique peut varier entre 0 (0%) et 255(100%).

Voir le tuto pour plus de détails.

Code Arduino

#define clkPin    2
#define dtPin 3
#define swPin 4 // Bouton Poussoir (Reset)

#define outPWM 8
#define StepPWM 15
#define numPWM 255 // Niveaux PWM


int nReset=1;

void setup()
{
//Init
Serial.begin(19200);
pinMode(clkPin,INPUT);
pinMode(dtPin,INPUT);
pinMode(swPin,INPUT_PULLUP);

pinMode(outPWM,OUTPUT);
analogWrite(outPWM,0);
}

void loop()
{
// Lecture de l'encodeur
nReset=digitalRead(swPin);
int R=encodUpDown(clkPin, dtPin, numPWM, StepPWM, 200, nReset);

// Affichage (Test)
Serial.print(R); Serial.print("\t");
Serial.println(R);

// Mise à jour intensité
analogWrite(outPWM,R);
}

int encodUpDown(int clkpin, int dtpin, int rotmax,int stpwm, int delay_ms, int nrst)
{
static int rotVal = 0;
static bool clkState = LOW, clkLast = HIGH;

clkState = digitalRead(clkpin);
if ((clkLast == LOW) && (clkState == HIGH))
{
if (digitalRead(dtpin) == HIGH) // Down
{
rotVal-=stpwm;
if ( rotVal < 0) rotVal = 0;
}
else // Up
{
rotVal+=stpwm;
if ( rotVal >= rotmax)rotVal = rotmax;
}
delay(delay_ms);
}
clkLast = clkState;

// Init
if (nrst==0)
{
rotVal = 0;
clkState = LOW;
clkLast = HIGH;
}
return rotVal;
}

Laisser un commentaire