Sistema de proteção contra vazamentos para uma máquina de lavar



1. Introdução


Eu acho que toda casa tem uma máquina de lavar. Normalmente, ele é conectado ao abastecimento de água através de uma mangueira flexível. Mas um grande incômodo pode acontecer com uma mangueira: às vezes elas explodem, o que levará a uma inundação no seu apartamento e nos vizinhos. Portanto, as máquinas de lavar são conectadas ao abastecimento de água através de uma torneira especial, que deve ser aberta antes da lavagem e fechada depois. Não conheço você, mas tenho este guindaste em um local extremamente inconveniente. Sim, e prefiro começar a lavar antes de sair para o trabalho, para que a maior parte do dia a mangueira fique sob pressão e possa estourar no momento em que não estou em casa. Seria ótimo se o guindaste se abrir e se fechar na hora certa!

A ideia me pareceu bastante capaz e resolvi implementá-la: em microcontroladores e com válvula motorizada.

Para começar, formulei os requisitos para o sistema desenvolvido:

  • monitorar o estado da máquina de lavar: abrir água no início da lavagem e fechar no final;
  • a capacidade de controlar manualmente a válvula;
  • operação da bateria e fechamento da válvula em caso de descarga da bateria;
  • presença de um sensor de vazamento: feche a válvula caso seja detectado vazamento.

Em seguida, ele descobriu em que partes ele será composto: um monitor instalado na máquina de lavar e um controlador que recebe sinais do monitor e controla uma válvula motorizada. A comunicação entre o monitor e o controlador é via um canal de rádio unidirecional.

Parece que isso é suficiente para a tarefa técnica. Vamos começar!

Seleção MCU


Como todo o sistema consiste em dois dispositivos, deve haver dois microcontroladores. Raspei as tripas e encontrei dois Atmega8: um no pacote DIP e outro no TQFP. O do DIP - foi para o monitor e o TQFP - para o controlador. Mais tarde, constatou-se que o firmware do controlador coberto de vegetação não se encaixa mais no 8KB Atmega8, então tive que atualizar para o Atmega328 - um analógico completo, mas agora há quatro vezes mais memória para o programa.
A propósito, um dos meus motivos para realizar esses projetos é o descarte de lixo eletrônico, que acumulei ao longo de muitos anos. É verdade que, no final do projeto, o lixo não se torna menor. Fica ainda maior!

Parte I Monitor


Interação com uma máquina de lavar


O primeiro problema: como determinar o que a máquina de lavar está fazendo agora? No início do projeto, essa parte da tarefa parecia muito simples para mim. Tudo o que precisava ser feito era determinar os momentos do início e do fim da lavagem. No painel frontal da máquina, há um LED que acende e apaga quando necessário. Eu esperava soldar um GPIO nele com o pé do microcontrolador; portanto, durante a depuração, simplesmente emulei os eventos necessários no monitor com o botão Apertei o botão - o LED acendeu, a lavagem começou. Deixe ir - o oposto é verdadeiro. No entanto, depois de analisar a máquina de lavar, descobriu-se que esse LED faz parte da exibição dinâmica e, infelizmente, não é tão fácil determinar se está ligado ou desligado.

Girando o painel de controle em minhas mãos (alguns dias), descobri que ele foi implementado em um controlador PIC. Além disso, ele é conectado à placa principal com as pernas respondendo ao hardware I2C. Sim, pensei, você pode cheirar o barramento I2C e, assim, determinar o que fazer a máquina de lavar agora. Encontrei o código sniffer I2C para o Atmega na Internet. Claro, eu tive que tocar alguma coisa.

Francamente: não consegui entender completamente o protocolo (e não tentei muito), mas acabou determinando os padrões de início e fim da lavagem (além de ligar e desligar a alimentação) com bastante precisão. Demorei cerca de uma semana.

Modelo: Candy GC4 1072 D. O computador envia periodicamente uma série de sequências de cinco bytes para a unidade de exibição. As quatro primeiras sequências estão no formato:

12 A7 00 – NN – X0 X1 X2 X3 X4 X5 X6 X7 – CS
onde: 12 A7 00 - cabeçalho, NN - número de sequência, X [0..7] - 8 bytes de dados, CS - soma de verificação. A quinta sequência é um lixo de tamanho variável, cuja essência para mim permaneceu um mistério.

