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 habito.

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

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.

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

%Construcción de malla
[phi,theta] = meshgrid(phi,theta);
r = meshgrid(r);

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

mesh(X,Y,Z), axis equal




viernes, 13 de febrero de 2015

Escudo de la BUAP (Blanco, PNG)


A veces hace falta un escudo blanco para hacer contraste en un fondo negro para algún póster científico o presentación. El escudo es invisible por el fondo blanco de la plantilla del blog pero ahí está. Puedes verlo dando click al espacio en blanco.

lunes, 17 de noviembre de 2014

Simulación de circuitos eléctricos en Simulink

Bloques usados:

Solver Configuration: (Simscape>Utilities)
Voltage Sensor: (Simscape >Foundations Library>Electrical>Electrical Sensors)
Current Sensor: (Simscape >Foundations Library>Electrical>Electrical Sensors)
PS-Simulink Converter: (Simscape >Utilities)
Resistor  (Simscape>Foundations Library>Electrical>Electrical Elements)
Electrical Reference  (Simscape>Foundations Library>Electrical>Electrical Elements)
AC Voltage Source     (Simscape>Foundations Library>Electrical>Electrical Sources)
Mux  (Simulink >Common Used Blocks)
Scope  (Simulink>Sinks)

Para este modelo se dejó la configuración del Solver en default con la fuente de voltaje a 10 V pico-pico a 60 Hz y la resistencia es de 50 ohms. El tiempo de simulación es de 0.06 segundos.
Nota: Cómo activar las leyendas en el Scope.

viernes, 3 de octubre de 2014

Guadalajara

Creo que siempre recordaré Guadalajara como el más agridulce de mis viajes. Tenía expectativas muy altas con la ciudad y con mis pretensiones, pero algo bajas con aquel congreso de astrobiología. Todo fue al revés. La ciudad, aunque bastante limpia y ordenada a mi parecer, no era precisamente la hermosa urbe colonial que tenía en la mente. Fue sin lugar a dudas uno de los mejores congresos a los que he asistido. Después de malas impresiones por ver una y otra vez en congresos anteriores trabajos mediocres hechos por estudiantes forzados, servicios sociales y gente que sólo va a alcoholizarse en la ciudades sede, no esperaba mucho. Cambié inmediatamente de opinión y me alegró saber que aún hay muchos estudiantes verdaderamente apasionados por la ciencia. Hice muy buena amistad con los compañeros de mi universidad que también asistieron al evento, personas que lamento no haber conocido antes. Pero la razón por la cual terminé en Jalisco fue la misma que me entristeció las cosas. Lo que creí era una oportunidad de mejorar mi relación me hizo darme cuenta en realidad de que tan mal estaban ya las cosas.

martes, 19 de agosto de 2014

Buscando a Waldo con Matlab

Una aplicación entretenida de la correlación cruzada normalizada es la detección de una imagen patrón en una imagen de mayor tamaño. Esta correlación está definida matemáticamente como 

dónde f(x,y) representa a la función de imagen y t(x,y) la función de templete o imagen patrón que se desea detectar. En nuestro programa ese templete será este segmento de imagen dónde aparece Waldo:


Nuestra función principal será el siguiente mapa en el que habrá que encontrar a Waldo:


Para encontrarlo utilizaremos la función normxcorr2(). Esta función retornará un arreglo bidimensional resultado de la correlación cruzada del templete y la imagen. Para encontrar la posposición de Waldo en la imagen bastará con encontrar el punto donde la función alcanza su máximo. El arreglo resultante será tan grande como la imagen del mapa por lo que habrá que seleccionar una pequeña región alrededor del pico para poder visualizarlo mejor:

 Para encontrar la posición del pico utilizamos la función max() con la siguiente sintaxis:

[pico,indice] = max(c(:)); % Obtener valor del pico y su índice

El arreglo c representa a la función de de correlación. Hasta aquí la variable pico contiene el valor del máximo y la variable indice contiene la posición del valor máximo como si la matriz c estuviera distribuida en un arreglo vectorial. Para conocer la verdadera poción del pico en la imagen se necesita la función  ind2sub():

[y,x] = ind2sub(size(c),indice); % Obtener posición en la imagen 

Teniendo ahora la posición de Waldo solo queda mostrar la imagen completa con un rectángulo superpuesto para señalarlo:


 El programa completo es quizá más compacto de lo que pudieron haber pensado

clc,clear
mapa = imread('Waldo.jpg'); %Carga imagen del mapa
waldokernel = imread('waldok.jpg'); % carga templete de Waldo
c = normxcorr2(waldokernel(:,:,1),mapa(:,:,1)); % Correlación cruzada normalizada
[pico,indice] = max(c(:)); % Obtener valor del pico y su índice
[y,x] = ind2sub(size(c),indice); % Obtener posición en la imagen
ccut = c(y-45:y+45,x-45:x+45); % Recortar región alrededor del pico
imshow(mapa)
hold on
rectangle('Position',[x-50,y-43,70,70], 'LineWidth',2)
figure(2),surf(ccut), shading flat, title('Pico en Correlación Cruzada')



miércoles, 23 de julio de 2014

Elisyum

En un conversación divagada le comenté a un amigo una idea que he traído en la cabeza desde hace mucho. Se trata de construir una ciudad desde cero con todo lo mejor que México puede ofrecer: las mejores universidades, centros de investigación, hospitales y fabricas de alta tecnología así como las oficinas de las empresas más grandes, es decir, una Hong Kong mexicana en la cosa de Veracruz o Oaxaca. Me hizo ver inmediatamente que esa idea le recordó a la película de Elisyum. Quizá tenga razón. Aumentar aún más la desigualidad en el país dista de ser una solución. Pero me queda la curiosidad. ¿Qué pasaría si existiera una ciudad así?

jueves, 26 de junio de 2014

Problema al implementar un programa asíncrono en VHDL

Supongamos que tenemos un programa muy simple en VHDL en el que prendemos y apagamos dos leds mediante dos interruptores: 

library ieee;
use ieee.std_logic_1164.all;

entity leds is
port( a,b : in std_logic;
     s1,s2: out std_logic);   
end leds;

architecture control of leds is
begin

s1 <= a;
s2 <= b;

end control;


Para la tarjeta de desarrollo Basys2 nuestro archivo .ucf quedaría:

# Interruptores
NET "a" LOC = P11;
NET "b" LOC = L3;

# Leds
NET "s1" LOC = M5;
NET "s2" LOC = M11;


Hasta aquí todo parece en orden e incluso nuestro programa funciona bien en la simulación. Pero un problema muy común entre los estudiantes de los primeros cursos de sistemas digitales es que al momento de cargar el archivo .bit de un programa asíncrono como este a una tarjeta de desarrollo, ésta se queda sin hacer nada. Esto ocurre porque la tarjeta espera arrancar por default con el oscilador interno aunque no lo usemos en el programa (razón por la que este problema muy rara vez se presenta en programas que si lo usan). Este problema se resuelve simplemente haciendo click derecho sobre "Generate Program File", buscar "Process Properties" que nos abrirá la siguiente ventana en la debemos buscar la categoría "Startup Options" y cambiar la opción de FPGA Start-Up Clock de CCLK a JTAG Clock:

domingo, 22 de junio de 2014

Control PID para el modelo simple de una masa móvil


Supongamos que tenemos un pequeño vehículo de masa 'm' que se encuentra en una posición inicial x0 que queremos llevar hasta una posición final xr. Para simplificar las cosas supondremos que no existe fricción entre las ruedas y el suelo ni resistencia al aire. El modelo de nuestra planta queda descrito entonces por la 2da Ley de Newton:


dónde la fuerza F(t) es la entrada y la posición x(t) nuestra salida de la planta. Obteniendo la transformada de Laplace,su función de transferencia nos queda:


Observe que cuando a 'm' se le asigna una masa unitaria G(s) se convierte en un doble integrador. Para este modelo, como debe haberse tratado en cualquier curso de control, un controlador proporcional resulta ineficaz. Un controlador de este tipo únicamente mantendría oscilando el carrito al rededor de la posición deseada sin alcanzar nunca la estabilidad. Incluso considerando la resistencia al aire, este tipo de controlador mostrará una respuesta transitoria indeseable. Para control ideal, donde el carrito acelere y desacelere suavemente hasta detenerse justo (casi en este caso sin fricción ni resistencia al aire) en la posición que queremos requerimos un controlador PID. Las ganancias para controlar un doble integrador ideal son:


Corriendo nuestro modelo en Simulink estos son son los resultados:



lunes, 28 de abril de 2014

Pruebas con adaptador Canon para telescopio (impreso 3D)

Hace poco mandé a imprimir en la Inventoteca una montura EF que se puede descargar en Thingiverse. Después de un intento fallido y varias vueltas, finalmente mi novia y yo lo probamos en su telescopio y funcionó de maravilla. ¡He aquí algunas fotos!: