Ad Code

Schéma electronique superviseur de pompe à eau

CP0028, le projet trainard....Commencé en Mai 2009, je viens juste de le terminer. Je ne sais pas trop pourquoi, ce projet a mis 2 ans pour voir le jour et contrairement à ma bonne résolution de finir ce que je commence avant de me lancer dans d'autres aventures, je n'ai pas arrété de faire autre chose. De plus, j'ai changé d'avis sur la conception en cours de route et refait certaines parties...Enfin, tout vient à point à qui sait attendre et le biniou est opérationel !


Voici la description de l'engin, vous pouvez le fabriquer ou vous en inspirer pour vos réalisations...

Alors, à quoi ça sert ?

Notre habitation étant une vielle ferme perdue dans les fin fonds de la Vendée, nous n'avons pas le service d'eau. Ceci n'est pas génant et nous permet de substantielles économies. Une pompe à eau (Aussi appelée 'groupe surpresseur') pompe l'eau du puit et alimente la maison. Ma femme, avec son élevage de chevaux remplie souvent les abreuvoirs (Un cheval boit entre 15 et 60 litres d'eau par jour selon les conditions, et il y en a une douzaine...)
Il lui arrive parfois d'oublier de fermer l'eau et c'est des mètres cubes qui sont perdus....L'eau est un bien précieux (de plus en plus) et il ne faut pas la gaspiller.
Je ne peut pas changer le firmware de ma femme pour qu'elle n'oublie plus, mais je peut adapter la pompe à son comportement. le but de cet appareil est donc le suivant :
- Qaund la pompe est en route, un voyant rouge extérieur est allumé pour attirer l'attention.
- Si la pompe tourne plus de 25mn, un signal sonore puissant sonne 15 secondes toutes les minutes
- Passé 30 minutes, si personne n'arrète la pompe ou remet le compteur à zéro, la pompe se coupe.
- De plus une sonde mesure la température de la pompe, si celle-çi chauffe trop, elle se stoppe aussi.
- Pour l'hiver, un chauffage antigel est mis en route si la température est proche de zéro afin d'éviter le gel
- Si la pompe est hors-fonction, le voyant extérieur clignote afin de signaler le problème
- 2 afficheurs 7 segment affiche l'état du systéme

Les contraintes du systéme étaient les suivantes :
- Ne pas modifier la pompe, la détection de la mise en route se fait par mesure du courant consommée.
- Etre le plus simple possible à utiliser
- Pouvoir facilement mettre le système hors fonction en cas de panne afin de ne pas être sans eau en cas de défaillance de l'électronique.
- Pouvoir remettre la pompe en marche de la maison si elle est coupée
- Etre protégée dans un boitier résistant à l'humidité et au froid

J'ai choisi de mettre l'ensemble dans un coffret electrique étanche standard. Pour la pompe, j'ai pris un télérupteur avec une commande manuelle, Si l'electronique de commande est coupée, il est trés facile de mettre la pompe en ou hors fonction juste en poussant le bouton de commande. De même, j'ai choisi un relais de puissance pour la commande du chauffage.

Le systéme comporte une interface de puissance permettant de :
- Commander le télérupteur
- Détecter le presence de tension aprés celui-ci afin de connaitre son état
- Détecter si la pompe est en route ou non en mesurant son courant consommé.
- Commander le voyant extérieur en 220 v
- Commander la sirène en 220 V
- Commander le relais de puissance du chauffage
- Le tout assurant bien sûr une l'isolation galvanique parfaite avec le secteur

Ce module comporte 3 voyants:
- Un bleu indicant que la pompe est sous tension
- Un jaune indiquant que la pompe est en marche
- Un rouge indicant que l'indicateur extérieur est allumé

Voici le schéma de l'interface :
Quelques explications....

J'ai choisi des relais statiques (Trouvés sur Ebay) pour la commande de tous les éléments extérieurs en 220V. Ces modules assurent l'isolation par une commande optique du triac interne. De plus la commutation se fait au passage à zéro de la tension secteur ce qui limite les parasites.
J'ai utilisé des portes 'Trigger de Schmitt" afin d'avoir une bonne immunitée aux parasites.

La détection de la mise en route de la pompe se fait via un transformateur torique. 2 spires au primaire suffisent à induire une tension au secondaire qui, aprés filtrage et amplification est détecté et mis en forme en TTL. Voici une photo de ce capteur fait maison :

La détection de la tension secteur aprés le télérupteur est elle confiée à un photo-coupleur bidirectionel parfaitement adapté à cette tâche.
J'ai monté l'ensemble dans un boitier de fabrication maison, J'ai utiliser un adaptateur spécial pour montage sur rail DIN. J'ai fait un circuit au stylo :
J'ai doublé de cuivre la piste véhiculant le courant de la pompe et généreusement étamé les autres pistes.
L'utilsation de bornier 'Débrochable' permet en cas de panne de sortir le module sans tout décabler.
Voila le circuit monté :
A l'étage au dessus, l'électronique sur plaque à trous :
Voici le module (Avant mise en place des voyants)
Ce module terminé, il a fallut une alimentation. J'ai choisi d'alimenter le tout en 5 V Afin d'avoir un bon rendement, j'ai choisi de faire une alimentation à découpage utilsant un CI spécialisé.
Voila le schéma : (La note d'application plus quelques protections et filtrage additionels....)
Même si elle n'est pas censée chauffer beaucoup (preuve de son bon rendement...), j'ai décider lui faire un petit radiateur.
Le haut du boitier avait des découpes rondes pour passage de cables éventuels, alors, je me suis dit, je vais me faire un radiateur rond...
J'ai pris un radiateur de processeur graphique de recup et lui ai fait la coupe au bol de rigueur...
Et voila...
Ensuite, usinage d'une bride pour plaquer femement le régulateur et la diode contre le radiateur, avec bien sûr l'inévitable graisse au silicione afin d'améliorer le transfer thermique...
Et voila, c'est compact mais, il n'y a pas trop de place....
Le tout est monté à coté du transfo 12V de reccup...
Et voila, ça fait une petite 'Touffe' d'alu sur le boitier, je me complique la vie des fois...mais bon faut bien laisser la créativité s'exprimer....
Test et mesure, Ca marche du feu de dieu, me voila tranquille coté alim !! Maintenant, il me faut gérer les sondes de températures. Une sonde est placée sur le moteur. Un afficheur genre BarGraphe est chargée d'afficher cette température. J'ai pris un bon vieux LM3914, le dernier segment sert a détecter la surchauffe de la pompe. J'ai calculé la chaine de résistances pour une fourchette entre environs 20 et 60°. On notera la résistance R2 servant à limiter la dissipation du 3914 en mode 'Bar". Voir la note d'application de NS.

Pour la sonde antigel, j'ai fait simple et indépendant. Un bête comparateur se charge du travail. Je n'ai pas mis d'hysteresis, l'inertie thermique étant suffisante.

L'étalonnage s'est fait avec de la bombe thermique, un souffleur d'air chaud et un thermomètre.

Voici le schéma :
Enfin, last but not least, le cerveau de la bête...Pour une fois, j'ai utilisé un micro-controleur. Mon choix c'est porté sur un 89c2051, version simplifiée du fameux µcontroleur 8051. J'aime particulièrement cette famille, digne successeur du bon vieux 8048. Même si les nouveaux Pic et autres bêtes de course sont bien plus puissantes, ce petit CI à trés bas prix rend déjà bien des service. Je n'ai pas eu le courage de me remettre à l'assembleur alors j'ai utilisé Bascom51, un basic dédié à la famille 8051. Même si ma préférence va pour le langage C, ce petit IDE est trés bien fait, facile à utiliser et bien documenté.
Voici le schéma du CPU :
Comme ont peut le voir, c'est trés simple. L'affichage est multiplexé. J'ai utilisé un 74Ls247 comme décodeur driver de Segments. J'utilise ainsi 4 lignes d'ES au lieu de 7. (par contre, je ne peux pas afficher tous les symboles sur les afficheurs mais qu'importe...)

Il n'y a pas de watchdog intégré, j'en ai donc fait un (J'ai depuis acheté des CI Max613 qui font tout bien mais à l'époque, j'en avais point...). le classique TL7705 assure un reset clean au démarrage. Le programe est censé faire clignoter le point décimal toutes les secondes. Si suite à un parasite, le programme se plante et se bloque, C11 ne sera plus déchargé et génèrera un reset. Attention, il est déconseillé de gérer les watch-dog sur les interuptions, celles-ci n'assurant pas que le programme principale fonctionne correctement.

J'ai monté toutes la logique dans un boitier DIN de récup.


Voici quelques explication sur le soft :

La pompe fonctionne par intermitance pour remplir le ballon tampon. Le soft attend donc 30 secondes d'arrêt effectif de la pompe pour considérer qu'elle est vraiment arrété. (temps mort ou dead time)

Le soft est un automate fini qui fonctionne en se basant prioritairement sur les états réels des entrées sortie. Une variable d'état nommée 'State' est calculée en permanence afin de déterminer l'état du système. Elle permet de gérer les phases de transition et l'affichage. Celui-ci peut avoir les indications suivantes.

Au boot affiche 88 afin de tester l'afficheur.
Le point décimal clignote en permanence et indique le bon fonctionnement du soft (et Trig le watch-Dog)
En mode stand bye, pompe alimentée et stoppée, rien n'est affiché.
Si la pompe tourne, s'affiche alors le nombre de minutes écoulée depuis sa mise en route.
Le décompte s'arrête pendans le temps mort et le temps affichée clignote.
Si le temps max est écoulé, l'afficheur affiche tt
A tout instant et de manière prioritaire, si la température max est atteinte, l'afficheur affiche t0
Si la pompe est mise hors tension manuellement, l'afficheur affiche cc (Le deuxime c est inversé mais j'ai pas la touche sur le clavier)

Si l'affichage est tt, t0 ou cc il est possible de revenir à l'état normal par appuis sur le télérupteur ou reset.
Quand la pompe est stoppée, l'indicateur extérieur clignote.

Note que, sauf dans le cas d'une surcharge thermique, la pompe se remet sous tension aprés le reset. Ceci permet de remettre la pompe en service depuis la maison en coupant puis rétablissant le disjoncteur de la pompe au tableau electrique.

L'affichage est entierement géré sous l'interuption du timer qui arrive toutes les 250 µs. Il suffit de positionner les variables DigMsb et Diglsb pour que l'affichage reflete leur valeurs.

J'ai utilisé des constantes pour toutes les valeurs critiques afin de rendre le code facile à lire et à modifier au besoin.
E même, j'ai aliasé toutes les I/O, c'est plus facile de lire In_PumpOn que P1.0

Un switch permet de sélectionner un mode 'Test' qui différe du mode 'Normal" par 3 points :
- Affiche u8 au reset
- Les minutes de comptage de mise en route sont des secondes
- Le dead time est de 5 secondes au lieu de 30

Ceci afin de tester le soft sans y passer sa vie....

Le code généré est petit (968 bytes) et est loin de remplir les 2k dispo du 89c2051

Le source original est dispo ici : CP0028.BAS le code compilé ici CP0028.HEX ou CP0028.BIN
J'ai mis le source en fin d'article pour les curieux...

Bon, j'arrive presque au bout de mes efforts...

Il faut monter l'indicateur extérieur et la siréne.
 Pour la sirène, j'ai finalement opté pour un modèle du commerce et j'ai juste fait une ptit alim vite fait :
Je monte tout ça sur une plaque de pvc avec des vis en plastique pour éviter la corosion
Note, je passe du fils souple. Il est impératif d'utiliser des embouts pour monter ces fils dans des cosses à serrage :
On trouve ces cosses facilement sur Ebay, on peut les sertir avec un pince plate mais le mieux est d'utiliser la sertisseuse qui va bien.
Je test avec on super banc de test secteur
et je monte le bouzin dehors, à l'abris du toit quand même :
puis j'installe et je cable le coffret
Je test, tout à l'air nominal....
Voici la pompe surplombé du chauffage antigel (Radian acheté dans un vide grenier...)

Je fixe les 2 sondes
Y a plus qu'à mettre le capot :
et voilà, putain 2 ANS !!! Bon c'est vrai, que j'ai fait plein d'autres truc depuis, la preuve le dernier sorti est CP0036.....

Bon, c'est quand même un projet qui m'aura pris du temps, les beaux schémas, le cablage, le softs et l'installation. A vu de nez je dirais environs 80 heures de taf....

Mais maintenant, on ne devrais plus trop gacher d'eau ou craindre le Gel (Comme c'est parti, on risque plus la surchauffe...)

