La mejor manera de enviar lecturas de sensores a través de una conexión RF simple

He comprado un par de módulos simples TX / RX de 315 MHz. Quiero usarlos para conectar un ATTiny85 alimentado por batería a una estación base Arduino. El ATTiny necesita despertarse regularmente y enviar una lectura del sensor a la estación base.

En teoría, debería poder simplemente escribir datos en el TX y leerlos desde el módulo RX. Sin embargo, ¿cómo me aseguro de que escribo/leo a la velocidad correcta? ¿Qué código necesito usar para transmitir a una velocidad particular (bytes/segundo)? ¿Cuál es la mejor manera de hacer la corrección/detección de errores?

Como quiero que el transmisor funcione con batería, ¿podría usar un transistor para apagar VCC al módulo TX cuando esté inactivo? ¿Qué recibirá el módulo RX cuando se apague el módulo TX?

Respuestas (7)

Esos módulos básicamente hacen que el pin del receptor se mueva en respuesta a cómo manejas el pin del transmisor. No saben nada sobre lo que crees que significa mover el pin, y no contienen un UART. Más detalles no eran inmediatamente obvios sin cavar. Ese es tu trabajo, así que no me molesté en ir más lejos. Debe proporcionar un enlace a la hoja de datos, no a la página de presentación del producto.

Estos módulos funcionan con modulación AM. La breve descripción dice ASK, pero probablemente solo sea una activación / desactivación del transmisor (que técnicamente es un subconjunto de ASK). El problema con este esquema es que el receptor no puede conocer inherentemente el nivel cuando el transmisor está encendido. Por lo tanto, lo más probable es que observe las intensidades de las señales recibidas recientemente y elija un valor en el medio para decidir entre activarlo o desactivarlo. Esto se llama corte de datos .

Si no está transmitiendo regularmente encendidos y apagados, el receptor pierde la noción de los niveles de encendido y apagado, y ya no puede dividir los datos correctamente. Esto generalmente se trata de dos maneras. Primero, un preámbulose ha enviado. Esto contiene un montón de encendidos y apagados en rápida sucesión para que el receptor pueda establecerse en un buen umbral de segmentación de datos. Se espera que algunos o todos estos bits no sean interpretados correctamente por el receptor, por lo que no son realmente "recibidos". La segunda estrategia es enviar datos para que siempre haya un encendido y apagado reciente para que el receptor se refiera. Algunos receptores, particularmente los baratos que hacen el corte de datos en analógico, solo cortan la intensidad de la señal recibida promedio filtrada de paso bajo. Para tales receptores, no solo necesita variar entre encendido y apagado con frecuencia, sino que el promedio debe estar cerca de 1/2 encendido.

Esta es la razón por la que la codificación Manchester es tan popular para estos enlaces de RF. No entraré en la codificación de Manchester aquí, ya que esto es bien conocido y no tendrá problemas para encontrar mucha información al respecto. Una buena característica del código Manchester es que tiene un promedio de 1/2 sobre cada bit. Un bit se divide en dos mitades. On-off puede significar 1 y off-on 0. Manchester es probablemente el mejor esquema de codificación más fácil de hacer.

Puede usar un UART, pero debe tener cuidado y perderá algo de ancho de banda (energía de la batería). Mira lo que transmitirá un UART. Si envía los caracteres uno tras otro inmediatamente, cada uno tardará 10 bits. Habrá un bit de inicio, 8 bits de datos y un bit de parada. Los bits de inicio y parada siempre tienen polaridad opuesta. Puede hacer arreglos para usar códigos en los 8 bits restantes que tienen la misma cantidad de 0 y 1 para mantener el umbral del cortador de datos en el medio. Esto significa que solo puede enviar 4 bits de información en cada carácter UART. También tendrá que pensar en el preámbulo cuidadosamente.

En general, debe asumir que cualquier transmisión de RF tiene una posibilidad significativa de errores de bits. Esto significa que algún tipo de suma de verificación es una buena idea. Puede enviar datos en paquetes e incluir algo como una suma de verificación CRC de 16 o 20 bits con cada paquete. Si el paquete no se recibe intacto, se descarta como si nunca hubiera sucedido.

El sistema también tiene que lidiar con el ruido aleatorio recibido cuando se apaga el transmisor. En ese caso, el umbral del receptor caerá y comenzará a dividir los datos en cualquier ruido aleatorio que capte. Con un preámbulo y una suma de verificación diseñados correctamente, puede hacer que la posibilidad de que el ruido aleatorio parezca datos válidos sea muy pequeña.

