domingo, 26 de enero de 2014

Graficar los datos de un archivo csv

 Un archivo csv=Comma Separated Values es un formato de archivo en que los datos de interés están separados por comas (u otros separadores), estos datos de interés pueden ser datos numéricos, o cadenas de caracteres.
En la presente entrada, solo nos interesan los datos numéricos, que pueden provenir de un archivo de hoja de calculo como Libre Office Calc,  MS Excel o pueden guardar resultados de simulaciones.

Este es un script de python que  procesa y grafica un archivo csv, se necesitan las librerias "pylab" y "csv".

 # procesar_csv.py  
 import pylab as pl  
 import csv  
 #  
 entrada = open('test.csv')  
 tabla = []  
 for fila in csv.reader(entrada):  
   tabla.append(fila)  
 entrada.close()  
 x=[0]  
 y=[0]  
 for fila in range(1, len(tabla)):  
     x.append(float(tabla[fila][0]))  
     y.append(float(tabla[fila][1]))  
 pl.plot(x,y)  
 pl.xlabel('Tiempo[s]')  
 pl.ylabel('Tension[V]')  
 pl.title('Ejemplo de grafica de un archivo csv')  
 pl.savefig('imagen.png')  
 pl.show()  


Este será el contenido del archivo csv de prueba, guardar como "test.csv", en el mismo directorio del script "procesar_csv.py"

 "TIME","?"  
 0,0  
 8.888888889e-05,10.4198  
 0.0001777777777,20.8278  
 0.0003555555555,41.5621  
 0.0007111111111,82.3786  
 0.001266666666,142.929  
 0.001822222222,197.233  
 0.002377777777,242.917  
 0.002933333333,277.985  
 0.003488888888,300.903  
 0.004044444444,310.67  
 0.0046,306.859  
 0.005155555555,289.638  
 0.005711111111,259.757  
 0.006266666666,218.524  
 0.006822222222,167.741  
 0.007377777777,109.626  
 0.007933333333,46.7202  
 0.008488888888,-18.2275  
 0.009044444444,-82.3786  
 0.0096,-142.929  
 0.01015555555,-197.233  
 0.01071111111,-242.917  
 0.01126666666,-277.985  
 0.01182222222,-300.903  
 0.01237777777,-310.67  
 0.01293333333,-306.859  
 0.01348888888,-289.638  
 0.01404444444,-259.757  
 0.0146,-218.524  
 0.01515555555,-167.741  
 0.01571111111,-109.626  
 0.01626666666,-46.7202  
 0.01682222222,18.2275  

Al ejecutar el script sobre el archivo csv anterior se obtiene la siguiente figura:

Panel fotovoltaico en python