N'hésitez pas si vous avez des questions mais inutile de me demander d'en construire un pour vous....je travaille déjà sur mon futur projet, un poste de soudure par points.....


Pour ceux que ça interrese, voici le source du firmware :

'--------------------------------------------------------------
' CP0028 - Pump Supervisor Firmware
' File: CP0028.BAS
' By Philippe Demerliac
' (c) 2011 Cyrob
'------------------------------------------------------------------------------
' Version history
' Version Date          Author      Comment
'   1.0d1 26 Feb 2011   Phildem     First release And preliminary tests
'   1.0d2 27 Feb 2011   Phildem     Change Display mode
'   1.0d3 06 Mar 2011   Phildem     Final Timer And dispay Test
'   1.0d4 02 Jun 2011   Phildem     Io Alias And final logic implementation
'   1.0b1 03 Jun 2011   Phildem     Final Test
'   1.0   03 Jun 2011   Phildem     Final release
'------------------------------------------------------------------------------
' Hardware connexions

' P1 Use

' In PumpOn       P1.0  Activ low
' In PumpPwr      P1.1  Activ low
' In PumpOverHeat P1.2  Activ low
' Out PumpOff     P1.3  Activ low
' Out IndLight On P1.4  Activ low
' Out Siren On    P1.5  Activ low
' In TestMode     P1.6  Activ low

