martes, 14 de julio de 2015

New Horizons finalmente en Plutón

Imagen de Plutón a 766000 kilómetros de distancia tomada por la New Horizons 
16 horas antes del encuentro (NASA/APL-JHU/SwRI).
  
9 años había esperado para ver esta fotografía y ha valido totalmente la espera. Un símbolo de lo lejos que puede llegar la inventiva humana. 

 "A la espera de los datos del encuentro, hoy ya vivimos en un mundo que sabe qué aspecto tiene Plutón. A partir de ahora, cuando queramos hablar de Plutón o de un objeto del cinturón de Kuiper ya no usaremos borrosas imágenes del telescopio Hubble o pinturas de artistas, porque al fin tenemos imágenes reales obtenidas por un artefacto humano que hemos mandado a los límites del sistema solar."

lunes, 13 de julio de 2015

Simulando circuitos con ngspice

Ngspice es un simulador de circuitos gratuito y de código abierto desarrollado por el CAD Group de la Universidad de California, Berkeley. Si ya están familiarizados con otros programas basados en SPICE no debe ser mayor problema aprender a usarlo. Por otro lado, si están acostumbrado a las comodidades de programas como Multisim o Proteus hay algunas cosas que deben saber para empezar. La forma de trabajar con ngspice es la siguiente:
 Es necesario crear un directorio en donde estén guardados los archivos .mod (SPICE models) que contienen los modelos de simulación de los dispositivos electrónicos que van a utilizarse. Estos archivos no están incluidos en la instalación por defecto de ngspice, pero son proveídos por los mismos fabricantes de componentes. Estos modelos deben ser enlazados a los componentes desde gschem.

Instalación en Debian/Ubuntu/Linux Mint:

$ sudo apt-get install ngspice

Para instalar gschem y gnetlist instalamos el paquede gEDA:

$ apt-get update && apt-get install geda pcb gerbv

Abrimos gschem:

$ gschem

, buscamos "añadir componente" en la barra de herramientas (su ícono es una compuerta and) y usamos los siguientes componentes:

SPICE simulation elements > vsin-1.sym
Diodes (generic) > diode-1.sym
Basic devices > resistor.sym
Power rails > gnd-1.sym

La interfaz de gschem es bastante intuitiva. Para girar 90° un componente sólo hay que seleccionarlo y presionar las teclas E y R (una después de la otra). Una vez terminado el circuito se deben configurar los componentes para poder generar un netlist que pueda ser simulado correctamente por ngspice. Dando doble click en el diodo se abrirá una ventana dónde debemos añadir una propiedad value cuyo valor será 1N4001 y damos click en "añadir":
Hacemos lo mismo con la fuente de AC. En este caso, value ya aparecerá en la tabla por lo que solo debemos modificar su valor directamente escribiendo "sin 0 5 60Hz". Para agregar un valor a la resistencia, le damos click derecho a su símbolo y buscamos "añadir propiedad", se abrirá una ventana dónde en "nombre"  escribimos "value" y en "valor" escribimos su resistencia en Ohms (100 para este ejemplo), en la última opción seleccionamos "Mostrar solo valor". Después de esto ahora sólo hace falta enlazar el archivo de modelo de SPICE al símbolo del diodo. Para esto regresamos a "agregar componente" y buscamos SPICE simulation elements > spice-model-1.sym. Para este modelo en particular las propiedades deben ser las siguientes:

Observen que en file he escrito la ruta al archivo de modelo para el diodo 1N4007 (pueden descargar un modelo de ese diodo aquí, cambiando la extensión de .txt a .mod) . Guardamos el esquema con el nombre diodo.sch. El esquema terminado debe verse algo así:

Para generar el netlist escribimos:

$ gnetlist -g spice-sdb -o diodo.net diodo.sch

[NOTA: consultar sintaxis y opciones de gnetlist]

Ejecutamos con ngspice:

$ ngspice diodo.net

Ya dentro de la consola de ngspice escribimos:

tran 100us 100ms #dónde se indica 100us de step simulando de 0 a 100ms
plot v(2)