Consegui resolver os seguintes padrões:

Power on

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

onde X [0..7] pelo menos um não é igual a 0

INICIAR

12 A7 00 – 03 – X0 X1 X2 X3 01 01 01 01 – CS
onde X [0..3] é qualquer número

PARAR

12 A7 00 – 03 – X0 X1 X2 X3 00 00 00 00 – CS
onde X [0..3] é qualquer número

Pode-se ver que essas não são sequências estritas, ou seja, modelos, então tive que mexer com o analisador.

A lógica do trabalho é aproximadamente a seguinte: se obtivermos a sequência POWER ON, mas não houver START, começaremos a transmitir pacotes com o status 0. Se a sequência START aparecer, altere o status para 1. Em outros casos, não há nada a enviar.

Falaremos sobre pacotes e qual o status a seguir.

É engraçado, mas quando espiei pacotes I2C, não tive a oportunidade de me conectar ao computador sniffer. Eu usei para este Raspberry Pi powerbank'om, que tinha uma caixa de alumínio. Então, assim que esse prédio entrou em contato com o corpo da lavadora, um RCD foi puxado para o escudo, a luz se apagou no apartamento e eu comecei a procurar a lanterna com o matyuki. :) Por que esse lixo aconteceu - ainda é um mistério para mim.

Canal de rádio


Inicialmente, eu não queria que os fios extras saíssem da máquina de lavar. Ou seja, a conexão deveria ser sem fio. A partir daqui, havia três soluções possíveis para o problema: WiFi, Bluetooth e o módulo RF para Arduino. Eu decidi sobre este último selecionando o módulo FS1000A.

É claro que em Habré haverá muitas pessoas que me censuram com essa escolha. Eles sugerem que no Ali-Express é possível comprar um módulo ESP com WiFi completo por um preço baixo. Mas pensei que isso complicaria bastante o projeto e decidi agir de maneira mais simples.

Como você sabe, o módulo RF FS1000A não pode ser conectado diretamente à interface RS232: uma longa sequência de zeros ou uns interrompe a sincronização do receptor. A biblioteca VirtualWire foi criada para resolver esse problema. No entanto, essa biblioteca foi escrita para o Arduino e eu programa exclusivamente de forma nativa no Atmega em C. Felizmente, o código para o Arduino é muito semelhante ao C puro e, com pequenas modificações, a biblioteca foi portada com êxito.

Houve algumas dificuldades: a princípio, os pacotes não queriam chegar ao receptor. Eu culpei minhas mãos tortas por tudo, mas, ao conectar diretamente os terminais do receptor e dos controladores de transmissor, fiquei convencido de que tudo funciona na parte do software. O transmissor encomendado à China mostrou-se defeituoso. Eu tive que comprar outro kit. Depois consertei o antigo e agora tenho dois conjuntos de transmissor-receptor. Lembra-se do que escrevi sobre como reduzir o lixo?

Os dados foram enviados, mas o que exatamente está contido nesses dados? Aqui está o que o pacote transmitido é:

 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 

As duas primeiras palavras duplas são os endereços físicos do receptor e do transmissor. No meu caso, eles são estritamente fixos: 0x43504d57 - receptor (controlador) e 0x4d504d57 - transmissor (monitor). De fato, os primeiros 8 bytes são essa assinatura de pacote. Informações significativas são encontradas apenas no último byte - o sinalizador de bit. O bit zero definido dessa bandeira significa que o monitor está ligado e funcionando - ele deve sempre ser 1. O primeiro bit é o status da válvula: 0 - a válvula deve estar fechada, 1 - aberta. Só isso.

Supõe-se que o monitor envie periodicamente pacotes ao controlador, confirmando sua operação e a capacidade de manutenção do canal de dados. No caso de perda do canal de comunicação, o controlador deve fechar a válvula de emergência.

A biblioteca VirtualWire monitora a integridade dos dados transmitidos usando o CRC32. Não precisei fazer esforços adicionais nessa direção. Beleza!

Construção civil


