domingo, 6 de diciembre de 2020

Sky Trackers

ATCA, Australia

Hace unas semanas, en uno de esos recuerdos completamente aleatorios que me llegan de repente, me vino a la memoria una serie de Discovery Kids (cuando era un canal para niños excelente) que se llamaba Cazadores de Estrellas. Yo debía tener entre 10 y 11 años y en aquel entonces no me llamó mucho la atención porque creí que iba a ser una serie con temática astronómica muy forzada. Me dio curiosidad de buscarla para verificar si había tenido razón y para mi sorpresa ahora lamento no haberla visto en aquellos años. La hubiera amado. Me habría adelantado a varias situaciones que viví en la prepa y la universidad durante los talleres de ciencia y escuelas de verano. Quizá lo único bueno de perdérmela es que seguramente hubiera tardado en superar un crush por Nikki porque no tuve una novia genio como ella hasta la mitad de la universidad. La serie fue grabada a principios de los 90's en las instalaciones del ATCA, el "mini-VLA" australiano aunque en la serie tiene el nombre ficticio de Kaputar Station (curiosamente ese observatorio fue mi wallpaper por mucho tiempo cuando estaba en la prepa). Fue un proyecto en conjunto con el CSIRO (algo así como el CONACyT de Australia) y un productora de televisión. Pienso que sería una excelente idea hacer una versión mexicana en el INAOE, que es un centro de investigación que lleva años realizando actividades de difusión de la ciencia entre chavos de secundaria y prepa. Los alrededores de ese centro también son muy bonitos. Podría crearse un pueblo ficticio usando como locaciones de grabación no sólo Tonanzintla sino también Cholula y Atlixco. Por lo que sé, el Canal Once transmitió esa serie aunque de eso me enteré después en comentarios de Youtube. Creo que son lo únicos que estarían interesados de producir algo así en este país.

martes, 29 de septiembre de 2020

Fuera de tiempo

Cine Robles, 2017

Acabo de descubrir otro "efecto Mandela" en mi vida. Cuando iba en la primaria pasaba un vocho,un datsun o una combi voceando los "trailers" de lo que era el cine Robles de Jojutla. El trailer ambulante que más recuerdo iba más o menos así: "¡A Arthur no le puede ir peor en la vida! Su casa está a punto de ser demolida y ha descubierto que su mejor amigo es un extraterrestre...". Si son algo geeks entenderán la referencia: The Hitchhiker's Guide to the Galaxy. Yo supe de que película se trataba hasta muchos años después pero la sinopsis se me quedó grabada por qué se me he hizo bien random en aquel entonces (mencionaba lo de la destrucción de la tierra para hacer una autopista espacial). Hace unos días noté un detalle muy extraño. Esa adaptación al cine se hizo en 2005 pero mi recuerdo es necesariamente de entre 2002 y 2003. Estoy seguro, al menos en lo que respecta a la sensación de fidelidad del recuerdo. Fueron varios días tomando clase desde el segundo piso de mi primaria, tengo una imagen mental con muchos detalles. No he encontrado ninguna adaptación anterior más que una serie de la BBC de los 80's. Por Navaja de Occam mi recuerdo debe ser el anacrónico. En cualquier caso es extraño. ¿Cuantos de nuestros recuerdos más "seguros" estarán mal? Mi mejor hipótesis es la siguiente. Me mudé a Chetumal en diciembre de 2005, en 3er año de secundaria. Mi secundaria de Morelos (Tec. 34) sólo tenía edificios de un pisa y era muy diferente a mi primaria (Cuahuatemoc). La nueva secundaria (Tec. 15) me recordaba a mi primaria y cuando tomaba clase tenía la sensación de estar en ella. Posiblemente durante varios días estuvo pasando un carro voceando la sinopsis de THGTG y la doble referencia colocó mi recuerdo algunos años antes con el paso del tiempo. No estoy seguro pero debe ser lo que en realidad ocurrió.

sábado, 22 de agosto de 2020

jueves, 20 de agosto de 2020

Instalación de VCS + PlatformIO en Debian/Ubuntu

Estoy aprendiendo a usar la familia de microcontroladores STM32 y ha sido todo un mundo nuevo para mi. Hay bastante información pero me ha parecido algo dispersa (seguramente eso cambiará en el futuro). Quiero hacer una aportación con una nota sobre el setup del entorno de desarrollo multiplataforma PlatformIO que en entradas futuras usaremos para programar un STM32F103C8T6 (Blue Pill).