Se abrirá una ventana con la gráfica del voltaje en la resistencia:


NOTA: Deben tomar siempre en cuenta el nombre del modelo que está declarado dentro del archivo .mod. El modelo del 1N4007 que estoy usando es diferente al que pueden descargar en diodes.com. Si usan ese archivo, deben asigar valores para la propiedad value de DI_1N4007 en vez de 1N4007 (o simplemente cambiar el nombre en el script del modelo). Este es el contenido del archivo de diodes.com, señalo el lugar donde va el nombre del modelo:

*SRC=1N4007;DI_1N4007;Diodes;Si;  1.00kV  1.00A  3.00us   Diodes, Inc. diode
.MODEL DI_1N4007 D  ( IS=76.9p RS=42.0m BV=1.00k IBV=5.00u
+ CJO=26.5p  M=0.333 N=1.45 TT=4.32u )

viernes, 19 de junio de 2015

With our eyes so full of evening

domingo, 7 de junio de 2015

Monterrey

En marzo de este año presenté un póster sobre un trabajo de radioastronomía amateur en un congreso en Monterrey. El trabajo consistía en una modernización del proyecto RadioJOVE de la NASA utilizando sintonizadores de televisión HD (SDR-RTL) de bajo costo. En aquellos días estaba demasiado sentimental como para hacer una reseña más o menos objetiva de aquel viaje. Alguna vez un amigo, estudiante de física, me advirtió del error que es andar con una mujer de tu misma área profesional, un consejo que me llegó muy tarde (y que meses después mi amigo tuvo que tragarse). Yo no diría que es un error pero si una apuesta arriesgada. Si las cosas funcionan por años, debe ser una experiencia muy bonita. Congresos, escuelas de verano, escuelas de invierno, estancias de investigación, viajar por el país y por el mundo juntos como pareja haciendo lo que los les gusta. Uno de esos romances dignos de una pantalla grande. Pero no, yo no tuve esa suerte. Cuando uno pierde esa apuesta se paga con una experiencia que puede llegar a ser bastante incomoda. Congresos, escuelas de verano, escuelas de invierno, estancias de investigación, viajar por el país y por el mundo topándote con exnovia, quizá por el resto de tu vida profesional. Por supuesto, si uno queda en buenos términos de amistad puede ser divertido, pero aquí es donde vuelvo a perder también.  Y como si el destino gozara de ver en desgracia a los mortales, mi cámara fue robada en el hotel en una situación tan extraña que parecía un relato de Sherlock Holmes. C'est la vie. No fue el viaje perfecto pero a pesar de todo lo disfruté mucho, y creo que eso es algo que puedo decir hasta ahora. Iba acompañado de buenos amigos que siempre supieron como animarme, aprendí mucho en muchos aspectos y, como siempre ocurre en estos eventos, conocí gente interesante y muy agradable. El drama de todos los días de un estudiante de ciencias.

sábado, 6 de junio de 2015

Escribir y compilar un programa en C con gcc desde terminal

Abrimos una consola, asegurándonos de que estamos en nuestra carpeta personal (puedes hacerlo con el comando pwd) y escribimos:
$ mkdir Programas  # Creamos una nueva carpeta
$ cd Programas       # Nos movemos a la carpeta Programas
~/Programas$ nano ejemplo.c # Creamos nuevo archivo .c
~/Programas$ gcc -o ejemplo ejemplo.c # Compilamos y creamos código objeto con el nombre ejemplo.o
~/Programas$ ./ejemplo # Ejecutamos código objeto

viernes, 5 de junio de 2015

Meetup

Esta semana hice algo de lo que tenía mucha curiosidad: ir a un meetup. Este en particular fue muy interesante ya que la temática era hacer un intercambio cultural entre extranjeros radicando en Puebla y mexicanos. Compartí una buena tarde con gente de Turquía, India (un estudiante de doctorado de astrofísica en INAOE) y EU (Ian, el fundador del grupo Foreing Exapts, Mexicanos and Poblanos). Meetup no es una plataforma muy conocida en México, sumémosle que la seguridad aquí no es nuestro fuerte, y es difícil encontrar eventos en la provincia. Espero que eso pronto pueda cambiar. Es justo el tipo de sitios donde el internet se usa para romper tu burbuja de confort y vivir algo nuevo en la vida real.

