
Introduccion
Creo que cada casa tiene una lavadora. Por lo general, está conectado al suministro de agua a través de una manguera flexible. Pero una gran molestia puede suceder con una manguera: a veces explotan, lo que provocará una inundación tanto en su apartamento como en sus vecinos. Por lo tanto, las lavadoras están conectadas al suministro de agua a través de un grifo especial, que debe abrirse antes del lavado y cerrarse después. No sé sobre usted, pero tengo esta grúa en un lugar extremadamente inconveniente. Sí, y prefiero comenzar a lavar antes de irme a trabajar, de modo que la mayor parte del día la manguera esté bajo presión y pueda explotar en un momento en que no estoy en casa. ¡Sería genial si la grúa se abre y se cierra en el momento adecuado!
La idea me pareció bastante capaz y decidí implementarla: en microcontroladores y con una válvula motorizada.
Para comenzar, formulé los requisitos para el sistema desarrollado:
- monitorear el estado de la lavadora: abrir el agua al comienzo del lavado y cerrar al final;
- la capacidad de controlar manualmente la válvula;
- funcionamiento con batería y cierre de la válvula en caso de descarga de la batería;
- presencia de un sensor de fugas: cierre la válvula en caso de detectar fugas.
Luego descubrió en qué partes consistiría: un monitor, que está instalado en la lavadora, y un controlador, que recibe señales del monitor y controla una válvula motorizada. La comunicación entre el monitor y el controlador se realiza a través de un canal de radio unidireccional.
Parece que esto es suficiente para la tarea técnica. ¡Empecemos!
Selección de MCU
Como todo el sistema consta de dos dispositivos, debería haber dos microcontroladores. Repasé las tripas y encontré dos Atmega8: uno en el paquete DIP y otro en TQFP. El que está en DIP - fue al monitor y TQFP - al controlador. Más tarde resultó que el firmware del controlador cubierto ya no cabe en el Atmega8 de 8 KB, por lo que tuve que actualizar a Atmega328, un análogo completo, pero ahora hay cuatro veces más memoria para el programa.
Por cierto, uno de mis motivos para realizar tales proyectos es la eliminación de la basura electrónica, que he acumulado durante muchos años. Es cierto que al final del proyecto, la basura no se vuelve más pequeña. ¡Se vuelve aún más grande!
Primera parte Monitor
Interacción con una lavadora.
El primer problema: ¿cómo determinar qué está haciendo la lavadora ahora? Al comienzo del proyecto, esta parte de la tarea me parecía muy simple. Todo lo que tenía que hacer era determinar los momentos del comienzo y el final del lavado. En el panel frontal de la máquina hay un LED que se ilumina y se apaga justo cuando es necesario. Esperaba soldar un GPIO con el pie del microcontrolador, por lo que durante la depuración, simplemente emulé los eventos necesarios en el monitor con el botón. Presioné el botón: el LED se encendió, comenzó el lavado. Déjalo ir: lo contrario es cierto. Sin embargo, después de analizar la lavadora, resultó que este LED es parte de la pantalla dinámica y, por desgracia, no es tan fácil determinar si está encendido o apagado.
Al girar el panel de control en mis manos (un par de días), descubrí que estaba implementado en un controlador PIC. Además, está conectado a la placa principal con patas que responden al hardware I2C. Sí, pensé, puedes oler el bus I2C y así determinar qué hacer con la lavadora ahora. Encontré el código sniffer I2C para Atmega en Internet. Por supuesto, tuve que tocar algo.
Francamente: no pude distinguir el protocolo por completo (y no lo probé demasiado), pero resultó determinar los patrones del inicio y el final del lavado (además de encender y apagar la alimentación) con bastante precisión. Me tomó alrededor de una semana.
Modelo:
Candy GC4 1072 D. La computadora envía periódicamente una serie de secuencias de cinco bytes a la unidad de visualización. Las primeras cuatro secuencias están en el formato:
12 A7 00 – NN – X0 X1 X2 X3 X4 X5 X6 X7 – CS
donde: 12 A7 00 - encabezado, NN - número de secuencia, X [0..7] - 8 bytes de datos, CS - suma de verificación. La quinta secuencia es una basura de tamaño variable, cuya esencia para mí sigue siendo un misterio.
Logré resolver los siguientes patrones:
Encendido12 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
donde X [0..7] al menos uno no es igual a 0
START12 A7 00 – 03 – X0 X1 X2 X3 01 01 01 01 – CS
donde X [0..3] es cualquier número
Parar12 A7 00 – 03 – X0 X1 X2 X3 00 00 00 00 – CS
donde X [0..3] es cualquier número
Se puede ver que estas no son secuencias estrictas, es decir, plantillas, por lo que tuve que jugar con el analizador.
La lógica del trabajo es aproximadamente la siguiente: si obtenemos la secuencia de ENCENDIDO, pero no hay INICIO, entonces comenzamos a transmitir paquetes con el estado 0. Si aparece la secuencia de INICIO, cambie el estado a 1. En otros casos, no hay casco.
Hablaremos sobre los paquetes y el estado que sigue.
Es divertido, pero cuando espié los paquetes I2C, no tuve la oportunidad de conectarme a la computadora sniffer. Utilicé para este Raspberry Pi c powerbank'om, que tenía una caja de aluminio. Entonces, tan pronto como este edificio entró en contacto con la carcasa de la lavadora, se sacó un RCD en el escudo, las luces se apagaron en el apartamento y comencé a buscar una linterna con el matyuki. :) Por qué sucedió esa basura, sigue siendo un misterio para mí.
Canal de radio
Inicialmente, no quería que los cables adicionales vinieran de la lavadora. Es decir, se suponía que la conexión era inalámbrica. A partir de aquí, había tres posibles soluciones al problema: WiFi, Bluetooth y el módulo RF para Arduino. Me decidí por este último seleccionando el módulo FS1000A.
Por supuesto, en Habré habrá muchas personas que me reprochen esta elección. Insinuarán que en Ali-Express es posible comprar un módulo ESP con WiFi completo a bajo costo. Pero pensé que esto complicaría mucho el proyecto y decidí actuar de manera más simple.
Como sabe, el módulo RF FS1000A no se puede conectar directamente a la interfaz RS232: una secuencia larga de ceros o unos interrumpe la sincronización del receptor. La biblioteca VirtualWire se creó para resolver este problema. Sin embargo, esta biblioteca está escrita para Arduino, y yo programo exclusivamente de forma nativa bajo Atmega en C. Afortunadamente, el código para Arduino es muy similar al C puro, y con modificaciones menores, la biblioteca fue portada con éxito.
Hubo algunas dificultades: al principio, los paquetes no querían llegar al receptor. Culpé a mis manos torcidas por todo, pero al conectar directamente los terminales del receptor y los controladores del transmisor, estaba convencido de que todo funciona en la parte del software. El transmisor ordenado desde China resultó ser defectuoso. Tuve que comprar otro kit. Luego arreglé el viejo y ahora tengo dos juegos de transmisor-receptor. ¿Recuerdas lo que escribí sobre reducir la basura?
Los datos se han enviado, pero ¿qué contienen exactamente estos datos? Esto es lo que es el paquete 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
Las dos primeras palabras dobles son las direcciones físicas del receptor y el transmisor. En mi caso, son estrictamente fijos: 0x43504d57 - receptor (controlador) y 0x4d504d57 - transmisor (monitor). De hecho, los primeros 8 bytes son esta firma de paquete. La información significativa se encuentra solo en el último byte: el indicador de bit. El bit cero establecido de este indicador significa que el monitor está encendido y funcionando: siempre debe ser 1. El primer bit es el estado de la válvula: 0 - la válvula debe estar cerrada, 1 - abierta. Eso es todo.
Se supone que el monitor debe enviar periódicamente paquetes al controlador, confirmando su funcionamiento y la capacidad de servicio del canal de datos. En caso de pérdida del canal de comunicación, el controlador debe cerrar la válvula de emergencia.
La biblioteca VirtualWire monitorea la integridad de los datos transmitidos usando CRC32. No tuve que hacer esfuerzos adicionales en esta dirección. Belleza!
Construcción
Estructuralmente, el monitor está hecho en forma de una pequeña placa, que está pegada al pegamento caliente "Uncle Liao snot" dentro del panel frontal de la lavadora. Mediante conectores, la placa se conecta al espacio entre la computadora y la pantalla. La máquina en sí no ha sufrido ninguna modificación: en cualquier momento puede volver a su estado original.
Segunda parte Controlador
Canal de radio
Aquí todo es simple: el receptor del kit FS1000A y la parte del receptor de la biblioteca VirtualWire están instalados. El paquete se analiza y su estado se transmite a la salida. El receptor VirtualWire ocupa TIMER1 en el microcontrolador.
Control de la válvula
En la tienda en línea china, se seleccionó una válvula motorizada de 3/4 ”con una fuente de alimentación de 5 voltios y con sensores terminales conectados al cable. Esta válvula se instaló entre la válvula de bola y la manguera de la lavadora. Para controlar la válvula, en el mismo sitio chino, se ordenó un controlador de motor paso a paso de baja potencia en los controladores L9110. Lo conecté al controlador de la siguiente manera:

