Temporisation de l'info d'un capteur

Bonjour,
Première intervention pour moi sur ce forum., n'hésitez pas à me
ré-aiguiller vers un lieu plus adapté si nécessaire...
Je suis un total novice en programmation, en tout cas depuis mes dernières
expériences (pas trop mauvaises, mais un peu moisies) en basic, basica, qbasic et autres gwbasic
dans les années 80. Ca vous donne une idée du niveau !

Là je suis en train d'essayer de dompter ma première carte arduino uno pour un petit
projet d'irrigation d'une carrière de club équestre.

Je commence à comprendre à peu près la logique du truc, mais je coince
depuis hier sur le pilotage d'une sécurité sur ma pompe.

En gros l'enchainement des opérations :

Démarrage :
J'appuie sur le bouton marche, la pompe démarre.
Un capteur me dit si la pompe débite réellement (amorçage ok)
Si ou bout de 20 s le capteur me dit que la pompe n'est pas amorcée, arrêt du moteur pour protéger la pompe.

Arrêt manuel :
Appui sur le bouton Arrêt, la pompe s'arrête.

Jusque là ça marche bien, avec des boucles if et en utilisant millis() pour faire ma temporisation.

Sécurité désamorçage pendant la marche :

C'est là où ça se gâte :

Si en cours de route la pompe se désamorce, il faut couper le moteur, mais en laissant une tempo pour éviter les décrochages trop sensibles sur une petite bulle d'air. Pour celà je pensais également utiliser millis() à partir de l'info de désamorçage, pour ne la prendre en compte que si elle dure plus de 15s par exemple. Mais je cale depuis hier, ma deuxième tempo, selon l'endroit où je la place, étant inefficace ou perturbant la première.

Merci d'avance pour votre aide !

Gilles

hello
donnes nous ton code

avant, lire CECI

Merci pour ta réponse,

Voici la partie du code qui fonctionne :

boolean EtatMoteur=0;  // Etat du relais commande moteur
boolean BPM; //Etat du Bouton poussoir Marche
boolean BPAT;  //Etat du Bouton poussoir Aret
boolean ContAm;  //Etat du capteur Controle d'Amorçage
unsigned long TempsDem; // temps au démarraage du moteur
unsigned long TempsDesam; // temps à l'info de désamorçage
const char BoutonMarche = 2;
const char BoutonArret = 3;
const char SondeAmorcage = 4;
const char RelaisMoteur = 5;
int secu;



void setup() {
  // init moteur
pinMode(BoutonMarche,INPUT);
digitalWrite(BoutonMarche,HIGH);
pinMode(BoutonArret,INPUT);
digitalWrite(BoutonArret,HIGH);
pinMode(SondeAmorcage,INPUT);
digitalWrite(SondeAmorcage,HIGH);
pinMode(RelaisMoteur,OUTPUT);
digitalWrite(RelaisMoteur,0);

}

void loop() {

 MarcheMoteur();
}

void MarcheMoteur()
{
   BPM = digitalRead(BoutonMarche); // état du bouton marche
    BPAT = digitalRead(BoutonArret); // état du bouton Arret
    ContAm = digitalRead(SondeAmorcage); // état de la sonde Controle Amorçage
 EtatMoteur = digitalRead(RelaisMoteur); // état du relais moteur

// démarrage et controle amorçage
 
  if ((BPM == 0 ) && (EtatMoteur == 0))
  {
    digitalWrite(RelaisMoteur,1);
      
   TempsDem=millis();  // démarrage de la tempo
 
    }
  
    if (EtatMoteur == 1 && ContAm == 0 && (millis()-TempsDem)>3000)  // tempo d'amorçage
    {
      digitalWrite(RelaisMoteur,0);  // coupure moteur si pompe pas amorcée
      
    }

// arret manuel du moteur

    if (EtatMoteur == 1 && BPAT == 0)
    {
       digitalWrite(RelaisMoteur,0);  // arrêt moteur sur appui BP Arret
      
    }
  
    
 }

Tapez pas trop fort sur la tête, c'est mon premier code ! :wink:

Là ca fonctionne très bien pour la sécurité de défaut d'amorçage au démarrage.

Pour la sécurité de désamorçage en cours de marche je pensais reprendre l'info de "ContAm" si elle apparait en cours de route, temporiser qques secondes pour éliminer les fausses alertes, et si elle est toujours à 0, arrêter le moteur. Hélas, c'est là qu'est l'os...