1. Instalar VSC

Lo primero que hay que hacer es instalar Visual Studio Code. Descarguen el fichero .deb desde aquí e instalen desde el mismo directorio donde está el instalador con:

$ sudo apt install ./<file>.deb

2. Instalar el complemento PlatformIO IDE

Una vez instalado VSC, ábranlo y muévanse a la pestaña de extensiones con Cntrl+Shilf+x o dando click en la pestaña:


Den click en instalar en la opción correspondiente y esperen a que termine.

3. Instalar reglas udev 

Debemos movernos ahora al directorio /etc/udev/rules.d y descargar el archivo con las reglas necesarias con la siguiente serie de comandos:

$ curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules

Después de hacer esto deben reiniciar su computadora. Si no instalan estas reglas les dará el error: Error: libusb_open() failed with LIBUSB_ERROR_ACCESS al intentar cargar un programa a su dispositivo.  

En principio es todo. PlatformIO instalará automáticamente los drivers y bibliotecas necesarias sobre la marcha. Es una maravilla.  


martes, 11 de agosto de 2020

Chan's FatFs en PIC24: Librería para lectura/escritura en memorias SD

FatFs es un módulo de sistema de archivos FAT32/16 para microcontroladores. Está escrito en ANSI C y es altamente portable entre una gran variedad de dispositivos. Si bien su documentación es muy detallada, al ser muy genérica es fácil perderse a la hora de hacer una implementación en un microcontrolador en particular.  En esta entrada trataré de explicar lo mejor posible como portarla a la familia PIC24. Lo primero que hay que entender es como están estructurados sus 5 archivos:

 Los únicos archivos del módulo que hay que editar son diskio.c y ffconf.h. La portabilidad radica en terminar de escribir las siguientes funciones de comunicación SPI:

  • BYTE xchg_spi (BYTE dat)
  • void xmit_spi_multi (const BYTE* buff, UINT cnt)
  • void rcvr_spi_multi (BYTE* buff, UINT cnt )
  • void FCKL_SLOW(void) 
  • void FCKL_FAST(void)

definir los macros:

  • CS_LOW()
  • CS_HIGH()
  • MMC_CD    
  • MMC_WP

y crear una rutina de interrupción por timer de 1 KHz que incrementa una variable de conteo de tiempo: volatile UINT Timer. Esta interrupción sirve para el manejo de timeouts. En los archivos del ejemplo podrán encontrar comentarios detallados sobre el funcionamiento de estas funciones. Pondré un enlace al final.

Para simplificar esta primer versión del programa de ejemplo he desactivado la opción de reloj de tiempo real modificando la linea 237 de ffconf.h: FF_FS_NORTC = 1.  Cuando está opción esta desactivada se requiere crear una función adicional que maneje el tiempo del sistema de archivos (lo haremos en otra entrada usando el módulo RTC del PIC24FJXXGB002).

En esta entrada ya he explicado como configurar el reloj de sistema y en esta otra como configurar el modulo SPI y el Periferial Pin Select.

Configuración de SCK

La primer cosa que hay hacer es estar seguros de que se pueda elegir entre dos frecuencias diferentes para el reloj del módulo SPI. Una baja que se encuentre entre 100 y 400 KHz y una alta que se la de operación (hay limites para esta frecuencia que explicaré más adelante). En la página 23 del documento Section 23. Serial Peripheral Interface encontramos la siguiente información: 

 

Los módulos de la familia PIC24 tienen dos prescalers. En este ejemplo lo que haré será dejar fijo el prescaler primario a 16:1 y alternar con el secundario entre 8:1 para el reloj con FCLK_SLOW() para tener 125 KHz y 2:1 con FCLK_FAST() para tener 500 KHz. Para verificar experimentalmente que la frecuencia sea correcta pueden usar el modo de disparo único de un osciloscopio (aquí hay un tutorial para configurar ese modo). Buena parte de las fallas con la implementación de la librería FatFs tienen que ver con una frecuencia baja incorrecta.

Conexión con el modulo SD