Anteriormente publicamos como simular un panel fotovoltaico con GNU Octave, en la presente entrada haremos lo mismo para python, haciendo uso de las librerías numpy y matplotlib.


 import numpy as np  
 import matplotlib.pyplot as plt  
 def ipanel(V,T,G,Voc):  
   Isc=3.76  
   Ns=36.0  
   Np=1.0  
   A=1.3  
   Ki=3e-3  
   Eg=1.15  
   k=1.38e-23  
   q=1.6e-19  
   Tref=273.0+25.0  
   Tc=273.0+T  
   Irs=Isc/(np.exp(q*Voc/(Ns*k*A*Tc))-1)  
   Is=Irs*(Tc/Tref)**3*np.exp(q*Eg*(1/Tref-1/Tc)/(k*A))  
   Iph1=(Isc+Ki*(Tc-Tref))*G  
   iVTG1=Np*Iph1-Np*Is*(np.exp(q*V/(Ns*k*Tc*A))-1)  
   iVTG1=0.5*(iVTG1+np.abs(iVTG1))  
   return iVTG1  
 Vfv=np.arange(0,30.1,0.1)  
 # respuesta de la corriente cuando variamos temperatura   
 # y mantenemos la irraradiación "G" constante  
 T=np.array([25.0,40.0,60.0])  
 IT1=ipanel(Vfv,T[0],0.75,21.7)  
 IT2=ipanel(Vfv,T[1],0.75,21.7)  
 IT3=ipanel(Vfv,T[2],0.75,21.7)  
 plt.figure(1)  
 p1,=plt.plot(Vfv,IT1)  
 p2,=plt.plot(Vfv,IT2)  
 p3,=plt.plot(Vfv,IT3)  
 plt.legend([p3, p2, p1], ["T=60","T=40", "T=25"])  
 plt.ylabel("Corriente[A]")  
 plt.xlabel("Tension[V]")  
 plt.show()     
 plt.savefig('img1.png')  
 #grafica de potencia, pára las condiciones anteriores  
 plt.figure(2)  
 p1,=plt.plot(Vfv,IT1*Vfv)  
 p2,=plt.plot(Vfv,IT2*Vfv)  
 p3,=plt.plot(Vfv,IT3*Vfv)  
 plt.legend([p3, p2, p1], ["T=60","T=40", "T=25"])  
 plt.ylabel("Potencia[W]")  
 plt.xlabel("Tension[V]")  
 plt.show()   
 plt.savefig('img2.png')  
 # respuesta de la corriente cuando variamos G  
 # y mantenemos la temperatura constante  
 G=np.array([0.5,0.75,1])  
 IG1=ipanel(Vfv,T[0],G[0],21.7)  
 IG2=ipanel(Vfv,T[0],G[1],21.7)  
 IG3=ipanel(Vfv,T[0],G[2],21.7)  
 plt.figure(3)  
 p1,=plt.plot(Vfv,IG1)  
 p2,=plt.plot(Vfv,IG2)  
 p3,=plt.plot(Vfv,IG3)  
 plt.legend([p3, p2, p1], ["G=1.0","G=0.75", "G=0.5"])  
 plt.xlabel("Tension[V]")  
 plt.ylabel("Corriente[A]")  
 plt.show()   
 plt.savefig('img3.png')  
 #grafica de potencia, pára las condiciones anteriores  
 plt.figure(4)  
 p1,=plt.plot(Vfv,IG1*Vfv)  
 p2,=plt.plot(Vfv,IG2*Vfv)  
 p3,=plt.plot(Vfv,IG3*Vfv)  
 plt.legend([p3, p2, p1], ["G=1.0","G=0.75", "G=0.5"])  
 plt.xlabel("Potencia[W]")  
 plt.ylabel("Corriente[A]")  
 plt.show()   
 plt.savefig('img4.png')  







Creacion de Script para Instalar Lamp en CentOS y uso de SCP

Creacion de Script para Instalar Lamp en CentOS y uso de SCP

BASH es un shell de Unix (intérprete de comandos de Unix) escrito para el proyecto GNU. Su nombre es un acrónimo de bourne-again shell (otro shell bourne); haciendo un juego de palabras (born-again significa renacimiento) sobre el Bourne shell (sh), que fue uno de los primeros shells importantes de Unix.
Bash es el shell por defecto de la mayoria de sistemas GNU/Linux
Por eso es que un script bash es el tiene manejo de la consola del servidor,este post veremos la creación de un script para la instalación de un entorno LAMP(Linux, Apache,Mysql y Php) para un servidor CentOS,aunque algunos ya empiezan a llamar GLAMP a este entorno, dándole el crédito que merece GNU, poniendo de manera mas notoria que GNU no es igual a Linux. Lo expuesto aquí respecto a la creación de script puede ser implementado para servidor Debian, Ubuntu,Opensuse cambiando la sintaxis de su manejo de paquetes de instalación y actualizaciones Un script posee la siguiente base, lo cual lo identifica como tal para el interprete bash de la consola Linux, estas etiquetas son: 

#!/bin/bash  
# -*- ENCODING: UTF-8 -*-  