' P3 Use all as output

' SegBCD A  P3.0  LSB Positiv Logic
' SegBCD B  P3.1
' SegBCD C  P3.2
' SegBCD D  P3.3

' Anode LSB P3.4  Display On when low
' Anode MSB P3.5  Display On when low

' Dp        P3.7  Dp On If 1 Used as WatchDog trigger

'------------------------------------------------------------------------------
$regfile = "89C2051.dat"                            'Define machine
$crystal = 12000000                                 '12 MHz XTal

'Const declaration ------------------------------------------------------------
Const kDig_Delay = 1                                'Digit display Time in ms
Const kRelayPulseWidth = 300                        'Relay pulse width in ms

Const kSirenTrig = 25                               'Siren Trig in Mn
Const kPumpMaxOnMn = 30                             'Max On Time in Mn
Const kSirenOnTime = 30                             'Siren On Time in Ticks

Const kTickPerMn = 120                              'Normal Ticks/mn
Const kTickPerMnTst = 2                             'Test Ticks/mn

Const kPumpDeadTime = 60                            'Normal Dead Time in Ticks
Const kPumpDeadTimeTst = 10                         'Test Dead Time in Ticks

' Possible Engine States
Const kStateIdle = 0                                'Normal Idle
Const kStateOn = 1                                  'Pump is On
Const kStateDead = 2                                'Pump is Dead Time
Const kStatePwrOff = 3                              'Pump Power Manually Off
Const kStateTimeOut = 4                             'Pump Time Out
Const kStateOverHeat = 5                            'Pump Over Heat

