Tabla de contenido:

Automatización del hogar Raspberry Pi 433MHz súper simple: 7 pasos
Automatización del hogar Raspberry Pi 433MHz súper simple: 7 pasos

Video: Automatización del hogar Raspberry Pi 433MHz súper simple: 7 pasos

Video: Automatización del hogar Raspberry Pi 433MHz súper simple: 7 pasos
Video: TODO ESTO PUEDES HACER CON UNA RASPBERRY PI 😈💻 2024, Noviembre
Anonim
Automatización del hogar Raspberry Pi 433MHz súper simple
Automatización del hogar Raspberry Pi 433MHz súper simple

Este tutorial es uno entre muchos cuando se trata de usar una Raspberry Pi para controlar dispositivos inalámbricos en el hogar. Como muchos otros, le mostrará cómo usar un par de transmisor / receptor barato conectado a su Pi para interactuar con dispositivos que operan en la banda de frecuencia de radio de 433MHz de uso común. Específicamente le mostrará cómo encender o apagar cualquier dispositivo eléctrico usando su Pi transmitiendo comandos a un conjunto de tomas de corriente controladas a distancia de 433MHz.

¿Por qué creé este tutorial si ya existen tantos? Principalmente porque casi todos los otros tutoriales que encontré parecían complicar demasiado las cosas, especialmente en el lado del software. Me di cuenta de que dependían en gran medida de bibliotecas, scripts o fragmentos de código de terceros para hacer todo el trabajo. Muchos ni siquiera explicarían qué estaba haciendo el código subyacente; solo le pedirían que insertara dos o tres piezas de software en su Pi y ejecutara un montón de comandos, sin hacer preguntas. Tenía muchas ganas de probar y usar mi Pi para encender y apagar dispositivos eléctricos en mi casa usando un conjunto de enchufes controlados a distancia de 433MHz, pero quería crear mi propia versión del sistema que pudiera entender, con suerte eliminando la necesidad de utilice las bibliotecas o los scripts de otra persona.

De eso se trata este tutorial. El lado del software de este sistema consta de dos scripts Python muy simples: uno para recibir y grabar señales y otro para transmitir estas señales a las tomas de corriente inalámbrica. La recepción / transmisión real de la señal se basa solo en la biblioteca RPi. GPIO fácil de usar que, al menos para mí, viene preinstalada con Raspbian. Esta biblioteca también se puede importar directamente a Python.

Para este proyecto necesitará:

Una Raspberry Pi. Cualquier modelo debería funcionar, utilicé un kit de inicio todo en uno, pero tal vez solo necesite la unidad central

Un par de transmisor / receptor de 433 MHz. Los más utilizados en este tipo de proyectos parecen ser estos. Comprar un paquete de cinco como el que está vinculado asegura que tenga algunos repuestos

Un conjunto de tomas de corriente de 433 MHz controladas a distancia. Usé estos que recomiendo encarecidamente, pero hay innumerables modelos disponibles. ¡Solo asegúrese de que operen en esta frecuencia

Algunos accesorios para la construcción de circuitos. Recomendaría usar una placa de pruebas y algunos cables de puente para que el proceso de construcción del circuito sea lo más fácil posible.

[Si decide comprar alguno de estos productos, le agradecería mucho que acceda a los listados utilizando los enlaces anteriores; de esa manera, obtengo una pequeña parte de las ganancias sin costo adicional para usted]

Paso 1: Configuración de la unidad receptora

Configuración de la unidad receptora
Configuración de la unidad receptora

Antes de que pueda usar su Pi para enviar comandos a los enchufes controlados a distancia, necesita saber a qué señales específicas responden. La mayoría de los enchufes con control remoto se envían con un auricular que se puede usar para encender o apagar unidades específicas. En el caso de los que compré, el teléfono tiene cuatro filas de botones de ENCENDIDO / APAGADO emparejados, cada uno de los cuales envía una señal de ENCENDIDO o APAGADO a una unidad de enchufe en particular.

