[ Resolu ] Position d'une porte avec potentiomètre

Bonjour à tous,

Je suis débutant avec Arduino, pour apprendre à coder cette chouette machine, j'essaie de réaliser quelques projets. Je suis actuellement sur un projet de porte :slight_smile: . Je m'explique, je souhaite commander une porte avec un vérin pneumatique et une électrovanne.
Cela fonctionne sans problème. J'ai rajouté des contacteurs de fin de course pour connaître l'état de la porte. Soit ouverte, soit fermé. Pas de soucis non plus. Alors, j'ai voulu corser la tout en montant un potentiomètre sur l'axe de la porte pour connaître sa position. Définir en fonction de la valeur du potentiomètre l'état de la porte, cela fonctionne. Pour augmenter la difficulté je voudrais analyser le signal du potentiomètre pour définir les points suivants:

1- si la tension est croissante de 0 vers 5 volts alors la porte est en cours d'ouverture
2 -si la tension est décroissante de 5 vers 0 volts alors la porte est en cours de fermeture

Premier obstacle, je n'arrive pas à mettre ce mécanisme en place. Je ne comprends pas comment analyser si une tension est décroissante ou croissante sur une entrée analogique.
Cela fait deux jours que je cherche sans succès !! :confused:
Avez-vous une piste de réflexion pour moi ? Je ne demande pas une solution toute faite, mais à comprendre comment réaliser cette fonction.

Dans un deuxième temps je voudrais définir si la porte est bloquée. Si pendant une phase de temps il y a plus de variation de la tension sur l'entrée analogique et que les contacteurs de fin de course indique que la porte n'est pas ouverte et n'est pas fermé alors on considère que quelque chose bloque le déplacement de la porte.

Si un blocage est constaté alors on inverse le sens de la porte ou on arrête la commande de celle-ci.

Voilà je remercie d'avance toute les personnes qui pourront m'accorder de leur temps et leur patiente.

Cordialement.

Ps:Je possède un Arduino mega et uno.

Premier point : s'ouvre ou se ferme ?
Tu fais des mesures en boucle.
Tu compare la mesure actuelle à la précédente que tu as stockée dans une variable.
Tu compare si la mesure actuelle est supérieure ou inférieure à la mesure précédente.
Cela te donnera le sens.

Porte bloquée :
C'est la même chose tu teste si la mesure actuelle est égale à la mesure précédente.

Point à régler :
Tu vas avoir à régler les points suivants :

  1. Une égalité vraie n'existe qu'en math, pas dans la vie réelle. Pour détecter le blocage il faudra tester si la différence en valeur absolue(sans le signe) est inférieure à une quantité qu'il te faudra déterminer en fonction de la réponse de ta porte.
  2. Comparer à la mesure précédente est facile mais qu'est-ce qui se passe pour le démarrage quand il n'y a jamais eu de valeur précédente ?
    Faut-il utiliser une variable qui empêche de faire le test si aucune mesure précédente existe ?
    A toi de jouer.

en complément a 68tjs
tu ne fais des mesures que lorsque tu est en cours de mouvement depuis l'ordre jusqu’à l'arrivée sur fdc
tu fais ces mesures tous les x temps (pas à la vitesse de la loop mais par ex tous les 1/10 de s a déterminer en fonction de la vitesse de déplacement de la porte et du temps de blocage acceptable)
pour la première valeur précédente tu la mesure juste avant de donner l'ordre la seconde étant x temps après
bonne continuation ....

Est il nécessaire de mesurer le sens de déplacement si tu commandes déjà le vérin qui actionne la porte? Par déduction, le sens est connu puisque les EV sont contrôlées par le code.

Cela dépend.

Si une personne force la porte a ce fermer alors que le vérin est commandé en ouverture, c'est bien de le détecter !

Je rajouterais un points en complément de ce qu'a dit @68tjs :

  1. Il faut trouver de manière empirique les valeur précité.
  2. Serial.println() ! c'est toujours agréable de voir les valeurs que l'on manipule. Le debug est plus facile, et piocher nos valeurs empirique aussi !

t-chou:
Cela dépend.

Si une personne force la porte a ce fermer alors que le vérin est commandé en ouverture, c'est bien de le détecter !

Oui dans le cas de la détection de blocage, Pas du sens de manœuvre.

Oui tout a fait.

On connais l'ordre de deplacement, mais une personne peut forcé la porte a s'arrété, OU a la deplacer dans l'autre sens ! Mais je chipote, on peut tres bien affilier ça a du blocage.

Oh ! On n'est pas dans l'optimisation d'un produit industriel.

Laisser le s'amuser un peu, l'important est que quoi qu'il fasse il apprendra, et c'est bien le but non ?

Bonsoir à tous,

Tout d'abord, merci pour vos réponses, j'ai réalisé mon code pour définir si la porte et en ouverture ou en fermeture.

Merci à 68tjs pour m'avoir débloqué sur la méthode à mettre en place.

Pour répondre à Jambe, non je n'ai pas besoin de connaître le sens, car lors du pilotage de l'électrovanne, on sait si la porte par en ouverture ou en fermeture. C'est juste un blocage de rédaction du code qui me pose problème, je ne savais pas évaluer si une tension était croissante ou décroissante.

Je vous transmets mon code, je suis ouvert à toute critique sur ma méthode de rédaction et je prends toutes les suggestions pour acquérir une meilleure rédaction.

