Construcción de un medidor de consumo eléctrico neurGAI basado en el microcontrolador KL25Z y un Shield WIFI de Seeed

(euskaraz)

A continuación explicamos cómo construir un medidor de consumos eléctricos que no requiere calibrar la entrada de audio del móvil. En este prototipo, la señal entregada por la sonda amperimétrica SCT013 es medida por un microcontrolador Kinetis KL25 (ARM® Cortex™-M0+MCU) . El microcontrolador está integrado en una plataforma de desarrollo FRDM-KL25Z de Freescale; esta plataforma permite una fácil integración con otros módulos compatibles con Arduino, como por ejemplo un Shield Wifi de Seeed. Este shield nos permitirá comunicar la FRDM-KL25Z con nuestra aplicación neurGAI, instalada en nuestro teléfono móvil, para enviarle las medidas de corriente eléctrica tomadas por la sonda amperimétrica.

La siguiente figura muestra la distribución de pines de la plataforma FRDM-KL25Z.

KL25ZLa plataforma se alimenta a través de cualquiera de los dos conectores USB. El conector USB superior izquierdo se utiliza para programar y monitorizar el microcontrolador mediante un ordenador.

Nuestro FRDM-KL25Z se puede programar de una forma sencilla a través de la plataforma virtual ARMmbed:

mbed

Esta plataforma nos ofrece un entorno de desarrollo completamente virtual para programar nuestro microcontrolador. Una vez dados de alta en mbed, de forma gratuita, dispondremos de un potente entorno de desarrollo soportado por la comunidad mbed con acceso a librerías, documentación, foros, etc.

Más adelante volveremos a la programación de nuestro microcontrolador Kinetis KL25. A continuación explicaremos cómo conectar la plataforma FRDM-KL25Z, el shield Wifi de Seeed y la sonda amperimétrica SCT013.

La siguiente figura muestra el proceso de montaje.

KL25-wifi

La imagen de la izquierda muestra la plataforma FRDM-KL25Z tal y como la entrega el fabricante. A los lados de la plataforma encontramos dos filas dobles de agujeros metalizados de conexión. A través de estos contactos tenemos acceso a los pines del microcontrolador. Las dos filas más exteriores son los contactos compatibles con el sistema Arduino. Estos son los contactos que utilizaremos para conectar el shield Wifi. Para ello, soldaremos sobre los agujeros exteriores los conectores que se muestran en la imagen central. El shield Wifi irá montado sobre ellos.

Una de las dos conexiones de la sonda amperimétrica debe conectarse al PTE30, de salida analógica del microcontrolador. Por ello, en la fila interior en la que se encuentra el pin PTE30 soldaremos una fila de 5 conectores de altura más reducida que los otros, para dejar sitio debajo del shield Wifi al cable de conexión con la sonda amperimétrica (cable verde en la imagen del centro).

El otro cable de la sonda amperimétrica debe conectarse al pin A2/PTB2 de la plataforma. La conexión la realizaremos a través del shield Wifi, que se conecta a su vez a la plataforma FRDM-KL25Z. Una ve montado todo el sistema, debe quedar tal y como se muestra en la imagen de la derecha.

Obsérvese que en el Shield Wifi el pin D15 (RX del UART1) está conectado con el pin D2 mediante un cable de color naranja, y el pin D14 (TX del UART1) está conectado con el pin D3 mediante un cable de color verde. Por otro lado (MUY IMPORTANTE), las dos patas que conectan los pines D2 y D3 del Shield Wifi a los mismos pines de la plataforma FRDM-KL25Z están sacados hacia afuera para evitar la conexión. De esta forma, los pines D2 y D3 del Shield (WIFI_TX y WIFI_RX del módulo que realiza la comunicación Wifi) quedan conectados a la UART1 del KL25. Así no es necesario emular por software el puerto serie que gestiona la comunicación con el módulo Wifi.

La sonda amperimétrica dispone de un conector macho TRS de 3,5 mm. Para conectar la sonda a la plataforma, lo hacemos a través de un conector hembra TRS del mismo calibre. Las siguientes imágenes muestran las conexiones de ambos conectores, macho y hembra.

