Bonjour,
Je suis un étudiant en licence pro système embarqué et je suis actuellement en stage. Pendant ce stage, on me demande de réaliser l'asservissement en position d'un moteur a courant continue à l'aide d'un potentiomètre.
Je me suis basé sur la librairie PID_V1 de arduino ainsi que l'exemple du site :
J'aimerais exactement reproduire la même chose que sur sa vidéo mais je rencontre quelques problème, quand je tourne mon potentiomètre, le moteur tourne mais ne s'arrete pas en fonction de la position du potentiomètre :
Objectif : Potentiomètre déplacer de 30° par exemple alors le moteur ce déplace de 30° et attend la nouvelle consigne du potentiomètre.
Je vous transmet le code que j'ai réaliser jusqu'à présent , je ne pense plus être loin du but mais tout aide est bonne à prendre
Pardon s'il y a des fautes
MERCI
/********************************************************
* PID Basic Example
* Reading analog input 0 to control analog PWM output 3
********************************************************/
#include <PID_v1.h>
//Define Variables we'll be connecting to double Setpoint, Input, Output;
double Setpoint, Input, Output;
//Setpoint = consigne
//Input = Position
//Output = Vitesse en sortie réguler par PID
int encoder0PinA = 3;//broche 3
int encoder0PinB = 4;//broche 4
int encoder0Pos = 0;//initialisation pos codeur 0
int encoder0PinALast = LOW;
int n = LOW;
// Constructeur. Relie le PID à l'entrée, de sortie, et la consigne
PID myPID(&Input, &Output, &Setpoint,1,5,1, DIRECT);//DIRECT = sens moteur (INVERSE est possible)
void setup()
{
Serial.begin(9600);
//initialize the variables we're linked to
Input = analogRead(0); //Initialisation entrée est la valeur du potard (en position)
myPID.SetOutputLimits(0, 255);
Setpoint = 100; //Consigne
pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);
//turn the PID on
myPID.SetMode(AUTOMATIC);
}
void loop()
{
//Setpoint = abs(Setpoint);
Encoder(); // Appel fonction détermine pos encoder0Pos
//Setpoint = encoder0Pos; // La consigne est la position de l'encoder
Input = analogRead(0); //Initialisation entrée est la valeur du potard (en position)
Input = map(Input, 0, 1023, 0, 512);// l'entrée est la valeur du potard (en position) mapper de 0 a 512 pour un tour de moteur
Setpoint = encoder0Pos;
myPID.Compute(); // Applique l'algoritmhe PID , compute appelé a chaque fois mais n'execute rien si cela n'est pas utile.
analogWrite(9,Output);// applique au moteur la sortie régulé
}
/*Fonction permettant de connaitre la position de l'encoder (du moteur aussi)*/
void Encoder(){
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoder0Pos--;
} else {
encoder0Pos++;
}
Serial.println (encoder0Pos);//affiche pos encoder
Serial.print ("/");
}
encoder0PinALast = n;
}