Estruturalmente, o monitor é feito na forma de uma pequena prancha, colada na cola quente "Tio Liao ranho", dentro do painel frontal da lavadora de roupas.Por conectores, a placa é conectada ao espaço entre o computador e a placa de vídeo. A própria máquina não sofreu nenhuma modificação: a qualquer momento, pode ser trazida ao seu estado original.

Parte Dois Controlador


Canal de rádio


Tudo é simples aqui: o receptor do kit FS1000A e o receptor da biblioteca VirtualWire estão instalados. O pacote é analisado e seu status é transmitido para a saída. O receptor VirtualWire ocupa TIMER1 no microcontrolador.

Controle de válvula


Na loja online chinesa, uma válvula motorizada de 3/4 ”foi selecionada com fonte de alimentação de 5 volts e com sensores terminais conectados ao cabo. Esta válvula foi instalada entre a válvula de esfera e a mangueira da máquina de lavar. Para controlar a válvula, no mesmo local chinês, um driver de motor de passo de baixa potência foi encomendado nos drivers L9110. Conectei-o ao controlador da seguinte maneira:



Do ponto de vista do software, não houve dificuldades particulares: pelas entradas VALVE_CLOSE e VALVE_OPEN, determinamos o status atual da válvula. Se esse status precisar ser alterado, ligue o motor para abrir ou fechar e aguarde até que um 0 lógico seja estabelecido na entrada correspondente.No entanto, como abrir ou fechar leva algum tempo, eu gostaria de não perder o controle sobre tudo naquele momento dispositivo Portanto, no cronômetro Atmega, um agendador primitivo foi construído e o controle da válvula foi transferido para uma tarefa especial. Ao mesmo tempo, o módulo de software especial WatchDog mede o tempo que leva para a válvula ser trocada e, se for muito longo, é gerado um sinal sobre seu mau funcionamento. Mais tarde, outras coisas interessantes foram penduradas nesse agendador, como LEDs piscando e sondando o sensor de vazamento. Mas mais sobre isso mais tarde.

Além disso, um LED de status de três cores e uma chave seletora de controle manual de três posições pertencem ao circuito de controle da válvula. Na posição intermediária da chave seletora, o controle automático é ativado de acordo com os sinais da máquina de lavar e de outros sensores. No caso de mau funcionamento da válvula, as cores vermelho e verde acendem alternadamente.

LED e indicação sonora


Com os LEDs, tudo é simples: eles se agarram diretamente às portas de E / S via resistores limitadores. As correntes não são grandes e as portas do Atmega são bastante poderosas.

Mas o som teve que mexer. Em primeiro lugar, não encontrei um emissor piezo grande e alto. Parece que essas pessoas existem na natureza, mas assim que participei da compra, a escolha não foi nem boa. A coisa mais legal que consegui parecer soou muito quieta. Eu tive que navegar na Internet para obter receitas.

Eu me acomodei em um circuito com um transistor e um autotransformador, que altera a tensão do som de 5V para 50V. E então ficou relativamente alto. Não em todas as frequências, é claro, mas mais perto da ressonância.

Foi somente durante a geração do som que o brilho dos LEDs (batente com energia) diminuiu um pouco, mas o microcontrolador não congelou e o programa de controle não quebrou. Eu pensei que este é um recurso do layout de depuração e tudo funcionará bem na placa final. Eu estava enganado - não melhorou. Pior, no entanto, também.



Outro problema foi que fiquei sem temporizadores e, em segundo plano, não consegui gerar som. Eu tive que perguntar o período de chiado com dorme. Assim, durante a geração do som, o Atmega não pode fazer nada além de interrupções, também teve que ser desativado, caso contrário, o tom não é claro. Mas isso acabou não sendo muito assustador, pois a saída de som não se cruzava com outras tarefas críticas, como controlar uma válvula ou receber dados via rádio.

Além disso, selecionei as constantes do sono para que correspondessem às notas e criei várias combinações mais ou menos harmoniosas: “a válvula está aberta”, “a válvula está fechada”, “a lavagem está concluída” e “vazamento”. Mais adiante, falarei sobre o sinal de "lavagem concluída".

Detector de vazamento