'IO Aliasing ------------------------------------------------------------------

In_PumpOn Alias P1.0
In_PumpPwr Alias P1.1
In_OverHeat Alias P1.2
In_TestMode Alias P1.6

Out_PumpRelay Alias P1.3
Out_Indic Alias P1.4
Out_Siren Alias P1.5

'Var Decl ---------------------------------------------------------------------

Dim Clock_word As Word                              'Timer counter
Dim Tick_hsec As Bit                                'Every 500ms Tick flag
Dim Watchd As Byte                                  'Watchd toggle

Dim Cnt_mn As Byte                                  'Tick counter for 1 Mn
                                                    'will count 0->119

Dim Cnt_PumpOn As Byte                              'Pump On Time In Mn
Dim DigLsb As Byte                                  'Lsb Digit Value
Dim DigMsb As Byte                                  'Msb Digit Value
Dim OutP3 As Byte                                   'Port 3 output buffer
Dim CurDisp As Bit                                  'Curent disp: 0 Lsb,1Msb
Dim PumpOn As Byte                                  'Nbr of Tick since PumpOn
Dim OnBlink As Bit                                  'Dead Blinker
Dim SirenOn As Bit                                  'Siren is On
Dim State As Byte                                   'System State

Dim VTickPerMn As Byte                              'Used Tick/Mn
Dim VPumpDeadTime As Byte                           'Used Dead Time in Ticks

'Program ----------------------------------------------------------------------

OnReset:

'Configure Timer0 for Interupt every 250µs

Config Timer0 = Timer , Gate = Internal , Mode = 2

On Timer0 Timer0_Int

Load Timer0 , 250

Priority Set Timer0
Enable Interrupts
Enable Timer0

'Init IO
P3 = &B01110000                                     'Display Off

'Init var
Clock_word = 0                                      'Init Timer counter
Cnt_mn = 0
Cnt_PumpOn = 0                                      'Init On Counter
CurDisp = 0
Watchd = 0
PumpOn = 0
OnBlink = 0
State = kStateIdle

' Look for Test Mode
If In_TestMode = 0 Then
   VTickPerMn = kTickPerMnTst
   VPumpDeadTime = kPumpDeadTimeTst

   DigLsb = 8                                       'Disp u8 in Test Mode
   DigMsb = 12
else
   VTickPerMn = kTickPerMn
   VPumpDeadTime = kPumpDeadTime

   'Display c8 for 0.3 sec to test display
   DigLsb = 8                                       'Disp 88 in Test Mode
   DigMsb = 8
End If

'Run display
Start Timer0

Waitmse 300

'Blank display
DigLsb = 15
DigMsb = 15

'Switch Pump Power On If off And not Overheat
If In_PumpPwr = 1 And In_OverHeat = 1 Then
   Gosub PulsePump