Estas dos etiquetas van al inicio del script, para crear y ejecutar un script simplemente habría que hacer los dos siguientes pasos
  • Crear y editar un archivo para script, con la característica que termine el nombre del archivo con .sh
  • Otorgar permisos y ejecutar el archivo

Creación y edición 

La creación de un archivo en consola de un sistema GNU/Linux se realiza : 
#touch script.sh  
El comando Touch creara un archivo en blanco, aqui vemos que nuestro script (el cual podria tener cualquier nombre) utiliza la terminación .sh, el cual lo identificara del resto de archivos como script shell también podríamos ahorrarnos este paso usando un editor de texto,pues un editor de texto crear el archivo si este no existe, en nuestro caso utilizare el script sera nano 
#nano script.sh 

miércoles, 22 de enero de 2014

Modelado de Motores DC

 Para poder usar adecuadamente un motor es necesario conocer sus características y estudiar su comportamiento en las condiciones en que será usado, en esta entrada se propone el uso de LTspice para el análisis, procurando integrar el comportamiento mecánico y térmico del motor. LTspice, es un software de simulación, aunque gratuito, no es libre, esta basado en Spice, y es desarrollado por Linear Technology, incluye mejoras que lo hacen recomendable para simular circuitos que trabajen en modo de conmutación, aunque bien sirve para cualquier tipo de simulación análogica.Para descargarlo, acceder al siguiente enlace: Descargar LTspice Para modelar un motor se debe recurrir a parámetros proporcionados en hojas de datos de fabricantes, o en su defecto recurrir a mediciones y captura de datos, que permitan obtener los parámetros de un modelo dado y posteriormente, estudiar el comportamiento del motor. Un motor DC esta constituido de dos partes, el rotor y el estátor, en el rotor encontramos un bobinado, el cual presenta un comportamiento Resistivo que se debe a la resistencia del cable bobinado, mas un comportamiento inductivo, este debido a la bobina arrollada sobre el núcleo, adicionalmente , se tiene una caída de tensión interna conocida como fuerza contraelectromotriz.


Figura 1: Modelo Basico de un Motor DC
$v=Ri+L\dfrac{di}{dt}+v_e$.............................(1)

Donde: $v$ es el voltaje aplicado. $R$ y $L$ son la resistencia e inductancia del bobinado, respectivamente. $i$ es la corriente en el motor. $v_e$ es la fuerza contraelectromotriz.

La ecuación (1) se complementa con otra que relaciona el torque y la velocidad angular en el eje del motor:
 $T_M=J\dfrac{d\omega}{dt}+B\omega+T_L$..............................(2)

Donde: $J$ es la inercia del rotor. $B$ es el coeficiente de fricción. $T_M$ es el torque Entregado + Pérdidas. $T_L$ es el torque en la carga. Con la ecuación (2), se puede crear un circuito eléctrico que modele, la relación entre $T_M$, $T_L$ y $\omega$, de tal manera que se pueda estudiar la relación entre ese conjunto de variables.

Figura 2: Circuito que modela el comportamiento mecánico
Este circuito representa una analogía eléctrica de la ecuación (2) $I1=C\dfrac{dv}{dt}+(\frac{1}{R})v+I2$ Esta ecuación representa al circuito de la Figura 2, notar que la tensión es la misma para todos los elementos, por estar en paralelo, y representa a la velocidad angular en el motor. Este es un paralelo entre la ecuación mecánica y su circuito eléctrico equivalente: $I1$ representa a $T_M$ $R$ representa a $1/B$, es decir la inversa del valor de la fricción. $C$ representa a $J$, la inercia del rotor $I2$ representa al torque de carga aplicado al eje del motor. $v$ que llamaremos a la tensión en los nodos marcados como salidas, representa a la velocidad angular. Debido a que ambos circuitos modelan las relaciones entre las variables eléctricas y mecánicas del motor, pero lo hacen por separado, es necesario, juntarlas en un mismo modelo y en base a este crear una simulación. Las ecuaciones que generan la interacción entre ambos circuitos se obtienen de la relación entre $T_M$ e $i$ y entre $v_e$ y $\omega$: Entre el torque y la corriente existe una proporcionalidad, determinada por una llamada constante de torque $K_i$.
$T_M=K_ii$.............................(3)

 Entre la velocidad angular del motor y la fuerza contraelectromotriz la relación es. $v_e=K_e\omega$..............................(4)

 De tal manera que en la Figura1 la fuente de tensión $v_e$ no es una fuente independiente sino una fuente dependiente del valor de $\omega$, de la misma manera en la Figura 2, la fuente de Intensidad $I1$ es dependiente del valor de la corriente en el primer circuito, en LTspice, como en otros simuladores estos comportamientos se modelan usando fuentes dependientes "e" que son fuentes de tensión controladas por tensión y fuentes "f" que son fuentes de corriente controladas por corriente.

