¿Cuál es el mejor mecanismo de comunicación con detección / evasión de colisiones para mi topología?

-2

Aquí está mi topología de sensores ..

Aquí, el atmega128 es el controlador principal y todos los demás atmega8 están conectados al controlador principal mediante un cable rs485.

¿Cuál es el mejor protocolo de comunicación para que esto detecte y evite la colisión?

Tengo 20 atmega8 conectados en una fila .. (es decir, todos los pines tx de atmega8 están conectados entre sí y, finalmente, conectados al Rx del controlador principal) y la distancia entre cualquier atmega8 o atmega128 es de 3 metros ...

/// EDITADO

Tengo 20 atmega8 conectados en una fila ... Aquí ... Atmega8 no puede hablar entre ellos ... En lugar de eso, escucharán los comandos del controlador Atmega128. Cuando un mensaje de difusión proviene de Atmega128, todo el atmega8 debería responda con su estado ... Aquí está la colisión en la imagen ... La velocidad en baudios es 9600. Básicamente, Atmega8 son mis sensores y Atmega128 es un controlador principal que solicita el sattus de los sensores y les ordena que cambien su estado.

    
pregunta T Obulesu

2 respuestas

0

Defina mejor ... Pero como definitivamente no desea desarrollar algo muy serio desde el principio, vaya a la topología maestro / esclavo, lo que significa que solo el maestro puede iniciar la comunicación.

Debes encontrar una manera de enumerar esclavos. Lo mejor sería endurecer los números por las subidas y bajadas. Tal vez con conectores externos cableados de alguna manera.

    
respondido por el Gregory Kornblum
0

Esta será una respuesta media , ya que está sucia y no es muy eficiente. Bueno, nunca dijiste la velocidad en baudios que ibas a usar. Entonces, quién sabe, tal vez sea lo suficientemente eficiente.

Use un cable de tierra y un cable de señal . Este cable señal se conectará al ADC de cada Atmega (entrada) y a algún pin digital de cada Atmega (salida).

No irá directamente al pin de salida digital, tendrá una resistencia de 1 kΩ conectada entre sí y el pin de salida digital.

Así que en el arte ascii se verá así:

 _______A_______
|               |
|     PF0(ADC0) |<--------|
|               |         |
|   Atmega128   |         |
|               |         |
|           PD0 |->-1kΩ---|
|_______________|         |
                          |
                          |
 _______B_______          |
|               |         |
|     PC0(ADC0) |<--------|
|               |         |
|   Atmega8   B |         |
|               |         |
|           PD0 |->-1kΩ---|
|_______________|         |
                          |
                          |
 _______C_______          |
|               |         |
|     PC0(ADC0) |<--------|
|               |         |
|   Atmega8     |         |
|               |         |
|           PD0 |->-1kΩ---|
|_______________|         .
                          .
                          .

Y luego asignas frecuencias particulares a cada Atmega. Entonces, si, digamos que A quiere generar un "1" lógico, entonces A generará una onda cuadrada en PD0 a ... digamos 10 kHz para un ejemplo. Y si A quiere emitir un "0" lógico, entonces A quedará en silencio.

Si B quiere hablar, generará una señal de onda cuadrada de, por ejemplo, 20 kHz o algo más, no 10 kHz. Lo mismo con C , tiene su propia frecuencia para hablar.

Luego, internamente en cada Atmega, realizarás FFT . No tiene que ser 8192 puntos o algún otro número innecesariamente alto, puede realizar fácilmente una FFT de 32 puntos. Cuantos menos puntos tenga, más se contraerá y superpondrá su onda sinusoidal. La vida no es ideal.

No se trata de ondas sinusoidales puras que emitirá a través de PD0, por lo que obtendrá algunos otros armónicos. En el caso de A , verá algunas ondas sinusoidales pequeñas a 30 kHz, 50 kHz, 70 kHz, etc., ya que forman parte de la onda cuadrada a 10 kHz. .

Además, como todo está conectado con resistencias, cuanto más larga sea la cadena, menos significará cada salida. Así que si tienes 4 Atmega's conectados. Luego hay 4 resistencias que se conectan al cable señal . Si uno de ellos está generando un valor alto y el resto bajo . Entonces tendrá \ $ 5 × 0.25 = 1.25 \ $ V. Eso significa que cuando lea ADC0 (ADC de 10 bits), leerá \ $ \ frac {1.25 × 1024} {5} = 256 \ $. Eso está bastante bien. Pero si tienes más, digamos 20 Atmega's, entonces leerás \ $ 5 × \ frac {1} {20} × \ frac {1024} {5} = 51 \ $ ... Hmmm, eso tampoco es tan malo ... Pero esto significa que también necesitarás 20 frecuencias diferentes, lo suficiente entre ellas para que no se superpongan cuando uses tu FFT.

Por lo tanto, cuantas más frecuencias utilice, más puntos de la FFT tendrá que calcular.

En otras palabras, lo que harás es como hacer que cada Atmega toque una cuerda de guitarra, y luego dices:
- "Oh, eso es un tono A, está bien, entonces Atmega # 2 me está enviando un '1' en este momento"
- "Hmm, creo que es un tono C, entonces ese es el Atmega # 1 que me está enviando un '1' en este momento"
- "Hay una ausencia del tono A, por lo que Atmega # 2 me está enviando un '0', ¡ya!"

Con respecto a tus Atmega8, si nunca van a hablar entre ellos. Luego, puede hacerlo para que escuchen el Atmega128 solo calculando la DFT de una frecuencia . Esa frecuencia sería de la onda cuadrada que su Atmega128 emitiría. O puede hacerlo para que cada Atmega8 escuche una frecuencia diferente, de esta manera puede hablar fácilmente con cada Atmega8 simultáneamente. Aunque necesitarías algo de DAC en el Atmega128, no una onda cuadrada.

Puedo continuar, pero creo que entiendes lo esencial. Recuerda, no es la solución más eficiente.

    
respondido por el Harry Svensson

Lea otras preguntas en las etiquetas