Desde el punto de vista del software, no hubo dificultades particulares: mediante las entradas VALVE_CLOSE y VALVE_OPEN determinamos el estado actual de la válvula. Si es necesario cambiar este estado, encienda el motor para abrirlo o cerrarlo y espere hasta que se establezca un 0 lógico en la entrada correspondiente. Sin embargo, dado que abrir o cerrar toma algún tiempo, me gustaría no perder el control sobre todo en ese momento dispositivo Por lo tanto, en el temporizador Atmega, se creó un planificador primitivo y el control de la válvula se transfirió a una tarea especial. Al mismo tiempo, el módulo de software WatchDog especial mide el tiempo que tarda la válvula en cambiar, y si es demasiado larga, se genera una señal sobre su mal funcionamiento. Más tarde, se colgaron otras cosas interesantes en este programador, como el parpadeo de los LED y el sondeo del sensor de fugas. Pero más sobre eso más tarde.
Además, un LED de estado de tres colores y un interruptor de palanca de control manual de tres posiciones pertenecen al circuito de control de la válvula. En la posición central del interruptor de palanca, el control automático se activa de acuerdo con las señales de la lavadora y otros sensores. En caso de mal funcionamiento de la válvula, los colores rojo y verde se iluminan alternativamente.
LED e indicación de sonido
Con los LED, todo es simple: se aferran directamente a los puertos de E / S a través de resistencias limitantes. Las corrientes allí no son grandes, y los puertos en Atmega son bastante poderosos.
Pero el sonido tuvo que retocar. En primer lugar, no encontré un emisor piezoeléctrico grande y ruidoso. Parece que tales personas existen en la naturaleza, pero tan pronto como atendí la compra, resultó que la elección ni siquiera fue excelente. Lo mejor que conseguí sonar muy tranquilo. Tuve que navegar por Internet para obtener recetas.
Me instalé en un circuito con un transistor y un autotransformador, que oscila el voltaje de sonido de 5V a 50V. Y luego resultó relativamente ruidoso. No en todas las frecuencias, por supuesto, pero más cerca de la resonancia.
Fue solo durante la generación del sonido que el brillo de los LED (jamb con alimentación) disminuyó ligeramente, pero el microcontrolador no se congeló y el programa de control no se interrumpió. Pensé que esta es una característica del diseño de depuración y que todo funcionará bien en el tablero final. Me equivoqué, no mejoró. Peor, sin embargo, también.