Esto plantea una pregunta: ¿cómo sabemos qué botones corresponden a qué zócalo? En realidad, esto depende del modelo que tengas. Una de las principales razones por las que elegí mi estilo particular de enchufe (vinculado en la introducción) es que las unidades se pueden configurar con un interruptor físico para hacer que un enchufe en particular responda a un conjunto particular de botones de ENCENDIDO / APAGADO en el teléfono. Esto también significa que puede desconectar y mover los enchufes por la casa sabiendo que cada unidad siempre responderá a las mismas señales de ENCENDIDO / APAGADO.

Una vez que haya descubierto cómo interactúan sus enchufes con el teléfono, deberá usar su unidad receptora de 433MHz (en la imagen de arriba) para 'olfatear' los códigos que envía el teléfono. Una vez que haya registrado las formas de onda de estos códigos, puede replicarlos usando Python y enviarlos usando la unidad transmisora.

Lo primero que debe hacer aquí es conectar los pines de su receptor a los pines GPIO correctos en el Pi. La unidad receptora tiene cuatro pines, pero solo se necesitan tres de ellos. Creo que ambos pines centrales dan la misma salida, por lo que solo necesita conectarse a uno de ellos (a menos que desee transmitir las señales recibidas a dos pines GPIO separados).

La imagen de arriba resume bastante bien el cableado. Cada pin del receptor se puede conectar directamente al pin correspondiente del Pi. Utilizo una placa de pruebas y cables de puente para hacer que el proceso sea un poco más elegante. Tenga en cuenta que puede elegir cualquier pin de datos GPIO para conectarlo a cualquiera de los pines del receptor central. Usé el pin marcado como '23' en mi encabezado Pi.

IMPORTANTE: Si conecta el pin marcado '3v3' en la imagen de arriba a un pin de voltaje más alto en el Pi (por ejemplo, 5v), probablemente dañará el Pi ya que los pines GPIO no pueden tolerar voltajes superiores a 3v3. Alternativamente, puede alimentarlo con 5v y configurar un divisor de voltaje para enviar un voltaje seguro al pin DATA.

El alcance del receptor no será muy grande con este voltaje, especialmente si no hay una antena conectada. Sin embargo, no necesita un alcance largo aquí, siempre que el receptor pueda captar las señales del teléfono cuando se colocan uno al lado del otro, eso es todo lo que necesitamos.

Paso 2: olfatear los códigos del teléfono

Olfatear los códigos de los teléfonos
Olfatear los códigos de los teléfonos

Ahora que su receptor está conectado al Pi, puede comenzar la primera etapa emocionante de este proyecto: el olfateo. Esto implica el uso de la secuencia de comandos de Python adjunta para registrar la señal transmitida por el teléfono cuando se presiona cada botón. El script es muy simple, y le recomiendo que le eche un vistazo antes de ejecutarlo; después de todo, el objetivo de este proyecto es que no ejecutará ciegamente el código de otra persona.

Antes de comenzar este proceso, deberá asegurarse de tener las bibliotecas de Python necesarias para ejecutar el script sniffer. Se enumeran en la parte superior del guión:

desde fecha y hora importar fecha y hora

importar matplotlib.pyplot como pyplot importar RPi. GPIO como GPIO

Las bibliotecas RPi. GPIO y datetime se incluyeron con mi distribución Raspbian, pero tuve que instalar la biblioteca matplotlib de la siguiente manera:

sudo apt-get install python-matplotlib

Esta biblioteca es una biblioteca de trazado de gráficos de uso común que es muy útil incluso fuera de este proyecto, por lo que instalarla definitivamente no puede hacer daño. Una vez que sus bibliotecas estén actualizadas, estará listo para comenzar a registrar datos. Así es como funciona el script:

