Construcción de un medidor de consumo eléctrico neurGAI basado en el microcontrolador KL25Z y un Shield Bluetooth 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 Bluetooth 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 Bluetooth de Seeed y la sonda amperimétrica SCTo13.

La siguiente figura muestra el proceso de montaje.KL05Zb

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 contactos son los contactos compatibles con el sistema Arduino. Estos son los contactos que utilizaremos para conectar el shield Bluetooth. Para ello, soldaremos sobre los agujeros exteriores los conectores que se muestran en la imagen central. El shield Bluetooth 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 Bluetooth al cable de conexión con la sonda amperimétrica (cable verde en la imagen de la derecha).

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 Bluetooth, 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 inferior.

completo

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 Bluetooth integra un módulo Bluetooth SPP (Serial Port Protocol). Su esquema de conexiones se muestra en la siguiente imagen.

BluetoothInterface

El Shield Bluetooth se alimenta a través de las conexiones con la plataforma FRDM-KL25Z. El Shield Bluetooth dispone de dos conectores Grove, digital y analógico, que no utilizaremos. El Shield dispone también de dos conexiones digitales (BT_RX, BT_TX) a través de las que se implementa la comunicación serie entre el shield Bluetooth y en nuestro caso la plataforma FRDM-KL25Z. El shield dispone de dos conectores (tipo puente) que sirven para conectar los pines BT_RX y BT_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:

BT_RX -> D5

BT_TX – > D4

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 Bluetooth

La configuración del Shiled Bluetooth 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 Bluetooth. Las características, funcionalidades e información complementaria sobre el Shield Bluetooth 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. Una búsqueda del término “neurGAI” nos llevará al repositorio, o pulsando este enlace: https://developer.mbed.org/users/gbm/code/neurGAI_Seeed_BLUETOOTH/. A continuació debemos pulsar en el botón “Import this program”.

 

mbed-neurGAI

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-developer

Para cargar el programa en el microcontrolador hay que compilar el código. Este proceso generará un fichero “neurGAI_BLUETOOTH_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 en primer lugar a configurar el Shield Bluetooth con el identificador “neurGAI”, y un código PIN “0000” (cuatro ceros).

La comunicación serie con el shield Bluetooth se realiza a través de los pines D5 y D4, que en la plataforma FRDM-KL25Z son TX y RX respectivamente (al revés que en el Shield).

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). La librería BluetoothSerial (https://developer.mbed.org/teams/Seeed/code/BluetoothSerial/), proporcionada por Seeed, ha sido ligeramente modificada para que la comunicación serie con el Shield pueda realizarse a través de dos pines diferentes de los correspondientes a una UART. Para ello, se hace uso de la librería SoftSerial (https://developer.mbed.org/users/Sissors/code/SoftSerial/), que nos permite implementar un canal serie por software a través de dos pines I/O digitales arbitrarios.

El arranque del programa requiere que la usuaria establezca la comunicación desde el otro terminal. Si este es un móvil en el que la App neurGAI está arrancada, la usuaria deberá activar la recepción de datos a través de Bluetooth activando esta opción en el menú de herramientas de la aplicación. Si los datos se quieren recibir a través de un terminal, por ejemplo en linux, haremos:

 

$sudo rfcomm bind /dev/rfcomm0 [MAC address] 1
$sudo putty

 

Primero establecemos una conexión entre el dispositivo Bluetooth RFCOMM del kernel con el dispositivo Bluetooth externo (el shield) identificado por su dirección MAC; a continuación nos serviremos de putty para establecer un canal serie a traves de /dev/rfcomm0.

La configuración por defecto del canal serie en el shield Bluetooth es: 9600 baudios, 8 bits, 1 bit stop, sin paridad.

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

 

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
    {
        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;
        led3 = !led3;   // conmuta LED azul
        medido = true;
    }
}

//..//

int main() {
    
    //configura el offset de voltaje a sumar a la sonda
    salida_offset = 0.5;
    float pendiente = 201.206437;
    float offset = 0;
   
    //configura el Bluetooth Shield
    //...//
    // asigna la función medir al temporizador con intervalo 200 us
    medidor.attach(&medir, 1.0/frecuencia_muestreo);
 
    // spin in a main loop. medidor will interrupt it to call medir
    float t = 0;
    int tiempo = 0;
    while(1)
    {
        if (medido)
        {
            medidor.detach();
            potencia_230V = (corriente_medida * pendiente + offset) * 230;
            serialBluetoothShield.printf("#%i€%f*\r\n", tiempo, potencia_230V);
            medido = false;
            t = t + 1;
            tiempo++;
            medidor.attach(&medir, 1.0/frecuencia_muestreo);
        }
    }
}

 

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 Bluetooth: el tiempo de la medida en segundos, 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 Bluetooth, en un terminal de nuestro ordenador, 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.

4 comentarios a Construcción de un medidor de consumo eléctrico neurGAI basado en el microcontrolador KL25Z y un Shield Bluetooth de Seeed

  • Roger

    Hola,

    Quisiera saber porque utilizas los pines D4 y D5 para conectar con RX y TX del modulo bluetooth. He hecho pruebas con los pines PTA1 (D1) y PTA2 (D0) de la placa frdm kl25z y otros RX y TX (de la placa) y no se enviaban los datos al móvil.

    He probado con los que utilizas y funciona como debería, pero no lo entiendo. ¿No se debe conectar Rx–>TX y TX–>RX?

    Muchas gracias,
    Roger

    PD: yo estoy enviando la señal de fuerza que recibe el sensor al móvil por bluetooth con la frdm kl25z.

    • GORKA BUENO MENDIETA

      Hola Roger,
      Gracias por tu interés en el proyecto.
      La explicación está en el texto de la entrada:

      La comunicación serie con el shield Bluetooth se realiza a través de los pines D5 y D4, que en la plataforma FRDM-KL25Z son TX y RX respectivamente (al revés que en el Shield).

      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). La librería BluetoothSerial (https://developer.mbed.org/teams/Seeed/code/BluetoothSerial/), proporcionada por Seeed, ha sido ligeramente modificada para que la comunicación serie con el Shield pueda realizarse a través de dos pines diferentes de los correspondientes a una UART. Para ello, se hace uso de la librería SoftSerial (https://developer.mbed.org/users/Sissors/code/SoftSerial/), que nos permite implementar un canal serie por software a través de dos pines I/O digitales arbitrarios.

      Si utilizas la UART0 (D1 y D0), como es el mismo puerto de comunicación con el ordenador en el depurado, se crean interferencias. Por ello, la solución es implementar un puerto serie por software con dos pines diferentes.

      Otra solución alternativa es la implementada en el prototipo con el shield wifi:
      En este otro prototipo, utilizamos el puerto serie UART1 del KL25z. Aquí ya no es necesario utilizar SoftSerial. Pero como sus pines (D14 y D15) están fuera del alcance del shield wifi, los conectamos a través de cables a los pines D2 y D3 del shield.

      Ondo izan!
      Gorka

  • Fernando Orjuela

    Primero que todo muy interesante tu post gracias por tu aporte. En segundo lugar tengo una pequeña duda si yo quisiera tener un tiempo de muestreo de 350micros cómo podría hacer ese modificación , ya que soy nuevo en esta plataforma.
    Gracias por tu tiempo

Deje una respuesta a Fernando Orjuela

 

 

 

Puedes utilizar estos tags HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Julio 2020
L M X J V S D
« May    
 12345
6789101112
13141516171819
20212223242526
2728293031