viernes, 10 de abril de 2015

sábado, 21 de marzo de 2015

02:25 am

Me arrepiento de perder la costumbre, si alguna vez la tuve, de escribir con regularidad. Este blog sería como un registro al que podría acudir para auxiliar a mi memoria o analizar mi vida de forma más ordenada. Una libreta de apuntes técnicos de mi vida. Pero siendo honesto conmigo mismo, esa no era la verdadera razón por la que yo escribía. Era y es una necesidad de dejar una huella en este mar de la existencia. Puedo presumir que a mis 24 años he llevado una vida de novela literaria. ¿No es esto un ya buen motivo para escribir sobre ella? Quizá temo palidecer los detalles sobre una mala redacción. But who knows? nunca es tarde para recuperar o construir un hábito.

jueves, 19 de marzo de 2015

Gráfica de un Patrón de Radiación 3D con Python

Para este programa se están utilizando datos obtenidos de una simulación de un dipolo de media onda en HFSS en un archivo csv.

# -*- coding: utf-8 -*-
"""
@author: Rodolfo Escobar
"""


import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm

data = np.loadtxt('dipolo_16.csv',delimiter=',',skiprows=1)

theta = data[:,0]
phi = data[:,1]
r = data[:,2]

a = 0.0174532925
phi_rad = a*phi;
theta_rad = a*theta;

#Conversión de coordenadas
x = r * np.sin(phi_rad) * np.cos(theta_rad)
y = r * np.sin(phi_rad) * np.sin(theta_rad)
z = r * np.cos(phi_rad);

x = np.reshape(x,(73, 37))
y = np.reshape(y,(73, 37))
z = np.reshape(z,(73,37))
R = np.reshape(r,(73,37))

N = R/R.max()

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=2,facecolors=cm.coolwarm(N),cmap = 'coolwarm',linewidth=0.5 )
surf.set_edgecolor('k')

# Equivalente a la instrucción axis equal en Matlab
max_range = np.array([x.max()-x.min(), y.max()-y.min(), z.max()-z.min()]).max() / 2.0

mean_x = x.mean()
mean_y = y.mean()
mean_z = z.mean()

ax.set_xlim(mean_x - max_range, mean_x + max_range)
ax.set_ylim(mean_y - max_range, mean_y+ max_range)
ax.set_zlim(mean_z - max_range, mean_z + max_range)
#

plt.title(u'Patrón de Radiación')
m = cm.ScalarMappable(cmap=cm.coolwarm)
m.set_array(R)
cbar = fig.colorbar(m,shrink=0.8, aspect=9)
cbar.set_label('dB')
plt.rc('ytick', labelsize=7)
plt.show()




lunes, 16 de marzo de 2015

Graficar una esfera con coordenadas esféricas en Matlab

Una manera de hacer la gráfica de una esfera hueca es primero construir el cascaron como una superficie expresada con coordenadas esféricas y después convertirlas a coordenadas cartesianas con la función sph2cart(). Matlab utiliza la convención alta-azimutal para coordenadas esféricas por lo que se tiene que considerar a la hora de traducir funciones expresadas con otras convenciones (por ejemplo, aquellas que miden theta desde el eje Z).  En este ejemplo estoy graficando una esfera unitaria centrada en el origen pero pueden modificar el radio multiplicándolo por el valor que deseen y sumando un offset a las coordenadas cartesianas para moverla. Este ejemplo también funciona sin ningún problema en Octave, que es la versión abierta y gratuita de Matlab.

%Esfera de radio unitario en coordenadas esféricas 
Az = linspace(0,2*pi,50); %phi
El = linspace(-pi,pi,50); %theta
r = ones(1,50);

%Construcción de malla
[El,Az] = meshgrid(El,Az);
r = meshgrid(r);

%La conversión se realiza después de construir la malla
[X,Y,Z] = sph2cart(Az,El,r);

mesh(X,Y,Z), axis equal