J'ai trouvé beaucoup plus simple que mon post précédent pour contrôler l'axe d'imprimante. J'utilise pour cela deux bibliothèques : Encoder et PID.
Le programme ci-dessous fait bouger l'axe de gauche à droite :
/*
* Contrôle d'un axe d'imprimante en utilisant les bibliothèques
* Encoder et Pid
*
*/
#include <Encoder.h>
#include <PID_v1.h>
const int pin_channelA = 2; // codeur optique
const int pin_channelB = 3; // codeur optique
const int pin_t1 = 10; // moteur, pont en H
const int pin_t2 = 9; // moteur, pont en H
double Setpoint, Input, Output;
Encoder encoder(pin_channelA, pin_channelB);
PID myPID(&Input, &Output, &Setpoint, 6.4, 0.32, 0.00064, DIRECT);
unsigned long time;
unsigned long last_time = 0;
int cons = 1;
int val = 1;
void setup() {
myPID.SetMode(AUTOMATIC); // demarrer Pid
pinMode(pin_t1, OUTPUT);
pinMode(pin_t2, OUTPUT);
myPID.SetSampleTime(1);
myPID.SetOutputLimits(-255, 255);
Output = 0;
}
void loop() {
Input = encoder.read() + cons; // En entrée du Pid : valeur du codeur + consigne
myPID.Compute();
if (Output > 0) { // sens avant
analogWrite(pin_t1, Output);
digitalWrite(pin_t2, LOW);
}
else if (Output < 0){ // sens arrière
analogWrite(pin_t2, -Output);
digitalWrite(pin_t1, LOW);
}
else { // arrêt
digitalWrite(pin_t1, LOW);
digitalWrite(pin_t2, LOW);
}
// on incrémente ou décremente la consigne toute les 2 ms
time = millis();
if (time-last_time > 2) {
cons+=val;
if (cons>500)
val=-1;
if (cons==0)
val = 1;
last_time = time;
}
}