Otro problema fue que me quedé sin temporizadores y en el fondo no pude generar sonido. Tuve que preguntar el período de chirrido con sueños. Entonces, durante la generación de sonido, Atmega no puede hacer nada más que interrupciones, también, tuvo que ser desactivado, de lo contrario el tono no es claro. Pero esto resultó no ser muy aterrador ya que la salida de sonido no se cruzaba con otras tareas críticas, como controlar una válvula o recibir datos por radio.
Además, seleccioné las constantes de sueño para que correspondieran a las notas y se me ocurrieron varias combinaciones más o menos armoniosas: "la válvula está abierta", "la válvula está cerrada", "el lavado ha terminado" y "fuga". Te contaré por separado sobre la señal de "lavado terminado" más adelante.
Detector de fugas
El detector de fugas se planeó originalmente para hacerse en el ADC incorporado del microcontrolador. Los experimentos han demostrado que esta es una solución que funciona perfectamente. Sin embargo, me di cuenta de que a veces se agrega un condensador al sensor con contactos para que esté conectado y si no hay ruptura en el cable en alguna parte. Puede verificar la presencia de un capacitor (y medir su capacitancia) usando: cadena RC, comparador y reloj. Como comparador, se usa una entrada GPIO convencional (también es una entrada lógica y cambia de 0 a 1 a un voltaje determinado), y hay suficientes horas en el microcontrolador.