Pour le code de la porte bloquée, je suis en pleine réflexion sur comment aborder le problème. La remarque de 68tjs est pertinente sur le démarrage sans valeur précédente.

Je pense dans un premier temps à mettre un apprentissage (réaliser une ouverture et fermeture pour stocker des valeurs de références. Je ne sais pas si je dois faire intervenir une notion de temps. Par exemple temps d'ouverture de porte de x, temps mesuré lors du mouvement de y,si y dépasse la référence x alors on considère la porte comme bloquer et on agit ne conséquence.

Je vais prendre le temps de la réflexion, essayé de coder quelque chose puis, je reviendrais vers vous pour avoir votre retour sur le code.

Encore merci.

// On considere que la valeur 500 correspond à une porte ouverte et que la valeur 0 à une porte fermer.

int signalPotent = A0;
int tension;
int oldTension;

void setup(){
Serial.begin(9600);
}

void loop(){
    
    oldTension = map(analogRead(signalPotent),0,1023,0,500);
    delay(100);
    tension = map(analogRead(signalPotent),0,1023,0,500);
    delay(100);
     //Serial.println(tension);
    if(oldTension > tension){
      Serial.println("Porte en fermeture");
    }
    if(oldTension < tension){
      Serial.println("Porte en ouverture");
    }
    if(tension == 0){
      Serial.println("Porte Ferme");
    }
    if(tension == 500){
      Serial.println("Porte ouverte");
    }
}

Tu utilise un "drapeau" : c'est à dire variable octet( c'est suffisant) qui sera à 0 au démarrage du programme et passera à 1 une fois que la première mesure sera acquise.

Petit rappel
setup() ne s'éxécute qu'une seule fois au lancement du programme
loop() comme sont l'indique tourne en boucle indéfiniment.

uint8_t etandard ;   //autre forme pour déclarer un octet (un byte)
int mesure_precedente ;
int mesure_actuelle;

setup(){
blablabla
etandard = 0 ;
}

loop(){
bla bla bla
mesure_actuelle = analogRead(Ax); 
if(etandard==1){
tu fais la comparaison
et tu fais ce que tu as à faire
}
else{
C'est la première mesure donc tu ne fais pas la comparaison
etandard = 1;    // tu mets le drapeau à 1 pour autoriser la comparaison
blabla si tu as des "choses supplémentaires à faire
}

mesure_precedente = mesure_actuelle;

Note au passage que j'utilise directement l'indication donnée par le convertisseur A/D, je ne vois pas l'utilité de faire un traitement supplémentaire.

PS : je n'ai jamais compris pourquoi vous vous sentez obliger d'utiliser des noms anglais pour les variables et même certains pour les commentaires !
Vous avez honte de votre langue ?
Vous pensez que le monde entier va s'arracher vos programmes et donc que "english is mandatory" ?
Les mots clé du langage bien sûr il faut que ce soient les mêmes pour le monde entier mais les noms de variables..................

Bonjour je suis sur un projet de gestion d'un verin "electrique" pour piloter des volets d'un ULM avec un ARDUINO NANO V3.0

IL s'apparente à ton projet.

Le controle de position est fait :

  • Par un potentiomètre linéaire.
  • 3 switchs positionnés pour donner les positions:
    0° (rentrés)
    15° (1er cran)
    45°(plein volets).

Je serai intéressé par un échange de croquis pour partager nos expériences.
J'ai déjà l'acquisition de la valeur du potentiomètre ( qui me détermineras dans quel sens je dois piloter le vérin) en fonction de sa position si je n'ai pas un des 3 switchs appuyé.

Merci de ta collaboration.

Merci @68tjs,

Pour répondre à ton post scriptum, non je n'ai pas honte de ma langue, ni de ma culture d'ailleurs. Je pense que lorsqu'on cherche à découvrir Arduino, on se base énormément sur internet et 80 % des programmes qui traînent sur le net sont en anglais. Alors, bêtement on recopie le terme vu dans d'autres programmes. Mais tu as raison restons simple et utilisons des noms de variable dans notre langue.

Là par contre où j'ai eu honte, c'est que tu m'avais guidé dès ton premier post en décomposant pas à pas ce que je devais réaliser et je suis passé à côté. :-[ .

J'ai énormément de mal à passer de ma feuille blanche où je note les étapes à réaliser, une sorte de chrono gramme, à la rédaction du code.

Je travaille mon code demain je le poste dès que cela est prêt.

@Airpopcie, je n'ai pas compris ce que tu voulais comme croquis, est ce le câblage de mes boutons de commandes ?

Ou des contacteurs de fin de course ?

Bonne soirée à tous.

Là par contre où j'ai eu honte, c'est que tu m'avais guidé dès ton premier post en décomposant pas à pas ce que je devais réaliser et je suis passé à côté. .

Il ne faut absolument pas avoir $"*£, ici on est tous passé par là et pour certains (il y en a un qui est en train d'écrire) on continue à y passer.
Si j'avais donné la solution toute cuite ce n'était pas sur que t'en souvienne, noyé dans le flot de nouveauté, là c'est sûr tu t'en souviendra :grin:

Voilà j'ai testé le code avec un potentiomètre piloté à la main et des Serial.print pour contrôler que cela fonctionne. Et cela marche :slight_smile: . Donc tout d'abord un grand merci.

Ce que j'ai fait c'est intégré tout ça dans mon code de gestion de la porte. Cela compile, mais je n'ai pas testé encore sur la porte. Je fais cela demain.

Merci et bonne soirée.