je suis en train de crée un montage avec un servo moteur actionné par potentiomètre.
sur mon montage j ai ajoute une led rouge et verte et un bouton poussoir de remise a 0 type arrêt urgence.
dans ma boucle de lecture (Loop) dans l ordre suivant:
je déclare ma variable lecture potentiomètre
je déclare la variable angle avec la fonction map qui me permet de définir toute la plage du potentiomètre pour la plage d'angle souhaitée du servo (ici de 0 à 180°)
//1er controle
{je controle l etat de mon bouton arret et si =1 je mets led rouge =1, led verte =0 je mets a 0 une variable initok et je remets mon servo a angle 0
}
//2eme contrôle
{je controle l etat de mon bouton arret et si =0 et que mon potar est a 0 je mets led rouge =0, led verte =1 je mets a 1 une variable initok
}
//3eme controle
{si initok = 1 alors j'ecris la valeur de l'angle souhaité sinon je mets led rouge =1, led verte =0 je mets a 0 la variable inittok }
cette partie la est fonctionnelle j ai bien ce que je souhaite ,par contre je viens de rajouter un acs712 pour le contrôle de l intensité moteur car j aimerais soit m'arrêter sur l angle défini par la fonction map fonction du potar soit sur un seuil d intensité qui serait la conséquence d'un effort trop important sur le servo le but étant de na pas grillé le servo.
j ai 2 souci par rapport a l'ACS712 c est que la mesure est instable donc je pense qu il faut que je moyenne mon résultat et surtout je ne sais pas ou placer ma lecture et l'opération du moyennage dans mon programme est ce que c est au début de la boucle est ce que c est une accolade de plus en plein milieu. sachant que ce contrôle d intensité doit être fait en permanence afin d'arrêter le déplacement du Servo sur le potar ou l'intensité si un pic est détecté
Bonjour,
avant d'entrer dans le détail de la programmation (qui n'est qu'un détail ... ), il convient (peut-être) de pousser un peu l'analyse :
si ton servomoteur butte avant d'avoir atteint sa consigne, il va continuer à forcer jusqu'à ce qu'il l'ait éventuellement atteinte, donc arrêter d'incrémenter la consigne n'est pas suffisant, il faut revenir en arrière
donc pas la peine de mesurer le courant en permanence, on peut arrêter la mesure quand le servo est immobilisé et ne fait pas ou plus de surcharge de courant
pour moyenner il faut un certain timing, dont je fixerais empiriquement la base à 20 ms
pour effectuer une série de mesure à intervalle de 20ms, on utilise la fonction millis()
au le début de la course, on doit avoir une moyenne exploitable au bout de 5 mesures, soit 1/10 s
...
pour avoir une lecture + stable de l'acs712, il convient peut-être d'ajuster la capa
note aussi qu'il n'est pas normal qu'un servo dusse forcer ! cela peut aussi faire chuter l'alim, de manière à ce que la situation deviennent définitivement hors de contrôle
si je veux mesurer en permanence le courant c est justement parce que je ne peux pas savoir quand ma mécanique est en butée.
voila comment j'ai pensé faire:
mon système est bien en position init, je tourne mon potar pour déplacer mon servo, je mesure le courant en même temps que le déplacement si le courant augmente et qu' il est égal ou supérieur a un seuil que je définirais j enregistre la valeur d'angle qui devient une valeur d'angle max a laquelle je soustrait 2 ou 5° et cette valeur soustraite devient le déplacement angulaire maximum que peut faire mon servo.
le but est d'avoir un outils universel ou je n ai pas besoin de faire de réglage mécanique pour la course.
c est une pince de serrage elle peut prendre n importe que taille d objet
mon problème il est plutôt comment je contrôle en permanence avec cette valeur moyennée sans trop perdre de temps afin de ne pas arrive trop haut en effort et surtout de voir la montée en effort le plus rapidement possible.
les seules façons de moyenner que j ai vu sont celle avec une boucle For mais quand on rentre dans une boucle For j ai plus de visu sur le potar et l'angle tant que je suis pas sorti
Dans ce cas, ça exclut tout usage d'une bibliothèque. Il faudra créer sa propre fonction de déplacement de à, de tel façon. que, après chaque incrément de déplacement (modification PWM), on a le temps de mesurer le courant.
J'ai fait des esais avec la bibliothèque VarSpeedServo qui pourrait bien aller pour faire ces mesures de courant.
J'ai un ina219, demain, si j'ai le temps, je fais un essai.
si je prends dans un 1er temps l'idée de Trimarco je fais ma mesure que je stock dans un tableau en utilisant un compteur pour le nombre de valeur à prendre et millis pour le temps entre chaque valeur lorsque j ai mon nombre de valeur définie par mon compteur je moyenne le tout, ce qui devrait selon moi ne pas bloqué le programme dans une boucle FOR et en plus cela ne devrait pas faire perdre beaucoup de temps a l'arduino;
ca vous parait jouable comme ca?
Oui, c'est une bonne approche, le problème c'est qu'il faut faire les mesures pendant le déplacement du servo et pouvoir stopper ce déplacement s'il y a dépassement de seuil donc arrivée sur obstacle.
En ça, VarSpeedServo permet de le faire avec ses fonctions
myServo.write()
myServo.isMoving()
myServo.stop()
Ainsi on peut lancer le déplacement ensuite tant qu'il y a déplacement, mesurer le courant consommé et, si dépassement, arrêter le déplacement.
Ca peut donner ça (pas essayé)
if (servoMoveUnderWatch(140, 255) != true) // Si déplacement pas terminé
{
// Action quand servo sur obstacle
}
boolean servoMoveUnderWatch(int servoDegr, int servoVit)
{
myServo.write(servoDegr, servoVit); // Déplacement à la position servoDegr viresse servoVit
while (myServo.isMoving()) // Tant que le serveau bouge
{
// Ici système de mesure (float servoCurrent)
if (servoCurrent > servoCurrentSeuil) // Si dépassement de seuil
{
myServo.stop(); // Arrêt du servo
return false; // Signal déplacement pas terminé, arrêt sur dépassement
}
}
return true; // Signal déplacement terminé
}