Entrada serie de Xbee-Arduino (problema de valores atípicos)

0

Tengo un Xbee configurado como receptor y Arduino (independiente con chip atmega328p) conectados juntos. El pin RSSI del Xbee está conectado a uno de los pin PWM de la placa Arduino. Utilicé PulseIn para obtener el equivalente digital del RSSI (lo llamé rssiDur) Utilicé el Hyperterminal para mostrar el valor de rssiDur. Los valores de rssiDur que se muestran en el HT no son consistentes. Cualquier interferencia entre mis Xbees cambia el rssiDur dramáticamente. Deseo estabilizar la lectura de rssiDur para que la interferencia no sea de gran efecto.

Se ha sugerido utilizar un temporizador. aunque no se como fue algo así como cuando el rssiDur muestra 10 consecutivos del mismo valor, ese valor será el rssiDur. (ejemplo: 9 9 9 9 9 9 9 9 9 9 8 8 6 7 10, rssiDur = 9) ¿Alguien sabe cómo hacer esto? ¿O alguna sugerencia sobre cómo tratar los valores de rssiDur? Ayudará mucho en nuestro proyecto.

** Actualización: Hola de nuevo! Utilicé la Biblioteca promedio pero todavía recibo valores atípicos de vez en cuando, por ejemplo: (copiado de HT) :
  25
4
25
27
25
20
32
1
24
24
20
20
27
28
20
22
20
19
1
3
19
18
20
20
1
20

¿cómo tirar los valores atípicos? ¿Sería recomendable si utilizara un filtro de modo doble?

    
pregunta roseannvalorie

2 respuestas

1

De acuerdo con el Arduino Reference pulseIn: "Funciona en pulsos de 10 microsegundos a 3 minutos de duración". Así que eso debe tenerse en cuenta.

Para responder a su pregunta, entiendo que usted desea "limpiar" o filtrar el valor rssiDur. Puede filtrar esto digitalmente utilizando un filtro de paso bajo para aproximar el valor mean :

int rssiDurFilt = (1-0.99)*rssiDur + 0.99*rssiDurFilt;

Cambie el 0.99 para cambiar la frecuencia de corte (más cerca de 1.0 es la frecuencia más baja). La expresión real para ese valor es exp (-2 * pi * f / fs) donde f es la frecuencia de corte que desea y fs es la frecuencia a la que se muestrean los datos.

Otro tipo de "filtro digital" es un filtro de eventos. Funciona bien en datos que tienen valores atípicos; p.ej. 9,9,8,10,9,25,9 En este caso, rellena una matriz con valores muestreados y crea una tabla de frecuencias (es decir, cuenta el número de ocurrencias de cada valor), luego selecciona el valor con la mayoría de las ocurrencias. Estadísticamente, este es el modo .

ACTUALIZACIÓN: Los promedios estadísticos, como la media, el modo, etc., se pueden calcular utilizando la Biblioteca promedio de Arduino.

    
respondido por el akellyirl
0

Simplemente mantendría un promedio móvil manteniendo los últimos 10 RSSI en una matriz y cambiando el contenido de la matriz en uno cada vez que se lea un nuevo valor.

No veo cómo cambiar el valor que almacena tiene un efecto en la interferencia real a menos que lo esté usando para retrasar la transmisión hasta que la "red" esté silenciosa.

    
respondido por el RedGrittyBrick

Lea otras preguntas en las etiquetas