Comunicación bidireccional entre un maestro y múltiples nodos

Tengo una arquitectura como esta:

Arquitectura

Master - Contiene un chip de comunicación RF. Todos los nodos dependen de Master para recibir y enviar datos a una unidad central.

Nodo: tiene algunas funciones básicas de GPIO. Puede haber de 4 a 5 tipos diferentes de nodos, cada uno de los cuales requiere un recuento de GPIO diferente. En aras de la simplicidad del diseño, planeo lanzar un microcontrolador barato en cada nodo y manejar todos los GPIO localmente. De esa manera, solo necesito un paquete de datos de control predefinido del maestro para realizar cualquier tarea. De manera similar, el nodo enviará un paquete predefinido que el maestro entenderá. La definición del paquete contendrá el tipo de nodo.

Los nodos pueden cambiar en número y preferiblemente deben ser intercambiables en caliente. La comunicación funciona así:

Dos nodos no se comunican directamente.

El maestro puede tener un paquete de datos que desea enviar a cualquier nodo en particular.

Cualquier nodo puede tener un paquete de datos que quiera enviar al maestro.

La distancia máxima entre un nodo y el maestro será inferior a 50 cm.

Después de pensarlo un poco, este es el plan que se me ocurrió:

Haga que todos los nodos se comuniquen a través de i2c. 16 nodos por maestro parece ser un buen número, así que puedo poner un interruptor DIP de 4 bits para configurar la dirección i2c de cada nodo. Básicamente, haré una lectura digital en 4 gpio y configuraré la dirección en consecuencia.

Esto será perfecto cuando el maestro quiera leer o escribir datos en los nodos.

Para el momento en que el nodo quiera enviar datos, necesito tener un GPIO adicional por nodo que avise al maestro de que hay algunos datos presentes. Alternativamente, puedo seguir leyendo todos los nodos en el ciclo y seguir verificando si hay algunos datos disponibles.

¿Hay una mejor solución a este problema?

Respuestas (2)

Una alternativa a I2C, podría considerar CANbus para esta solución. Podría decirse que es más complejo, pero los esclavos podrían comunicarse con el maestro en el mismo bus sin necesidad de un GPIO para indicar que tienen datos disponibles. Además, la detección de colisiones está integrada en el diseño de la capa física y el protocolo.

Los controladores CAN están disponibles a un precio relativamente bajo, aunque necesita un transceptor para cada nodo.

Otros buses multipunto comunes que podría considerar:

RS-485: Simple de usar, pero usted sería el responsable de todo el direccionamiento. I2C al menos incorpora eso.

SPI: Útil si tiene E/S de sobra para una línea de selección esclava para cada nodo. Según su descripción anterior, probablemente esta no sea la mejor ruta.

¿Necesito transceptores de bus CAN adicionales aunque mi microcontrolador admita el protocolo CAN? Traté de buscar transceptores CAN en digikey y descubrí que la mayoría de ellos son del tipo de 5 V. ¿Es común que funcionen con 5V? ¿Es 3.3V un caso raro para CAN?
@Whiskeyjack No estoy seguro ... es posible que algunos microcontroladores se construyan en los transceptores. Los que hemos usado todavía necesitan un transceptor externo. En cuanto a los transceptores de 3,3 V, TI SN65HVD232DG4 es uno. Está disponible en Mouser.
Gracias. Le echaré un vistazo y comprobaré la viabilidad. :)

Su solución de sondeo es probablemente la más clásica.

Otra solución es hacer una encuesta de difusión.

Básicamente, envíe un mensaje que todos escuchen, lo que hace que envíen un pulso con un retraso establecido después de recibir la encuesta si tienen datos. La duración del retraso se establece mediante la dirección de los dispositivos.

El maestro puede monitorear la señal de retorno y decodificar quién tiene datos para enviar y preguntar directamente.

Otra técnica es incorporar un breve retraso entre la transmisión del maestro y el reconocimiento del esclavo. Luego use esa ventana para permitir que los esclavos graznen un solo pulso que actúa como una interrupción para el maestro. Entonces tendría que sondearlos.

Lo de la retransmisión parece interesante. Voy a pensar un poco más en ello. Por cierto, ¿qué tan difícil crees que será establecer una dirección esclava personalizada para un microcontrolador general? Arduino UNO (atmega328p) es bastante fácil.
@Whiskeyjack, la dirección siempre es el problema. Hay formas de establecer direcciones aleatorias, pero se complica rápidamente.
@Whiskeyjack también suele requerir algún tipo de detección de colisión.