Figura 3: Modelo que interacciona el comportamiento eléctrico y mecánico

En la Figura 3, se puede observar que la fuente $Ke$ es una fuente "e" y depende de la tensión en el Nodo W (con respecto al nodo de Tierra o GND)la fuente $Ki$ es una fuente "f" cuya tensión de control es la corriente $i$ que recorre a todos los elementos del primer circuito, la salida de $K_i$ representa al torque y la salida de la fuente $K_e$ representa a la fuerza contralectromotriz. El circuito de la Figura 3, será usado para modelar el comportamiento de un motor MAXON RE30, el cual viene disponible en 5 diferentes tensiones nominales: 12V, 18V 24V, 36V, 48V. Los datos técnicos para este tipo de motor, lo encontramos en: Motor Maxon RE30

 
Figura 4: Datos técnicos del motor Maxon RE30
A modo de ejemplo, el modelado se llevara a cabo con el motor de $12V$, para este motor, los parámetros a usar son:

Tabla 1: Datos técnicos Necesarios para el Modelado
Terminal Resistance Terminal Inductance Rotor Inertia Torque ConstantSpeed ConstantNo Load Current No Load Speed
$0.198 \Omega$ $0.0345 mH$ $33.5gcm^2$ $13.9 mN m/A$$685 rpm/V$$300 mA$$8170 rpm$
Antes de proseguir, se debe establecer las unidades, de las variables involucradas.

Tabla 2: Unidades SI
Variable:Tensión Corriente TorqueVelocidad Angular
Unidad: $V$ $A$ $N m$$rad/s$

Convirtiendo los valores de la tabla anterior a las unidades convenidas:


Tabla 3: Datos de la tabla 1 convertidos al SI
Terminal Resistance Terminal Inductance Rotor Inertia Torque ConstantSpeed ConstantNo Load Current No Load Speed
$0.198 \Omega$ $34.5 \mu H$ $3.35\mu Kg.m^2$ $13.9m \frac{Nm }{A}$$71.73\frac{rad/s}{V}$ $0.3A$ $855.6\frac{rad}{s}$


La contante $B$ modela las perdidas por fricción, para obtenerla analicemos el circuito de la Figura 3 en estado estacionario y para condiciones en que el torque de carga es nulo, con lo cual se anulan el efecto del inductor y el capacitor (inercia del rotor), con esto el modelo se reduce a la Figura 5.


Figura 5: Equivalente del modelo del motor, en estado permanente en condiciones sin carga

De la Figura 5, podemos deducir: $K_ii=B\omega$. Con lo que $B=K_ii/\omega$, donde $i$ es la corriente en condiciones sin carga (en la tabla es :"No Load Current") y $\omega$ es velocidad angular en condiciones sin carga (en la tabla es: "No Load Speed"), usando los valores de la Tabla 3 tenemos $B=4.874x10^-6\frac{Nm}{rad/s}$ El valor de $K_e$, es el inverso de la "Speed Constant", consignada en la Tabla 3, notar que es prácticamente igual a $K_i$, por lo que en caso de no ser consignada una de las dos se puede usar el mismo valor para ambas. Con esto, se tiene que los parámetros deben tener los siguientes valores:


Tabla 4: Valores de los Parámetros
$R$ $L$ $J$ $K_i$$K_e$$B$
$0.198 \Omega$ $34.5 \mu H$ $3.35\mu Kg.m^2$ $13.9m \frac{Nm }{A}$$13.94m\frac{V}{rad/s}$ $4.874\mu\frac{Nm}{rad/s}$


Hasta aquí ya se calcularon todos los valores de los parámetros necesarios para el modelo propuesto, la mayoría se obtienen directamente de la hoja de datos, otros se deben convertir a unidades Estándar, y solo uno calcularlo en base a datos de la hoja técnica.lo que sigue, sería, ingresarlos en LTspice.


Figura 6: Modelo para el motor Maxon

Los Valores de $R1$, $L1$, $C1$ y $V1$, se ingresan directamente La fuente E1 se configura así:


Figura 8: Configuración de la fuente E1

La fuente F1 se configura así:

Figura 8: Configuración de la fuente F1

El valor de $R2$ que se debe ingresar corresponde al inverso de $B$, es decir $R2=1/B=205.17k$. Como debe ser obvio, la equivalencia del circuito propuesto para analizar el comportamiento del motor es a nivel numérico, a nivel de unidades de medida cada magnitud mecánica estará según le corresponda en la Tabla 2, es decir el Torque en $Nm$ (en el simulador aparecerá en $A$), y la velocidad angular en $rad/s$ (en el simulador aparecerá en $V$).  

Testeando el modelo:
 
Figura 9: Curvas de Torque vs Velocidad angular, a diferentes tensiones
Estas curvas muestran la relación entre el torque y la velocidad angular, el punto de trabajo exacto, lo determinaran la carga mecánica acoplada al motor, si lo que queremos es estudiar el desempeño del motor con una cierta carga, es necesario realizar un modelado de la carga e ingresarlo a Ltspice y estudiar la respuesta.


Figura 10: Respuesta transitoria de velocidad a diferentes tensiones
.
Figura 11: Curvas de Torque vs Potencia, en varios valores de tensión
La Figura 11, muestra la potencia mecánica que puede suministrar el motor, en función del torque, observar que en la Figura 4 (Datos de Maxon), el valor nominal de potencia es $60W$ y el valor nominal de torque es de $51.7mNm$, esto significa que aunque el motor puede sobrepasar estos valores, no es saludable para su vida útil, que lo haga por mucho tiempo.


Figura 12: Curvas de Torque vs Eficiencia, en varios valores de tensión
Hasta aquí se ha logrado construir un modelo que emula el comportamiento eléctrico y mecánico del motor, además de lo que se muestra, se puede támbien graficar el diagrama de Bode de la respuesta en frecuencia del motor, se pueden también estudiar los efectos de diversas cargas, respuesta a una señal PWM, mostrar el desempeño en un sistema de control, en fin, bastantes posibilidades adicionales. Si bien el presente análisis se ha llevado a cabo con datos ya proporcionados por el fabricante, en caso de no disponer de ellos, se puede modelar experimentalmente el motor y la carga y adecuarlo al modelo propuesto, para llevar a cabo diferentes análisis. El mismo análisis se puede llevar a cabo usando algún otro simulador de circuitos, con similares resultados, se pueden realizar cálculos referentes al transitorio, como referentes al estado permanente (por ejemplo curvas de torque y velocidad).

Panel fotovoltaico en GNU Octave


GNU Octave es un software libre para análisis numérico,el lenguaje de Octave, es bastante similar y compatible con Matlab, por lo que, muchos scripts pueden funcionar en ambos software. Las funcionalidades de Octave pueden extenderse mediante Toolbox distribuidas libremente en Octave Forge.

A continuación mostramos el uso de Octave para analizar el desempeño de un panel fotovoltaico frente a variaciones en la temperatura y  la irradiación solar.