O detector de vazamento foi originalmente planejado para ser executado no ADC interno do microcontrolador. Experimentos demonstraram que esta é uma solução perfeitamente funcional. No entanto, eu percebi que, às vezes, um capacitor é adicionado ao sensor com contatos para que ele seja conectado e se não houver interrupção no fio em algum lugar. Você pode verificar a presença de um capacitor (e medir sua capacitância) usando: corrente RC, comparador e relógio. Como um comparador, é usada uma entrada GPIO convencional (também é uma entrada lógica e alterna de 0 a 1 a uma certa tensão), e há horas suficientes no microcontrolador.



Supunha-se que, de tempos em tempos, eu verificava a presença de um capacitor na linha e depois usava o ADC para determinar se os contatos do sensor estão na água. Como se viu, basta medir apenas a capacitância do capacitor: se você o abaixar na água, o tempo de carga aumentará e a descarga diminuirá. Além disso, o tempo mudará em uma quantidade suficiente para que possa ser detectado com confiança.

Para o meu sistema, escolhi medir o tempo de carga: se o capacitor não estiver conectado, será zero, se estiver seco é relativamente pequeno e se estiver na água, o tempo de carga será muito maior. Os valores exatos foram determinados usando um pires com água e uma série de experimentos.

O detector de vazamento possui seu próprio LED indicador vermelho. Se o sensor não for detectado, ele acende e o comando para fechar a válvula é transmitido ao ar. Basta restabelecer a comunicação com o sensor, o LED apaga e a válvula pode ser aberta (se apenas a máquina estiver no estado de lavagem, é claro). Outra coisa é se o sensor detectar água. Nesse caso, o indicador começa a piscar, um som intermitente desagradável é ouvido e a válvula é fechada à força. Mas o mais importante, o controlador nunca sai desse estado. Um vazamento é considerado um acidente grave e o suprimento de água não será retomado até que você reinicie o dispositivo com força.

Nutrição


Comida é a parte mais incompreensível para mim neste projeto. Se eu sou um pouco versado em circuitos digitais, depois em analógico, para dizer o mínimo - na verdade não. Mas, graças aos chineses: posso comprar módulos prontos para conversores DC-DC com controladores de carga de bateria e, com base neles, consigo pensar em algo viável.

Desde o início, foi planejado tornar o dispositivo com alimentação própria, para que, em caso de falta de energia, verifique se a água será desligada. Além disso, eu tinha uma fonte de alimentação de 9V que precisava ser conectada em algum lugar. No total, o resultado introdutório foi o seguinte:

  • 9V vem da rede;
  • 3.4 ~ 3.7V vem da bateria;
  • para carregar a bateria você precisa de 5V;
  • 5V é necessário para alimentar a lógica e os circuitos de potência;
  • se a tensão da rede falhar, ligue a bateria;
  • é necessário transmitir o sinal de carga da bateria, a tensão na bateria e o sinal de operação da rede para o controlador.

O diagrama de blocos ficou como na figura.



Dois diodos Schottky são usados ​​como elemento de comutação. O controlador de carregamento possui dois LEDs: CHARGE e STANDBY. O sinal do primeiro foi conectado à porta GPIO do controlador para que o monitor soubesse que a bateria estava carregando. Além disso, um sinal do primeiro conversor DC-DC é aplicado à porta do microcontrolador para determinar se o dispositivo está operando com uma rede elétrica ou bateria. Para controlar o nível de carga, a tensão da bateria é fornecida ao ADC do controlador. Se a tensão estiver muito baixa, o monitor fecha a válvula e entra no modo de espera: ele não responde a nenhum comando até que a tensão da rede elétrica apareça.

Infelizmente, havia alguns batentes aqui: por alguma razão, o motor da válvula toma parte da energia da bateria. Aparentemente, cometi um erro com a potência do conversor DC / DC da rede ou com a espessura das faixas de energia na placa. Como resultado: após abrir ou fechar a válvula, a bateria começa a carregar.

Para monitorar o status da energia, há um LED especial de duas cores. Se estiver verde, o dispositivo está operando na rede. Se vermelho - a partir da bateria. Se estiver verde, mas o vermelho piscar, a bateria está carregando.

Lógica de trabalho


Bem, temos todo o hardware e seu suporte de software, agora precisamos, de alguma forma, fazer com que tudo isso interaja. Inicialmente, vi a implementação da lógica do trabalho na forma de um loop grande (o que é chamado de loop principal) com um monte de ifs dentro.