Gracias por la excelente respuesta. ¿Hay algún ejemplo de código existente que haga todo esto? Parece que la mayor parte/todo esto es algo que cualquiera que use estos módulos tendrá que resolver; seguramente no soy el primero.
He hecho la codificación y decodificación de Manchester varias veces, pero cada una tenía sus propias arrugas y, por lo tanto, está incrustada en el código del cliente que no voy a dar. Mira alrededor. Es muy posible que alguien haya hecho esto y publicado el código. Tenga en cuenta, sin embargo, que aquellos que piensan que esto es lo suficientemente importante como para publicar el código no son los que quieren el código. Sin embargo, a veces encuentras cosas buenas por ahí. Como dije, mira a tu alrededor.
En general, descubrí que cuando encuentro un código como ese, tiene tantos problemas que lleva tanto tiempo depurarlos que hubiera sido mejor escribir el mío propio.
@Kellenjb: Estoy de acuerdo. Ni siquiera busco el código de los demás. En el mejor de los casos, no apesta, y eso es raro, pero integrarlo en mi proyecto es difícil y propenso a errores si no se escribió en mi entorno de desarrollo en primer lugar. Menciono mirar alrededor solo porque parece que otras personas no se sienten de esta manera.
@mchr Todavía no lo he usado personalmente, así que no puedo hablar de la confiabilidad, pero he visto la biblioteca VirtualWire (tenga en cuenta que desafortunadamente es un PDF) mencionada un poco en las discusiones sobre este tipo de módulos combinados con Arduinos. Parece que fue escrito específicamente para ellos.
Virtual Wire será la solución perfecta para usar el módulo RX con el Arduino. Sin embargo, la biblioteca VW no parece funcionar con un ATTiny85. Creo que buscaré portar/arreglar el código para que se ejecute en mi ATTiny 85.
Me acaban de vincular a una biblioteca que dice hacer lo que quiero en ATTiny y ATmega: arduino.cc/forum/index.php/topic,63755.0.html

Terminé usando una biblioteca de codificación de Manchester. La última versión de esta biblioteca ahora se ha publicado aquí: https://github.com/mchr3k/arduino-libs-manchester

Los detalles sobre mi uso de esta biblioteca se pueden ver aquí: http://mchr3k-arduino.blogspot.com/

Esta pregunta es abordada directamente por los productos Wicked Node / Wicked Receiver Shield que hago (divulgación) en Wicked Device . Por favor, échales un vistazo. Constituyen un enlace de radio ASK unidireccional de bajo costo en 433 MHz para obtener hasta cuatro lecturas de sensores analógicos (por Wicked Node) de forma inalámbrica a su Arduino a intervalos prescritos. Usé un ATTiny24A en lugar de un ATTiny85 principalmente para las entradas analógicas adicionales. El software utiliza ampliamente los modos de suspensión y Wicked Node está diseñado para funcionar con una batería de 9V durante varios meses.

Recomiendo mirar la biblioteca VirtualWire, que implementa la transmisión de RF para pares de transmisor/receptor de rango ISM con salida ASK. Consulte http://www.open.com.au/mikem/arduino/ . Lo he usado con éxito para recopilar datos de sensores inalámbricos repartidos por mi casa.

Desafortunadamente, la biblioteca VirtualWire no es compatible con ATTiny85.

Dependiendo de cuánta interoperabilidad con los dispositivos existentes desee, pero si desea mucha, podría valer la pena investigar http://www.dealextreme.com/p/wireless-bluetooth-rs232-ttl-transceiver-module-80711 . Es solo un enlace serial Bluetooth muy barato y casi cualquier computadora con bluetooth podría leerlo. Bluetooth también tiene un rendimiento excelente (relativamente) incluso en entornos con comunicaciones de 2,4 GHz muy ruidosas.

Gracias por el enlace, ¡es un módulo bluetooth muy barato!

Echa un vistazo aquí:

https://www.sparkfun.com/datasheets/RF/KLP_Walkthrough.pdf

La mayoría de las respuestas que está buscando en el documento.

¿Puede agregar algunos detalles más del enlace a su respuesta? Se desaconsejan las respuestas de solo enlace porque se vuelven inútiles si el enlace muere en el futuro.

Aunque el cartel original ya encontró una solución. Solo agregaré información para las personas que terminan aquí. Básicamente, existen 2 formas establecidas de enviar datos inalámbricos entre arduino/Attiny: VirtualWire y Manchester. Ambos tienen bibliotecas disponibles. Entiendo que Virtualwire solo puede enviar caracteres (aunque hay una solución), Manchester puede enviar números. Al usar la biblioteca de Manchester, asegúrese de tener la última. Tanto VirtualWire como Manchester se pueden poner en un Attiny. Con respecto a encender o apagar el transmisor para ahorrar el uso de la batería, le sugiero que ponga el Attiny en reposo y cuando se despierte, haga que encienda la fuente de alimentación del transmisor a través de un transistor (attiny pin a la base, haga alto, etc.) . Hay un ejemplo (probablemente más de uno) en instructables:http://www.instructables.com/id/Attiny85-RF-Transmitter-to-Arduino-Uno-Receiver-Ma/?comments=all#CWNVMX4I6RT1A1N