Bonjour à tous,
Etant nouveau sur le forum, je commence par une petite présentation
Je m'appelle Alan, je suis étudiant en 2ème année d'école d'ingénieur à l'Ensmm. Une école d'ingénieur située en Franche-Comté spécialisée dans la mécanique et les micro techniques. Je suis actuellement en stage pour une durée de 6 mois pour un laboratoire d'analyse dans le bio-médical. Dans le cadre d'un projet innovant de micro-tamisage, je travail sur un prototype et afin d'effectuer des tests facilement, je me suis orienté vers une carte Arduino UNO et un simple moteur à CC. Bien-sûr, ces solutions technologiques ne sont pas les solutions finales retenues.
Pour en venir au sujet, j'essaye de programmer un programme capable de faire tourner un moteur à CC dans un sens, puis dans l'autre puis finir par des oscillations autour de l'axe vertical. Un peu le même principe qu'une machine à laver ^^
Cependant, ayant des notions simples en programmation (Python et Java), j'ai réaliser un programme en commandant les sorties PWM avec de simples boucles while(). Voici le programme que j'ai réalisé, qui en soit fonctionne mais n'est pas très claire :
int M1PWM = 6;
int M2PWM = 9;
int a; //rapport cyclique entre 0 et 255 (255 => 100% de la tension disponible)
int b; //VARIABLE durée de phase accélération/décélération pour vitesses constantes en ?
int v1; //VARIABLE vitesse constante max sens 1 (0-255)
int v2; //VARIABLE vitesse constante max sens 2 (0-255)
int v3; //VARIABLE vitesse oscillations programme 1 (0-255)
int v4; //VARIABLE vitesse oscillations programme 2 (0-255)
int c; //VARIABLE temps entre chaque mouvement en ms
int d; //VARIABLE temps phase vitesse constante en ms
int e; //VARIABLE durée de phase accélération/décélération pour oscillations en ?
int f; //VARIABLE nombre d'oscilation programme 1 & 2
int compteur; //VARIABLE compteur oscillations programme 1
int compteur2; //VARIABLE compteur oscillations programme 2
int g; //VARIABLE temps d'une oscillation en ?
int tosci; //VARIABLE temps oscillations programme 2 en ?
int tdemiosci; //temps demi-oscillations programme 2 en ?
void setup() {
// put your setup code here, to run once:
pinMode(M2PWM, OUTPUT);
pinMode(M1PWM, OUTPUT);
}
void loop()
{ // put your main code here, to run repeatedly:
a=0; //rapport cyclique entre 0 et 255 (255 => 100% de la tension disponible)
b=255; //VARIABLE durée de phase accélération/décélération pour vitesses constantes en ?
v1=255; //VARIABLE vitesse constante max sens 1 (0-255) : 0 correspond à vitesse nulle et 255 coresspond à 100%
v2=255; //VARIABLE vitesse constante max sens 2 (0-255)
v3=100; //VARIABLE vitesse oscillations programme 1 (0-255)
v4=100; //VARIABLE vitesse oscillations programme 2 (0-255)
c=5; //VARIABLE temps entre chaque mouvement en ms
d=5000; //VARIABLE temps phase vitesse constante en ms
e=25; //VARIABLE durée de phase accélération/décélération pour oscillations en ?
f=20; //VARIABLE nombre d'oscilation programme 1 & 2
compteur=0; //VARIABLE compteur oscillations programme 1
compteur2=0; //VARIABLE compteur oscillations programme 2
g=100; //VARIABLE temps d'une oscillation en ?
tosci=400; //VARIABLE temps oscillations programme 2 en ?
tdemiosci=tosci/2; //temps demi-oscillations programme 2 en ?
/// VITESSE CONSTANTE SENS 1
digitalWrite(M2PWM, 0); // On initialise la sortie moteur M2PWM =0
while (a <= v1) { // PHASE ACCELERATION 1
analogWrite(M1PWM, a); // Sortie moteur M1PWM =a 0 au début puis 5, 15 etc...
a=a+5; // Vitesse accélération qui correspond à la vitesse d'incrémentation de la boucle while()
delay(b); // Temps d'accélération
}
a=v1;
digitalWrite(M2PWM,0); //vitesse constante 1
analogWrite(M1PWM,v1);
delay(d);
while (a >=0) { // phase de décélération 1
analogWrite(M1PWM, a);
a = a - 5;
delay(b);
}
a=0;
delay(c);
/// VITESSE CONSTANTE SENS 2
a=0;
digitalWrite(M1PWM, 0);
while (a <= v2) { // phase d'accélération 2
analogWrite(M2PWM, a);
a=a+5;
delay(b);
}
a=v2;
digitalWrite(M1PWM,0); //vitesse constante 2
analogWrite(M2PWM,v2);
delay(d);
while (a >=0) { // phase de décélération 2
analogWrite(M2PWM, a);
a = a - 5;
delay(b);
}
a=0;
delay(c);
/// OSCILLATIONS PROGRAMME 1
digitalWrite(M1PWM,0);
digitalWrite(M2PWM,0);
while (a <=v3) { // phase d'accélération 1
analogWrite(M1PWM, a);
delay(e);
a=a+10;
}
a=v3;
digitalWrite(M2PWM,0); //vitesse constante 1
analogWrite(M1PWM,v3);
delay(g);
while (a >=0) { // phase de décélération 1
analogWrite(M1PWM, a);
a = a -10;
delay(e);
}
a=0;
while(compteur<f){
digitalWrite(M1PWM, 0);
while (a <= v3) { // phase d'accélération 2
analogWrite(M2PWM, a);
delay(e);
a=a+10;
}
a=v3;
digitalWrite(M1PWM,0); //vitesse constante 2
analogWrite(M2PWM,v3);
delay(g);
while (a >=0) { // phase de décélération 2
analogWrite(M2PWM, a);
a = a - 10;
delay(e);
}
a=0;
compteur=compteur+1;
digitalWrite(M2PWM, 0);
while (a <= v3) { // phase d'accélération 1
analogWrite(M1PWM, a);
delay(e);
a=a+10;
}
a=v3;
digitalWrite(M2PWM,0); //vitesse constante 1
analogWrite(M1PWM,v3);
delay(g);
while (a >=0) { // phase de décélération 1
analogWrite(M1PWM, a);
a = a - 10;
delay(e);
}
a=0;
compteur=compteur+1;
}
while (a <=v3) { // phase d'accélération 2
analogWrite(M2PWM, a);
delay(e);
a=a+10;
}
a=v3;
digitalWrite(M1PWM,0); //vitesse constante 2
analogWrite(M2PWM,v3);
delay(g);
while (a >=0) { // phase de décélération 2
analogWrite(M2PWM, a);
a = a - 10;
delay(e);
}
a=0;
delay(c);
///OSCILLATIONS PROGRAMME 2
digitalWrite(M2PWM,0); //vitesse constante 1
analogWrite(M1PWM,v4);
delay(tdemiosci);
while(compteur2<f){
digitalWrite(M1PWM,0); //vitesse constante 2
analogWrite(M2PWM,v4);
delay(tosci);
compteur2=compteur2 +1;
digitalWrite(M2PWM,0); //vitesse constante 1
analogWrite(M1PWM,v4);
delay(tosci);
compteur2=compteur2+1;
}
digitalWrite(M1PWM,0);
analogWrite(M2PWM,v4);
delay(tdemiosci);
analogWrite(M2PWM,0);
while(1){
}
}
Comme vous pouvez le voir, j'ai fais 2 programmes différents. Le premier programme oscillation 1, je contrôle l'accélération/décélération avec des boucles while(). Le deuxième programme oscillation 2, je ne fais que tourner le moteur dans un sens pendant un certains temps "tosci" puis dans l'autre sens.
Or, quand j'ai présenté ceci à mes tuteurs, ils m'ont dit que c'était beaucoup trop simpliste et que ça ne permettait pas un pilotage externe via la communication série. Si j'ai bien compris, ils voudraient que je pilote la carte Arduino via la comm série et piloter le moteur via un profil de vitesse. En soit, ils voudraient que je rentre une accélération et que la vitesse désirée soit calculé et appliqué au moteur.
Ils m'ont alors proposé un bout de programme que je dois compléter :
J'ai beau me documenter, lire des topics, faire des exercices, je n'y comprend pas grand chose à leur programme. J'utilise ce pdf ( http://www.insyte.website/Arduino/ArduinoEskimonComplet.pdf ) et ce site ( http://eskimon.fr/ ) pour apprendre mais j'ai du mal à faire le lien. Si vous pouvez m'aider à éclaircir ce programme et que je puisse compléter les parties manquantes.
Alan