Después de mucho.... mucho tiempo hice la prueba
.
Las pruebas que realizamos fueron las siguientes:
- Comunicación UART a 2400bps (máxima velocidad declarada por el receptor)
- Comunicación UART a 1200bps (tratando de buscar más sensibilidad)
- Comunicación Manchester a 2400bps (requiere 2 bits para mandar 1 bit de dato)
- Comunicación símil al Manchester, pero con duty 75% (requiere 4 bits para mandar 1 bit de dato).
En todas las pruebas la comunicación era unidireccional y con una trama similar a esta:
Código:
Preambulo (para estabilizar el receptor, varios bytes) - Código del mensaje (1 byte) - Dirección Destino (1 byte) - Dirección Origen (1 byte) - Mensaje (array de bytes) - CheckSum (1 byte)
El mensaje en las pruebas solo era un Byte. Dicha trama se enviaba durante 8 min. aproximadamente en forma continua hasta llegar a las 10000 tramas.
Antenas utilizadas:
- Antena comercial de 12 a 13 cm aprox. con conector SMA
- Cable coaxil de 35cm (media lambda) conectado a lo cabezón.
Resultados:
- Comunicación UART a 2400bps (máxima velocidad declarada por el receptor)
- A 15Mts de distancia (con pared en el medio)-> 980 paquetes (usando Antena comercial en receptor y Cable coaxil en transmisor), pero no era del todo constante, a veces llegaban menos.
- A 15Mts de distancia (con pared en el medio)-> 300 paquetes (usando Antena comercial en receptor y Antena comercial en transmisor), pero no era del todo constante, a veces llegaban menos.
- A 15Mts de distancia (con pared en el medio)-> 0 paquetes (usando Cable coaxil en receptor y Antena comercial en transmisor).
- A 4 pisos de diferencia (30mts aprox) -> 0 paquetes (usando Antena comercial en receptor y Cable coaxil en transmisor)
- A 4 pisos de diferencia (30mts aprox) -> 0 paquetes (usando Antena comercial en receptor y Antena comercial en transmisor)
- A 4 pisos de diferencia (30mts aprox) -> 600 a 300 paquetes (usando Antena comercial en transmisor y Cable coaxil en receptor)
- Comunicación UART a 1200bps (se empleó las mejores antenas obtenidas en 2400bps)
- A 15Mts de distancia (con pared en el medio)-> 700 paquetes (usando Antena comercial en receptor y Cable coaxil en transmisor), pero no era del todo constante, a veces llegaban menos.
- A 4 pisos de diferencia (30mts aprox) -> 300 a 150 paquetes (usando Antena comercial en transmisor y Cable coaxil en receptor)
- Comunicación Manchester a 2400bps (requiere 2 bits para mandar 1 bit de dato)
- A 15Mts de distancia (con pared en el medio)-> 1100 paquetes (usando Antena comercial en receptor y Antena comercial en transmisor), era bastante constante.
- A 4 pisos de diferencia (30mts aprox) -> 300 a 150 paquetes y después caía y dejaban de llegar paquetes (usando Antena comercial en transmisor y Antena comercial en receptor)
- A 4 pisos de diferencia (30mts aprox) -> 0 paquetes (usando Antena comercial en transmisor y Cable coaxil en receptor)
- Comunicación símil al Manchester, pero con duty 75% (requiere 4 bits para mandar 1 bit de dato)
- A 15Mts de distancia (con pared en el medio)-> 500 a 600 paquetes (usando Antena comercial en receptor y Antena comercial en transmisor), era bastante constante.
- A 3 pisos de diferencia (20mts aprox) -> 200 a 150 paquetes y después caía y dejaban de llegar paquetes (usando Antena comercial en transmisor y Antena comercial en receptor)
- A 3 pisos de diferencia (20mts aprox) -> 0 paquetes (usando Antena comercial en transmisor y Cable coaxil en receptor)
Como verán los resultados son bastante ambiguos y varían mucho según la antena usada en dicha distancia. Lo que pude sacar en limpio:
- El receptor de alguna forma tiene que saturar, ya que en la prueba uart de 2400bps, al usar las antenas con las que se obtuvo mejor distancia en distancias menores, la cantidad de paquetes disminuye mucho.
- Bajar la velocidad a 1200bps no trajo muchos beneficios, siempre se recibía la mitad de paquetes por un tema de velocidad y era poco constante como a 2400bps, por lo tanto no hubo beneficio alguno.
- Con Manchester se obtiene la mejor comunicación en distancias cortas, estable y con mayores paquetes recibidos.
- Con Manchester se pudo recibir paquetes usando las 2 antenas comerciales a largas distancias.
- A pesar de recibir paquetes en forma constante a 15mts usando Manchester y usando las antenas comerciales, a mayor distancia se vuelve muy inestable, empieza a recibir bien y después cae hasta no recibir nada.
- Con el código para obtener un duty del 75% no parecía a haber grandes cambios en referencia al Manchester, estable a cortas distancias e inestable a grandes distancias.
La conclusión de momento es que tanto el Manchester como el código con duty aplicado al 75% no dieron mejores resultados que usar una UART a secas, pero de todas formas vamos a repetir las mediciones en otro entorno.
Sobre el código Manchester, usé la UART para realizar la codificación y decodificación, ya que mi mayor interés era ver que pasaba cuando tenía un duty constante durante el envío del mensaje (y no tanto el tema de la sincronización). Subo el PDF que usé para basarme en la codificación/decodificación y les dejo el código que usé, tal vez le sea útil.
Códificación Manchester usando UART (en C):
PHP:
int enviar_cod_manchester(u8 dato)
{
u8 cont1,cont2,aux,byte_cod;
aux = dato;
for (cont1=0; cont1<2; cont1++)
{
byte_cod = 0; // Byte codificado
for (cont2=0 ; cont2<4; cont2++)
{
byte_cod =(byte_cod >>2);
if (aux&0x01)
byte_cod |= 0b10000000; // 1 Logico => 1->0
else
byte_cod |= 0b01000000; // 0 Logico => 0->1
aux=(aux>>1);
}
if(envia_dato_rs232(byte_cod)<0)
return -1;
}
return 1;
}
Decodificación Manchester usando UART (en C):
PHP:
int recibe_manchester()
{
u8 cont1,cont2,byte_decodificado,aux;
byte_decodificado = 0;
for(cont1=0;cont1<2;cont1++)
{
if(recibe_dato_rs232()<0)
return -1;
aux = dato_rx;
if (aux == 0xf0) // Comienzo o fin de trama -- Preámbulo
return -1;
for (cont2=0; cont2<4; cont2++)
{
byte_decodificado=(byte_decodificado >>1);
switch(aux & 0x03)
{
case 0x01:{ byte_decodificado&=0x7f; break;}
case 0x02:{ byte_decodificado|=(1<<7); break;}
default:{return -1;}
}
aux=(aux>>2);
}
}
dato_rx=byte_decodificado;
return 1;
}