Else
   If In_OverHeat = 0 Then
      State = kStateOverHeat
   End If
End If

' Main Loop -------------------------------------------------------------------
Do

If Tick_hsec = 1 Then                               'Every half Sec tick
   Tick_hsec = 0

   If Watchd = 0 Then
      Watchd = &B10000000                           'Toggle Watch dog
   Else
      Watchd = 0
   End If

   'Calc State
   If In_PumpPwr = 0 Then                           ' Look If Pwr Is On
                                'Look for over heat
      If In_OverHeat = 0 Then
          State = kStateOverHeat
      else
         If State > kStateDead Then                 ' Manually set Powered On
            State = kStateIdle
            Cnt_PumpOn = 0
            PumpOn = 0
         End If

         If In_PumpOn = 0 Then                      ' Pump is running
            State = kStateOn
            PumpOn = VPumpDeadTime

            If Cnt_PumpOn > kPumpMaxOnMn Then
               State = kStateTimeOut
            End If

         Else
            If PumpOn = 0 Then                      'Pump really stopped
               State = kStateIdle
               Cnt_PumpOn = 0                       'Reset On counter
            else
               State = kStateDead
               Decr PumpOn
            End If

         End If
      End If

   else

      If State < kStateTimeOut Then                 ' Look If manually Off
         State = kStatePwrOff
      End If

   End If

   SirenOn = 0
   If state = kStateOn Or State = kStateDead Then
      If Cnt_PumpOn > kSirenTrig Then
         SirenOn = 1
      End If
   End If

   Select Case State
      Case kStateIdle :                             'Idle, Blank display
         DigLsb = 15
         DigMsb = 15
         Set Out_Indic                              ' Indic Off

      Case kStateOn :                               'On Display Time
         DisTime:
         DigLsb = Cnt_PumpOn Mod 10                 ' Calc Lsb
         DigMsb = Cnt_PumpOn / 10                   ' Calc Msb
         Reset Out_Indic                            ' Indic On

      Case kStateDead:                              'Dead Blink Display
         OnBlink = Not OnBlink
         If OnBlink = 0 Then Goto DisTime
         DigLsb = 15
         DigMsb = 15
         Reset Out_Indic                            'Indic On

       Case kStatePwrOff:                           'Of Display c Rev c
         DigLsb = 11
         DigMsb = 10
         Out_Indic = Not Out_Indic

       Case kStateTimeOut:                          'Time Out Display tt
         DigLsb = 14
         DigMsb = 14
         Gosub OffCond

       Case kStateOverHeat:                         'Heat display t0
         DigLsb = 0
         DigMsb = 14
         Gosub OffCond

      Case Else :                                   ' Abnormal
         Goto OnReset
   End Select

   Incr Cnt_mn

   'Siren Handling
   If SirenOn = 1 And Cnt_mn <= kSirenOnTime Then
      Reset Out_Siren
   else
      Set Out_Siren
    End If

   ' Minute Timer
   If Cnt_mn = VTickPerMn Then
      Cnt_mn = 0

      If State = kStateOn Then                      'if pump is on, incr Cntr
         Incr Cnt_PumpOn
      End If

   End If

End If                                              'Of Tick

'And continue for ever, that's the computer hard duty..
Loop

'---------------------------------------------------------
' Off Cond  ----------------------------------------------
'---------------------------------------------------------
OffCond:

    'Force Pump Off
    If In_PumpPwr = 0 Then Gosub PulsePump

    'Togle Light indicator
    Out_Indic = Not Out_Indic

Return

'---------------------------------------------------------
' Pulse Pump  --------------------------------------------
'---------------------------------------------------------
PulsePump:
   Reset Out_PumpRelay
   Waitmse kRelayPulseWidth
   Set Out_PumpRelay
Return

'------------------------------------------------------------------------------
' Timer 0 Interrupt -----------------------------------------------------------
'------------------------------------------------------------------------------

Timer0_Int:

'All Display Off Phamtom effect killer
OutP3 = Watchd Or &B01110000
P3 = OutP3

'Incr Sec Ticks
Incr Clock_word
If Clock_word = 2000 Then
   Clock_word = 0
   Tick_hsec = 1
End If

'Refresh Display
If CurDisp = 1 Then
   OutP3 = Watchd Or DigMsb
   P3 = OutP3 Or &B01010000                         ' Display DigMsb
Else
   Outp3 = Watchd Or DigLsb
   P3 = OutP3 Or &B01100000                         ' Display DigLsb
End If

CurDisp = Not CurDisp                               ' Switch to next display

.....
source :free.fr


Enregistrer un commentaire

0 Commentaires

Close Menu