La segunda falla de implementación más común tiene que ver con la conexión física con los módulos SD. He visto en varios foros, y también me pasó, que los dispositivos de 3.3 V fallan con algunos módulos microSD de este tipo pero que funcionan perfectamente cuando construyen sus propios circuitos de conexión a la memoria SD. En mi caso sólo me ha funcionado cn PIC24 con un módulo SD de tamaño estándar (como este) y con jumper flotando conectado a SCK. Desde PIC18 a 5V no he tenido problemas.  

La tercer falla más común es con la frecuencia máxima. Comentan en los foros que algunos módulos prefabricados no están optimizados para trabajar a máxima frecuencia de SDK. Sus circuitos tienen un pasa-bajas que solo permite frecuencias de entre 1-2 MHz. Si están desarrollando una aplicación comercial es mejor que integren su propio circuito de conexión con un socket microSD.

Edit: ¡Alcance hacerla funcionar hasta la frecuencia máxima de SCK para el GB002 que es de 8MHz! 

Otro detalle más. El simulador Proteus solo funciona con memorias virtuales en formato FAT16 en algunas instalaciones. Al menos a mi sólo me he funcionado así. En físico no he tenido problemas con FAT32. 

Nivel de optimización

Esta librería ocupa bastante espacio. Un microcontrolador de 32K de memoria de programa es apenas suficiente (pero funciona). Idealmente deberían usar de al menos 64K. Si llega a marcar un error al compilar pueden intentar subir el nivel de optimización del compilador a 2 de la siguiente forma:

Click para agrandar


Código principal

Si todo lo anterior está en orden el siguiente ejemplo de escritura debe funcionar sin problemas con este circuito (el código es para GB002, el circuito en Proteus tiene un GA002 pero el conexionado es el mismo):

 

jueves, 6 de agosto de 2020

Cielomotos y trenes

Se le llama cielomoto a un conjunto de fenómenos atmosféricos (de naturaleza poco comprendida aún) que provocan sonidos o señales inusuales en múltiples instrumentos de monitoreo. Los más conocidos son los eventos de sonidos similares a una trompeta o instrumento metálico. Otros reportes mencionan sonidos similares a motores sin poder ubicar la fuente. En los últimos meses ha habido un repunte de estos reportes en medios de noticias y redes sociales.  Desde antes de la pandemia mis primos, aquí en Mérida, me habían contado que les da mucho miedo unos sonidos muy fuertes y extraños que parecen venir del cielo. En el grupo de WhatsApp que tenemos han comentado estos fenómenos siempre entre las 2 y 4 de la mañana. Yo no había tenido la oportunidad de escucharlos hasta hace cosa un mes. Es verdaderamente un sonido tan extraño que enchina la piel. No pude grabarlo porque no era muy intenso y se perdía entre el ruido de los aires acondicionados de mis vecinos. El tipo de sonido era una mezcla entre trompeta y ballena de canto metálico. Pero el sonido también me hizo recordar una grabación de uno mis amigos en Puebla de hace dos años donde se escucha un sonido metálico estilo "pelicula de terror". Pero en este caso la fuente fue identificada y se trataba de los frenos de emergencia del tren (por un asalto organizado según cuenta). Si bien los sonidos no son exactamente iguales me ha hecho pensar si una parte de los sonidos en el cielo reportados podían deberse a los frenos de tren. En el caso de Mérida parece tener sentido porque el tren suele pasar por la ciudad en la madrugada cuando hay menos transito en las calles.

Con la hipótesis del tren como el origen de las Trompetas del Apocalipsis lo que necesitaba para fortalecer las evidencia era tener un mapa con todas las rutas ferroviarias de México. Esto era que quería saber desde que era niño. Siempre me han gustado los trenes. Llegué a subirme con mi papá a una máquina azul del Tren del Balsas que estaba parada en la estación de Puente de Itxla. Este tren dejó de operar en 1997. Varias veces me tocó verlo pasar desde la autopista Acapulco-Cuernavaca y me había quedado con la duda de hasta donde llegaba ese tren. Pude resolver ambas incógnitas con el sitio OpenRailwayMap. No sólo muestra las vías activas sino también las vías retiradas (como la del Balsas). Con este mapa ya podía trabajar. Tenía seguras hasta ese entonces dos ubicaciones de reportes de sonidos similares: Lagos de Moreno (vía Román Villalobos) y Mérida.  Ambas ciudades con pasos de tren. ¿Habría mas reportes de estos sonidos en las ciudades de las rutas ferroviarias? Empece a buscar en Youtube y estos ruidos aparecen en todas las ciudades grandes en rutas de tren: León, Querétaro, Xalapa, Coatzacoalcos y la lista sigue. No puedo demostrar aun que esta sea la causa pero creo que es un buen acotamiento de la búsqueda. La evidencia definitiva sería captar al tren directamente haciendo los sonidos. Si algún lector la tiene le agradecería ponerla en comentarios.  