Un panel fotovoltaico es un arreglo de células fotovoltaicas. Las células o celdas fotovoltaicas l tienen la propiedad de convertir energía luminosa en energía eléctrica.

La relación entre la corriente y el voltaje, depende de la temperatura, la irradiación solar, y del tipo de tecnología de que esta hecha la célula.

Visitando el blog de ramirozky podemos encontrar mas detalles de como modelar un panel fotovoltaico, para posteriormente ejecutar el modelo en Scilab/Xcos, en la presente entrada nos remitiremos únicamente a reescribir el script de ramirosky  para poder ser ejecutado en octave.

function ipanel=ipanel(V,T,G,Voc)  
 Isc=3.76;  
 Ns=36;  
 Np=1;  
 A=1.3;  
 Ki=3e-3;  
 Eg=1.15;  
 k=1.38e-23;  
 q=1.6e-19;  
 Tref=273+25;  
 Tc=273+T;  
 Irs=Isc/(exp(q*Voc/(Ns*k*A*Tc))-1);  
 Is=Irs*(Tc/Tref)^3*exp(q*Eg*(1/Tref-1/Tc)/(k*A));  
 Iph1=(Isc+Ki*(Tc-Tref))*G;  
 iVTG1=Np*Iph1-Np*Is*(exp(q*V/(Ns*k*Tc*A))-1);  
 endfunction  


La función anterior puede guardarse con el nombre "ipanel.m" y llamarla desde octave, antes de cualquier llamada, debe agregarse el directorio donde se tiene guardada la función

 addpath(Directorio_donde_esta_la_función)

A continuación un ejemplo de como usar la función para graficar las curvas I-V definidas para distintos valores de Temperatura e irradiación.

 V=[0:.1:30];  
 T1=25;  
 T2=40;  
 T3=60;  
 v1=size(V);  
 for j = 1:v1(1,2)  
 i1(j)=ipanel(V(j),T1,.75,21.7);  
 i2(j)=ipanel(V(j),T2,.75,21.7);  
 i3(j)=ipanel(V(j),T3,.75,21.7);  
 i4(j)=ipanel(V(j),T1,.5,21.7);  
 i5(j)=ipanel(V(j),T1,.75,21.7);  
 i6(j)=ipanel(V(j),T1,1,21.7);  
 end  
 figure(1);  
 plot(V,i1,V,i2,V,i3);  
 grid;  
 xlabel("TENSION [V]");ylabel("CORRIENTE [A]");  
 title("VARIACION DE LA INTENSIDAD CON LA TEMPERATURA");  
 legend("T=25","T=40","T=60"); 
 %print -dpng -color "/home/v_var_t";  
 figure(2);  
 plot(V,i1.*V,V,i2.*V,V,i3.*V);  
 grid;  
 xlabel("TENSION [V]");ylabel("POTENCIA [W]");  
 title("VARIACION DE LA POTENCIA CON LA TEMPERATURA");  
 legend("T=25","T=40","T=60");  
 %print -dpng -color "/home/p_var_t";  
 figure(3);  
 plot(V,i4,V,i5,V,i6);  
 grid;  
 xlabel("TENSION [V]");ylabel("CORRIENTE [A]");  
 title("VARIACION DE LA INTENSIDAD CON LA IRRADIACION");  
 legend("G=0.50","G=0.75","G=1.00");  
 %print -dpng -color "/home/v_var_irr";  
 figure(4);  
 plot(V,i4.*V,V,i5.*V,V,i6.*V);  
 grid;  
 xlabel("TENSION [V]");ylabel("POTENCIA [W]");  
 title("VARIACION DE LA POTENCIA CON LA IRRADIACION");  
 legend("G=0.50","G=0.75","G=1.00");  
 %print -dpng -color '/home/p_var_irr';   

Si deseas salvar los gráficos en archivos png, borrar el "%", antes del comando "print".

El resultado al ejecutar el ultimo script, son 4 ventanas con las siguientes figuras:





Esto es todo, cualquier comentario, no duden en hacerlo llegar.