Cuando se ejecuta (usando el comando 'python ReceiveRF.py'), configurará el pin GPIO definido como entrada de datos (pin 23 por defecto). Luego, muestreará continuamente el pin y registrará si está recibiendo un 1 o un 0 digital. Esto continúa durante un tiempo establecido (5 segundos por defecto). Cuando se alcanza este límite de tiempo, el script dejará de registrar datos y cerrará la entrada GPIO. A continuación, realiza un pequeño procesamiento posterior y traza el valor de entrada recibido en función del tiempo. Nuevamente, si tiene preguntas sobre lo que está haciendo el guión, probablemente pueda responderlas usted mismo después de ver cómo funciona. He intentado que el código sea lo más sencillo y legible posible.

Lo que debe hacer es estar atento cuando el guión indique que tiene ** Grabación iniciada **. Una vez que aparezca este mensaje, debe mantener presionado uno de los botones del teléfono durante aproximadamente un segundo. Asegúrese de mantenerlo cerca del receptor. Una vez que el script ha terminado de grabar, utilizará matplotlib para trazar una forma de onda gráfica de la señal que ha recibido durante el intervalo de grabación. Tenga en cuenta que si está conectado a su Pi mediante un cliente SSH como PuTTY, también deberá abrir una aplicación X11 para permitir que se muestre la forma de onda. Utilizo xMing para esto (y para otras cosas, como la conexión remota de escritorio a mi Pi). Para permitir que se muestre el gráfico, simplemente inicie xMing antes de ejecutar el script y espere a que aparezcan los resultados.

Una vez que aparezca la ventana de matplotlib, el área de interés dentro del gráfico debería ser bastante obvia. Puede usar los controles en la parte inferior de la ventana para acercar hasta que pueda distinguir los altos y bajos de la señal transmitida por el teléfono mientras se mantiene presionado el botón. Vea la imagen de arriba para ver un ejemplo de un código completo. La señal probablemente consistirá en pulsos muy cortos separados por períodos de tiempo similares en los que no se recibe ninguna señal. Este bloque de pulsos cortos probablemente será seguido por un período más largo en el que no se recibe nada, después del cual el patrón se repetirá. Una vez que haya identificado el patrón que pertenece a una sola instancia del código, tome una captura de pantalla como la que se encuentra en la parte superior de esta página y continúe con el siguiente paso para interpretarlo.

Paso 3: transcripción de la señal resultante

Transcripción de la señal resultante
Transcripción de la señal resultante

Ahora que ha identificado el bloque de máximos y mínimos periódicos correspondientes a la señal de un botón en particular, necesitará una forma de almacenarlo e interpretarlo. En el ejemplo de señal anterior, notará que solo hay dos patrones únicos que componen todo el bloque de señal. A veces ves un máximo corto seguido de un mínimo largo y, a veces, es lo contrario: un máximo largo seguido de un mínimo corto. Cuando estaba transcribiendo mis señales, decidí usar la siguiente convención de nomenclatura:

1 = corto_en + largo_off0 = largo_en + corto_off

Mire de nuevo la forma de onda etiquetada y verá lo que quiero decir. Una vez que haya identificado los patrones equivalentes en su señal, todo lo que tiene que hacer es contar los 1 y 0 para construir la secuencia. Cuando se transcribe, la señal anterior se puede escribir de la siguiente manera:

1111111111111010101011101

Ahora solo necesita repetir este proceso para grabar y transcribir las señales correspondientes a los otros botones de su teléfono, ¡y ha completado la primera parte del proceso!

Antes de poder reenviar las señales usando el transmisor, hay un poco más de trabajo por hacer. El tiempo entre los máximos y mínimos correspondientes a un 1 o un 0 es muy importante, y debe asegurarse de saber cuánto dura realmente un 'short_on' o un 'long_off'. Para mis códigos, había tres piezas de información de tiempo que necesitaba extraer para replicar las señales:

  • La duración de un intervalo 'corto', es decir, el comienzo de un 1 o el final de un 0.
  • La duración de un intervalo 'largo', es decir, el final de un 1 o el comienzo de un 0.
  • La duración de un intervalo "extendido". Noté que cuando mantenía presionado un botón en el teléfono, había un período de 'extendido_pagado' entre cada instancia repetida del bloqueo de señal. Este retraso se utiliza para la sincronización y tiene una duración fija.

Para determinar estos valores de tiempo, puede usar la función de zoom en la ventana de matplotlib para acercar completamente y colocar el cursor sobre las partes relevantes de la señal. La lectura de la ubicación del cursor en la parte inferior de la ventana debería permitirle determinar qué tan ancha es cada parte de la señal que corresponde a un intervalo largo, corto o extendido. Tenga en cuenta que el eje x del gráfico representa el tiempo y el componente x de la lectura del cursor está en unidades de segundos. Para mí, los anchos fueron los siguientes (en segundos):

  • retardo_corto = 0.00045
  • long_delay = 0.00090 (el doble de largo que un 'corto')
  • Extended_delay = 0.0096

Paso 4: Configuración de la unidad transmisora

Configuración de la unidad transmisora
Configuración de la unidad transmisora

Una vez que haya recopilado sus códigos y datos de sincronización, puede desconectar su unidad receptora, ya que ya no la necesitará. Luego puede conectar el transmisor directamente a los pines Pi GPIO relevantes como se muestra en la imagen de arriba. Descubrí que los pines de las unidades transmisoras están etiquetados, lo que facilita el proceso.

En este caso, está bien alimentar la unidad utilizando la fuente de 5v del Pi, ya que el pin DATA no enviará señales al Pi, solo las recibirá. Además, una fuente de alimentación de 5v proporcionará más rango de transmisión que el uso de la fuente de 3v3. Nuevamente, puede conectar el pin DATA a cualquier pin apropiado en el Pi. Usé el pin 23 (el mismo que para el receptor).

Otra cosa que recomendaría hacer es agregar una antena al pequeño orificio en la parte superior derecha del transmisor. Usé un trozo de alambre recto de 17 cm de largo. Algunas fuentes recomiendan un cable enrollado de longitud similar. No estoy seguro de cuál es mejor, pero el cable recto proporciona suficiente alcance para que pueda encender / apagar los enchufes desde cualquier lugar de mi pequeño apartamento. Es mejor soldar la antena, pero simplemente quité un poco del plástico del cable y envolví el cobre a través del orificio.

Una vez que el transmisor está conectado, ¡esa es toda la configuración del hardware! Lo único que queda por hacer ahora es configurar los enchufes de la casa y echar un vistazo al programa del transmisor.

Paso 5: transmisión de señales usando el Pi

Aquí es donde entra en juego el segundo script de Python. Está diseñado para ser tan simple como el primero, si no más. Nuevamente, descárguelo y revise el código. Deberá editar el script para transmitir las señales correctas de acuerdo con los datos que registró en el paso 3, por lo que ahora es un buen momento para echarle un vistazo rápido.

Las bibliotecas necesarias para ejecutar este script estaban preinstaladas en mi Pi, por lo que no fue necesaria ninguna instalación adicional. Se enumeran en la parte superior del guión:

tiempo de importación

importar sys importar RPi. GPIO como GPIO

Debajo de las importaciones de la biblioteca está la información que tendrá que editar. Así es como se ve por defecto (esta es la información correspondiente a mis sockets según lo determinado usando el paso 3):

a_on = '1111111111111010101011101'

A_OFF = '1111111111111010101010111' b_on = '1111111111101110101011101' b_off = '1111111111101110101010111' c_on = '1111111111101011101011101' c_off = '1111111111101011101010111' d_on = '1111111111101010111011101' d_off = '1111111111101010111010111' short_delay = 0,00045 long_delay = 0,00090 extended_delay = 0,0096

Aquí tenemos ocho cadenas de códigos (dos para cada par de botones de encendido / apagado en mi teléfono; es posible que tenga más o menos códigos) seguidos de las tres piezas de información de tiempo que también se determinaron en el paso 3. Tómese el tiempo para asegurarse de tener ingresó esta información correctamente.

