compteur impulsions contact effet hall piface

Python est le langage de prédilection du Raspberry Pi

Modérateurs : Francois, Manfraid

christophe27
Messages : 38
Enregistré le : lun. 3 nov. 2014 14:04

compteur impulsions contact effet hall piface

Message par christophe27 » jeu. 2 juil. 2015 15:33

bonjour
je veux connecter un débimetre (7500 impulsions/minute)sur une piface.
j'ai donc créer en python une boucle wihle qui "interroge" tous les 0,005 seconde l'état du débimetre (contact effet hall)

#!/usr/bin/python
from time import sleep
import pifacedigitalio as p
p.init()
Litreminute = 0
dernierePrise = 0
while(True):
impuls=p.digital_read(1)
if (dernierePrise == 0 and impuls == 1):
Litreminute +=1
dernierePrise = impuls
sleep(0.005)

print Litreminute
Existe t-il une autre méthode pour coder un compteur d'impulsions?
un script qui ferrait moins"travailler" le raspi
merci

Avatar du membre
Manfraid
Modérateur
Messages : 1402
Enregistré le : ven. 3 oct. 2014 14:50
Contact :

Re: compteur impulsions contact effet hall piface

Message par Manfraid » jeu. 2 juil. 2015 15:59

Salut,

essaye de t'inspirer de ceci, il faut utiliser les interruption pour ce genre de chose, cela est plus facile
http://blog.oddbit.com/2013/08/05/interrupts-on-the-pi/
NAS : DIY OS Debian: DD250Go + 3x2To + 6To
Raspberry pi : 2B OS : Raspbian
Se tromper est humain, Vraiment foutre la merde nécessite le mot de passe de root.

christophe27
Messages : 38
Enregistré le : lun. 3 nov. 2014 14:04

Re: compteur impulsions contact effet hall piface

Message par christophe27 » ven. 14 août 2015 15:03

BONJOUR
excusez moi pour ce retour tardif!!
Avec votre méthode il semble que je soit " plafonné " 380 impulsions par minute. ce qui convient pour un compteur d'eau 1 impulsion/litre ==>380 litre par minute c'est déjà beaucoup !!

je ne peut pas utiliser un compteur d'eau car de débit mini est trop faible (il ne tourne pas)

j'ai donc acheter ce debimetre
http://www.conrad.fr/ce/fr/product/1503 ... -a-10-lmin

j'ai un débit maxi a 2 L/minute donc au maxi 5000 impulsions /minute donc une impulsion toute les 0.012 seconde

avec la boucle WHILE tous les 0.005 seconde les résultat semble cohérant .
le raspberry travail a 20%
si vous avez une méthode plus pro? merci

jarvis
Messages : 3
Enregistré le : mar. 1 févr. 2022 18:20

Re: compteur impulsions contact effet hall piface

Message par jarvis » mer. 2 févr. 2022 10:25

HELP !!!!

Bonjour, le sujet m'intéresse fortement car pas beaucoup de sujets sur le comptage d'impulsion.
Très très intéressant ton capteur. Moi j'utilise ou j'essaye d'utiliser un YF-S402B pas très loin du tien.

Le mien je l'ai connecté sur une entrée de carte piface
J'ai modifié piface.conf comme dans le wiki piface pour activer le compteur
piface.0.input.3.enabled=false
piface.0.input.3.pin_type=level
piface.0.input.3.count_enabled=true
piface.0.input.3.count_update_interval_sec=60

Par contre ensuite, je sèche un peu. Mon dispositif est bien vu et je récupère bien mes impuls OFF-ON-FF-ON-OFF....sur dispositif "lightning Impuls". Aussi des dispositifs RFXmeter (plusieurs fois le même ID) qui comptent des milliers de litre LOL avec des valeurs différentes. Je me dis qu'il y a une base, mais tout ça est brouillon pour moi. Je découvre les compteurs.
Dans l'idéal, j'aurai aimé éviter l'usage d'un script. Théoriquement, c'est juste du comptage d'impulsion et un calibrage à définir (ex: 100 impulsion/litre).

Aurais-tu connaissance d'un tuto et d'exemples complets pour les nulls ?
Possible d'avoir ton aide ou d'autres personnes connaissant ce sujet piface et comptage d'impulsion.

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: compteur impulsions contact effet hall piface

Message par MSG » lun. 15 août 2022 17:41