Se suponía que de vez en cuando verificaría la presencia de un condensador en la línea y luego usaría el ADC para determinar si los contactos del sensor están en el agua. Resultó que es suficiente medir solo la capacitancia del capacitor: si lo baja al agua, entonces el tiempo de carga aumentará y la descarga disminuirá. Además, el tiempo cambiará en una cantidad suficiente para que pueda detectarse con confianza.
Para mi sistema, elegí medir el tiempo de carga: si el condensador no está conectado, entonces es cero, si está seco es relativamente pequeño y si está en agua, entonces el tiempo de carga es mucho más largo. Los valores exactos se determinaron usando un platillo con agua y una serie de experimentos.
El detector de fugas tiene su propio LED indicador rojo. Si no se detecta el sensor, se ilumina y el comando para cerrar la válvula se transmite al aire. Uno solo tiene que restablecer la comunicación con el sensor, el LED se apaga y la válvula se puede abrir (si solo la máquina está en estado de lavado, por supuesto). Otra cosa es si el sensor detecta agua. En este caso, el indicador comienza a parpadear, se escucha un sonido intermitente desagradable y la válvula se cierra a la fuerza. Pero lo más importante, el controlador nunca abandona este estado. Una fuga se considera un accidente grave y el suministro de agua no se reanudará hasta que reinicie el dispositivo con fuerza.
Nutrición
La comida es la parte más incomprensible para mí en este proyecto. Si estoy un poco versado en circuitos digitales, entonces en analógico, por decirlo suavemente, en realidad no. Pero, gracias a los chinos: puedo comprar módulos listos para usar para convertidores DC-DC con controladores de carga de batería, y en base a ellos puedo pensar en algo viable.
Desde el principio, se planeó hacer que el dispositivo se autoalimentara, de modo que en caso de un corte de energía, asegúrese de que se cierre el agua. Además, tenía una fuente de alimentación de 9V que necesitaba ser conectada en alguna parte. En total, el resultado introductorio fue el siguiente:
- 9V proviene de la red;
- 3.4 ~ 3.7V proviene de la batería;
- para cargar la batería necesitas 5V;
- Se necesitan 5V para alimentar la lógica y los circuitos de alimentación;
- si falla la tensión de red, cambie la alimentación de la batería;
- es necesario transmitir la señal de carga de la batería, el voltaje de la batería y la señal de funcionamiento de la red al controlador
El diagrama de bloques resultó como en la figura.

