miércoles, 1 de diciembre de 2021
Evidente y elusivo
domingo, 22 de agosto de 2021
Throttle
Leí en algún lugar esta frase: "conversar con uno mismo es la mejor forma de pensar". Estuve muy de acuerdo. A veces cuando estoy solo converso en susurros conmigo mismo. Lo hago por dos razones. Una es que es una manera de throttle mental. En cómputo esto es un concepto que hace referencia a la desaceleración deliberada de un cálculo o procesamiento para cumplir un requisito de tiempo real o de interacción con un humano. Por ejemplo, una computadora podría reproducir una canción tan rápido con lo permita su procesador pero... vaya ¿quién quiere eso? Vocalizar forza a las ideas a ir a un ritmo que permita apreciarlas mejor que a la velocidad del pensamiento. La segunda razón me parece aún más útil. Creo que casi todos hemos visto aquella imagen donde primero una persona tiene un globo de pensamiento lleno de cosas y luego un globo de dialogo con una frase torpemente dicha. He notado que mis ensayos susurrados mejoran enormemente el como articulo una idea en una conversación con otras personas. Cierro cada vez más esa brecha entre lo que pienso y lo que digo, y un día no tan lejano me gustaría aventarme reels estilo Jason Silva.
domingo, 4 de julio de 2021
Ángeles
Amo a la IA de Pinterest, siempre me da buenas sorpresas. En general es siempre agradable que alguien entienda muy bien tus gustos, incluso cuando es una maquina quien lo hace. Mi ultimo descubrimiento tiene que ver con ofanimes y querubines. A partir de una fotografía de una representación de un ángel apegada la descripción del pasaje de Ezequiel 1:19, di con un foro ruso de arte ortodoxo que me llevó a una página de
conservación de patrimonio cultural serbio donde hallé las joyas que aquí comparto.
Estas imágenes son del monasterio de Gračanica (Kosovo) y de la iglesia de San Jorge en Prizren (Serbia). El resto de las fotografías pueden encontrarlo aquí y acá.
viernes, 5 de marzo de 2021
Atención difusa, zombies y arqueros
Llevo varias semanas practicado un nuevo hack de manejo de ansiedad y, en general, de estados mentales desbordados. Estoy bastante sorprendido de lo bien que funciona y debo decir que que también me sorprende no haberlo encontrado por mi cuenta mucho antes. Aquí debo decir dos cosas. No se si vaya a poder ponerlo en palabras. Aunque pudiera, su efectividad debe deberse también a mucha práctica previa e introspección de mi parte y dos años de terapia. Y como nota adicional, quizá el estudiar y discutir tantos artículos de cognición corporizada con los de mi seminario ha contribuido. Voy a intentarlo de todas maneras como ejercicio y apunte personal. La idea la tomé de Awa Kenzo, un maestro de kyudo, una forma tradicional de arquería japonesa que se combina con el Zen. Uno pensaría que el tiro con arco es el ejemplo perfecto de una tarea dónde se debe poner total atención en el objetivo. Pero lo que enseñaba Kenzo es que, para el aprendiz novato, una voluntad intensa por acertar en el blanco era una distracción que termina saboteando la práctica efectiva. Tampoco es que el "corazón" sepa como tirar una flecha en el blanco. A la luz de la ciencia cognitiva corporizada se podría explicar que es el cuerpo entero y su cognición distribuida lo que se debe entrenar en conjunto. Una atención completamente enfocada termina consumiendo demasiados recursos, al menos durante el proceso de aprendizaje. Es hasta que el "piloto automático" sabe lo que hay que hacer cuando la atención puede coordinar una acción exitosamente, no antes. El novato debe usar la atención difusa durante la practica, sentir todo el cuerpo y el entorno, o en palabras Kenzo, "volverse uno con el blanco". El eliminar la urgencia de completar un objetivo libera también la presión durante el aprendizaje y vuelve el error como una parte más de la práctica. El tiro con arco es un caso particular avanzado. ¿Podemos generalizar estas ideas y llevarlas otras habilidades más cotidianas? Lo que descubrí es que cuando se adaptan a las técnicas ya conocidas de manejo emocional aceleran enormemente su efectividad. Al primer ejercicio le llamo zombie mindfulnes. ¿Recuerdan esa sensación de estar muy muy ebrios (pero al borde de la consciencia) y caminar en modo automático? La idea es salir a caminar tratando de imaginar que son un zombie o que están muy borrachos y tratar de poner atención a todos los detalles que puedan de la forma más floja posible. La atención principal puede estar en otras cosas, no es importante en este ejercicio. La atención difusa si, esa es la que debe entrenarse. Un zombie Zen, digamos. El segundo ejercicio lo he estado usando para poder dormir cuando mi mente no se quiere callar. Sólo funciona después de varios días de practica del zombie mindfulness. Sólo tengo que recordar el ejercicio de la atención difusa llevada al entorno. No puedo explicar como ocurre pero es como si la atención principal fuera arrastrada por la atención difusa que ya sabe lo que tiene que hacer hasta que me quedo dormido. No esperen que salga a la primera pero garantizo que funciona si invierten en muchos intentos.
miércoles, 3 de marzo de 2021
Conversión Digital-Analógica por PWM filtrado en PIC16F15313
Este apunte público tratará muchos conceptos y haré referencias a información extra para mantenerlo corto. Comenzaré con la razón por la que necesité hacer este programa. Requería construir un pulso para caracterizar un sistema (identificación de sistemas) a partir de su la respuesta. Un impulso o Delta de Dirac es una distribución que tiene la peculiaridad de tener un espectro que abarca todas las frecuencias. En teoría, si queremos saber cual será la respuesta de un sistema a todas las frecuencias entonces debemos aplicar como entrada una señal impulsiva. En la práctica hay algunos problemas. Es imposible construir un impulso ideal y a demás los sistemas físicos como los sensores están siempre limitados a una banda de frecuencias. Peor aún, al digitalizar la señal de un sensor analógico se restringe a un más el ancho de banda útil. Es por eso que en algunos casos en mejor utilizar una función Sinc (o seno cardinal) como entrada de caracterización ya que permite definir bastante bien el ancho de banda de trabajo. En mi caso particular, necesito una señal Sinc con un periodo de lóbulo principal de 1/(3.8kHz) o 263.16 us y con los bordes suavizados por una gaussiana. El periodo del lóbulo principal se mide entre sus cruces por 0. Su gráfica en el tiempo y su espectro se muestra a continuación:
Se puede notar que he establecido mi ancho de banda de trabajo de 0 a 3.8kHz. Ahora lo que procede es escribir un programa en un microcontrolador que me de un PWM que codifique mi señal Sinc. Por restricciones de espacio, mi aplicación requiere de un microcontrolador muy pequeño por lo que elegí el PIC16F15313 que tiene solo 8 pines. Justo los que requería. En México pueden comprarlos en AG Electrónica. El circuito usado es el siguiente:lunes, 15 de febrero de 2021
Módulo RTCC en PIC24
En la entrada anterior comentaba que necesitaba una interrupción con reloj secundario para verificar que mi configuración de cristal era correcta. Lo que en realidad quería hacer es de lo que quiero hablar en esta entrada. He combinado la librería de consola serial de Chan con una librería terminé de escribir a partir de los programas de ejemplo de la página de Microchip. Es una aplicación sencilla en la que se puede leer y escribir el valor del RTCC vía puerto serial. Los detalles los pueden encontrar en este repositorio de Github. No olviden ponerme una estrella.
jueves, 11 de febrero de 2021
Interrupción por TMR1 con reloj secundario (SOSC) en PIC24
viernes, 5 de febrero de 2021
Problemas duros
Algo casi tan frustrante para mi como lo es el Problema Duro de la Conciencia es que este sea tan difícil de hacer notar a la mayoría de la gente a pesar de ser tan evidente (algo particulamente notorio entre mis amigos y conocidos físicos). ¿No les parece increíble ver colores, saborear la comida, escuchar sonidos y sentir texturas? Deténganse un minuto a notarlo; miren sus manos de cerca. No me refiero a un romanticismo fácil de la vida, sabemos que el sufrimiento es igual de real. Quiero decir, ¿no es increíble que el lienzo mismo de la experiencia subjetiva no pueda ser deducido lógicamente del sustrato neuro-físico-químico del que debe emerger? Al menos no con las piezas que tenemos. El correlato entre la experiencia y la fisiología es el problema suave. No es ningún misterio que el hielo se sienta frío y hasta podemos saber que áreas se activan en el cerebro para cada estímulo. A la mayoría eso les parece suficiente hasta que se intenta pensar en como replicar artificialmente una experiencia consiente a partir de primeros principios.
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
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
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:
domingo, 12 de julio de 2020
sábado, 27 de junio de 2020
Consola serial en PIC en XC16
- 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
Las expresiones de sustitución tiene la forma general:
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:
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:
$ rename -v -- 's/(\w+)_(\w+)_(\w+)/$3_$2_$1/' *.txt
jueves, 18 de junio de 2020
miércoles, 10 de junio de 2020
Trazos
domingo, 7 de junio de 2020
Optimización en Python con SciPy
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)


























