Realización de una cadena de comunicación infrarroja flexible, pero tolerante a fallas

La tarea recayó en mí para realizar un sistema de comunicación inalámbrico en cadena. La comunicación debe ser inalámbrica, esp. a través de diodos infrarrojos. El final de la cadena está conectado a una PC (por cable). El sistema completo consta de n miembros. Cada miembro tiene dos lados con un diodo emisor y receptor.

Configuración

El objetivo es:

  • La PC debe poder enviar un comando de inicialización y el sistema que contiene n miembros debe averiguar cuántos módulos están instalados ("buscar n").
  • La PC debe poder enviar un comando a todos los módulos
  • La PC debe poder enviar un comando a un determinado módulo
  • Los módulos están muy juntos, pero la distancia debe poder variar entre aproximadamente 1 y 3 pulgadas.

Mi enfoque hasta ahora:

  • La PC envía un comando al módulo 1. El módulo 1 devuelve su presencia a la PC, así como de forma inalámbrica al segundo módulo. Hasta ahora, la PC sabe que hay 1 módulo presente. Cuando el módulo 2 recibe el comando init, envía su reconocimiento al primer módulo, que transfiere el mensaje de 2 a la PC. Además, el módulo 2 envía el comando init al módulo 3, y así sucesivamente. La fase de inicio finaliza cuando el último módulo (n) recibe el comando de inicio y su mensaje de presencia llega a la PC. Después de eso, no llega más mensaje al lado de la PC y sabe que hay n módulos presentes.
  • Otros comandos contienen un byte de encabezado que se dirige al módulo "destino". O, si se refiere a todos los módulos, el comando comienza con un byte "cero" (0x00).

El reto es:

  • Físicamente: no sé cómo evitar el hecho de que el módulo x podría "hablar" con el módulo x + 1 y x + 2 simultáneamente (diafonía cruzada) por reflejos o reflejos. Necesito que el sistema aprenda por sí mismo. Hasta ahora, atenúo los diodos hasta que solo pueden alcanzar una distancia muy pequeña. Pero esto no es muy tolerante a fallas.
  • Lógicamente: la luz del día y otras fuentes de luz infrarroja generan muchos mensajes borrosos y galimatías. Los mensajes reales actualmente están precedidos o incluso perturbados por influencias externas.
¿Cada módulo sabe qué "n" es? ¿O están todas idénticamente programadas y no tienen idea de su propia orientación?
Las cadenas margarita no son tolerantes a fallas para ninguna definición razonable de "tolerante a fallas". Si algún eslabón de la cadena deja de funcionar, la red se divide en dos, que no pueden comunicarse. "Tolerante a fallos" significa que algún elemento falla, pero el sistema en su conjunto funciona, con plena funcionalidad. Por ejemplo, el almacenamiento RAID es tolerante a fallas. Una unidad de disco muere, pero continúa la disponibilidad completa de todos los datos. Un servicio distribuido es tolerante a fallas. Un servidor se cae, pero los clientes encuentran otro.
Puede agregar una medida de tolerancia a fallas mediante un paso de hardware. Es decir, cualquier nodo que no se esté comunicando puede liberar la estructura de infrarrojos y el propio hardware pasa las señales para completar la cadena. Esto significa que incluso si un módulo falla, mientras su hardware de infrarrojos tenga energía, continuará pasando señales. Entonces, incluso mientras los dispositivos se reinician, se actualizan con actualizaciones de firmware o se bloquean por completo, pasan datos.
Tal vez... Intente "encontrar" el módulo más lejano (¿o es el más lejano?) en el enlace. Normalmente, este debería ser el módulo que no obtiene una respuesta cuando retransmite el comando init. Reconocerá la falta de respuesta y se considerará la más lejana. El problema de intentar encontrar el más cercano es que varios módulos pueden responder creyendo que están más cerca. Con suerte, el módulo más lejano se puede definir de esta manera. Pero, hay problemas con este sistema si hay dos (o más) módulos que creen que son los segundos más lejanos porque recibieron la respuesta "Estoy aquí" del más lejano. ¡Interesante!
¿El sistema necesita ser una cadena de margaritas? ¿Puede, en cambio, transmitir desde el primario a todos los "clientes", luego aceptar respuestas (transmitidas repetidamente con retrasos aleatorios hasta que el primario las reconozca) de cada uno, con su ID único generado aleatoriamente, enumerarlos y así llegar a un recuento de dispositivos y una libreta de direcciones? Las señales IR, como las de los controles remotos de TV, atraviesan varios metros con éxito.
No todos los dispositivos pueden ver a todos los demás, solo se garantiza que los dispositivos adyacentes se vean entre sí.