Una vez que esté satisfecho con los códigos / retrasos que ha ingresado en el script (puede cambiar el nombre de las variables de cadena de código si lo desea), ¡estará listo para probar el sistema! Antes de hacerlo, eche un vistazo a la función transmit_code () en el script. Aquí es donde ocurre la interacción real con el transmisor. Esta función espera que una de las cadenas de código se envíe como argumento. Luego abre el pin definido como una salida GPIO y recorre cada carácter en la cadena de código. Luego enciende o apaga el transmisor de acuerdo con la información de tiempo que ingresó para construir una forma de onda que coincida con la cadena de código. Envía cada código varias veces (10 por defecto) para reducir la posibilidad de que se pierda, y deja un Extended_delay entre cada bloque de código, al igual que el teléfono.

Para ejecutar el script, puede utilizar la siguiente sintaxis de comando:

python TransmitRF.py code_1 code_2…

Puede transmitir varias cadenas de código con una sola ejecución del script. Por ejemplo, para encender los sockets (a) y (b) y apagar el socket (c), ejecute el script con el siguiente comando:

Python TransmitRF.py a_on b_on c_off

Paso 6: una nota sobre la precisión del tiempo

Como se mencionó, la sincronización entre los pulsos de encendido / apagado transmitidos es bastante importante. El script TransmitRF.py usa la función time.sleep () de python para construir las formas de onda con los intervalos de pulso correctos, pero debe tenerse en cuenta que esta función no es del todo precisa. El tiempo que hace que el script espere antes de ejecutar la siguiente operación puede depender de la carga del procesador en ese instante dado. Esa es otra razón por la que TransmitRF.py envía cada código varias veces, en caso de que la función time.sleep () no pueda construir correctamente una instancia determinada del código.

Personalmente, nunca he tenido problemas con time.sleep () cuando se trata de enviar los códigos. Sin embargo, sé que mi time.sleep () tiende a tener un error de aproximadamente 0,1 ms. Lo determiné usando el script SleepTest.py adjunto que se puede usar para dar una estimación de cuán precisa es la función time.sleep () de su Pi. Para mis enchufes de control remoto particulares, el retardo más corto que necesité implementar fue de 0.45ms. Como dije, no he tenido problemas con los sockets que no responden, por lo que parece que 0.45 ± 0.1ms es lo suficientemente bueno.

Existen otros métodos para garantizar que la demora sea más precisa; por ejemplo, podría usar un chip PIC dedicado para generar los códigos, pero cosas así están más allá del alcance de este tutorial.

Paso 7: Conclusión

Conclusión
Conclusión

Este proyecto ha presentado un método para controlar cualquier aparato eléctrico mediante una Raspberry Pi y un conjunto de enchufes de 433MHz controlados a distancia, con un enfoque en la simplicidad y la transparencia. Este es el proyecto más emocionante y flexible para el que he usado mi Pi, y hay aplicaciones ilimitadas para él. Aquí hay algunas cosas que ahora puedo hacer gracias a mi Pi:

  • Enciende un calentador eléctrico junto a mi cama media hora antes de que suene la alarma.
  • Apaga la calefacción una hora después de que me haya ido a dormir.
  • Enciende la luz de la mesilla de noche cuando suene la alarma para que no me vuelva a quedar dormido.
  • y muchos más…

Para la mayoría de estas tareas, uso la función crontab dentro de Linux. Esto le permite configurar tareas programadas automáticas para ejecutar el script TransmitRF.py en momentos específicos. También puede usar el comando de Linux at para ejecutar tareas únicas (que, para mí, debían instalarse por separado usando 'sudo apt-get install at'). Por ejemplo, para encender mi calentador media hora antes de que suene la alarma a la mañana siguiente, todo lo que necesito hacer es escribir:

a las 05:30

Python TransmitRF.py c_on

¡También puede usar este proyecto junto con mi sistema de monitoreo del hogar Dropbox para controlar dispositivos a través de Internet! Gracias por leer, y si desea aclarar algo o compartir su opinión, ¡publique un comentario!

Recomendado: