Skip to content

RFE_IoT_SerialPlotter example in Spanish

jcalderon09 edited this page Jun 12, 2018 · 6 revisions

Ejemplo RFE_IoT_SerialPlotter

Ejemplo para mostrar la utilidad Arduino Serial Plotter con RF Explorer 3G+ IoT. Con el ejemplo podremos visualizar una traza completa del espectro de radio en un rango especificado. Por defecto el ejemplo viene configurado entre 902 y 928MHz.

¿Qué es lo que hace?

Este sketch configura el analizador para visualizar gráficamente una captura del espectro. Para ello se vale de la utilidad SerialPlotter instalada en el entorno de Arduino desde la versión 1.6.6 de noviembre de 2015. Es una utilidad en constante desarrollo por lo que a medida que se incorporen nuevas características y mejoras, actualizaremos el código para sacarle el máximo provecho.

El ejemplo establece la configuración de trabajo del dispositivo y recoge datos a partir de esa configuración.

¿Cómo ejecutarlo?

Cargue el ejemplo RFE_IoT_SerialPlotter en el Arduino Due y vea los resultados en el Serial Plotter del entorno de Arduino.

Resultados esperados

Al conectar una señal a la frecuencia de 915MHz y a una potencia de -28.5dBm obtendremos la siguiente imagen. Puede utilizar el siguiente generador de señal: RFE6GEN.

Como se muestra en la imagen, la salida en el Serial Plotter incluye la siguiente información gráfica:

  • La curva de color azul formado por el conjunto de muestras capturadas.
  • En el eje Y, la potencia en dBm que capta nuestro dispositivo. Tenemos un suelo de ruido en -105dBm y una fuerte señal sinusoidal en la frecuencia central a -28dBm
  • En el eje X, el número total de muestras que definen la resolución. En nuestro caso podemos ver que se acerca al valor de 240 muestras. La muestra 0 correcpondería al valor inicial que hemos determinado como ejemplo (902Mhz )y la muestra 240 al valor último (928Mhz).

El SerialPlotter no permite hasta la versión actual, (IDE 1.8.1) establecer el valor ni unidades de los ejes. No es posible hasta el momento colocar un rango de frecuencias en los ejes. Más información sobre cómo se realiza la visualización en el apartado: Descripción detallada del código fuente

Si en su lugar quitamos el cable, la antena o conectamos una carga de 50 Ohmios obtendremos el Suelo de Ruido del dispositivo.

Podemos observar que no existe ninguna señal ya que los valores detectados están en el rango de -105dBm.

Descripción detallada del código fuente

Un par de constantes #define permiten infinidad de configuraciones del mismo sketch. Las constantes permiten seleccionar la frecuencia de inicio (_START_FREQ_KHZ) y la de parada (_STOP_FREQ_KHZ). La frecuencia se establece en KHz para trabajar con el RF Explorer 3G+ IoT.

Dichas constantes están protegidas para seleccionar el rango factible del analizador. Otras constantes denominadas _MIN_FREQUENCY_KHZ y _MAX_FREQUENCY_KHZ están almacenadas en la librería RFExplorer 3G+ IoT y, contienen los valores de frecuencia mínimo y máximo del dispositivo. El siguiente código da un error de compilación si se superan esos márgenes en frecuencia.

	#if _START_FREQ_KHZ>=_STOP_FREQ_KHZ
	  #error PLEASE SPECIFY VALID FREQUENCY RANGE
	#endif

	#if ((_START_FREQ_KHZ < _MIN_FREQUENCY_KHZ) || (_STOP_FREQ_KHZ>_MAX_FREQUENCY_KHZ))
	  #error PLEASE SPECIFY VALID FREQUENCY RANGE
	#endif

La función setup() es muy similar a los códigos utilizados en los ejemplos RFE_IoT_GetPeak y RFE_IoT_SweepsAndChangeConfig. La diferencia sustancial es que, en la codificación de este ejemplo, utilizamos programación de estados a lo largo de la ejecución. Siempre se espera hasta recibir la información deseada para transitar al siguiente estado. Por tanto en el primer estado podemos ver como el código se encuentra en un bucle hasta que recibe, tanto en el método processReceivedString() un _RFE_SUCCESS, como el contenido de ese mensaje es una configuración completa _CONFIG_MESSAGE. Puedes conocer más sobre los posibles mensajes así como el manejo de errores en la Referencia de la librería.

Una vez pasada esa condición envía el comando sendNewConfig() con los valores seleccionados en los define por el usuario.

    //Wait for Message received is default configuration from 3G+
    do
    {
        g_objRF.updateBuffer();
        g_nProcessResult = g_objRF.processReceivedString();  
    }
    while(!((g_nProcessResult == _RFE_SUCCESS) && (g_objRF.getLastMessage() == _CONFIG_MESSAGE)));
     
    //Send Command to change RF module configuration
    g_objRF.sendNewConfig(_START_FREQ_KHZ, _STOP_FREQ_KHZ);     

Una vez enviado el comando, el siguiente paso es recibir la nueva configuración. Por tanto, en el do-while dispondremos de un código idéntico al de la función setup() para obtener ese nuevo mensaje de acuerdo a la misma condición: que se reciba en el processReceivedString() un _RFE_SUCCESS y el contenido de ese mensaje sea una configuración completa _CONFIG_MESSAGE.

Después de este paso podemos estar seguros de que los datos recibidos por el analizador corresponden a la frecuencia que hemos seleccionado. De modo que podemos pasar al siguiente estado de captura de los valores de amplitud.

Volvemos a repetir la misma estructura de espera para recibir y procesar los datos del analizador. En este estado, la condición de salida está basado en 3 elementos: que se reciba en el processReceivedString() un _RFE_SUCCESS, que el contenido de ese mensaje sea un barrido en frecuencia (_SWEEP_MESSAGE) y que los datos que se han recibido hasta ese momento sean consistentes y válidos con el método isValid().

    do
    {
        g_objRF.updateBuffer();
        g_nProcessResult = g_objRF.processReceivedString();  
    } 
    while (!((g_nProcessResult == _RFE_SUCCESS) && (g_objRF.getLastMessage() == _SWEEP_MESSAGE) && g_objRF.isValid()));

En el siguiente y último estado vamos a representar esa información recibida punto a punto. En el SerialPlotter se establece el valor de amplitud con el siguiente código:

    for (short int nIndexStep = 0; nIndexStep<g_objRF.getConfiguration()->getFreqSpectrumSteps(); nIndexStep++)
    {
        //Print every step of sweep data into Serial Plotter
        g_objRF.getMonitorSerial().println(g_objRF.getSweepData()->getAmplitudeDBM(nIndexStep)); 
    }

Esta amplitud se coloca en el Eje Y. El Eje X se establece en función del envío de la amplitud. El valor de la muestra 0, muestra 1,... hasta la n.

Los ejes son establecidos automáticamente enviando dos códigos con valores cercanos a los límites de los ejes. Esta es la razón por la que al inicio de la gráfica aparecen, aunque disimuladas, dos líneas verticales.

    g_objRF.getMonitorSerial().println(-35);
    g_objRF.getMonitorSerial().println(-105);

Lo último que se va a realizar en nuestro código es colocar el RF Explorer 3G+ IoT en modo shutdown, con el método sleep() y, finalizar el programa. No continuamos escaneando porque la versión actual del Serial Plotter de Arduino no permite borrar y volver a dibujar.

    g_objRF.sleep(); 
    while(1);