sábado, 1 de agosto de 2020

Creatividad

Se habla mucho de la creatividad y la innovación pero muchas veces es poco lo que se dice. Me parece excelente que haya motivación para arreglar el mundo pero las buenas intenciones no son suficientes ¿Exactamente cómo se es creativo? ¿Cuáles son las herramientas mentales que hay que tener para resolver problemas complejos? Entiendo que no son preguntas fáciles de responder y más que crítica es solo un señalamiento para no trivializar las dificultades. Tampoco creo que todo en la cultura maker y de emprendimiento este mal en este sentido. Creo que la popularidad del Design Thinking es lo mejor que ha pasado en el tema de innovación en los últimos años.  Incluso creo que falta mucha más divulgación de metodologías como Sprint y SCRUM fuera de la comunidad de desarrollo de software y empezar a deshacernos tanto del perfeccionismo como de la improvisación excesiva. Pero hay una pieza muy grande que falta en el fondo. El mundo es complejo y se requiere de redoblar y simultáneamente reducir inteligentemente el esfuerzo para encontrar soluciones.

Mi pequeña contribución que puedo hacer aquí es recomendar dos libros que he leído durante la cuarentena y que sentí que verdaderamente abren la caja negra del pensamiento creativo:


He descartado muchos otros por repetir los clichés del "genio creativo" o dar recetas demasiado ambiguas. Estos dos libros aportan insight real en la cuestión de la creatividad y en lo que yo llamaría soft problem solving. Para el hard problem solving estoy preparando una selección diferente. También la publicaré por aquí cuando la tenga lista.

domingo, 12 de julio de 2020

Little Fury Things, J Mascis


¿Cómo que Richard Stallman y J Mascis no son la misma persona?

sábado, 27 de junio de 2020

Consola serial en PIC en XC16

Chan ya es famoso por ser el autor de la librería para manejo de archivos FAT32 en memorias SD pero tiene muchas otras creaciones geniales. Aquí describiré un ejemplo para usar la librería xprint que permite dotar de forma sencilla a casi cualquier microcontrolador de una pequeña consola de operación o depuración. Usaré un PIC24FJ32GA002 pero entendiendo la idea general se puede portar facilmente a cualquier otro dispositivo.  Primero, deben descargar los archivos xprinf.h y xprintf.c. Esta librería está escrita en ANSI C por lo que es independiente de la plataforma y el compilador. Las tres funciones más importantes que contiene son:
  • void xputs (const char* str)          : análoga a la función puts()
  • void xprintf (const char* fmt, ...) : análoga a la función printf()
  • int xgets (char* buff, int len)        : similar a la función gets()

 xputs() permite escribir una cadena simple. como un "Bienvenidos al programa". xprintf() nos permite dar formato a la cadena, como ("Temperatura %d",temp), como lo haríamos en un C en una PC. xgets() es muy útil y la que la dará mucha presentación a un programa para microcontrolador. Es en esencia muy distinta a su contraparte gets(). Lo que hace xgets es ir capturando en tiempo real lo que se vaya recibiendo el microcontrolador del puerto serial hasta que se presiona ENTER. La misma función va enviado simultáneamente cada carácter a Tx como espejo (aunque esta opción puede desactivarse en los macros del header). ¡Permite incluso borrar caracteres!    

La librería no puede funcionar por si sola. Es necesario asociarla a funciones de escritura y lectura bajo nivel. Lo que sigue ahora es crear un programa que contenga las rutinas para enviar y recibir un byte por puerto serial con la siguiente forma:

//-- Poner byte en el registro Rx
unsigned char uart_getc(void);

//-- Poner byte en el registro Tx

void uart_putc(unsigned char d);


Esta parte del programa siempre será dependiente del dispositivo y compilador. Estas dos rutinas pueden tener cualquier nombre siempre y cuando se asocien en el código principal de la siguiente manera:

//-- Unir UART con funciones de consola
xdev_in(uart_getc);        
xdev_out(uart_putc);