No processo, havia a necessidade de um agendador de tarefas para ações simples como: piscar um LED, pesquisar um sensor de vazamento, rastrear o tempo de comutação da válvula e o controle de energia, que desliguei no TIMER0. O planejador em si não iniciou as funções associadas à tarefa, mas apenas definiu o bit de sincronização como um no descritor associado à tarefa. A tarefa ainda foi realizada no ciclo principal, conseguimos nos livrar dos intervalos de rastreamento, o que tornou muito simples.

Do zoológico ifs, que verifica o status de vários subsistemas do controlador e toma uma decisão: era necessário recusar abrir ou fechar a válvula. É muito difícil depurar isso e é muito fácil ficar confuso. Em vez disso, gostei da idéia do livro antigo de D. Hazerman: "Como fazer um robô você mesmo". O livro sugeriu que cada módulo gere seus próprios sinais de controle: avançar, retroceder, rotação etc. Em seguida, somente um que vem de um bloco com prioridade mais alta é selecionado a partir desses sinais. Eu fiz o mesmo.

Priorizei os blocos da seguinte maneira:

  1. Bloqueio de vazamento
  2. Unidade de controle da bateria
  3. Unidade de controle de válvula manual
  4. Unidade de controle de válvula de controle de rádio
  5. Temporizador de válvula WatchDog block

Cada bloco gera três comandos: UNDEFINED, OPEN e CLOSE.

O bloco de vazamento tem a maior prioridade, mas não possui o comando ABRIR, mas seu comando FECHAR definitivamente fecha a válvula, independentemente do que os outros blocos digam. A unidade de controle manual pode interromper qualquer sinal da unidade de canal de rádio, o que permite controlar a válvula, independentemente do que a lavadora de roupas nos indicar. Bem e assim por diante. Ou seja, apareceu uma estrutura hierárquica lógica que é fácil de entender e depurar.

Agora, voltemos ao sinal: "a lavagem está concluída". Infelizmente, meu modelo de máquina de lavar não tem a oportunidade de informar sobre o final de seu trabalho com a ajuda do som: os engenheiros da Candy não forneceram essa oportunidade. Por outro lado, eu tenho um dispositivo adicional que possui um emissor piezo e a cada momento sabe o que a máquina de lavar está fazendo. Por que não fazê-lo relatar o final da lavagem? Bem, vamos fazer o controlador alto e desagradável (na frequência de ressonância) chiar quando a válvula fecha o sinal. Adicione outro intervalo de guarda de cinco minutos para não ouvir esse chiado sempre que ligar e desligar a máquina. A válvula está aberta por cinco minutos - a lavagem definitivamente começou.

Resultados


O desenvolvimento levou cerca de um ano de trabalho sem pressa (muito sem pressa). O dispositivo está funcionando há dois anos. Em operação, provou ser bastante satisfatório. Mas não sem falhas. Vamos listá-los honestamente:

  1. Eu estraguei algo com o poder: o motor da válvula toma parte da energia da bateria.
  2. O circuito de geração de som consome a tensão de alimentação. Você pode ver claramente como os LEDs mudam o brilho quando o som é reproduzido.
  3. O canal de rádio não é muito estável. Primeiro, o sinal desaparece se uma pessoa estiver perto da máquina de lavar. E segundo, às vezes o sinal piora por si próprio. Nesse caso, você precisa usar a chave de alternância manual, mas isso acontece muito raramente.
  4. A unidade de monitor na máquina de lavar pendurou algumas vezes. O bloco do controlador não travou nem uma vez.
  5. O som do emissor piezo foi muito abafado dentro do gabinete. Fiz um buraco no koprus: ficou melhor, mas não realmente. Eu tive que soldar o emissor da placa e colá-lo na caixa, diretamente em frente ao orifício.

Em geral, considero o desenvolvimento bem-sucedido e muito útil. Eu ligo a máquina pela manhã e saio calmamente para o trabalho: sei que na hora certa a torneira do abastecimento de água será fechada.

O arquivo com arquivos de projeto pode ser baixado aqui .

Algumas fotos.


Vista superior com a tampa superior removida


Vista traseira, pelo lado dos conectores









- «»

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


All Articles