Bonjour,
Alors voilà, je suis un élève de 1ère et ai pour projet scolaire de faire une main robotisée où plutôt "piloter" une pince en contractant ou non le bras. J'ai donc utilisé un EMG Sensor (http://wiki.seeed.cc/Grove-EMG_Detector/) branché sur ma carte Arduino UNO lié à un servomoteur quelconque. Le sensor émettant des données très peu variantes qu'on contracte ou non, j'ai donc premièrement fait une moyenne de ses valeurs pour ensuite faire la moyenne de leurs écart (plus gros écart de valeur lorsqu'on contracte la bras, probablement du aux tremblements du bras lorsqu'il est constamment contracté) afin de pouvoir convenablement les utiliser. Ainsi lorsque la moyenne de l'écart est supérieure à une certaine valeur, la pince se referme à part si elle est déjà en mouvement (!=position fermée && position ouverte) où elle attend que le précédent mouvement se termine avant d'effectuer de le prochain [Même processus lorsqu'on veut ouvrir la main]. J'ai donc du créé une valeur "statut" qui lorsqu'elle est égale à -1 signifie que la pince n'est pas en mouvement, lorsqu'elle est égale à 0 la pince est en cour d'ouverture, lorsqu'elle est égale à 1 elle est en cours de fermeture. La valeur passe donc à 1 lorsqu'on veut fermer la main puis repasse à -1 lorsque la main est fermée, et passe à 0 lorsqu'on veut l'ouvrir puis repasse à -1 lorsqu'elle est ouverte (la pince met 1750ms à s'ouvrir et la même durée pour se fermer). Je veut donc que lorsque le statut passe à 0 ou 1, un chronomètre de 1750ms se lance, lorsqu'il est terminé, statut repasse à -1 mais pendant ce chronomètre, le programme doit toujours avancer or je ne sais pas comment faire (j'avais premièrement mit un delai de 1750ms, le programme ne continue donc pas d'avancer. Puis j'ai vu qu'on pouvait utiliser millis() or je ne sais pas comment faire).
Voici mon code :
#include <Servo.h>
Servo servo;
void setup(){ //Init. du graphique, du servomoteur et de son statut (-1, c'est-à-dire moteur non utilisé).
Serial.begin(115200);
servo.attach(1);
servo.writeMicroseconds(1850);
delay(2000);
servo.writeMicroseconds(600);
delay(2000);
int statut = -1;
}
Serial.println("Main prête à l'emploi.");
void loop(){ //Création d'une boucle qui répetera le programme continuellement.
long somme=0; //Init. des valeurs qui vont être utilisées.
int moyS=0;
int mini=1000;
int maxi=0;
double ecart=0;
double moyE=0;
for(int i=1; i<=100; i++){ //Création d'une boucle qui va se répeter 100 fois.
for(int j=1; j<=10; j++){ //Création d'une boucle qui va se répeter 20 fois. [Les 2
boucles permettent d'exploiter le signal émit par le capteur
en faisant
somme+=analogRead(A2); //Lecture des valeurs du capteur. une
moyenne car il est très difficile de les exploiter sans
changements]
}
moyS=somme/10; //Moyenne des 10 valeurs issues du capteur.
somme=0;
if(moyS<mini){ //Définition d'un minimum et d'un maximum.
mini=moyS;
}
if(moyS>maxi){
maxi=moyS;
}
ecart=maxi-mini; //Calcul de l'écart
ecart+=ecart;
}
moyE=ecart/100; //Moyenne de l'écart
ecart=0; //Remise des valeurs à leur initial
mini=1000;
maxi=0;
moyS=0;
if(moyE>=0.85){ //Si on ferme la main
if(servo.read()==600){ //Et que le servo est sur la position "ouvert": la fermer
servo.writeMicroseconds(1850);
statut = 1;
//delay(1750);
//statut = -1;
}
else if(servo.read()!= 1850){
if(statut == 1){
delay = (1850-servo.read())*1.4;
delay(delay+5);
servo.writeMicroseconds(1850);
//delay(1750);
//statut = -1;
}
if(statut == 0){
delay = (servo.read()-600)*1.4;
delay(delay+5);
servo.writeMicroseconds(1850);
//delay(1750);
//statut = -1;
}
}
}
else{
if(servo.read()==1850){
servo.writeMicroseconds(600);
statut = 0;
//delay(1750);
//statut = -1;
}
else if(servo.read()!= 1850){
if(statut == 1){
delay = (1850-servo.read())*1.4;
delay(delay+5);
servo.writeMicroseconds(600);
//delay(1750);
//statut = -1;
}
if(statut == 0){
delay = (servo.read()-600)*1.4;
delay(delay+5);
servo.writeMicroseconds(600);
//delay(1750);
//statut = -1;
}
}
}
moyE=0;
}
En espérant m'être fait comprendre, si ce n'est pas le cas demandez moi de vous ré-expliquer car j'aimerais bien finaliser ce projet.
Bonne journée