La implementación de las funciones de comunicación serial también están basadas en la implementación de Chan pero las he reescrito de una forma más clara y comentadas lo mejor que pude. Esta implementación utiliza dos colas (registros FIFO), una de envío y otra de recepción. Esto es muy útil porque permite aprovechar las interrupciones de la UART para no perder bytes. Las referencias a páginas son para la data del GB004 pero es la misma información.   

Aislamiento

Si están utilizando baterías para alimentar al PIC o van a estar realizando depuración es una buena práctica utilizar opto-acopladores. Esto también permite utilizar módulos de conversión USB-Serial que no tengan salida de 3.3v:


 

Programa completo:

viernes, 26 de junio de 2020

Renombrar archivos automaticamente en Linux

El comando rename permite renombrar archivos utilizando la versatilidad de las expresiones regulares de perl. Recomiendo hacer un respaldo de la carpeta con los archivos a renombrar porque los errores de renombramiento pueden ser difíciles de revertir. Pueden utilizar el argumento '-n' o crear una nueva carpeta con las copias de algunos archivos para practicar primero.

Las expresiones de sustitución tiene la forma general:

's/PATRON/REMPLAZO/'modificador

dónde algunos de los modificadores más usados son:
  • i :  Patrón insensible a las mayúsculas.
  • x : Permitir uso de espacios para mayor claridad.
  • g : Remplaza todas las ocurrencias del patrón.

Cuando estaba haciendo mi tesis de licenciatura ocurrió que generé desde Linux cientos de archivos con la hora en el nombre dejando el simbolo ':' como separador. En Linux no es un problema pero en Windows se vuelven inaccesibles. No iba renombrar manualmente esos cientos de archivos, por supuesto. Tomaré este caso como primer ejemplo. Supongamos que tenemos montones de archivos con esta forma:

datos_10:34:01.txt 

Lo que necesitamos hacer es sustituir todas las ocurrencias de ':' por '_'. Por lo tanto el comando para renombrar es:

$ rename -v -- 's/\:/\_/'g *.txt

Notese que si no colocamos el modificador 'g' al final de la expresión entonces solo se sustituirá la primera ocurrencia del patrón e ignorará a las posteriores. Los caracteres ':' y '_' pueden ir sin la barra '\' pero es buena costumbre colocar la barra para distinguir los caracteres del patrón con los operadores de las expresiones regulares.

La expresiones regulares son lo que necesitamos para realizar renombramientos más complejos. Si nunca habían escuchado ese concepto recomiendo ver este video. En pocas palabras es un sub-lenguaje de descripción de patrones de cadenas de símbolos. He aquí una referencia rápida:

.        : carácter único.
\s      : espacio en blanco.
\S     : carácter diferente a espacio en blanco.
\d     : dígito (0-9).
\D     : no-dígito.
\w     : caracter de palabra (a-z, A-Z, 0-9,_)
\W     : no caracter de palabra
[aeiou] : Identifica sólo un carácter del conjunto entre bracetes.
[^aeiou] : Identifica sólo un caracter fuera del conjunto entre bracetes.
(foo|bar|baz) : operador or. Identifica cualquiera de las expresiones dadas.
^   : principio de cadena.
$   : final de cadena.

Cuantificadores
*         : cero o más apariciones de la expresión o símbolo previo.
+        : una o mas apariciones de la expresión o símbolo previo.
{5}    : 5 o más apariciones...
{3,7} : entre 3 y 7 apariciones.
{6,}    : 6 o más apariciones.

 Aprender a escribir expresiones regulares complejas requiere de práctica. Al principio puede ser frustrante pero después de muchos ejercicios se entiende la idea general.

El ejemplo final de esta nota será una demostración del uso de variables. Supongamos que tenemos un directorio con miles de archivos con nombres con la siguiente estructura:

resultados_Rodolfo_Escobar.txt

y se quiere modificar a la forma:

Escobar_Rodolfo_resultados.txt

De nuevo, nadie quiere pasar por la pesadilla de renombrar los archivos a mano. Para crear una expresión de sustitución debemos tener claro el patrón que necesitamos. Tenemos 3 campos separados por _'s. No podemos saber de antemano cuantas letras tendrá cada campo pero si sabemos que contendrán caracteres de palabra, así que debemos describir el patrón como (\w+)_(\w+)_(\w+). Los paréntesis permiten manejar subpatrones de cadenas. Para reutilizar estos supatrones (moverlos de lugar), podemos manejarlos como $n dónde n es el orden en el que aparecen de izquierda a derecha. El comando completo es:

$ rename -v -- 's/(\w+)_(\w+)_(\w+)/$3_$2_$1/' *.txt



miércoles, 10 de junio de 2020

Trazos

Mi persona es como el meme del dibujo del caballo. Algunas partes están muy bien definidas y estilizadas, y quien me conozca sólo desde esos ángulos suele intimidarse o tenerme por una persona con los cabos bien atados. No digo que se equivoquen en todo pero si quiero señalar que pocos saben que el resto de mi son solo bosquejos y garabatos. No digo esto por complejo de inferioridad como podría pensarse, o como alguna vez si lo fue. Es lo que he visto en mis introspecciones y hay, diría, razones históricas. Con la misma evaluación honesta se también que soy perfectamente capaz de tomar un lápiz y terminar de dibujarme. Pero hoy no. Aún no sé que dibujar sobre muchos de los espacios en blanco ni sobre las lineas pobremente trazadas. Sigo inacabado y a veces me lo recuerda una que otra amarga circunstancia.

domingo, 7 de junio de 2020

Optimización en Python con SciPy

Resolver problemas de optimización es una herramienta esencial para la ingeniería y la ciencia y debería ser una prioridad en los programas académicos. La bibliografía para aprender la teoría que podría sugerir es el capítulo 7 del libro gratuito Mathematics for Machine Learning. Por ahora me concentraré a detallar una nota para usar la función minimize() del modulo SciPy. Me estoy basando en gran parte en el ejemplo de APmonitor. No sólo será un traducción sino que añadiré detalles importantes que fueron omitidos en su tutorial.

En la jerga de optimización, se le llama función objetivo a la función que se desea optimizar alguno o algunos de sus argumentos. En este ejemplo la función objetivo a minimizar será:
La solución del problema de minimización consiste en encontrar los valores del vector x para los cuales la salida de la función objetivo sea mínima. En la práctica la función objetivo está sujeta a restricciones por lo que este ejemplo no será la excepción:

Restricción 1. El producto de todas las variables debe ser mayor o igual a 25.
Restricción 2. La suma de los cuadrados de las variables debe ser igual a 40.
Finalmente hay que considerar los intervalos que acotan a cada una de las variables:  
Para escribir el programa de Python usando el submódulo optimize de SciPy necesitamos saber lo siguiente. La función minimize() tomará, para este ejemplo, estos argumentos:

func. Una función que debe definirse con un único argumento vectorial y retornando un único escalar.
method. La lista de métodos de minimización disponibles aparecen en la documentación. Es importante saber que los únicos métodos que permiten optimización con restricciones son ''COBYLA", "SLSQP" y "trust-constr".
bounds. Lista de tuplas con las cotas para cada variable.
constraints. Lista de diccionarios donde cada uno tiene la esctructura:
  • 'type': Tipo de restricción. 'eq' para igualdad o 'ineq' para desigualdad
  • 'func': Nombre de la función que describe la desigualdad (debe crearse) 
Código completo:

jueves, 4 de junio de 2020

El libro del tiempo

En la novela corta "La Historia de tu Vida" del escritor de ciencia ficción Ted Chiang se menciona que Borges tenía un argumento en contra de la pre-definición del futuro que me parece demoledor. Supongamos que el libro de mi vida existe y que en el está cada detalle de mi pasado y futuro. Supongamos ahora que encuentro ese libro. Verifico que es autentico porque en el reconozco mis recuerdos hasta el momento exacto en el que tomo ese mismo libro en mis manos. Lo que ocurre después es extraño. Sé ahora todo lo que "voy" a hacer después de ese momento por el resto de mi vida. ¿Pero de verdad voy a hacer todo lo que dice ahora que tengo esa información? ¿Qué me obliga a seguir la historia de ese libro? Nada. Tengo la opción de elegir. Esto hace que la existencia del libro de mi vida sea lógicamente imposible. Borges hace otra observación. Es posible que ese libro exista si se cumple una condición: la historia del universo debe estar hecha de tal manera que yo nunca tenga acceso a él. Sospecho que este argumento debe estar en los ensayos contenidos en "Otras Inquisiciones" que espero conseguir algún día.

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.

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