KL05Za

El shield Wifi integra un módulo wifi RN171. El esquema de conexiones del módulo se muestra en la siguiente imagen.

wifi shield

El Shield Wifi se alimenta a través de las conexiones con la plataforma FRDM-KL25Z. El Shield dispone dos conexiones digitales (WIFI_RX, WIFI_TX) a través de las que se implementa la comunicación serie entre el shield Wifi y nuestra plataforma FRDM-KL25Z. El shield dispone de dos conectores (tipo puente) que sirven para conectar los pines WIFI_RX y WIFI_TX del Shield con dos de los ocho puertos digitales de entrada/salida de la plataforma FRDM-KL25Z. En nuestro caso, debemos realizar la siguiente conexión:

WIFI_RX -> D3 (conectado a D14, TX del UART1 a través del cable verde)

WIFI_TX – > D2 (conectado a D15, RX del UART1 a través del cable naranja)

En este punto ya tenemos todos los componentes de nuestro sistema interconectados. A continuación debemos programar el microcontrolador.

 

Programación del microcontrolador KL25 y configuración del Shield Wifi

La configuración del Shiled WIFI se hace por software a través del microcontrolador KL25. Por tanto, el siguiente paso consiste en cargar el programa en el KL25. Este programa incluye la configuración y programación del Shield WIFI. Las características, funcionalidades e información complementaria sobre el Shield Wifi pueden consultarse en esta wiki de Seeed.

La información que se aporta a continuación está accesible también en la plataforma mbed: https://developer.mbed.org/platforms/KL25Z/

Una vez adquirida una plataforma FRDM-KL25Z, el primer paso consiste en actualizar el firmware de la openSDA (open standard embedded serial and debug adapter). Este sistema digital complementario al KL25Z integrado en la tarjeta nos permitirá comunicarnos con el microcontrolador a través del puerto USB, y sobre todo cargar fácilmente (como una memoria USB externa) el programa que se ejecutará en el microcontrolador. El proceso de actualización del firmware de la openSDA es imprescindible para poder programar nuestra plataforma. El proceso se describe en este enlace.

El siguiente paso será importar a nuestro entorno de programación en la plataforma mbed el código y librerías asociadas al programa que cargaremos en la FRDM-KL25Z. Lo más sencillo es hacerlo a través de la herramienta de repositorios. El repositorio está accesible en este enlace: https://developer.mbed.org/users/gbm/code/neurGAI_WIFI/. A continuación debemos pulsar en el botón “Import this program”.

mbed-neurGAI_WIFI

 

Esto nos cargará el código del programa en nuestra área de trabajo.