Respuestas (2)

Las señales IR rebotan: se atenúan o, en ocasiones, se reflejan de formas inesperadas. Como dijiste, esto tiene que ser atendido.

Si estos dispositivos están en una habitación, los dispositivos 2 y n-1 pueden ver la misma señal del dispositivo 1 y responder al mismo tiempo: ¿qué sucede entonces?

Me parece que primero necesitará descubrir dispositivos y construir una red, luego estructurar mensajes para usar la red.

Por ejemplo:
etapa 1) Descubrimiento de red. Supongo que (a) sabe cuántos (n) son, (b) puede programar variaciones en cada dispositivo individual (c) cada dispositivo puede medir la intensidad de la señal (o la calidad de la señal de alguna manera).

El dispositivo 1 transmite un mensaje de difusión. Todos los dispositivos receptores esperan (un tiempo diferente en cada caso para evitar colisiones) y responden con la intensidad de la señal. Algunos mensajes vuelven a él, otros no.

El dispositivo 1 ahora tiene una lista de estaciones con las que puede hablar de manera confiable, ordenadas por calidad de señal bidireccional y cuáles no puede alcanzar. Llame al más fuerte "Dispositivo 2".

Ahora le pide al Dispositivo 2 que haga lo mismo y le devuelva su lista. Esto pone más carga en el Dispositivo 1 o en la computadora host para construir las rutas más eficientes para cada dispositivo y las alternativas.

etapa 2) Uso de la red: Cada mensaje incluye 2 direcciones: el destino final y el objetivo inmediato (generalmente el Dispositivo 2, desde el Dispositivo 1). Solo el objetivo inmediato responderá al mensaje, evitando colisiones sin necesidad de los retrasos utilizados en el descubrimiento de redes.

Variación de la etapa 2: la PC indica a los dispositivos de segundo nivel qué dispositivos de tercer nivel se le asignan. Entonces, cuando se trata de redes, la PC no tiene que preocuparse por la "forma" de la red o quién está a cargo de quién: simplemente envía un mensaje y espera que se comunique. ¿Inteligencia distribuida?
@Andy: buena idea. Primero, los dispositivos de segundo nivel deben informar todos los dispositivos que pueden ver (¡porque la PC no lo sabe!) Luego, la PC les indica cómo enrutar.

Asigne a cada unidad su propia ID de nodo codificada intrínsecamente única, que ayudará a ciertos problemas y algoritmos. O puede generar uno "al azar" si quiere como un GUID.

Asigne a cada "mensaje" una "ID de mensaje" única y eso puede ayudarlo a decidir si un mensaje determinado ha sido visto/procesado/reenviado una o más veces o no por un nodo determinado.

Asigne a cada mensaje un "tipo" como "SOLICITUD DE COMANDO DE INICIO", "RESPUESTA DE COMANDO DE INICIO", "TRANSMISIÓN DE BALIZA", lo que sea.

Use banderas como "mensaje reenviado", "mensaje original" si lo desea.

Utilice datos de carga útil del mensaje como "recuento de saltos reenviados" (incrementos cada vez que se reenvía), "tiempo de vida" (número de episodios de reenvío antes de que caduque un mensaje) si lo desea.

Use algoritmos como nodos que solo reenvíen a otros nodos o nodos en una secuencia determinada si lo desea.

Por supuesto, probablemente podría usar módulos XBEE o WiFly o algo así si quiere renunciar a IR por RF. O podrías hacer algo divertido (exagerado, sí, pero divertido) como usar TinyOS, Contiki, UDP o lo que sea si quisieras y usaras nodos lo suficientemente potentes. O podría portar SimpliciTI o similar. Porte cualquiera de las capas de red para usar el medio infrarrojo.

En cuanto al ruido ambiental, use fototransistores con filtro IR, que reducirán el ruido que no es IR. Si el ruido IR de banda base sigue siendo un problema, use módulos IRDA que tienen filtrado óptico y de banda base para ayudar. O puede usar la modulación de CA en una portadora analógica infrarroja y recibir los datos en formato analógico o digital. Podrías hacer múltiples canales FDM si quisieras entre 1kHz y 10kHz o lo que sea. En analógico, podría usar un decodificador de tono PLL como el NE567 o el HC4046 para recibir modulación FM, pero ¿por qué molestarse si hacer algunos filtros digitales es solo unas pocas líneas de código MCU? Diablos, usa DTMF, hay un código fuente para eso. O salida PWM FSK y filtro digital para recibir.

La corrección de errores de reenvío podría ayudar a la verificación e integridad de los mensajes. O una simple suma de comprobación o CRC.