Se utilizan dos diodos Schottky como elemento de conmutación. El controlador de carga tiene dos LED: CHARGE y STANDBY. La señal del primero se conectó al puerto GPIO del controlador para que el monitor pudiera saber que la batería se estaba cargando. Además, se aplica una señal del primer convertidor CC-CC al puerto del microcontrolador para determinar si el dispositivo funciona con una red eléctrica o una batería. Para controlar el nivel de carga, el voltaje de la batería se suministra al ADC del controlador. Si el voltaje es demasiado bajo, el monitor cierra la válvula y pasa al modo de espera: no responde a ningún comando hasta que aparece el voltaje de la red.
Desafortunadamente, hubo algunas jambas aquí: por alguna razón, el motor de la válvula toma parte de la energía de la batería. Aparentemente, cometí un error con la potencia del convertidor CC / CC de red o con el grosor de las pistas de potencia en la placa. Como resultado: después de abrir o cerrar la válvula, la batería comienza a cargarse.
Para controlar el estado de la alimentación hay un LED especial de dos colores. Si es verde, el dispositivo está funcionando en la red. Si es rojo, entonces de la batería. Si es verde, pero el rojo parpadea, la batería se está cargando.
Lógica de trabajo
Bueno, tenemos todo el hardware y su soporte de software, ahora necesitamos de alguna manera hacer que todo esto interactúe entre sí. Inicialmente, vi la implementación de la lógica del trabajo en forma de un bucle grande (lo que se llama el bucle principal) con un montón de ifs dentro.
En el proceso, era necesario un planificador de tareas para acciones tan simples como: parpadear un LED, sondear un sensor de fugas, rastrear el tiempo de conmutación de la válvula y el control de potencia, que publiqué en TIMER0. El planificador en sí no inició las funciones asociadas con la tarea, sino que solo configuró el bit de sincronización en uno en el descriptor asociado con la tarea. La tarea todavía se llevaba a cabo en el ciclo principal, logramos deshacernos de los intervalos de tiempo de seguimiento, lo que lo hizo muy simple.
Desde el zoológico, que verifica el estado de varios subsistemas del controlador y toma una decisión: era necesario negarse a abrir o cerrar la válvula. Es muy difícil depurar esto y es muy fácil confundirse. En cambio, me gustó la idea del antiguo libro de D. Hazerman: "Cómo hacer un robot usted mismo". El libro sugiere que cada módulo genere sus propias señales de control: hacia adelante, hacia atrás, rotación, etc. Luego, solo se selecciona una de estas señales que provenga de un bloque con una prioridad más alta. Hice casi lo mismo.
Prioricé los bloques de la siguiente manera:
- Bloque de fugas
- Unidad de control de batería
- Unidad de control de válvula manual
- Unidad de control de la válvula de radio control
- Temporizador de válvula Bloque WatchDog
Cada bloque genera tres comandos: INDEFINIDO, ABIERTO y CERRADO.
El bloque de fugas tiene la máxima prioridad, pero no tiene el comando ABRIR, pero su comando CERRAR definitivamente cierra la válvula, sin importar lo que digan otros bloques. La unidad de control manual puede interrumpir cualquier señal de la unidad de canal de radio, lo que le permite controlar la válvula independientemente de lo que nos indique la lavadora. Bueno y así sucesivamente. Es decir, ha aparecido una estructura jerárquica lógica que es fácil de entender y depurar.
Ahora, volvamos a la señal: "el lavado ha terminado". Por desgracia, mi modelo de lavadora no tiene la oportunidad de informar sobre el final de su trabajo con la ayuda del sonido: los ingenieros de Candy no brindaron esa oportunidad. Por otro lado, tengo un dispositivo adicional que tiene un emisor piezoeléctrico y en todo momento sabe lo que está haciendo la lavadora. ¿Por qué no hacer que informe el final del lavado? Bueno, hagamos que el controlador suene fuerte y desagradable (a la frecuencia de resonancia) cuando la válvula cierre la señal. Agregue otro intervalo de protección de cinco minutos para no escuchar este chirrido cada vez que enciende y apaga la máquina. La válvula está abierta durante cinco minutos: el lavado definitivamente ha comenzado.
Resultados
El desarrollo me llevó cerca de un año de trabajo sin prisas (muy sin prisas). El dispositivo ha estado funcionando durante dos años. En funcionamiento, resultó ser bastante satisfactorio. Pero no sin fallas. Vamos a enumerarlos honestamente:
- Arruiné algo con la energía: el motor de la válvula toma parte de la energía de la batería.
- El circuito de generación de sonido dibuja la tensión de alimentación. Puede ver claramente cómo los LED cambian el brillo cuando se reproduce el sonido.
- El canal de radio no es muy estable. En primer lugar, la señal desaparece si una persona se encuentra cerca de la lavadora. Y en segundo lugar, a veces la señal empeora por sí sola. En este caso, debe usar el interruptor de palanca manual, pero esto ocurre extremadamente raramente.
- La unidad de monitor en la lavadora colgó un par de veces. El bloque controlador no se colgó ni una sola vez.
- El sonido del emisor piezoeléctrico fue muy ahogado dentro de la caja. Perforé un agujero en el koprus: mejoró, pero en realidad no. Tuve que soldar el emisor de la placa y pegarlo a la caja, directamente enfrente del agujero.
En general, considero que el desarrollo fue exitoso y muy útil. Arranco la máquina por la mañana y salgo tranquilamente al trabajo: sé que en el momento correcto se cerrará el grifo del suministro de agua.
El archivo con los archivos del proyecto se puede descargar
aquí .
Algunas fotos
Vista superior con la cubierta superior retirada
- «»