En este punto, ya podemos consultar el código del programa. Las plataformas de ARMmbed se programan en C++ (para más información, http://www.cplusplus.com/).

mbed-neurGAI_WIFI_kodea

Para cargar el programa en el microcontrolador hay que compilar el código. Este proceso generará un fichero “neurGAI_WIFI_KL25Z.bin” que deberemos guardar en el dispositivo de almacenamiento USB asociado a nuestra plataforma FRDM-KL25Z. Una vez grabado el programa, al pulsar el botón de reset de la plataforma el programa arrancará.

Al arrancar el programa, este procede a engancharse a un punto de acceso WIFI (WAP) con el identificador (SSID) NeurGai“, y clave (preSharedKey) neurGai2016.

La comunicación serie con el shield WIFI se realiza a través del UART1 del KL25Z. No hemos utilizado una UART del KL25 (la UART0, por ejemplo) para no interferir con una posible comunicación con el ordenador a través de SerialPC (las sentencias están comentadas en el código, e inhabilitadas en la última versión del repositorio; estas sentencias se pueden descomentar para monitorizar el funcionamiento del programa).

El arranque del programa requiere que la usuaria establezca la comunicación desde el otro terminal, un móvil en el que la App neurGAI está arrancada. La usuaria deberá activar la recepción de datos a través de WIFI activando esta opción en el menú de herramientas de la aplicación. El código de la aplicación neurGAI está accesible en este enlace: https://github.com/gorkabueno/NeurGai. Una sencilla aplicación Android con el código que establece el canal serie a través de WIFI, y vuelca la información a consola está disponible en este enlace: https://github.com/gorkabueno/wifiAP.

A continuación se muestra el código que realiza la medida del valor eficaz de la corriente, en el KL25:

 

void medir()
{
    numero_muestra++;
    valor_muestra = sonda.read();
    v_offset = v_offset + valor_muestra;
    potencia = potencia + pow((valor_muestra - v_offset_medido), 2);
    if (numero_muestra == frecuencia_muestreo)  // hemos llegado a un segundo
    {
        medidor.detach();
        potencia_medida = potencia / frecuencia_muestreo;
        corriente_medida = sqrt(potencia_medida);
        v_offset_medido = v_offset / frecuencia_muestreo;
        v_offset = 0;
        potencia = 0;
        numero_muestra = 0;
        medido = true;
        potencia_230V = (corriente_medida * pendiente + offset) * 230;
        sprintf(buffer, "#%i&%f*\n", num_medida, potencia_230V);
        DBG("%s %i", buffer, strlen(buffer));
        int numDatosEnviados = client.send_all(buffer, strlen(buffer));
        medido = false;
        num_medida++;
        medido_y_enviado = true;
        DBG("datos enviados : %i", numDatosEnviados);
    }
}

int main (void)
{
    DBG("Empezando...");
    wifly.init(); // use DHCP
    while (!wifly.connect()); // join the network
    DBG("\nLa direccion IP es %s", wifly.getIPAddress());
 
    server.bind(ECHO_SERVER_PORT);
    server.listen();
 
    DBG("\nEsperando conexion...");
    server.accept(client);
    DBG("\nServidor aceptado...");
    wait(1);    //si no se le mete un pequeño retardo, se queda colgado. También vale con el DBG anterior
    
    //configura el offset de voltaje a sumar a la sonda
    salida_offset = 0.5;
    
    while (true) {
        DBG("Esperando dato...");
        int n = client.receive(buffer, sizeof(buffer));
        if (n <= 0continue;
        DBG("Recibido dato: %s Longitud %i", buffer, n);
        buffer[n] = 0;
        if (strcmp(buffer, "Pot?\n") == 0) {
            // activa el muestreo
            medido_y_enviado = false;
            medidor.attach(&medir, 1.0/frecuencia_muestreo);
        }
            
        // spin in a main loop. medidor will interrupt it to call medir
        while (!medido_y_enviado) 
            wait(.1);
    }
}

 

Tras configurar el canal WIFI, el KL25z espera a recibir la cadena “Pot?\n” de la aplicación Android. Esto activa el muestreo de la señal de corriente medida por la sonda amperimétrica.

La señal entregada por la sonda amperimétrica (SCT013-060) es una señal alterna sin componente de continua. El microcontrolador solo puede medir señales positivas, así que es necesario sumar a la señal de la sonda un offset, que es el nivel de tensión impuesto a través de la salida analógica PTE30 (salida_offset). Así, la señal medida (valor_muestra) es la suma de la señal entregada por la sonda, sumada a ese valor de offset. Este valor medio se calcula a posteriori, y se resta al valor medido para obtener el valor de la señal entregada por la sonda en cada instante.

El método medir() se arranca de forma periódica cada 200 μs. Este valor se corresponde con una frecuencia de muestreo de 5 kHz. Esta frecuencia de muestreo proporciona 100 muestras por periodo de señal (de 50 Hz, periodo de 20 ms), suficientes para calcular adecuadamente su valor eficaz. El periodo de muestreo (200 μs), por otro lado, es suficiente para que el método medir() procese cada medida antes de que salte la llamada de la siguiente medida. El método toma una medida instantánea de la tensión en la sonda, y acumula en un sumatorio el valor instantáneo. Al acabar 1 segundo se calcula un valor proporcional a la corriente eficaz medida por la sonda amperimétrica a lo largo de ese segundo.

Cuando el bucle exterior detecta que se han tomado las muestras correspondientes a un segundo, el programa ajusta el valor eficaz medido a la corriente eficaz real, mediante un coeficiente que debe ser calibrado, y multiplica por 230 V para obtener la potencia del consumo medido.

Por último, el programa envía dos datos a través del shield WIFI: el número de medida realizada, y el valor de la potencia aparente equivalente sobre una tensión eficaz de 230 V ya calculado.

El coeficiente de proporcionalidad entre el valor eficaz medido y la corriente eficaz real que circula por la sonda amperimétrica (pendiente = 201.206437) requiere una calibración específica para cada sistema KL25+SCT013. Para ello, hemos procedido de la siguiente manera:

Primeramente hemos fijado un coeficiente de proporcionalidad igual a la unidad (pendiente = 1), y eliminado la multiplicación por 230 (V). De esta forma, los valores proporcionados por el microcontrolador a través del canal WIFI se corresponden directamente con los valores proporcionales a la corriente que circula a través de la sonda amperimétrica.

Las corrientes que debe medir la sonda amperimétrica son del orden de amperios (una potencia de consumo de 4,6 kW se corresponde con una corriente de 20 A). Estos altos niveles de corriente se pueden reproducir en un laboratorio de electrónica haciendo pasar la señal entregada por un generador de funciones a través de un bobinado de hilo de cobre con el suficiente número de vueltas. En nuestro caso, hemos utilizado un bobinado de 500 vueltas. La siguiente imagen muestra la sonda amperimétrica abrazada al bobinado de 500 vueltas, a través del que circula una corriente de 81,4 mA. De esta forma simulamos una corriente de 40,7 A circulando a través de la sonda amperimétrica.

 

IMG_20151211_103935

 

Variando progresivamente la corriente que circula a través del bobinado (desde las decenas de miliamperios hasta las decenas de amperios), es posible registrar las medidas que proporciona el microcontrolador KL25. La siguiente tabla, a la izquierda, muestra en la primera columna la corriente que circula por la bobina, medida por el amperímetro. La tercera columna muestra la corriente que circula a través de la sonda amperimétrica (x500). La columna central muestra el valor numérico entregado por el KL25.

La gráfica de la derecha muestra la relación lineal entre la corriente medida (eje vertical) e el dato proporcionado por el microcontrolador (eje horizontal). Se puede comprobar la gran linealidad, de la que se obtiene fácilmente el coeficiente de proporcionalidad del sistema.

kalibrazioaNos queda por determinar el margen dinámico de nuestro medidor de corriente eficaz (consumo eléctrico, si multiplicamos por la tensión de la red, 230 V).

Las siguientes dos gráficas muestran la señal a la entrada del microcontrolador, entregada por la sonda amperimétrica cuando por ella circula una corriente total de 40,7 A. Se observa el carácter sinusoidal de la señal, y la frecuencia de 50 Hz. A la señal de la izquierda le hemos eliminado la componente continua, que sí se muestra en la imagen de la derecha. La componente continua (el valor medio de la señal a la derecha) es 1,63 V, y se corresponde con el offset entregado a través del pin PTE30 del microcontrolador (salida_offset=0.5).

oszilo

La sonda amperimétrica utilizada (SCT-013-060) es de 1 V-60 A. 40,7 voltios eficaces a través de la sonda se convierten en 40,7/60=0,678 mV, prácticamente el mismo valor (0,677 mV) de RMS en la imagen de la izquierda.

Según consta en el manual de la plataforma FRDM-KL25Z (pág. 14), el ADC del KL25 funciona con dos referencias VREFH=3,3 V y VREFL=0 V. Esto es coherente con el valor medio medido en la señal de la derecha, 1,63 V aproximadamente igual a 3,3V/2 (salida_offset=0.5). La máxima amplitud sin distorsión que puede tener una señal a la entrada del ADC es de 1,63 V, que corresponde a un valor eficaz de 1,15 V. En una sonda SCT-030-060 ese voltaje se corresponde con 69,16 A, suponiendo que la linealidad de la sonda se mantiene por encima de los 60 A. Esta corriente se corresponde con una potencia de 15,9 kW.

Este prototipo es capaz, por tanto, de medir potencias (aparentes) de hasta 15,9 kW.

No se admiten más comentarios.

Junio 2020
L M X J V S D
« May    
1234567
891011121314
15161718192021
22232425262728
2930