lunes, 23 de marzo de 2020

Escribir un archivo binario desde Python y leerlo en C

En algunas ocasiones se requiere preparar un conjuntos de datos desde la comodidad de Python y terminar de procesarlos con la eficiencia de C o Fotran. Aquí un apunte sobre como pasar de un array de numpy de datos float32 a un binario para ser leído desde un programa en C. La escritura de binarios en Python por si misma es muy útil para exportar resultados de una manera eficiente en espacio si es que se maneja un volumen de datos inmanejable para un archivo de texto.

Python:
Para estructuras mas complejas de datos será necesario ingenier un sistema de bytes iniciales que den información de la estructura que contiene el archivo.  

C:

miércoles, 18 de marzo de 2020

Mi plantilla de poster minimalista

Esta es una entrada que tenía pendiente pues había hecho esta plantilla desde finales de noviembre para un trabajo final de la maestría. Había estado buscando por todos lados una plantilla que fuera simple y bonita. Nada sofisticado, simplemente mostrar mi trabajo y ya. Encontré que se pueden hacer posters con una clase de tikz y es justo lo que estaba buscando. Aunque tuve que batallar bastante hasta que quedara a mi gusto:

miércoles, 11 de marzo de 2020

Blinking-led en PIC24FJXXGB002 en XC16

El led parpadeante es el Hola Mundo de los microcontroladores. Pero a diferencia de su contraparte de consola es muy útil en la práctica para verificar empíricamente que la configuración del reloj se haya hecho correctamente.

Primero, veamos la conexión física. Esta serie de microcontroladores trabajan a 3.3v lo que los hace más susceptibles al ruido si no se hace un buen conexionado. Es estrictamente necesario colocar capacitores de 0.1 uF entre cada par de pines Vdd-Vss como se muestra en la Figura 2-1 de la datasheet (yo estaré usando en este ejemplo un PIC24FJ32GB002):

Si no se colocan estos capacitores el PIC tendrá un comportamiento errático debido al ruido. Usaré en este ejemplo un cristal de 8MHz con capacitores de 22pF. Una vez conectado el circuito podemos avanzar a la configuración del oscilador. Configuraremos el oscilador externo con PLL activado con la frecuencia de reloj FOSC máxima de 32 MHz (recordemos que FCY = FOSC/2). He marcado el camino que nos interesa sobre el diagrama de la Figura 8-1 de la página 107:
 Si estamos usando un cristal de 8 MHz ¿Qué modo es el adecuado? Eso lo ponemos encontrar en la tabla 8-3 de la pag. 114, el cual dice que es XTPLL. En la misma tabla se indica que el divisor del PLL requerido es 2. Ahora solo necesitamos saber que bits de configuración necesitamos modificar. En la tabla 8-1 de la página 108 podemos ver que son POSCMD y FNOSC. Para encontrar los macros necesarios podemos ir a Compiler Help en el dashboard de MPLAB X:

Abrirá un archivo HTML donde debemos buscar Configuration Settings Reference. De ahí podrán copiar los pragmas requeridos. Ahora solo falta un ajuste más pero se hará escribiendo en un registro. Lo que falta es asegurarnos que FOSC tenga un frecuencia de 32 MHz. Para esto debemos revisar el registro CLKDIV (pág. 111) dónde podremos ver que el valor de división del último postcaler es de 0. Ahora tenemos toda la información necesaria para escribir nuestro programa:

domingo, 16 de febrero de 2020

viernes, 14 de febrero de 2020

Atractor de Lorenz en Python usando odeint()