Gilles

Parmi toutes les solutions soft possibles tu peux tout simplement appliquer un filtre RC sur le signal ContAm de telle manière à ce que toutes les fausses alertes soient filtrées.

Bonjour Standby,

De mes vieux souvenirs d'électronique et de radio, un filtre RC c'est du hard, pas du soft ???
De plus il me semble qu'en général ça peut filtrer des parasites, pas une attente de 15 secondes ?
Ou alors on ne parle pas de la même chose, et je reste toute ouïe...

Merci de ton aide,

Gilles

Bonjour,

Je parlais justement d'une solution hard :slight_smile:

Il est possible avec de simples composants de faire une tempo de 15s voir plus.

Sur le schéma ci-dessous si on ajoute une porte logique à hystérésis à un circuit RC on peut crée un détecteur de niveau logique qui dure une durée X.

Dans l'exemple ci-dessous si le signal en entrée est supérieur à 15s il activera la sortie de la porte logique, dans le cas contraire s’il est inférieur à 15s il n'activera pas la porte logique.

Mais il à ses limites, car si le signal bagote il est possible qu'il n'active pas la porte.

Bonjour;

Oui, mais ce n'est un montage qui est aussi simple que cela à calibrer.
Par exemple, si tu met une résistance R1 très élevée, dans les M Ohms, la résistance d'entrée du SN74 qui est aussi de quelques M Ohms va avoir une influence énorme sur le montage les niveaux et temps de déclenchements.

En plus dans ce montage, le temps de charge (tempo à l'allumage) est du même ordre de grandeur que celui du temps de décharge (tempo à l'extinction) ce n'est pas ce qui est demandé dans l'application de lofanauty

C'est je pense plus simple de faire une tempo soft, ca ne coûte aucun composant en plus.

Merci pour ces explications.

La vérification de l'amorçage je compte la faire en mesurant l'intensité absorbée par le moteur, avec un capteur de ce type (transfo d'intensité) :

C'est donc une entrée analogique que je vais devoir utiliser pour fixer le seuil de détection qui va sans doute être fluctuant s'il y a de petites bulles qui passent à un moment ou à un autre, d'où la nécessité de filtrer cette info pour n'agir que si la pompe tourne durablement à vide.
Dans mon premier essai de codage j'avais simulé ça avec un BP (ContAm) juste pour valider le principe.

Par exemple, si tu met une résistance R1 très élevée, dans les M Ohms, la résistance d'entrée du SN74 qui est aussi de quelques M Ohms va avoir une influence énorme sur le montage les niveaux et temps de déclenchements.

Tout à fait vrai, il faut faire attention à l'impédance du montage.

c'est une grosse pompe? parce que je courant ne va pas fluctuer beaucoup si c'est des petites bulles...

Lofanauty:
La vérification de l'amorçage je compte la faire en mesurant l'intensité absorbée par le moteur, avec un capteur de ce type (transfo d'intensité) :
http://www.dx.com/p/30a-1v-split-core-current-transformer-ac-current-sensor-for-arduino-446423#.WZbOaRJTkrw

C'est bien pensé ce petit truc, c'est chinois et il y a la doc en plus!

Par contre, comment tu fais la mesure en niveau code?
Si ce transfo d'intensité t’envoie une image (en tension) du courant, cette image aura la forme d'une sinusoïde de 50Hz.

Et toi tu veux mesurer la valeur efficace de cette sinusoïde.

Je ne pense pas que ce capteur te fasse la transformation nécessaire du signal pour avoir en sortie une tension qui soit l'image de la valeur efficace de ce courant.

(Une valeur efficace c'est en quelque sorte une valeur redressée double alternance et filtrée avec quelque part un coef multiplicateur, cf Valeur efficace — Wikipédia )

Existe t'il une bibliothèque ou un code permettant de faire une mesure de valeur EFFICACE d'un signal?

Telle est mon interrogation ...

Sinon ce signal transforme assez facilement pour approcher d'une valeur stable et mesurable.

c'est une grosse pompe? parce que je courant ne va pas fluctuer beaucoup si c'est des petites bulles...

5kVA tri, en gros un peu moins de 10A/phase.

Ca ne me gêne pas que ça fluctue peu sur les petites bulles, au contraire, ce qui m'embête c'est la grosse bulle qui passe en 2 ou 3 s et qui va tout mettre en rideau alors que ça pourrait se réamorcer tout seul. Je ne sais pas si le cas va se produire, j'essaye juste d'anticiper les problèmes parce que je sais qui on va appeler au secours si ça merdoie :wink:

C'est bien pensé ce petit truc, c'est chinois et il y a la doc en plus!

Par contre, comment tu fais la mesure en niveau code?
Si ce transfo d'intensité t'envoie une image (en tension) du courant, cette image aura la forme d'une sinusoïde de 50Hz.

Et toi tu veux mesurer la valeur efficace de cette sinusoïde.

Je ne pense pas que ce capteur te fasse la transformation nécessaire du signal pour avoir en sortie une tension qui soit l'image de la valeur efficace de ce courant.

Remarque fort judicieuse ! A vrai dire je ne m'étais pas penché sur la question, ayant dans une vie antérieure utilisé un certain nombre de capteurs divers (pression, accéléromètres, températures, etc...), j'avais l'habitude de récupérer un signal 0-10V ou 4-20mA qu'on envoyait directement dans l'automate sans se poser de question. Quand même, quand je lis "Output type: voltage output type built-in sampling resistor" sur la fiche technique, je ne comprends pas vraiment le détail, mais ça laisse supposer qu'il y a un embryon de traitement du signal, non ?

Sinon, effectivement, je ne sais pas comment l'Arduino interprète une entrée sinusoïdale ???
Si nécessaire, où est-ce que je peut trouver ce genre de bibliothèques ?

Indépendamment du filtrage pour récupérer une Veff , je viens de voir qu'il existe une autre version de ce capteur, en 1V pour 10A, donc sans doute une plage utile beaucoup mieux exploitée.
http://www.dx.com/p/10a-1v-split-core-current-transformer-ac-current-sensor-for-arduino-446424#.WZcFExJTkrw

à lire la doc la valeur de la tension de sortie sur le jack est proportionnelle à l'intensité du courant alternatif - entre 0 et 1V (donc à utiliser sur une pin analogique avec AREF interne à 1.1V)

La dernier que tu propose, selon cette doc, est en sotie tension et non courant, donc avec la résistance câblée sur le capteur.

Il est bien précisé aussi que la sortie est du du "rms"
Tension de sortie (rms ): sortie linéaire . lorsque le courant d'entrée est de 10 A, la tension de sortie est de 1V

Pour info:
RMS = Root Mean Square, « racine carrée de la moyenne des carrés » = valeur efficace en physique.

Donc je repose la même question, et je ne connais pas moi même la réponse:

Une entrée analogique sait-elle mesurer un signal analogique sinusoïdale pour en donner la valeur EFFICACE.
A ma connaissance les entrés analogiques mesurent des signaux continus.

Autre remarque de TAILLE.

Un signal sinusoïdale est caractérisé par une fréquence (si c'est celle du reseau ERDF c'est 50Hz) et une valeurs efficace.

Mais dans la réalité, sa valeur MAXIMALE, celle qui serra envoyée à la broche d'entrée de votre arduino, serra = Veff x Racine de 2 -------> 1V efficace (rms) = 1,4V max (sur la broche de arduino).

Un expert en code arduino serait nous dire s'il existe une fonction adaptée à la mesure des signaux alternatifs.

Le choix de ton capteur dependra aussi de l'intensité du courant que tu veux mesurer donc de la puissance de ta pompe (10A/230V de l'ordre de 2000W selon le cos du moteur)

il y a un article bien fichu pour les anglophones sur ce type de capteur et un tuto arduino qui répond à vos questions de RMS etc

C'est certain le capteur donnera une sinusoïde.
Soit tu utilise la documentation déjà fournie et il te faudra faire suffisamment de mesure en 20ms, durée d'une période de 50 Hz, pour déterminer la valeur min et la valeur max pour être sûr de ton signal.

Info : le convertisseur analogique/digital a été configuré par Arduino dans un mode très très conservateur. Moyennant une lecture de la datasheet du micro pour trouver les registres à modifier tu peux bien augmenter sa fréquence d'échantillonnage.

Soit tu effectue un redressement suivi d'un filtrage afin d'obtenir un signal continu.
Signal sinusoîdal v= Vmax.sin()
Redressement simple alternance Vcontinu = Vmax / PI
Redressement double alternance Vcontinu = 2.Vmax / PI
Mais attention il y aura des seuils de diodes (0,7 à 0,8V) dont il faudra tenir compte.

Soit tu utilise cette documentation sur un redresseur double alternance sans seuil mais avec un ampli opérationnel.

Lecture facultative :

Une valeur efficace n'est pas équivalent à du RMS, sauf à copier les habitants des USA dont le langage très pauvre les poussent à commettre des abus de langage. Le français à un vocabulaire riche autant l'utiliser.

RMS = racine de la moyenne des carré : mais avec une fréquence 50 Hz, carré de quoi, et moyenne de quoi, quand il n'y a qu'une seule fréquence en action ?

Revenons aux fondamentaux (pour moi c'était en terminale Mathématiques élémentaires, donc bien avant 68)
Valeur efficace :
On a d'un coté une tension continue U
On a de l'autre une tension sinusoîdale V = Vmax.sin(2.PI.F.t)

Le but est trouver une valeur déduite de la valeur max de la sinusoïde qui aurait la même "efficacité" que la tension continue U.
Le calcul consiste à calculer dans les deux cas la puissance dissipée par effet Joule dans une résistance --> P= U2/R
Le calcul consiste à faire une intégrale sur un période.
Le calcul donne :
Veff = Vmax/racine(2).
Il n'y aucune notion de moyenne des carré la dedans. C'est une intégrale sur une période d'une fréquence discrète.

La notion de RMS n'intervient que quand le signal est constitué de plusieurs fréquences (comme la parole par exemple) et qu'on recherche la puissance équivalente. P= P1 + P2 + P3 + P4 (les puissances s’additionnent directement, les tensions sinusoïdales non car il faut faire intervenir la phase)
Donc oui sur un ampli audio on peut parler de rms mais il me semble que c'est mieux de continuer à appliquer le même concept et de continuer à parler de valeur efficace.

Tu me fait rire (jaune) avec ton mode grognon.

RMS, c'est écrit sur tous les appareil de mesures modernes et made in France (Chauvin Arnoux, Metrix ...) ce n'est pas un simple caprice des USA, et ce n'est pas ce qui importe dans le sujet.

Le fabricant chinois du capteur indique que la tension de sortie = 1V RMS pour un courant d'entrée de 10A RMS, point à la ligne.

Pour ma part, ca me tarabuste cette histoire de calcul de la valeur efficace (et d'ailleurs je souris jaune encore quand le lis redressement sans seuil, avec un ampli op, on va où là, dans les hautes sphéres de l'électronique analogique? il y en a combien ici qui savent mettre en route ce genre de montage?)

J'aime mieux ce genre de lien typiquement pour les arduinistes
https://learn.openenergymonitor.org/electricity-monitoring/ctac/how-to-build-an-arduino-energy-monitor

et d'ailleurs je souris jaune encore quand le lis redressement sans seuil, avec un ampli op, on va où là,

Si cela t'intéresse j'ai refais le calcul et c'est juste.

Avec un ampli op on fait aussi des diodes sans seuil, des inductances avec des condensateurs et même des résistances négatives.

Bonjour;

Je ne doute pas que le montage soit juste.

Je pense simplement qu'il n'est pas suffisant en lui même pour donner une valeur efficace du courant.

C'est un redressement double alternance, il faut en tirer sa valeur moyenne multipliée par un Coef à déterminer pour en faire une valeur efficace.

C'est en ce sens que je dis que ce n'est pas aussi simple que cela à mettre en œuvre.

C'est tout.

Il n'a jamais été dit autre chose :

  1. assertion de départ : le signal est sinisoïdal
  2. soit on l'échantillone, soit on le redresse et en utilisant l'assertion 1 il suffit de faire un calcul.

Pour clore la discussion précédente une précision qui peut être utile :
Il existe 2 types des puissancemètre dit "rms" :
-ceux qui partent du principe que le signal est sinusoïdal et font un simple calcul avant l'affichage du résultat, ce sont les plus courants.

  • ceux dit "rms VRAI" qui utilisent un thermocouple et qui sont totalement insensibles à la forme du signal.
    Ils sont moins courants et même assez rares parce que fragiles et délicats d'utilisation.