martes, 28 de abril de 2020

Futurismo contemporáneo

Falta poco para el primer cuarto del siglo y seguimos sin vivir en el futuro que imaginaban en los 80's y principios de los 90's. He pensado mucho en esto. De niño me hacia enojar un poco ver que el mundo avanzaba tan rápido que no me daría la oportunidad de participar en algún descubrimiento o avance importante. En ese aspecto, mi preocupación se desvaneció al crecer. Me siento retado por la abundancia de problemas que aún quedan por resolver.  Pero hay otra cosa que quiero hacer notar. Ha habido avances enormes sólo que la mayoría de ellos están ocultos a la vista del publico no especializado. Vemos sólo la punta del iceberg tecnológico. Un ejemplo interesante es la robótica. Los robots que de vez en cuando se ven en las calles o son torpes o tienen que ser controlados por un humano. Esto da la impresión de que estamos lejos de tener un ejercito de sirvientes mecánicos como la ciencia ficción pintaba para esta década. Pero me atrevería a decir que si lo tenemos. Es sólo que estos sirvientes están encerrados en fabricas, almacenes o son invisibles (bots de software que automatizan servicios web y financieros). Quiero mostrarles 3 vídeos cortos y recientes que pienso los pondrán en una perspectiva tecnológica más acertada:




lunes, 20 de abril de 2020

Flor del Edén

Flor del Edén
En teoría de autómatas celulares, un "Jardín del Edén" es una configuración a la que no se puede llegar sin importar la condición inicial ni cuanto evolucione el programa que implementa al autómata. Pero un Jardín del Edén si puede ser una condición inicial del programa, de ahí las dos interpretaciones que le dieron el nombre: la de John Tukey que dice que sólo el creador de la simulación puede construirlo y otra que dice que "una vez perdido, no puede recuperarse". Este concepto ha generado experimentos filosóficos curiosos. En principio, si viviéramos en una simulación, bastaría encontrar un Jardín del Edén como marca de agua de los arquitectos de la Matrix para verificarlo. Esta idea es explorada en la novela de ciencia ficción "Ciudad Permutación" de Greg Egan. La Flor del Edén es un JdE del Juego de la Vida (GoL, The Game of Life ). Sé que John Conway odiaba ser famoso por The Game of Life, pero este post era la mejor referencia que podía hacer en su memoria.

sábado, 11 de abril de 2020

Sobre aprendizaje e internet

Foto: Luis Eusébio
No basta tener acceso a internet o una biblioteca física para ser un autodidacta exitoso. Es necesario pero no suficiente. El problema no es que falte información sino que hemos acumulado una cantidad tan grande que no hemos terminado de organizarla. Nos hacen falta mapas para navegar en ese basto océano y, me parece, tenemos muy pocos. No hace mucho, después de participar en una mesa panel sobre comunidades de ciencia y tecnología en Mérida, se me acerco una persona de unos 50 años. Me pidió consejo sobre como aprender machine learning. Me hizo el comentario que el problema que había encontrado es que la información disponible era muchísima y que no había sabido ni por donde empezar. Creo que esto aplica para muchos otros temas. Ciertamente hay muy buenos tutoriales y cursos introductorios excelentes, pero aún existe una barrera para pasar al dominio intermedio y avanzado. Nos faltan brújulas para la excelencia. Aquí es donde los que nos hemos esforzado para llegar o acercarnos a ese punto debemos tomar la responsabilidad de indicarles el camino más corto (más no siempre fácil) al entendimiento a los demás. Ya he puesto mi granito de arena con la guía para ing. electrónica y estoy haciendo una para redes neuronales. Pero aún hay todo un mundo de temas ahí afuera que requieren de un mapa para quienes quieran o necesiten aprender algo desde cero de la manera menos tortuosa posible. Esto no es por simple comodidad para ellos. Creo que todos ganamos al movernos rápido y poder resolver los problemas difíciles que nos atañen como sociedad. Como ya nos hemos dado cuenta, el mundo puede cambiar muy rápido y necesitamos seguirle el paso.

domingo, 5 de abril de 2020

Comunicación SPI para PIC24FJXXGA004 en XC16

En este ejemplo haré referencia a la hoja de datos para la familia PIC24FJXXGA004, así que deben tenerla a la mano. 'XX' hace referencia al tamaño de la memoria de programa. En este caso particular usaré un PIC24FJ32GA004 (32Kb). Lo primero que hay que saber es que esta familia de PIC's tiene pines remapeables (Peripheral Pin Select). Para usar los pines asociados al SPI, UART, PWM, interrupciones externas, etc, se deben mapear a los pines del puerto virtual RP. Para trabajar con SPI requerimos 3 pines: SCK1,  SDO1 y SDI1. Para poder realizar el mapeo, existen dos grupos de registros que hay que configurar. Uno es el grupo de 24 registros de mapeo entrada: del RPINR0 al RPINR23 (pags. 111-117). El otro es el grupo de 13 registros mapeo de salida: del RPOR0 al RPOR12  (pags 118-124). La forma de mapear entradas es muy distinta a la de mapear salidas. Para mapear un pin de entrada debe elegirse el registro asignado al periférico que nos interesa mapear. Para esto podemos consultar la Tabla 10-2 de la página 108. Ahí podremos ver que la entrada SDI1 se configura con el registro RPINR20. Lo que debemos hacer ahora es escribir en RPINR20.SDI1R el numero de RPx a dónde queremos poner a SDI1. En este ejemplo lo pondremos en RP2 (RB0) de la siguiente manera:

RPINR20bits.SDI1R = 2; // SDI -> RP2/RB2

Para mapear las salidas debe elegirse primero el RPx, RP0 y RP1 para SCK1 y SDO1 respectivamente en este ejemplo. El registro necesario será por lo tanto RPOR0 (pag. 118). Este registro tiene los campos RP0R y RP1R asociados a RP0 y RP1. Para elegir las funciones de estos pines debe consultarse la Tabla 10-3 de la pagina 109. Se podrá ver que el código para SKC1OUT es 8 y para SDO1 es 7.  Configuramos los dos pines de la siguiente manera:

 RPOR0bits.RP0R = 8;  // SCK -> RP0/RB0 
RPOR0bits.RP1R = 7;  // SDO -> RP1/RB1

El circuito simulado en Proteus es el siguiente:
(Click para agrandar)
El código completo:

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.