El código de este módulo es sólo una modificación del código de Dr Dew (Scilab Ninja). La única diferencia es que le he agregado el conteo de ascenso y descenso para un registro de 16 bits. National Instrumentes tiene una nota en español muy completa sobre el manejo de encoders de cuadratura. La ventaja del modo X4 es que permite tener la máxima resolución angular posible para un encoder.
domingo, 5 de noviembre de 2017
sábado, 4 de noviembre de 2017
Parálisis
Acabo de tener la pesadilla/parálisis del sueño más extraña y
aterradora hasta ahora. Escribiré los detalles mientras los tenga
frescos. La fotografía que muestro es relevante y llegaré a ella en un
momento. En la primera parte del sueño me encontraba con varias
personas en un extraño tren de vapor que no tenía paredes ni techo ni
piso, sólo una estructura o esqueleto en el teníamos que movernos con
mucho cuidado para no caer. Teníamos que alimentar la caldera con
carbón lo cual era muy difícil de hacer por la forma de los vagones.
Empecé a cansarme y me que parado recargado en la estructura mirando el
suelo y las vías moverse relativamente por debajo de mi. Comencé a
hacer un ejercicio de mindfulness que estoy muy acostumbrado a hacer en
la vida real. Esto hizo forzar el "renderizado" del sueño y los
detalles eran cada vez más y más reales [esto ya me había ocurrido
antes]. De pronto el tren se descarrila. Salgo volando y todo se apaga.
En ese momento me di cuenta que estaba soñando y que había muerto en el
sueño al caer del tren. Lo extraño era que ahora estaba en una especie
de limbo en mi mente. De pronto pude ver una imagen. Era justo la de la
fotografía, era lo que tenía frente a mi ojo izquierdo (el derecho
estaba tapado por una almohada). Sabía ahora que estaba de regreso en
el mundo real. Traté de moverme pero estaba paralizado. Estaba
tranquilo porque ya me había pasado muchas veces antes. Espere un
momento a que la parálisis pasara. Pero pasaron varios minutos sin que
lo hiciera. Traté de moverme lo más fuerte que pude hasta que ocurrió
algo muy extraño. Empecé a sentir mover mi brazo, pero era como mover
un miembro fantasma. Más extraño aún era que podía tocar y sentir el
celular y el libro, sentía que podía moverlos pero la imagen que veía o
estaba congelada o los movimientos que hacía no eran reales. Estaba
seguro que seguía despierto. Esperé varios minutos más a que este
estado pasara, pero para mí horror no lo hacía. Traté de calmarme y
pensar en qué hacer. Si mi vista se había congelado tal vez podía hacer
una llamada y pedir ayuda. Lo intenté, sentía todos los movimientos de
mi mano y el celular pero la imagen seguía congelada y no sabía lo que
hacía. Me rendí y trate de pensar en otra cosa. Había comenzado a
notar algunos cambios en mi vista con cierto retraso (como el "lag" en
un vídeo en vivo). Se me ocurrió intentar dar la vuelta y sentí que lo
hice. Unos segundos después la imagen cambio abruptamente al techo.
Esto ya era demasiado extraño y de pronto me vino la idea de que tal
vez algo me había pasado en la realidad, que tal vez mi casa se había
venido abajo, tenía un daño cerebral y sólo estaba atrapado en este
limbo esperando morir en cualquier momento. Había pasado cerca de media
hora. Tenía mucho miedo, comencé a gritar y sacudirme para despertar
pero no podía. De pronto volví a ver la imagen de la foto y ya estaba
completamente despierto. Me levanté, verifiqué que podía moverme de
nuevo. Lo único que se me ocurrió decir fue "the fuck was this?" y
comencé a escribir esto para no olvidarlo. Ahora me pregunto si no estoy
en una simulación y esto no fue más que un fallo en la matrix que quizá
yo mismo induje al hacer mindfulness en un sueño.
[Originalmente una nota de Facebook]
[Originalmente una nota de Facebook]
martes, 31 de octubre de 2017
Módulo de control para un Qik 2s12v10 de Pololu en VHDL
Estoy empezando a aprender el HDL Coder Toolbox de Matlab/Simulink pero antes de empezar hacer pruebas con controladores PID en hardware necesitaba escribir el código de un modulo que me permitiera controlar el driver para motores DC Qik 2s12v10 que había comprado para mi montura altazimutal. El módulo esta diseñado para trabajar junto con este módulo UART del que había hablado en la entrada pasada. El esquema de la entidad del modulo es la siguiente:
Esta versión del módulo solo puede enviar los valores de potencia en 7-bits signados y no puede leer la corriente que consumen los motores ni los mensajes de error. Espero en un futuro cree un módulo más completo. Pero la funcionalidad de esta versión es suficiente para realizar muchos proyectos. El siguiente diagrama muestra la implementación esquemática para una tarjeta Basys2 en dónde probé el módulo:
Aquí muestro en un video el funcionamiento del módulo:
domingo, 29 de octubre de 2017
Módulo UART en VHDL
Este módulo fue por el profesor Carlos García Lucero de la FCE-BUAP. Aunque debe estar disponible en la página de INTESC considero útil repostearlo por aquí para que tenga mejor accesibilidad para los buscadores. El código esta muy bien comentado y está implementado en un solo archivo vhd.
domingo, 15 de octubre de 2017
Convertir un modelo de Simulink a código VHDL con HDL Coder [Ejemplo 1]
Para este primer ejemplo, generarémos el código VHDL para una función booleana sencilla de la forma X = AB xor C desde un diagrama en Simulink.
Bloques requeridos
HDL Coder > Commonly Used Blocks > In1
HDL Coder > Commonly Used Blocks > Out1
HDL Coder > Logic and Bit Operations > Logical Operators
Diagrama
Una vez terminado el bloque debemos irnos a la pestaña Code > HDL Code > Generate HDL. Si no hay ningún error deberá aparecer lo siguiente en la ventana de comandos:
### Generating HDL for 'Ejemplo_HDL'.
### Starting HDL check.
### Begin VHDL Code Generation for 'Ejemplo_HDL'.
### Working on Ejemplo_HDL as hdlsrc\Ejemplo_HDL\Ejemplo_HDL.vhd.
### Creating HDL Code Generation Check Report Ejemplo_HDL_report.html
### HDL check for 'Ejemplo_HDL' complete with 0 errors, 3 warnings, and 0 messages.
### HDL code generation complete.
Por defecto el código generado aparecerá en el directorio hdlsrc\. El código generado para este ejemplo es el siguiente:
Bloques requeridos
HDL Coder > Commonly Used Blocks > In1
HDL Coder > Commonly Used Blocks > Out1
HDL Coder > Logic and Bit Operations > Logical Operators
Diagrama
Una vez terminado el bloque debemos irnos a la pestaña Code > HDL Code > Generate HDL. Si no hay ningún error deberá aparecer lo siguiente en la ventana de comandos:
### Generating HDL for 'Ejemplo_HDL'.
### Starting HDL check.
### Begin VHDL Code Generation for 'Ejemplo_HDL'.
### Working on Ejemplo_HDL as hdlsrc\Ejemplo_HDL\Ejemplo_HDL.vhd.
### Creating HDL Code Generation Check Report Ejemplo_HDL_report.html
### HDL check for 'Ejemplo_HDL' complete with 0 errors, 3 warnings, and 0 messages.
### HDL code generation complete.
Por defecto el código generado aparecerá en el directorio hdlsrc\. El código generado para este ejemplo es el siguiente:
martes, 26 de septiembre de 2017
Jojutla
De niño crecí en un lugar que, junto con la formación académica me mis
papás, moldeó en gran parte mi amor por la ciencia. Vivía en una unidad
habitacional que tiene una vista muy amplia hacia el valle del suroeste
de Morelos con dos volcanes en el fondo. El paso de las estaciones es
muy notorio en esa zona de México gracias a los cambios en el color de
la vegetación en los cerros, el ir y venir de los glaciares de los
volcanes y las "lluvias" de tisne del final de la zafra azucarera.
La cerros también me daban una referencia para darme cuenta que el Sol
salía en un lugar diferente a lo largo del año, efecto que noté muy bien
durante la formación de las mañanas en la secundaria. Las fumarolas del
Popocatepetl eran muy comunes y siempre visibles por el clima. Las
tormentas eléctricas también son particularmente intensas en esa región,
algo que sólo noté hasta que me mudé a otros estados. Hasta la fecha no
he estado en un lugar de México en dónde haya tantas especies de
plantas y animales en un mismo patio como en ese lugar. Jojutla siempre me recordó que la
Tierra es un lugar vivo y de constante cambio. Este mes lo ha hecho más que nunca y nos
ha dado a muchos un recordatorio de lo frágiles que somos los humanos
ante el poder de la naturaleza
* * *
El 26 de septiembre de 2007 publiqué la primera estrada en este, mi primer y único blog continuamente activo. Me hubiera gustado que mi entrada de X aniversario tuviera un tema menos sombrío. El de 19 de septiembre de este mes ocurrió uno de los sismos más devastadores en la historia de mi país. Mis primeras entradas hablaban de la región, ahora en buena parte en ruinas, en la que pasé toda mi infancia. Nunca nos pasó por la mente el vivir en Jojutla un desastre tan grande. Los sismos siempre fueron frecuentes pero nunca pasaron un breve susto. De niños crecimos haciendo colectas de vivieres hacia lugares que nos parecían muy lejanos. Este fue un tema recurrente entre mis amigos de la infancia con quienes estuve apoyado como brigadista de remoción de escombros desde el martes pasado hasta el domingo. Caminar por aquella ciudad ciudad tan querida reducida a una zona de guerra me provocó una sensación extraña de irrealidad. Al mismo tiempo el ver el compromiso de tanta gente me animó de forma inesperada. Por ahora las emergencias ya están atendidas y solo queda trabajar en las demoliciones y reconstrucción. Aún hay un largo camino por trabajar. Me hubiera quedado más tiempo pero desafortunadamente tenía acceso a internet sólo por breves momentos y no me dí cuenta que la BUAP reanudaba labores hasta el 2 de octubre. Sólo tenía que regresar por mis tramites de titulación. Posiblemente regrese a apoyar este jueves.
* * *
El 26 de septiembre de 2007 publiqué la primera estrada en este, mi primer y único blog continuamente activo. Me hubiera gustado que mi entrada de X aniversario tuviera un tema menos sombrío. El de 19 de septiembre de este mes ocurrió uno de los sismos más devastadores en la historia de mi país. Mis primeras entradas hablaban de la región, ahora en buena parte en ruinas, en la que pasé toda mi infancia. Nunca nos pasó por la mente el vivir en Jojutla un desastre tan grande. Los sismos siempre fueron frecuentes pero nunca pasaron un breve susto. De niños crecimos haciendo colectas de vivieres hacia lugares que nos parecían muy lejanos. Este fue un tema recurrente entre mis amigos de la infancia con quienes estuve apoyado como brigadista de remoción de escombros desde el martes pasado hasta el domingo. Caminar por aquella ciudad ciudad tan querida reducida a una zona de guerra me provocó una sensación extraña de irrealidad. Al mismo tiempo el ver el compromiso de tanta gente me animó de forma inesperada. Por ahora las emergencias ya están atendidas y solo queda trabajar en las demoliciones y reconstrucción. Aún hay un largo camino por trabajar. Me hubiera quedado más tiempo pero desafortunadamente tenía acceso a internet sólo por breves momentos y no me dí cuenta que la BUAP reanudaba labores hasta el 2 de octubre. Sólo tenía que regresar por mis tramites de titulación. Posiblemente regrese a apoyar este jueves.
jueves, 7 de septiembre de 2017
Clasificador k-NN supervisado con Scikit-Learn
Scikit-Learn es un módulo para Python que incluye varias rutinas de clasificación, regresión y clustering entre otras herramientas matemáticas utilizadas en machine learning y minería de datos. En esta entrada únicamente trataré un ejemplo sencillo que permitirá introducir a la idea central detrás del clustering o análisis de grupos.
Imaginemos que existe una especie de conejos en la que las hembras tienden a ser grandes y tener pelaje de color gris claro mientras que los machos tienden a ser más pequeños y tener un pelaje más oscuro. Crearemos un programa que implemente un clasificador k-NN (k-nearest neighbors) utilizando el modulo scikit-learn. Este algoritmo de clasificación es muy sencillo. Su trabajo es dividir un espacio de n dimensiones (dónde cada una de ellas en la práctica representa un atributo o característica de un objeto) en N regiones (dónde cada una representa una clase de objetos). El modelo de división del espacio se basa en la razón de clases de los 'k' datos vecinos más cercanos a un punto de dicho espacio. Por ejemplo, para el caso en dónde solo existen n = 2 características y N = 2 clases (triángulos y cuadrados):
Para k = 3 (circulo solido), el elemento desconocido en verde será clasificado dentro de la categoría de los triángulos (2 triángulos vs 1 cuadrado). Para un k = 5 (circulo punteado), el elemento sera clasificado dentro de la categoría de los cuadrados (3 cuadrados vs 2 triángulos). El modelo de clasificación debe poder hacer predicciones para todos los posibles datos que caigan en cualquier punto del espacio de características. El proceso de generación de este modelo se conoce como entrenamiento. Existen dos caminos: supervisado, cuando el conjunto de datos de entrenamiento esta clasificado desde un principio para el algoritmo y no supervisado, cuando no se le dice algoritmo a que clase pertenece cada elemento del conjunto de entrenamiento. En nuestro ejemplo de los conejos utilizaremos un entrenamiento supervisado a partir de un conjunto de datos de entrenamiento que generé con la siguiente distribución (conejos.csv):
El color de los conejos está especificado por valores en escala de grises de 8-bits (0-255). El código se puede dividir en 4 secciones: carga y acondicionado de los datos de entrenmiento, instanciación del clasificador desde el módulo, entrenamiento del clasificador y finalmente la predicción de la clase de un elemento arbitrario. Una vez entrenado el clasificador, debe poder retornar una predicción de la clase a la cual puede pertenecer el vector [color,tamaño]. El código es el siguiente:
Para más detalles recomiendo revisar la documentación de sklearn.neighbors.KNeighborsClassifier.
Imaginemos que existe una especie de conejos en la que las hembras tienden a ser grandes y tener pelaje de color gris claro mientras que los machos tienden a ser más pequeños y tener un pelaje más oscuro. Crearemos un programa que implemente un clasificador k-NN (k-nearest neighbors) utilizando el modulo scikit-learn. Este algoritmo de clasificación es muy sencillo. Su trabajo es dividir un espacio de n dimensiones (dónde cada una de ellas en la práctica representa un atributo o característica de un objeto) en N regiones (dónde cada una representa una clase de objetos). El modelo de división del espacio se basa en la razón de clases de los 'k' datos vecinos más cercanos a un punto de dicho espacio. Por ejemplo, para el caso en dónde solo existen n = 2 características y N = 2 clases (triángulos y cuadrados):
Para k = 3 (circulo solido), el elemento desconocido en verde será clasificado dentro de la categoría de los triángulos (2 triángulos vs 1 cuadrado). Para un k = 5 (circulo punteado), el elemento sera clasificado dentro de la categoría de los cuadrados (3 cuadrados vs 2 triángulos). El modelo de clasificación debe poder hacer predicciones para todos los posibles datos que caigan en cualquier punto del espacio de características. El proceso de generación de este modelo se conoce como entrenamiento. Existen dos caminos: supervisado, cuando el conjunto de datos de entrenamiento esta clasificado desde un principio para el algoritmo y no supervisado, cuando no se le dice algoritmo a que clase pertenece cada elemento del conjunto de entrenamiento. En nuestro ejemplo de los conejos utilizaremos un entrenamiento supervisado a partir de un conjunto de datos de entrenamiento que generé con la siguiente distribución (conejos.csv):
El color de los conejos está especificado por valores en escala de grises de 8-bits (0-255). El código se puede dividir en 4 secciones: carga y acondicionado de los datos de entrenmiento, instanciación del clasificador desde el módulo, entrenamiento del clasificador y finalmente la predicción de la clase de un elemento arbitrario. Una vez entrenado el clasificador, debe poder retornar una predicción de la clase a la cual puede pertenecer el vector [color,tamaño]. El código es el siguiente:
Para más detalles recomiendo revisar la documentación de sklearn.neighbors.KNeighborsClassifier.
Etiquetas:
Machine Learning,
Python,
scikit-learn
jueves, 27 de julio de 2017
De finales y comienzos
Nunca pensé que terminar un tratamiento psicológico se sintiera como terminar un libro, juego o una serie que te gustó mucho. Te libraste del cruel villano después tantas batallas, finalmente, está hecho, pero ahora sabes que no volverás a ver a quienes te acompañaron en esta larga campaña. Quizá haya un nuevo enemigo y los antiguos combatientes deban ser reunidos de nuevo en el futuro. Pero por ahora camino sobre las ruinas del régimen vencido con una mezcla de libertad y soledad en el pecho... Pero me si me detengo a pensarlo, ¿no es este el inicio de una historia completamente nueva?
lunes, 17 de julio de 2017
He Has Left Us Alone But Shafts of Light Sometimes Grace the Corners of Our Rooms
Tenía bastante que no disfrutaba tanto un disco de Post-Rock. El disco debut de Thee Silver Mt. Zion Memorial Orchestra. Poniéndome un poco en contexto, acabo de emborracharme solo con una Calavera Witbier mientras lo escuchaba. La lluvia de verano en Puebla aún suena allá afuera. Puedo ahorrarme una larga reseña de por qué este disco en una obra de arte si únicamente les recomiendo salir a buscar unas buenas cervezas para acompañarlo. Acompañarlo en soledad y con el mejor equipo de sonido que tengan. Descargar
jueves, 13 de julio de 2017
Ejemplo de programación multithread en Python
Como anexo a la entrada anterior, pongo un ejemplo del mismo programa pero en Python utilizando el módulo threadings. En este programa hago un cambio importante, estoy utilizando un producto punto del módulo numpy, una operación que está optimizada y escrita en C lo que me da tiempos de ejecución menores que los del programa anterior [Ref]:
Ejecutamos y medimos el tiempo de ejecución con:
time (python MatMulThreads.py)
Estos fueron los tiempos de ejecución en una Raspberry Pi 3 para matrices de 2000x2000:
Debe tomarse en cuenta que a pesar de que ambos programas son semanticamente iguales, su implementación no lo es. Es de notarse que en este caso no hay tanta mejoría entre 2 y 4 threads.
Ejecutamos y medimos el tiempo de ejecución con:
time (python MatMulThreads.py)
Estos fueron los tiempos de ejecución en una Raspberry Pi 3 para matrices de 2000x2000:
Debe tomarse en cuenta que a pesar de que ambos programas son semanticamente iguales, su implementación no lo es. Es de notarse que en este caso no hay tanta mejoría entre 2 y 4 threads.
Suscribirse a:
Entradas (Atom)