Este programa es un ejemplo de dos temas interesantes: el atractor de Lorenz y la resolución de un sistema de ecuaciones diferenciales ordinarias usando el modulo scipy. El sistema que resolveremos (el sistema de Lorenz) consta de 3 ecuaciones diferenciales acopladas (que funcionan de manera interdependiente). Nótese que he cambiado la notación que aparece en el articulo de Wikipedia a una forma vectorial:
Esta notación facilita el entendimiento de la sintaxis de la función  odeint(). Lo primero que debe hacerse, después de importar los módulos correspondientes, es contruir una función que tome como argumentos el vector u y t y retorne el vector de derivadas de u. En este caso particular las ecuaciones diferenciales no dependen de t (son autónomas), aún así es necesario poner como argumento a t porque lo exige la sintaxis de la función odeint(). Después se establece una condición inicial para el vector u y se construye una lista de valores para t sobre el intervalo en que nos interese tener a la solución. Finalmente se coloca todo lo anterior como argumentos del solver odint() como aparece en el código completo:

Esta será la gráfica resultante (El Atractor Extraño de Lorenz):


jueves, 16 de enero de 2020

Escribir datos en sistema FAT32 con un PIC18F4550

En este ejemplo vamos a a realizar una escritura de datos simple a una memoria SD utilizando el complilador MikroC. Para evitar la restricción de memoria direccionable máxima que impone el formato FAT16 debemos instalar la librería FAT32 descargandola desde LibStock. Si se va a utilizar el 4550 es muy importante descargar específicamente la versión 2.0: FAT32 v2.0. Si usan PIC's más modernos con mayor memoria pueden utilizar la versión más reciente sin ninguna problema. Requerirán descargar también Package Manager y seguir estas instrucciones para instalar la librería.

Deben agregar el archivo __Lib_FAT32.h de cabecera a header files de su proyecto o solo copiándolo en el directorio donde se encuentre su archivo fuente .c.

Teniendo todo instalado, deben conectar el modulo SD al PIC de la siguiente manera:
  • MISO ------ SDI (RB0)
  • MOSI ------ SDO (RC7)
  • SCK -------- SCK (RB1)
  • CS----------- RC2   
Al estar usando el puerto B es necesario que los convertidores A/D estén desactivados para ese puerto o el programa no funcionará aunque compile. El programa completo es el siguiente:

Para el manejo de múltiples archivos y directorios recomiendo revisar el ejemplo que viene en la documentación de la librería.

miércoles, 15 de enero de 2020

lunes, 13 de enero de 2020

Apuntes de transistores BJT (cheatsheets)

Hice dos hojas de apuntes con lo que considero más relevante y fundamental para tener a la mano a la hora de hacer amplificadores de emisor común con transistores. Estan basadas en los siguientes capítulos de Principios de Electrónica de  Albert Malvino y David J. Bates:
  • Capítulo 6:  Transistores de unión bipolares
  • Capítulo 7:   Fundamentos de los transistores
  • Capítulo 8:   Polarización de los transistores
  • Capítulo 9:   Modelos de alterna
  • Capitulo 10: Amplificadores de tensión

jueves, 26 de diciembre de 2019

Sobre mi vida reciente II

Este ha sido un buen año para mi, es justo decirlo. En la segunda mitad de 2018 pasé unos meses bastante duros, honestamente no tenía muchas expectativas en enero. Pero en algún momento de febrero simplemente comencé a unir los puntos. Regresar a Mérida fue una sorpresa. Conocí a mucha gente increíble que ahora han hecho aún más grande mi grupo de "super science friends". Entré al fin a un posgrado (uno que años atrás, en una plática con un estudiante del CIC-IPN, me había parecido un reto muy alto). Tenía mucho que no sentía el haber aprendido más de lo que esperaba en un sólo año y que al fin, después de tanto funciono, bien otra vez.

Encontré un buen argumento más para escribir bitácoras públicas en un lugar inesperado, un librazo sobre inteligencia artificial que me recomendó uno de mis profesores: What to Think About Machines That Think. Pero necesito terminar de reconstruir el contexto antes de llegar a él. En Sobre mi vida reciente I me había quedado en mi sombría segunda mitad de 2018. Recibí 2019 en Zacatepec y regresé a Yucatán la primera semana de enero porque me habían aceptado para el SPI del CIMAT Unidad Mérida. Entre finales de febrero y la primera mitad de Marzo pasé mi última recaída psicológica y desde entonces me sentido como nunca. En mayo si no ml recuerdo me avisaron que había sido aceptado a la maestría en la UNAM (PCIC). Me ha gustado bastante hasta ahora. La carga de trabajo no es excesiva en volumen pero exige mucho tiempo de investigación, desarollo y depuración en el que caso de las tareas prácticas. En septiembre escribí lo siguiente en un estado:

"xkcd tenía una gráfica de conocimiento vs seguridad de saber. Había un pico cerca del origen y luego un valle muy grande, para después volver a subir alto después de mucho. He de estar en el valle porque a pesar de que cada semana aprendo a hacer cosas que se me hacían muy avanzadas para mí en la mitad licenciatura, sigo viendo lejos una capacidad real para resolver problemas de frontera. Porque es como caminar hacía el horizonte; avanzas solo para darte cuenta de que hay más y más camino para recorrer. En el caso de las ciencias naturales esto sería emocionante (¡tanto por descubrir y tan poco tiempo!), pero en las ciencias aplicadas me parece atemorizante (tanto por resolver, tantas herramientas por entender, y tan poco tiempo)."

Me siento más satisfecho con mi despeño desde entonces, pero no puedo evitar sentir ganas de evitar el estancamiento académico (en una sana medida, quiero pensar). La materia que más disfrute fue inteligencia artificial. Los dos profesores que la impartieron son excelentes. Uno de ellos fue el que nos dio una montaña de excelentes recomendaciones de libros de divulgación sobre distintos temas (incluyendo el que comentaba más atrás). La mejor razón que encontrado para escribir con más frecuencia aparece en un ensayo de Cesar Hidalgo: "No creo que las máquinas puedan pensar, pero tampoco creo que las personas puedan". En su opinión, la capacidad de pensar no es algo que este confinado en un solo individuo u objeto. Si una persona hubiera pasado años desde su nacimiento aislada en una cámara de supresión de estímulos, aislada del universo entero, no tendría nada en que pensar. La capacidad de pensar es una propiedad distribuida. Requerimos de la interacción con el mundo, de conversaciones, del conocimiento de la vida e ideas de otras personas para poder pensar. Creo que si más personas regresaran a escribir en bitácoras publicas (cada una con al menos un circulo de lectores significativo), aumentaría la capacidad de pensamiento y empatía en una escala social. No hace falta que se discutan temas profundos. Cada detalle de lo cotidiano es un bloque de construcción necesario. Espero regresar más a menudo al anecdotario y encontrar nuevos bloggers este 2020.

martes, 17 de diciembre de 2019

2006

Back then.
Si me dieran la oportunidad de regresar a 2006 pero sin saber lo que se ahora (en todos los aspectos), no lo aceptaría. El futuro (presente) sería diferente pero no necesariamente mejor ni habría disfrutado del tiempo mejor (dónde aplicaba). Este es mi argumento. Imaginen que se les da la tarea de organizar una biblioteca completa que tiene inicialmente todos los libros en desorden. Supongan que esto les toma dos años enteros. Al final, deciden crear un catálogo en donde aparece la posición correcta de cada libro en los estantes. Si enviaran ese catálogo a su yo de dos años del pasado justo antes de empezar, les tomaría quizá solo un mes ordenar todos los libros en vez de dos años. ¿Ven la idea? La información cuesta esfuerzo (sino de ustedes, de alguien más). Si amaneciéramos mañana en 2006 por una fallo en la matrix (como en la imágen que circula), estamos condenados a repetirlo todo (repetir en categorías, sería distinto por las pequeñas diferencias acumuladas [efecto mariposa] ). Suena un poco desalentador pero creo hay algo muy bueno en todo esto. Si no supimos aprovechar los buenos tiempos o no hicimos las cosas que nos hubieran hecho más felices, entonces no podemos culparnos porque la experiencia no puede crearse de la nada. Si tuvieron antes o tienen ahora las guías correctas, siéntense afortunados porque no existen los oráculos en la vida real.

nota: pueden encontrar aquí la versión formal de esta idea.