Système de protection contre les fuites pour une machine à laver



Présentation


Je pense que chaque maison a une machine à laver. Habituellement, il est connecté à l'alimentation en eau via un tuyau flexible. Mais une grosse nuisance peut se produire avec un tuyau: parfois, ils éclatent, ce qui entraînera une inondation à la fois dans votre appartement et chez vos voisins. Par conséquent, les machines à laver sont connectées à l'alimentation en eau par un robinet spécial, qui doit être ouvert avant le lavage et fermé après. Je ne sais pas pour vous, mais j'ai cette grue dans un endroit extrêmement gênant. Oui, et je préfère commencer à me laver avant de partir au travail, afin que la majeure partie de la journée, le tuyau soit sous pression et puisse éclater à un moment où je ne suis pas à la maison. Ce serait formidable si la grue s'ouvre et se ferme au bon moment!

L'idée m'a semblé tout à fait capable et j'ai décidé de la mettre en œuvre: sur microcontrôleurs et avec valve motorisée.

Pour commencer, j'ai formulé les exigences pour le système développé:

  • surveiller l'état de la machine à laver: eau libre au début du lavage et fermeture à la fin;
  • la possibilité de contrôler manuellement la vanne;
  • fonctionnement sur batterie et fermeture de la valve en cas de décharge de la batterie;
  • présence d'un capteur de fuite: fermer la vanne en cas de détection de fuite.

Il a ensuite compris de quelles pièces il s'agissait: un moniteur, qui est installé dans la machine à laver, et un contrôleur, qui reçoit les signaux du moniteur et contrôle une vanne motorisée. La communication entre le moniteur et le contrôleur se fait via un canal radio unidirectionnel.

Il semble que cela soit suffisant pour la tâche technique. Commençons!

Sélection MCU


Étant donné que l'ensemble du système se compose de deux appareils, il devrait y avoir deux microcontrôleurs. J'ai jeté les tripes et trouvé deux Atmega8: un dans le package DIP et l'autre dans TQFP. Celui en DIP - est allé au moniteur, et TQFP - au contrôleur. Plus tard, il s'est avéré que le firmware du contrôleur envahi ne correspond plus à l'Atmega8 de 8 Ko, j'ai donc dû passer à Atmega328 - un analogue complet, mais maintenant il y a quatre fois plus de mémoire pour le programme.
Soit dit en passant, l'une de mes motivations pour réaliser de tels projets est l'élimination des déchets électroniques que j'ai accumulés au fil des années. Certes, à la fin du projet, la corbeille ne devient pas plus petite. Ça devient encore plus gros!

Première partie Moniteur


Interaction avec une machine à laver


Le premier problème: comment déterminer ce que la machine à laver fait maintenant? Au début du projet, cette partie de la tâche m'a paru très simple. Il ne restait plus qu'à déterminer les moments de début et de fin de lavage. Sur le panneau avant de la machine, il y a une LED qui s'allume et s'éteint au moment voulu. Je m'attendais à lui souder un GPIO avec le pied du microcontrôleur, donc pendant la durée du débogage, j'ai simplement émulé les événements nécessaires sur le moniteur avec le bouton. J'ai appuyé sur le bouton - la LED s'est allumée, le lavage a commencé. Lâchez prise - le contraire est vrai. Cependant, après avoir analysé la machine à laver, il s'est avéré que cette LED faisait partie de l'affichage dynamique et, hélas, il n'est pas si facile de déterminer si elle est allumée ou éteinte.

En tournant le panneau de contrôle entre mes mains (quelques jours), j'ai trouvé qu'il était implémenté sur un contrôleur PIC. De plus, il est connecté à la carte principale avec des pieds répondant au matériel I2C. Ouais, je pensais, vous pouvez renifler le bus I2C et ainsi déterminer quoi faire la machine à laver maintenant. J'ai trouvé le code de renifleur I2C pour Atmega sur Internet. Bien sûr, je devais jouer quelque chose.

Franchement: je n'ai pas pu comprendre le protocole complètement (et je ne l'ai pas trop essayé), mais j'ai réussi à déterminer les modèles pour le début et la fin du lavage (ainsi que pour allumer et éteindre) assez précisément. Cela m'a pris environ une semaine.

Modèle: Candy GC4 1072 D. L'ordinateur envoie périodiquement une série de séquences de cinq octets à l'unité d'affichage. Les quatre premières séquences sont au format:

12 A7 00 – NN – X0 X1 X2 X3 X4 X5 X6 X7 – CS
où: 12 A7 00 - en-tête, NN - numéro de séquence, X [0..7] - 8 octets de données, CS - somme de contrôle. La cinquième séquence est une poubelle de taille variable, dont l'essence est pour moi restée un mystère.

J'ai réussi à résoudre les schémas suivants:

Allumer

12 A7 00 – 01 – X0 X1 X2 X3 X4 X5 X6 X7 – CS
12 A7 00 – 02 – X0 X1 X2 X3 X4 X5 X6 X7 – CS

où X [0..7] au moins un n'est pas égal à 0

COMMENCER

12 A7 00 – 03 – X0 X1 X2 X3 01 01 01 01 – CS
où X [0..3] est un nombre quelconque

STOP

12 A7 00 – 03 – X0 X1 X2 X3 00 00 00 00 – CS
où X [0..3] est un nombre quelconque

On peut voir que ce ne sont pas des séquences strictes, à savoir des modèles, j'ai donc dû bricoler l'analyseur.

La logique de travail est approximativement la suivante: si nous obtenons la séquence POWER ON, mais qu'il n'y a pas de START, alors nous commençons à diffuser des paquets avec le statut 0. Si la séquence START apparaît, changez le statut à 1. Dans d'autres cas, il n'y a pas de casque.

Nous parlerons des packages et de leur statut suivant.

C'est drôle, mais quand j'ai espionné des paquets I2C, je n'ai pas eu l'occasion de me connecter à l'ordinateur renifleur. J'ai utilisé pour ce Raspberry Pi c powerbank'om, qui avait un boîtier en aluminium. Donc, dès que ce bâtiment est entré en contact avec le corps de la laveuse, un RCD a été retiré dans le bouclier, la lumière s'est éteinte dans l'appartement et j'ai commencé à chercher la lampe de poche avec le matyuki. :) Pourquoi ces ordures se sont produites - est toujours un mystère pour moi.

Chaîne radio


Au départ, je ne voulais pas que les fils supplémentaires proviennent de la machine à laver. Autrement dit, la connexion était censée être sans fil. À partir de là, il y avait trois solutions possibles au problème: WiFi, Bluetooth et le module RF pour Arduino. Je me suis installé sur ce dernier en sélectionnant le module FS1000A.

Bien sûr, sur Habré il y aura beaucoup de gens qui me reprocheront ce choix. Ils laisseront entendre que sur Ali-Express, il est possible d'acheter un module ESP avec WiFi complet pour pas cher. Mais j'ai pensé que cela compliquerait grandement le projet et j'ai décidé d'agir plus simplement.

Comme vous le savez, le module RF FS1000A ne peut pas être connecté directement à l'interface RS232: une longue séquence de zéros ou de uns interrompt la synchronisation du récepteur. La bibliothèque VirtualWire a été créée pour résoudre ce problème. Cependant, cette bibliothèque est écrite pour Arduino, et je programme exclusivement en natif sous Atmega en C. Heureusement, le code pour Arduino est très similaire au C pur, et avec des modifications mineures, la bibliothèque a été correctement portée.

Il y a eu quelques difficultés: au début, les paquets ne voulaient pas atteindre le récepteur. J'ai blâmé mes mains tordues pour tout, mais en connectant directement les terminaux des contrôleurs du récepteur et de l'émetteur, j'étais convaincu que tout fonctionnait dans la partie logicielle. L'émetteur commandé en Chine s'est révélé défectueux. J'ai dû acheter un autre kit. Ensuite, j'ai réparé l'ancien et maintenant j'ai deux ensembles d'émetteur-récepteur. Rappelez-vous ce que j'ai écrit sur la réduction des déchets?

