Cui Bono
So far, so good
- Desde
- 19 Jul 2007
- Mensajes
- 29.855
- Reputación
- 51.554
PulsePI es una aplicación creada por mí (y espero que por otros también) para el microcontrolador Raspberry PI (en adelante la llamaré "raspi") que le permite registrar los pulsos de un contador de energía y presentar esos datos. Está siendo probada sobre la distribúción Raspbian, que es un port de Debian Wheezy para la arquitectura ARM del raspi.
Más info: Raspberry Pi - Wikipedia, la enciclopedia libre
Esta aplicación funciona tras una adaptación del hardware, añadiendo un circuito al emisor de pulsos.
El primer diseño es éste:
Se parte del hecho de que los impulsos en un contador Hager EC-152 son en salida a colector abierto.
Lo más limpio sería usar un relé y puentear con un contacto libre de tensión GPIO0 con GND cuando llegue un pulso, pero también es lo más caro y haría necesario usar una fuente de alimentación externa si no queremos que nuestra raspi tenga una bobina en su alimentación.
He sustituido el relé por un circuito optoacoplado alimentado por la propia raspi.
El tras*istor de salida (dentro del contador) actúa como un interruptor, uniendo eléctricamente sus dos puntas accesibles cuando sucede el pulso. Ese "corto" provoca el paso de corriente por el diodo led del optoacoplador, que actúa inyectando electrone por la base del fototransistor haciendo que su colector y emisor funcionen también como si fuera un interruptor, dando paso a la corriente entre colector y emisor y, por tanto, poniendo GPIO0 a referencia cercana a cero voltios, y eso es lo que hace que se genere la rutina de interrupción en nuestra raspi.
El programa necesita para la ejecución tener instalados libmysqlclient y las librerías wiringPi.
https://projects.drogon.net/raspberry-pi/wiringpi/
Para el desarrollo en lenguaje C necesitamos las librerías de mysql y este Makefile adaptado por mí:
http://46.137.166.84/pulsepi/Makefile
El código en C se compila y linka con el Makefile, poniendo ambos (pulsePi.c y su Makefile) en el mismo directorio y ejecutando "make". Este es pulsePi.c en su primera y brutota versión:
http://46.137.166.84/pulsepi/pulsePi.c.txt
Es necesario tener instalado un servidor mySQL con una base de datos que sea accesible por la aplicación (ver configuración de la base en el código fuente de pulsePi).
Cuando llega el pulso, se genera una interrupción. El raspi deja de hacer lo que esté haciendo y la atiende. Captura el tiempo unix de su reloj interno (se supone exacto porque la raspi se actualiza con servidores NTP) y salva la info en la base de datos. No hace nada más. La lectura e interpretación de los datos se hace con consultas a la base de datos, que pueden hacerse con diversas aplicaciones (también con el popular Excell y sus opciones de importación de datos externos).
Los primeros datos obtenidos son estos: http://46.137.166.84/pulsepi/pulsos.csv (podeis importarlo a EXCELL).
El número que empieza por 135... es un timestamp unix, eso se convierte a dia mes año segundos y microsegundos con diferentes funciones, como por ejemplo, con éste código en PHP, que usa la función "date" : http://46.137.166.84/pulsepi/codigo_php.txt
Este PHP, ejecutado en un webserver da como salida un texto tal que éste: http://46.137.166.84/pulsepi/salida_php.txt
Al incorporar un servidor web y tener los datos de los pulsos en una base mysql, la manipulación de los datos y la representación con gráficos reshulones o listados de textos se hace mucho más potente.
Cada pulso son 100wh, según las especificaciones del contador. Para convertir esa energía a potencia media instantánea hay que restarle al tiempo actual el tiempo del anterior pulso y tendríamos P = 3600 seg/hr x 100 w*hr/((t-t1)seg) = 360000/(t-t1) w, simbolizando esos vatios el promedio de potencia instantánea consumida durante el pulso. Podeis ver cómo se hace eso en el programa PHP de ejemplo que os he puesto.
Los datos de esta primera prueba no han salido perfectos. Aunque como totalizador sí que serviría ya que el número de pulsos se corresponde (más o menos), con un error de 8 pulsos, con lo que me marca antes y después mi contador en su display. Sin embargo, hay pulsos fantasma que falsean los datos de potencia media instantánea.
El número de pulsos por hora es pequeño (unos pocos a la hora) y, además, aparecen errores, seguramente debido a "rebotes" en el hardware. Una cosa es cortocircuitar GPIO0 y GND a pata juntando cables (eso me salía muy bien) y otra depender de la caja de color que supone el circuito interno de impulsos del contador, que seguramente sea otro optoacoplador.
Se puede solucionar añadiendo un filtro, cambiando la alimentación de 3.3v a la de 5v o quizás poniendo un condensador entre colector y emisor de la salida de impulsos. Tengo que probarlo.
Tal y como está, creo que necesita un sensor adicional, de corriente en amperios, que nos de pulsos con mayor frecuencia, quizás uno cada 10 segundos o así. Este nuevo sensor ayudaría a corregir los falsos pulsos y, a la vez, podríamos usar los pulsos del totalizador de whr para autocalibrar el propio sensor, pero esto da para otro post y éste ya es un tocho.
Más info: Raspberry Pi - Wikipedia, la enciclopedia libre
Esta aplicación funciona tras una adaptación del hardware, añadiendo un circuito al emisor de pulsos.
El primer diseño es éste:
Se parte del hecho de que los impulsos en un contador Hager EC-152 son en salida a colector abierto.
Lo más limpio sería usar un relé y puentear con un contacto libre de tensión GPIO0 con GND cuando llegue un pulso, pero también es lo más caro y haría necesario usar una fuente de alimentación externa si no queremos que nuestra raspi tenga una bobina en su alimentación.
He sustituido el relé por un circuito optoacoplado alimentado por la propia raspi.
El tras*istor de salida (dentro del contador) actúa como un interruptor, uniendo eléctricamente sus dos puntas accesibles cuando sucede el pulso. Ese "corto" provoca el paso de corriente por el diodo led del optoacoplador, que actúa inyectando electrone por la base del fototransistor haciendo que su colector y emisor funcionen también como si fuera un interruptor, dando paso a la corriente entre colector y emisor y, por tanto, poniendo GPIO0 a referencia cercana a cero voltios, y eso es lo que hace que se genere la rutina de interrupción en nuestra raspi.
El programa necesita para la ejecución tener instalados libmysqlclient y las librerías wiringPi.
https://projects.drogon.net/raspberry-pi/wiringpi/
Para el desarrollo en lenguaje C necesitamos las librerías de mysql y este Makefile adaptado por mí:
http://46.137.166.84/pulsepi/Makefile
El código en C se compila y linka con el Makefile, poniendo ambos (pulsePi.c y su Makefile) en el mismo directorio y ejecutando "make". Este es pulsePi.c en su primera y brutota versión:
http://46.137.166.84/pulsepi/pulsePi.c.txt
Es necesario tener instalado un servidor mySQL con una base de datos que sea accesible por la aplicación (ver configuración de la base en el código fuente de pulsePi).
Cuando llega el pulso, se genera una interrupción. El raspi deja de hacer lo que esté haciendo y la atiende. Captura el tiempo unix de su reloj interno (se supone exacto porque la raspi se actualiza con servidores NTP) y salva la info en la base de datos. No hace nada más. La lectura e interpretación de los datos se hace con consultas a la base de datos, que pueden hacerse con diversas aplicaciones (también con el popular Excell y sus opciones de importación de datos externos).
Los primeros datos obtenidos son estos: http://46.137.166.84/pulsepi/pulsos.csv (podeis importarlo a EXCELL).
El número que empieza por 135... es un timestamp unix, eso se convierte a dia mes año segundos y microsegundos con diferentes funciones, como por ejemplo, con éste código en PHP, que usa la función "date" : http://46.137.166.84/pulsepi/codigo_php.txt
Este PHP, ejecutado en un webserver da como salida un texto tal que éste: http://46.137.166.84/pulsepi/salida_php.txt
Al incorporar un servidor web y tener los datos de los pulsos en una base mysql, la manipulación de los datos y la representación con gráficos reshulones o listados de textos se hace mucho más potente.
Cada pulso son 100wh, según las especificaciones del contador. Para convertir esa energía a potencia media instantánea hay que restarle al tiempo actual el tiempo del anterior pulso y tendríamos P = 3600 seg/hr x 100 w*hr/((t-t1)seg) = 360000/(t-t1) w, simbolizando esos vatios el promedio de potencia instantánea consumida durante el pulso. Podeis ver cómo se hace eso en el programa PHP de ejemplo que os he puesto.
Los datos de esta primera prueba no han salido perfectos. Aunque como totalizador sí que serviría ya que el número de pulsos se corresponde (más o menos), con un error de 8 pulsos, con lo que me marca antes y después mi contador en su display. Sin embargo, hay pulsos fantasma que falsean los datos de potencia media instantánea.
El número de pulsos por hora es pequeño (unos pocos a la hora) y, además, aparecen errores, seguramente debido a "rebotes" en el hardware. Una cosa es cortocircuitar GPIO0 y GND a pata juntando cables (eso me salía muy bien) y otra depender de la caja de color que supone el circuito interno de impulsos del contador, que seguramente sea otro optoacoplador.
Se puede solucionar añadiendo un filtro, cambiando la alimentación de 3.3v a la de 5v o quizás poniendo un condensador entre colector y emisor de la salida de impulsos. Tengo que probarlo.
Tal y como está, creo que necesita un sensor adicional, de corriente en amperios, que nos de pulsos con mayor frecuencia, quizás uno cada 10 segundos o así. Este nuevo sensor ayudaría a corregir los falsos pulsos y, a la vez, podríamos usar los pulsos del totalizador de whr para autocalibrar el propio sensor, pero esto da para otro post y éste ya es un tocho.