Bonjour ,

Je ne suis pas spécialiste de compteur d'eau , mais il y a un truc qui m'échappe dans votre façon de compter .
J'ai comme l'impression que vous totalisez le nombre d'impulsions , ce qui au bout d'un certains temps , très long , va permettre de déterminer un débit .

Prenons un autre exemple pour lequel , je ne suis pas spécialiste non plus , mais pour lequel je pourrais peut-être vous apporter la lumière (du moins j'espère) .
Un ventilateur de refroidissement de PC à 3 fils . Deux sont pour l'alimentation (rouge et noir) et le troisième pour contrôler sa vitesse (jaune) , il me semble que c'est aussi un contact effet hall , si ne me trompe pas .

Donc sur ce fil jaune nous avons des impulsions qui arrivent et permettent de déterminer sa vitesse de rotation (tachymètre) . Sachant qu'il ne tournera pas au delà d'une certaine vitesse , disons 3000 trs/min soit 50 trs/sec soit 0,02 sec/tr qui est le temps à pleine vitesse . Pour déterminer sa vitesse intermédiaire il suffit de mesurer le temps entre chaque impulsion et ensuite on fait le calcul inverse . Disons qu'il tourne à 0.1 sec/tr soit 10 trs/sec soit 600 trs/min . 1000 trs/min devrait tomber vers 0,06 sec/tr.

RPM = 60 / temps en secondes

Donc pour mesurer ce temps , il faut détecter ce qu'on appelle un front , soit le changement d'état 0 vers 1 (dit montant) ou 1 vers 0 (dit descendant) . Il faut savoir que les impulsions sont carré 0,1,0,1,0 etc , mais avec un rapport cyclique qui n'est pas toujours le même pour le 0 et le 1 .

Donc on peut utiliser 2 variables pour stocker l'état antérieur et traiter le signal lu (comme à fait christophe27) , ou n'utiliser qu'une seule variable par simple injection du bit lu et décalage (registre à décalage) . Il suffit alors de lire l'état de ces deux bits pour détermine l'état que nous avons :

Si injection du bit par la droite
00 << niveau bas (valeur décimale 0)
01 << front montant (valeur décimale 1)
11 << niveau haut (valeur décimale 3)
10 << front decendant (valeur décimale 2)

Code : Tout sélectionner

a <<= 1
a += bool( bit_lu )
a &= 0b11 # filtre pour ne garder que ces deux bits
Si injection du bit par la gauche
>> 00 niveau bas (valeur décimale 0)
>> 10 front montant (valeur décimale 2)
>> 11 niveau haut (valeur décimale 3)
>> 01 front descendant (valeur décimale 1)

Code : Tout sélectionner

a >>= 1
a += bool( bit_lu ) * 2
Après avoir choisi quel front vous voulez détecter , il faudra toujours garder le même . La première détection de front déclenchera le chronomètre , la seconde détection du même front (un tour après) provoque l'arrêt du chrono et le début du calcul .

Petit exemple avec une simulation en python de détection de front : (désolé pour la déclaration de fonctions avec Lambda ! :oops: )

Code : Tout sélectionner

from time import time
from time import sleep
bit = lambda b : 1<<b
Bin = lambda w, nb=8 : ( "0"*nb + bin(w)[2:] ) [-nb:]
front = lambda w, f : bool(( w & 0b11 ) == f )

up = 0b01
t0 = t1 = t = a = 0
for i in range (32):
   a <<= 1
   a += bool( i & bit(2) )  # detecte les fronts du bit 2
   a &= 0b11   # filtre les deux derniers bits à droite
   if front(a, up) :
      t += 1
      if t is 1: t0= time()
      if t is 2: t1= time()
   print ("%2i %s %s %s %s" %( i, Bin(i,4), Bin(a,2), front(a, up), t==2 and str(t1-t0) or "" ))
   if t is 2: t0= t1; t=1
   sleep(.2) # tempo mise parceque ça va trop vite pour le test   ;p

Code : Tout sélectionner

# ce qui donne le résultat suivant sur la détection du bit 2
#  Bits  
#  3210  a front up 
 0 0000 10 False 
 1 0001 00 False 
 2 0010 00 False 
 3 0011 00 False 
 4 0100 01 True 
 5 0101 11 False 
 6 0110 11 False 
 7 0111 11 False 
 8 1000 10 False 
 9 1001 00 False 
10 1010 00 False 
11 1011 00 False 
12 1100 01 True 1.6037945747375488
13 1101 11 False 
14 1110 11 False 
15 1111 11 False 
16 0000 10 False 
17 0001 00 False 
18 0010 00 False 
19 0011 00 False 
20 0100 01 True 1.603339433670044
21 0101 11 False 
22 0110 11 False 
23 0111 11 False 
24 1000 10 False 
25 1001 00 False 
26 1010 00 False 
27 1011 00 False 
28 1100 01 True 1.6032378673553467
29 1101 11 False 
30 1110 11 False 
31 1111 11 False 
>>> 

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: compteur impulsions contact effet hall piface

Message par MSG » lun. 15 août 2022 20:59

Un autre exemple me vient , calculer la vitesse sur une roue de vélo .

Vitesse = distance / temps

Il faut connaitre la distance parcourue pour un tour de roue . On peut mesurer au sol la distance parcourue sur 1 tour ou la calculer selon dimension de la roue.
Ex: sur une roue de 20" , soit 508 mm de diamètre , multiplier par Pi (3.14, pas la CM :D ) ça nous donne 1595mm de distance , on va dire 1,6m à chaque tour .
1,6m / temps en seconde d'une rotation = vitesse en m/s
1,6m / 0,5s = 3,2 m/s et en m/h du 11520m/h soit 11,5 Km/h .

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: compteur impulsions contact effet hall piface

Message par MSG » mar. 16 août 2022 10:36

Bonjour ,

Une autre façon de traiter l'information , en parallèle avec plusieurs données en même temps . On mémorise toutes les entées dans une variable indiquant l'état présent ( i ) et une autre l'état précédent ( i_ant ). Avec une fonction ( fronts ) , on traite l'information pour déterminer les bits qui ont changé d'état ( chg )
, ceux qui sont passé de l'état 0 à 1 ( mon ) et ceux qui sont passé de l'état 1 à 0 ( des ) . On récupère ces informations pour les exploiter rapidement .

Exemple :

Code : Tout sélectionner

def fronts( actuel, anterieur ):
   Bin = lambda w, nb=8 : ( "0"*nb + bin(w)[2:] ) [-nb:]
   change = actuel ^ anterieur
   montant = change & actuel
   descendant = change & anterieur
   print( "act = %s" % Bin( actuel ))
   print( "ant = %s" % Bin( anterieur ))
   print( "chg = %s" % Bin( change ))
   print( "mon = %s" % Bin( montant ))
   print( "des = %s" % Bin( descendant ))
   return change, montant, descendant

Code : Tout sélectionner

>>> i_ant = 0b01001111
>>> i = 0b10010011
>>> i_fronts = fronts( i, i_ant )
act = 10010011
ant = 01001111
chg = 11011100
mon = 10010000
des = 01001100
>>>  
La variable i_fronts récupère donc dans l'ordre , l'état des bits qui changent , en position [0] , suivi de ceux qui ont basculé de 0 à 1 , en position [1] et enfin ceux qui ont basculé de 1 à 0 , en position [2].

Code : Tout sélectionner

>>> i_fronts
(220, 144, 76)
>>>
Si je veux savoir si le bit(7) de mes entrées à basculé à l'état montant .

Code : Tout sélectionner

>>> bool( 1<<7 & i_fronts[1] )
True
>>>
On peut faciliter l'accès avec ces 3 petites fonctions :

Code : Tout sélectionner

def front_up_bit( bit, tuple_word ): 
   return bool( 1<<bit & tuple_word[1] )

def front_dn_bit( bit, tuple_word ):
   return bool( 1<<bit & tuple_word[2] )

def front_ch_bit( bit, tuple_word ):
   return bool( 1<<bit & tuple_word[0] )
Ce qui donne :

Code : Tout sélectionner

>>> front_up_bit( 7, i_fronts )
True
>>> 

Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Re: compteur impulsions contact effet hall piface

Message par Artemus24 » sam. 20 août 2022 16:42

Salut à tous.

Je ne connais pas ce genre de matériel et j'aimerai au moins comprendre comment ça fonctionne.
Un débitmètre mesure la quantité d'eau qui s'écoule au travers d'un tuyau.
A l'intérieur se trouve un rotor qui tourne en fonction du débit de cette eau.
Un tour de ce rotor est proportionnel à la volumétrie d'eau déplacée.
Le rotor a une vitesse variable en fonction de la vitesse de l'eau dans le tuyau.

Je suppose que par impulsion, il s'agit d'effectuer une lecture de la mesure de ce débit par intervalle de temps régulier.
Si je fais le parallèle avec les GPIO de la raspberry, la mesure est numérique et le résultat se présente sous N bits.
Pour que la mesure soit pertinente, il faut que la fréquence soit la plus rapide possible.
A chaque mesure, je lis 12 bits, soit un modulo de la valeur comprise dans l'intervalle allant de 0 jusqu'à 4095.
Par exemple, ma première mesure me donne 1000 unités et ma deuxième mesure me donne 3000 unités.
Si la fréquence est rapide, sans erreur d'interprétation, le débit a augmenté de 3000-1000=2000 unités.
Si la fréquence est lente, je peux avoir une erreur d'interprétation car le débit peut avoir augmenté de:
--> 4096 + 2000.
--> 8192 + 2000.
--> 16384 + 2000.
et ainsi de suite.
Il est nécessaire de synchroniser la fréquence des lectures à celle de la vitesse maximale du rotor.

Mais que mesure-t-on réellement ? Dois-je comprendre que la mesure est continue et est proportionnelle au débit ?

Cordialement.
Artemus24.
@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

MSG
Raspinaute
Messages : 119
Enregistré le : ven. 26 déc. 2014 18:31

Re: compteur impulsions contact effet hall piface

Message par MSG » sam. 20 août 2022 20:23

Bonjour Artemus24 ,

Ils parlent bien d'impulsions et non de tension , (sauf erreur de ma part) le CAN (Convertisseur Analogique Numérique de tension) ne sera pas utile dans ce cas .

Je suppose que c'est un capteur de position qui envois des impulsions à chaque tour (Tachymètre). Si on totalise les impulsions , on a un volume d'eau proportionnel aux nombres de tours . Pour calculer le débit , ça dépendra de la rapidité du dispositif qui fait la mesure , on peut soit mesurer le temps mis pour faire un seul tour , soit totaliser le nombre de tours effectués sur un temps donnée , ça reste précis mais les mesures seront beaucoup plus espacées , et il faut quand même un compteur rapide qui détecte sans failles toutes les impulsions .

C'est comme calculer la vitesse d'une automobile , on peut rouler pendant 1h puis estimer la distance parcourue , disons 90 km pour donner la vitesse moyenne , soit 90Km/h .
OU sur une durée et une distance plus courte : 90km/h = 90'000m / 3'600s = 25m/s .
OU le plus rapide , mesurer la distance d'un tour de roue et mesurer le temps pour faire ce tour de roue . Disons qu'on a une roue qui parcours 2m à cache tour .

Formule : Vitesse = Distance / Temps
on tourne la formule: Temps = Distance / Vitesse ; soit T = 2 / 25 = 0,08 sec

Si cette même roue tourne en 0,05 sec , on a une vitesse de 2 / 0.05 = 40m/s , soit 40 * 3600 = 144'000 m/h soit 144 km/h .
En totalisant le nombre de tours , on a une distance . Mais pour avoir la vitesse il faut l'élément temps .

Un tour du compteur d'eau (360° , d'impulsion à impulsion) , doit correspondre à un volume d'eau précis (en litres ou dm³).
Comme une voiture lancée , l'eau ne s'accélère , ni se freine instantanément avec un robinet multi-tour , à moins d'être sur une installation pressurisée et un robinet 1/4 de tour , c'est possible , mais gaffe à l'effet bélier .

Artemus24
Raspinaute
Messages : 1077
Enregistré le : ven. 15 sept. 2017 19:15

Re: compteur impulsions contact effet hall piface

Message par Artemus24 » dim. 21 août 2022 00:44

Salut MSG.

Merci pour les explications, mais j'aurai aimé savoir ce que l'on mesure et comment.

Cordialement.
Artemus24.
@+
RPI4B/8GB + Argon FanHAt
Rpi3A+, Rpi3B+
RPi 2B + Joy-It I2C Serial 20x4 2004 LCD Module
RPi 2B + PIM273 Unicorn HAT HD 16x16 Leds RGB
RPi0v1.3, RPi0W + LibreElec/Kodi, Rpi0WH + Tuner TV HAT
NodeMCU ESP32

Répondre

Retourner vers « Python »