Les données ont été envoyées, mais que contiennent exactement ces données? Voici ce qu'est le paquet transmis:

 typedef struct { uint32_t dst; uint32_t src; #define WMP_MSG_STATUS_ALIVE _BV(0) #define WMP_MSG_STATUS_VALVE _BV(1) uint8_t status; } wmp_msg_t; #define WMP_ADDR_MONITOR 0x4d504d57 #define WMP_ADDR_CONTROLLER 0x43504d57 

Les deux premiers mots doubles sont les adresses physiques du récepteur et de l'émetteur. Dans mon cas, ils sont strictement fixes: 0x43504d57 - récepteur (contrôleur) et 0x4d504d57 - émetteur (moniteur). En fait, les 8 premiers octets sont cette signature de paquet. Des informations importantes ne sont trouvées que dans le dernier octet - l'indicateur de bit. Le bit zéro défini de ce drapeau signifie que le moniteur est allumé et fonctionne - il doit toujours être 1. Le premier bit est l'état de la vanne: 0 - la vanne doit être fermée, 1 - ouverte. C’est tout.

Il est supposé que le moniteur doit envoyer périodiquement des paquets au contrôleur, confirmant son fonctionnement et la facilité de maintenance du canal de données. En cas de perte du canal de communication, le contrôleur doit fermer d'urgence la vanne.

La bibliothèque VirtualWire surveille l'intégrité des données transmises à l'aide de CRC32. Je n'ai pas eu à faire d'efforts supplémentaires dans ce sens. La beauté!

La construction


Structurellement, le moniteur se présente sous la forme d'un petit tableau, qui est collé sur la colle chaude "Uncle Liao snot" à l'intérieur du panneau avant de la machine à laver. Par des connecteurs, le tableau est connecté à l'espace entre l'ordinateur et le tableau d'affichage. La machine elle-même n'a subi aucune modification: à tout moment elle peut être ramenée à son état d'origine.

Deuxième partie Contrôleur


Chaîne radio


Ici, tout est simple: le récepteur du kit FS1000A et le récepteur de la bibliothèque VirtualWire sont installés. Le package est analysé et son état est transmis à la sortie. Le récepteur VirtualWire occupe TIMER1 dans le microcontrôleur.

Contrôle de soupape


Dans la boutique en ligne chinoise, une vanne motorisée 3/4 ”a été sélectionnée avec une alimentation de 5 volts et des capteurs terminaux connectés au câble. Cette vanne a été installée entre le robinet à boisseau sphérique et le tuyau de la machine à laver. Pour contrôler la vanne, sur le même site chinois, un pilote de moteur pas à pas de faible puissance a été commandé sur les pilotes L9110. Je l'ai connecté au contrôleur comme suit:



Du point de vue logiciel, il n'y a pas eu de difficultés particulières: par les entrées VALVE_CLOSE et VALVE_OPEN on détermine l'état actuel de la vanne. Si cet état doit être changé, allumez le moteur pour l'ouverture ou la fermeture et attendez qu'un 0 logique soit établi à l'entrée correspondante. Cependant, comme l'ouverture ou la fermeture prend un certain temps, je voudrais ne pas perdre le contrôle de tout à ce moment appareil. Par conséquent, sur la minuterie Atmega, un planificateur primitif a été construit et le contrôle de la vanne a été transféré vers une tâche spéciale. Dans le même temps, le module logiciel spécial WatchDog mesure le temps nécessaire à la valve pour commuter, et s'il est trop long, un signal de son dysfonctionnement est généré. Plus tard, d'autres choses intéressantes ont été accrochées à ce planificateur, telles que les LED clignotantes et l'interrogation du capteur de fuite. Mais plus à ce sujet plus tard.

En outre, une LED d'état tricolore et un interrupteur à bascule de commande manuelle à trois positions appartiennent au circuit de commande de la vanne. En position médiane de l'interrupteur à bascule, la commande automatique est activée en fonction des signaux de la machine à laver et d'autres capteurs. En cas de dysfonctionnement de la vanne, les couleurs rouge et verte s'allument alternativement.

LED et indication sonore


Avec les LED, tout est simple: elles s'accrochent directement aux ports d'E / S via des résistances de limitation. Les courants n'y sont pas importants et les ports d'Atmega sont assez puissants.

Mais le son devait bricoler. Premièrement, je n'ai pas trouvé d'émetteur piézoélectrique grand et bruyant. Il semble que de telles personnes existent dans la nature, mais dès que j'ai assisté à l'achat, il s'est avéré que le choix n'était même pas grand du tout. La chose la plus cool que j'ai réussi à faire était très calme. J'ai dû surfer sur Internet pour trouver des recettes.

Je me suis installé sur un circuit avec un transistor et un autotransformateur, qui fait passer la tension sonore de 5V à 50V. Et puis cela s'est avéré relativement fort. Pas à toutes les fréquences, bien sûr, mais plus près de la résonance.

Ce n'est que lors de la génération du son que la luminosité des LED (jambage avec alimentation) a légèrement diminué, mais le microcontrôleur n'a pas gelé et le programme de contrôle n'a pas cassé. Je pensais que c'était une caractéristique de la disposition de débogage et que tout fonctionnerait bien sur la carte finale. Je me trompais - ça ne s'est pas amélioré. Pire aussi, cependant.



Un autre problème était que je manquais de minuteries et en arrière-plan, je ne pouvais pas générer de son. Je devais demander la période de couinements avec sommeil. Ainsi, lors de la génération du son, Atmega ne peut rien faire, mais les interruptions ont également dû être désactivées, sinon le ton n'est pas clair. Mais cela ne s'est pas révélé très effrayant, car la sortie sonore n'a pas intercepté d'autres tâches critiques, telles que le contrôle d'une vanne ou la réception de données par radio.

Ensuite, j'ai sélectionné les constantes de sommeil pour qu'elles correspondent aux notes et j'ai trouvé plusieurs combinaisons plus ou moins harmonieuses: «la valve est ouverte», «la valve est fermée», «le lavage est terminé» et «fuite». Je vous parlerai séparément du signal "lavage terminé" plus tard.

Détecteur de fuite


Le détecteur de fuite était initialement prévu pour être réalisé sur l'ADC intégré du microcontrôleur. Des expériences ont montré qu'il s'agit d'une solution parfaitement opérationnelle. Cependant, j'ai rencontré que parfois un condensateur est ajouté au capteur avec des contacts pour qu'il soit connecté et s'il n'y a pas de rupture du fil quelque part. Vous pouvez vérifier la présence d'un condensateur (et mesurer sa capacité) à l'aide de: chaîne RC, comparateur et horloge. Comme comparateur, une entrée GPIO conventionnelle est utilisée (c'est aussi une entrée logique et passe de 0 à 1 à une certaine tension), et il y a suffisamment d'heures dans le microcontrôleur.



On a supposé que de temps en temps je vérifiais la présence d'un condensateur sur la ligne, puis j'utilisais l'ADC pour déterminer si les contacts du capteur étaient dans l'eau. Il s'est avéré qu'il suffit de mesurer uniquement la capacité du condensateur: si vous l'abaissez dans l'eau, le temps de charge augmentera et la décharge diminuera. De plus, l'heure changera d'une quantité suffisante pour pouvoir être détectée en toute confiance.

Pour mon système, j'ai choisi de mesurer le temps de charge: si le condensateur n'est pas connecté, alors il est nul, s'il est sec il est relativement petit, et s'il est dans l'eau, alors le temps de charge est beaucoup plus long. Les valeurs exactes ont été déterminées en utilisant une soucoupe avec de l'eau et une série d'expériences.

Le détecteur de fuite a sa propre LED rouge. Si le capteur n'est pas détecté, il s'allume et l'ordre de fermer la vanne est transmis à l'air. Il suffit de rétablir la communication avec le capteur, la LED s'éteint et la vanne peut être ouverte (si seulement la machine est en état de lavage, bien sûr). Une autre chose est que si le capteur détecte de l'eau. Dans ce cas, l'indicateur commence à clignoter, un bruit intermittent désagréable se fait entendre et la valve est fermée de force. Mais surtout, le contrôleur ne quitte jamais cet état. Une fuite est considérée comme un accident grave et l'alimentation en eau ne reprendra pas tant que vous n'aurez pas redémarré l'appareil.

La nutrition


La nourriture est la partie la plus incompréhensible pour moi dans ce projet. Si je suis un peu versé dans les circuits numériques, puis en analogique, pour le dire légèrement - pas vraiment. Mais, grâce aux Chinois: je peux acheter des modules prêts à l'emploi pour les convertisseurs DC-DC avec des contrôleurs de charge de batterie, et en me basant sur eux, je peux penser à quelque chose de réalisable.

Dès le début, il a été prévu de rendre l'appareil autonome, afin qu'en cas de panne de courant, assurez-vous que l'eau sera coupée. De plus, j'avais une alimentation 9V qui devait être connectée quelque part. Au total, le résultat introductif était le suivant:

  • 9V provient du réseau;
  • 3.4 ~ 3.7V provient de la batterie;
  • pour charger la batterie, vous avez besoin de 5V;
  • 5 V est nécessaire pour alimenter la logique et les circuits de puissance;
  • si la tension secteur tombe en panne, mettez la batterie sous tension;
  • il est nécessaire de transmettre le signal de charge de la batterie, la tension sur la batterie et le signal de fonctionnement du réseau au contrôleur.

Le schéma fonctionnel s'est avéré comme sur la figure.



Deux diodes Schottky sont utilisées comme élément de commutation. Le contrôleur de charge a deux LED: CHARGE et STANDBY. Le signal du premier a été connecté au port GPIO du contrôleur afin que le moniteur puisse savoir que la batterie était en charge. De plus, un signal provenant du premier convertisseur CC-CC est appliqué au port du microcontrôleur pour déterminer si l'appareil fonctionne sur secteur ou sur batterie. Pour contrôler le niveau de charge, la tension de la batterie est fournie à l'ADC du contrôleur. Si la tension est trop basse, le moniteur ferme la vanne et passe en mode veille: il ne répond à aucune commande tant que la tension secteur n'apparaît pas.

Malheureusement, il y avait des jambages ici: pour une raison quelconque, le moteur de la valve prend une partie de l'énergie de la batterie. Apparemment, j'ai fait une erreur avec la puissance du convertisseur réseau DC / DC ou avec l'épaisseur des pistes d'alimentation sur la carte. Résultat: après ouverture ou fermeture de la valve, la batterie commence à se charger.

Pour surveiller l'état de l'alimentation, il y a une LED bicolore spéciale. S'il est vert, cela signifie que l'appareil fonctionne sur le réseau. Si rouge - puis de la batterie. S'il est vert, mais rouge clignote, la batterie est en charge.

Logique de travail


Eh bien, nous avons tout le matériel et leur support logiciel, maintenant nous devons faire en sorte que tout cela interagisse les uns avec les autres. Au départ, j'ai vu la mise en œuvre de la logique du travail sous la forme d'une grande boucle (ce qu'on appelle la boucle principale) avec un tas d'if à l'intérieur.

Dans le processus, il y avait un besoin d'un planificateur de tâches pour des actions simples telles que: clignoter une LED, interroger un capteur de fuite, suivre le temps de commutation de la vanne et le contrôle de l'alimentation, que j'ai raccroché sur TIMER0. Le planificateur lui-même n'a pas démarré les fonctions associées à la tâche, mais a uniquement défini le bit de synchronisation sur un dans le descripteur associé à la tâche. La tâche était toujours effectuée dans le cycle principal, nous avons réussi à nous débarrasser des intervalles de temps de suivi, ce qui a rendu les choses très simples.

Depuis les zoos du zoo, qui vérifient l'état des différents sous-systèmes du contrôleur et prennent une décision: il fallait refuser d'ouvrir ou de fermer la vanne. Il est très difficile de déboguer cela et il est très facile de se confondre. Au lieu de cela, j’ai aimé l’idée tirée de l’ancien livre de D. Hazerman: «Comment fabriquer soi-même un robot». Le livre a suggéré que chaque module génère ses propres signaux de contrôle: avant, arrière, rotation, etc. Ensuite, seul celui qui provient d'un bloc avec une priorité plus élevée est sélectionné parmi ces signaux. J'ai fait à peu près la même chose.

J'ai priorisé les blocs comme suit:

  1. Bloc de fuite
  2. Unité de contrôle de batterie
  3. Unité de commande manuelle de soupape
  4. Unité de commande de vanne de commande radio
  5. Minuterie de soupape bloc WatchDog

Chaque bloc génère trois commandes: UNDEFINED, OPEN et CLOSE.

Le bloc de fuite a la priorité la plus élevée, mais il n'a pas la commande OPEN, mais sa commande CLOSE ferme définitivement la vanne, peu importe ce que disent les autres blocs. L'unité de commande manuelle peut interrompre n'importe quel signal de l'unité de canal radio, ce qui vous permet de contrôler la vanne indépendamment de ce que la machine à laver nous indique. Eh bien et ainsi de suite. Autrement dit, une structure hiérarchique logique est apparue qui est facile à comprendre et à déboguer.

Maintenant, revenons au signal: "le lavage est terminé". Hélas, mon modèle de machine à laver n'a pas la possibilité d'informer de la fin de son travail à l'aide du son: les ingénieurs de Candy n'ont pas prévu une telle opportunité. D'un autre côté, j'ai un appareil supplémentaire qui a un émetteur piézo et qui sait à chaque instant ce que fait la machine à laver. Pourquoi ne pas lui faire rapporter la fin du lavage? Eh bien, faisons grincer le contrôleur fort et méchant (à la fréquence de résonance) lorsque la valve ferme le signal. Ajoutez un autre intervalle de garde de cinq minutes afin de ne pas écouter ce grincement à chaque fois que vous allumez et éteignez la machine. La valve est ouverte pendant cinq minutes - le lavage a définitivement commencé.

Résultats


Le développement m'a pris environ un an de travail sans hâte (très sans hâte). L'appareil fonctionne depuis deux ans maintenant. En fonctionnement, il s'est révélé assez satisfaisant. Mais pas sans défauts. Énumérons-les honnêtement:

  1. J'ai gâché quelque chose avec la puissance: le moteur de la valve prend une partie de l'énergie de la batterie.
  2. Le circuit de génération de son tire la tension d'alimentation. Vous pouvez voir clairement comment les LED changent de luminosité lorsque le son est joué.
  3. La chaîne radio n'est pas très stable. Premièrement, le signal disparaît si une personne se tient près du lave-linge. Et deuxièmement, parfois le signal s'aggrave de lui-même. Dans ce cas, vous devez utiliser l'interrupteur à bascule manuel, mais cela se produit extrêmement rarement.
  4. Le moniteur de la machine à laver a été suspendu plusieurs fois. Le bloc contrôleur n'a pas été suspendu une seule fois.
  5. Le son de l'émetteur piézo était très noyé à l'intérieur du boîtier. J'ai percé un trou dans le koprus: ça s'est amélioré, mais pas vraiment. J'ai dû souder l'émetteur de la carte et le coller sur le boîtier, directement en face du trou.

En général, je considère le développement réussi et très utile. Je démarre la machine le matin et pars calmement pour le travail: je sais qu'au bon moment le robinet d'arrivée d'eau sera fermé.

L'archive avec les fichiers du projet peut être téléchargée ici .

Quelques photos.


Vue de dessus avec couvercle supérieur retiré


Vue arrière, du côté des connecteurs









- «»

Source: https://habr.com/ru/post/fr472296/


All Articles