jueves, 29 de octubre de 2015

Existencialismo

Si me preguntaran cuales han sido los 3 libros que marcaron mi vida, simplemente diría que sólo hay un ensayo que realmente lo ha hecho, y lo ha hecho más tarde de lo que hubiera querido. Me refiero a "El Existencialismo es un Humanismo" de Sartre. Pasé casi toda mi vida culpando al mundo de mis fallas, pasando por alto una idea tan fundamental; la existencia del hombre precede a su esencia y somos nosotros mismos quienes nos definimos. Quizá en fondo lo sabemos y nos aterra la idea de haber nacido en un mundo indiferente que existe y debe definirse desde cero. Que tarde lo he conocido señor Sartre.

martes, 27 de octubre de 2015

Convertir tiempo UTC a GMST (Tiempo Sideral Medio de Greenwich) en Python

 -*- coding: utf-8 -*-
"""
Created on Tue Oct 27 18:37:49 2015

@author: Rodolfo Escobar et al
"""

from datetime import datetime
from astropy.time import Time
from numpy import floor

# Reductor de rango 0-24h
def to24(x):
 while x >= 24:
  if x < 0:   
   x = x + 24
  if x > 24:
   x = x - 24
 return x
#


# Conversor de formato de hora
def tohms(x):
 time_hours = x
 time_minutes = time_hours * 60
 time_seconds = time_minutes * 60

 horas    = int(floor(time_hours))
 minutos  = int(floor(time_minutes % 60))
 segundos = int(floor(time_seconds % 60))
 return (horas,minutos,segundos)
#

#Programa principal
ut = Time(datetime.utcnow(), scale='utc')
JD= ut.jd # Fecha Juliana
D = JD - 2451545.0
GMST = 18.697374558 + 24.06570982441908*D
GMST = to24(GMST)
(horas,minutos,segundos) = tohms(GMST)
#

print "Hora Sideral:","{h}:{m}:{s}".format(h=horas, m=minutos, s=segundos)


Referencias:
Approximate Sidereal Time, USNO
Local Sidereal Time, Durham University
Astronomy With Your Personal Computer, Peter Duffett-Smith
Astropy.org

viernes, 23 de octubre de 2015

winvid en Matlab 2014/2015

Por alguna razón no viene instalada por defecto ninguna interfaz de video en las ultimas versiones de Matlab. Para resolver esto solo hay que escribir en la consola supportPackageInstaller e instalar el siguiente paquete:


Con esto podrás adquirir la imagen de tu webcam sin problemas después de reiniciar Matlab.

lunes, 28 de septiembre de 2015

Interrupciones externas en Raspberry Pi con Python

A partir de la versión 0.5.6 de la librería RPi.GPIO es posible utilizar rutinas de interrupción externas. Como los usuarios de microcontroladores experimentados deben saber, una rutina de interrupción permite ejecutar una o una serie de instrucciones sin perder tiempo en bucles de lectura. Es decir que si el procesador se encuentra ejecutando una tarea, éste pausará el proceso en curso y ejecutará la rutina de interrupción ante un flanco de subida o bajada ocurrido en un pin GPIO. Si no has comprado tu Raspberry recientemente y no has actualizado su software es recomendable hacerlo:

sudo apt-get update 

sudo apt-get upgrade #(Esto podría tardar hasta más de una hora)

El siguiente código es un ejemplo sencillo sobre el uso de interrupciones. Tenemos dos rutinas de interrupción CuentaA() y CuentaB() asociadas a GPIO23 y GPIO24 respectivamente. Cada una incrementan una variable de conteo y muestran el resultado en consola. El programa se detiene cuando el contador A es mayor o igual a 5. Para más detalles sobre interrupciones pueden revisar la documentación de la librería RPi.GPIO. Para evitar el el efecto de rebote se utilizan capacitores de entre 22 o 10 uF conectados en paralelo con las resistencias pulldown de 10K como se muestra en el circuito [aunque también puede utilizarse un debounce vía software agregando el argumento bouncetime=200 a la función add_event_detect()]:
import RPi.GPIO as GPIO
import os

contaA = 0
contaB = 0

#Setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(23,GPIO.IN)
GPIO.setup(24,GPIO.IN)

#Callbacks
def CuentaA(channel):
    global contaA
    contaA += 1
    os.system("clear")
    print "Contador A: ", contaA
    print "Contador B: ", contaB

def CuentaB(channel):
    global contaB
    contaB += 1
    os.system("clear")
    print "Contador A: ", contaA
    print "Contador B: ", contaB

#Interrupciones
GPIO.add_event_detect(23, GPIO.RISING, callback = CuentaA)
GPIO.add_event_detect(24, GPIO.RISING, callback = CuentaB)

print "Contador A: ", contaA
print "Contador B: ", contaB

#Bucle principal
while(contaA < 5):
    pass

GPIO.cleanup()

jueves, 17 de septiembre de 2015

Filtro de Notch de 60 Hz

Debido a la restricción de los valores comerciales para los resistores y capacitores, este circuito tiene una frecuencia central de 58.94 Hz. Sin embargo, como se puede ver en una simulación, se tiene una atenuación de -34 dB (un factor de de 0.0004) para la componente de 60 Hz.


Para más detalles sobre este tipo de filtros pueden consultar éste artículo.

domingo, 13 de septiembre de 2015

Circuito para electrocardiografía (ECG/EKG)

Este circuito está basado en el que se puede encontrar en la hoja de datos del INA114. En el circuito original se asume que el rango de voltaje de la señal de entrada es de 1 mV ~ 5 mV más un offset de DC de 300 mV. Sin embargo, en la práctica estos valores resultan ser aún más pequeños (posiblemente por las condiciones poco controladas en un laboratorio de ingeniería universitario o el uso de caimanes y protoboard) así que es necesario incrementar la ganancia del amplificador de instrumentación. Para esta modificación se tiene una ganancia de 2501 y estos fueron los resultados:


En este video utilizan un circuito con ganancia de 100 con buenos resultados (el cual no funcionó en mi caso), lo que me hace sospechar que existen varios factores que afectan el voltaje de entrada. Posiblemente este circuito no funcionará en condiciones diferentes por lo que recomiendo experimentar con diferentes valores de ganancia.

Un segundo circuito que también funciona muy bien es una modificación del que pueden encontrar en The Biosignal How-To:
 

miércoles, 29 de julio de 2015

“Que nadie trate de deducir quién fui 
de todo lo que hice y todo lo que dije. 
Había un obstáculo que deformaba 
mis acciones y mi modo de vivir. 
Había un obstáculo que me detenía 
muchas veces cuando iba a hablar. 
Por medio de mis acciones más inadvertidas 
y mis escritos más velados, 
sólo por medio de estas cosas podré ser comprendido. 
Pero quizá no valga la pena dedicar 
tanto interés y tantos esfuerzos a descubrir quién soy. 
Más adelante –en una sociedad más perfecta- 
otro, hecho exactamente como yo, 
sin duda aparecerá y actuará con libertad.” 
 — Cosas escondidas, Constantino Cavafis.

lunes, 27 de julio de 2015

Morelia

A mediados de mayo recibí dos muy buenas noticias el mismo día. Mi universidad aprobó el financiamiento de mi proyecto de tesis (un radiotelescopio de 1m para la banda Ku) y la noticia de que había sido aceptado en una escuela de verano que había estado esperando con muchas ansias. Sin embargo había un pequeño detalle en esto último. Como había temido, iba a toparme durante dos semanas con mi ex nuevamente. Después de la mala experiencia de Monterrey había decido no permitir que volviera a ocurrir así que tuve que contactarla, después de meses sin hablarnos, para negociar una reconciliación amistosa. Esto ocurrió una semana antes de la escuela. Para mi sorpresa aquella tarde terminó muy bien. Aclaramos muchas cosas sobre el congreso de Monterrey, hablamos como buenos amigos. Aquel día también escuché lo que tanto había temido. Ya salía con alguien más. Debo decir que en aquel momento lo tomé muy bien, e incluso pasé el resto de la tarde sintiéndome orgulloso de mi madura respuesta, como si subir un nivel de la vida se tratara. Pero la realidad me golpeó con toda su fuerza al siguiente día al verlos besándose en mi propia facultad, pues por fatalidades de la vida el susodicho era compañero mío. Vislumbrado un infierno para las siguientes semanas, pero no fue así. Por mucho, fue una de las mejores experiencias que viví en este año. Académicamente me abrió todo un panorama que desconocía. Resolví muchas de mis eternas dudas sobre síntesis de radioimágen y conocí en persona a toda una leyenda de la radioastronomía en México, Stan Kurtz. Manejé remotamente una antena de 35 metros en España (Proyecto PARTNeR), procesé datos crudos de ALMA, datos de rayos X de Chandra y aprendí un poco sobre software del NRAO. No sentía una euforia tan intensa por el conocimiento desde hacía un buen tiempo. Stan, una persona muy amable a quién visité frecuentemente mostrándole mis proyectos y exponiendo mis dudas, acepto mi propuesta de trabajar con el como voluntario o becarlo el próximo año y apenas lo podía creer ¡Tanto tiempo que lo había creído inaccesible para mi! En cuanto mi ex... si hubiera escrito en esos días de junio estaría hablando enérgicamente sobre el "mito" de la imposibilidad de la amistad después del amor y demás. Nos pasamos hablando durante el largo viaje desde Puebla hasta Morelia en autobús. A lo largo de la estancia tuvimos algunas peleas, pero como en los buenos tiempos, aclarábamos las cosas escuchándonos. Hubo un día en el que no pude evitar recordar a un bloguero moreliano que contaba sus aventuras y desamores en aquella ciudad. Ahora era yo quien estaba en lagrimas en una noche en zócalo de Morelia. Fue  toda una sopresa llevarme tan bien con ella en esas dos semanas. Aunque nunca lo aceptó, notaba como se le llenaban los ojos de algunas lagrimas en los momentos que reíamos o cuando le contaba apasionadamente sobre mis platicas con Stan, como solíamos hacerlo alguna vez... Es una lastima que se alejó de mi tan pronto volvimos del viaje.

domingo, 19 de julio de 2015

Comunicación serial con Arduino y Scilab

 Recuerda instalar Serial Communication Toolbox primero con Module Manager.

Programa en Scilab

h=openserial("/dev/ttyACM0","9600,n,8,1"); // *
xpause(1e06); // retardo (aprox. 1 sec)
writeserial(h,char(1)) // envía 1(uint8)
xpause(1e06) // retardo (aprox. 1 sec)
writeserial(h,char(0)) // envía 0 (uint8)
closeserial(h);

* En Windows se debe sustituir "/dev/ttyACM0" por el número (sin comillas) de COM. Por ejemplo, para el COM5 quedaría: h=openserial(5,"9600,n,8,1");

Probamos la comunicación con un programa simple en Arduino dónde el led del puerto 13 encienda enviando un 1 y apagándolo con un 0.

Programa de prueba en Arduino

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT); 
  digitalWrite(13,LOW);  
}

void loop() {
    while (Serial.available() > 0) {
     int lectura = Serial.read();    
     if (lectura == 1){digitalWrite(13,HIGH);}
     else if(lectura == 0){digitalWrite(13,LOW);}   
      
    }    
} 

Como ejercicio, se puede escribir un programa dónde se envíe un valor PWM (0-255) desde Scilab hacía un led conectado a la tarjeta.