jueves, 28 de marzo de 2019
De regreso en la divulgación
La semana pasada y antepasada, di unas charlas sobre comunicaciones por radio en una
primaria al sur en Mérida. Use mi dongle de SDR FunCube. Noté que a los niños les llamó bastante la
atención el "arcoíris de radio" (como les digo para hacer referencia al espectrograma) y la demodulación del FM
qué hago con SDR# en tiempo. No pude controlar a los de 4to mucho tiempo (son los
de esta foto) pero los de 6to estuvieron muy tranquilos y entendieron
perfectamente bien cómo funciona la modulación digital FSK y ASK. En todos los años que llevo haciendo divulgación científica he visto una y otra vez la capacidad de los niños de entender conceptos complejos si se encuentra la manera adecuada de presentarlos. Me molesta bastante que se les trate como tontos. Afortunadamente me invitaron a un nuevo grupo de difusión científica llena de excelentes personas: Asociación Juvenil de Ciencia Yucatán. He estado en varios grupos de divulgación pero este verdaderamente tiene miembros con un equilibrio perfecto entre entusiasmo y talento. Esto es algo que no digo todos los días (i. e. soy muy mamón a la hora de evaluar proyectos y personas) y aún más curioso considerando sus edades, la mayoría estudiantes de segundo semestre. Llevo poco tiempo conviviendo con los miembros y en sus eventos ya he hecho nuevos amigos muy interesantes. El tipo de amigos que me hubiera gustado tener en mis primer año en Puebla.
martes, 26 de marzo de 2019
Sobre el por qué documentarlo todo
Como a muchos, si no es el caso de la mayoría, odiaba documentar mis proyectos en la universidad hasta que entendí su utilidad. Los problemas, sin importar su tipo, están muy a menudo
relacionados unos con otros. Cada problema que resuelves puede significar tiempo ahorrado en
un problema futuro. Entre más problemas hayas resuelto, mejores son tus
probabilidades de resolver tus siguientes problemas en menor tiempo. Pero esta
experiencia no se organiza de forma automática en tu mente (bueno fuera que si). Para aplicar el principio que comento es necesario llevar un registro
detallado de tus soluciones. Esta es mi regla: "documenta como si
tú yo del futuro fuera a olvidarlo todo". Es decir, no puedes confiar
en que el futuro seguirás teniendo en la memoria todos los pequeños detalles que
le dieron contexto a tus soluciones. En otras palabras, "date a ti mismo la
solución que te hubiera gustado que te cayera del cielo en ese
momento". No es necesario ser muy formales en la redacción si es una
documentación personal. Tengo varias libretas de "Príncipe Mestizo"
llenas de taches y correcciones con lo que funcionó y no funcionó, y este mismo blog es también la versión on-line de mis apuntes. Tan
pronto vean los resultados de esto amarán registrarlo todo. Siempre y cuando lo hagan de una manera
fácil de consultar cuando sea requerido, les garantizo placeres profesionales.
lunes, 25 de marzo de 2019
Gráfica de lecturas de un DHT11 en Python
Esta nota corta será para no olvidar como hacer una gráfica en Python de un conjunto de mediciones de temperatura a lo largo del tiempo. El sensor utilizado en un DHT11 (que muy tardé me di cuenta que tenía muy baja resolución y que es mejor el DHT22). Generé un archivo de texto a partir de comunicación serial entre un PIC y una Raspberry Pi dónde cada linea tiene la siguiente estructura:
2019-03-22 23:11:33,22,46
fecha, temperatura, humedad relativa
Algo muy útilil que aprendí a hacer es trasferir archivos entre un host local y la Raspberry a través de la red con un solo comando de consola. El comando es scp y su sintaxis es la siguiente para copiar del host local a la Raspberry :
$ scp /un/dir/local/archivo usuario@ipremota:/un/dir/remoto/archivo
Y de la Raspberri al host local:
$ scp usuario@ipremota:/un/dir/remoto/archivo /un/dir/local/archivo
Ya con el archivo en mi computadora, utilicé el módulo Pandas para leer el archivo .txt dónde registre cerca de dos dias y medio de datos de temperatura y humedad relativa. Aplique un filtro de mediana con el modulo scipy.signal para quitar los picos abruptos en los datos. Finalmente realice los ajustes necesarios para mostrar únicamente la hora en el eje x. El programa completo es el siguiente:
Gráfica:
Gráfica:
martes, 19 de marzo de 2019
CIAA
Hace unos días en un grupo de Facebook me ayudaron con una duda que me tenía
intranquilo y no puedo expresar lo agradecido que estoy. Me especialicé
en sistemas digitales y comunicaciones y no sé nada de manejo robusto de
transientes e interfaces en entorno industrial. Resulta que los
benditos argentinos tienen un proyecto de hardware y software abierto de
sistemas de cómputo para entornos industriales llamado CIAA (Computadora Industrial Abierta Argentina). Tienen absolutamente
todo lo que requería, diagramas de la circuitería de protección,
documentación, tesis, pruebas ¡Todo! Esto me ahorra meses enteros de trabajo. Tenía muchas dudas sobre el como implementar circuitos de protección robustos para tarjetas de aplicación de microcontroladores (PIC, AVR, STM32, etc.) aptas para soportar las condiciones de un entrono industrial.
Este es el el espíritu del hardware y software abiertos que tanto defiendo: llegar más
lejos echándonos la mano entre todos.
Etiquetas:
Anecdotario,
Electrónica,
PIC's
lunes, 18 de marzo de 2019
LCD en MPLAB X / XC8
Había comentado en una entrada pasada que las nuevas versiones de XC8 dejaron de usar Peripheral Library y en esa misma entrada explico el truco que pueden hacer para utilizarla. Sin embargo, los usuarios de PIC's modernos deben saber lo cómodo que es usar ahora MCC. Pero también habrán notado que no hay un generador de código para el manejo de LCD's. Así que he hecho un fork en GitHub de una librería hecha por Manolis Agkopian a la que hecho una mínima modificación para poder usarla en el PIC18F45K50. Pueden acceder a los códigos aquí. Esta librería me parece genial porque te permite usar el puerto que quieras, a diferencia de la mayoría que he visto que te limitan a un puerto fijo (que debes modificar si quieres usar otro). Lo único que deben hacer es agregar los archivos lcd.h y lcd.c a los headers de su proyecto. Como aún hay muchos usuarios del PIC18F4550 voy a poner aquí un ejemplo con él. Usaré una tarjeta Miuva a 48 MHz:
martes, 12 de marzo de 2019
Máquina de Estados Finitos en C [PIC18F45K50]
Para esta implementación en software de una máquina de estados finitos (FSM: Finite State Machine) haremos uso de punteros a funciones [click en el enlace para ver un video-tutorial]. Usaremos también el compilador XC8 en MPLAB X y un PIC18F45K50 con las mismas configuraciones que en la entrada anterior.
En una gran cantidad de problemas a resolver mediante un sistema embebido es necesario llevar a cabo un proceso estrictamente secuencial. En estos casos es muy útil y elegante estructurar nuestros programas como una máquina de estados. Quizá muchos de ustedes estén tentados a usar una estructura case para elegir un segmento de código cuando se cumple una condición. Si el numero de estados es pequeño, quizá se una opción fácil. Desafortunadamente el uso de case's es muy ineficiente cuando la máquina de estados y su tabla de transiciones es muy compleja. La implementación que se mostrará en esta entrada parecerá un tanto rebuscada pero tiene la ventaja de tener buen despeño a la hora de escalarla a numero grande de estados.
El diagrama de estados de la FSM de este ejemplo es el siguiente:
Las entradas 0/1 representan los estados de un switch conectado a RB0. Los estados se harán visibles enviando el numero correspondiente al Puerto D [esta acción será definida en la función asociada a cada estado]. Obsérvese que está máquina describe a un contador ascendente o descendente según la entrada. Se agregará un retardo de un segundo para poder visualizar las transiciones.
Movámonos al programa. Primero, debemos definir un tipo enumerado para codificar nuestro conjunto de estados:
//-- Definición de tipo de estados
typedef enum {
Estado_0, // Estado inicial
Estado_1,
Estado_2,
Estado_3,
Estado_4,
No_de_Edos
} ESTADOS;
Creamos con esto una variable enumerada global que usaremos para almacenar el estado actual de la máquina:
//-- Variable global de estado
ESTADOS Estado_Actual = Estado_0;
El siguiente paso es definir una estructura que nos permitirá construir un objeto para nuestra FSM:
//-- Estructura de Maquina de Estados (FSM))
typedef struct {
ESTADOS Estado; // Estado miembro del conjunto enumerado ESTADOS
void (*func)(int); // Acciones asociadas al estado
} FSM;
Con lo anterior podemos ahora crear una instancia que sera nuestra FSM:
//-- Prototipos de funciones de estado
void Codigo_EDO_0(int);
void Codigo_EDO_1(int);
void Codigo_EDO_2(int);
void Codigo_EDO_3(int);
void Codigo_EDO_4(int);
//-- Creación de la estructura global de la FSM
FSM Maquina_de_Estados[] = {
{Estado_0,Codigo_EDO_0},
{Estado_1,Codigo_EDO_1},
{Estado_2,Codigo_EDO_2},
{Estado_3,Codigo_EDO_3},
{Estado_4,Codigo_EDO_4},
};
Es importante que los prototipos de las funciones asociadas a cada estado aparezcan antes de la creación de la estructura (estas funciones serán definidas más adelante en el código). El segmento de código principal queda reducido elegantemente de la siguiente manera:
void main(void) {
int sw = 0;
setup();
//-- FSM ---
while(1){
sw = PORTBbits.RB0;
(*Maquina_de_Estados[Estado_Actual].func)(sw);
}
return;
}
Código completo:
Circuito utilizado:
En una gran cantidad de problemas a resolver mediante un sistema embebido es necesario llevar a cabo un proceso estrictamente secuencial. En estos casos es muy útil y elegante estructurar nuestros programas como una máquina de estados. Quizá muchos de ustedes estén tentados a usar una estructura case para elegir un segmento de código cuando se cumple una condición. Si el numero de estados es pequeño, quizá se una opción fácil. Desafortunadamente el uso de case's es muy ineficiente cuando la máquina de estados y su tabla de transiciones es muy compleja. La implementación que se mostrará en esta entrada parecerá un tanto rebuscada pero tiene la ventaja de tener buen despeño a la hora de escalarla a numero grande de estados.
El diagrama de estados de la FSM de este ejemplo es el siguiente:
![]() |
| Diagrama hecho en LaTeX con TIKz |
Movámonos al programa. Primero, debemos definir un tipo enumerado para codificar nuestro conjunto de estados:
//-- Definición de tipo de estados
typedef enum {
Estado_0, // Estado inicial
Estado_1,
Estado_2,
Estado_3,
Estado_4,
No_de_Edos
} ESTADOS;
Creamos con esto una variable enumerada global que usaremos para almacenar el estado actual de la máquina:
//-- Variable global de estado
ESTADOS Estado_Actual = Estado_0;
El siguiente paso es definir una estructura que nos permitirá construir un objeto para nuestra FSM:
//-- Estructura de Maquina de Estados (FSM))
typedef struct {
ESTADOS Estado; // Estado miembro del conjunto enumerado ESTADOS
void (*func)(int); // Acciones asociadas al estado
} FSM;
Con lo anterior podemos ahora crear una instancia que sera nuestra FSM:
//-- Prototipos de funciones de estado
void Codigo_EDO_0(int);
void Codigo_EDO_1(int);
void Codigo_EDO_2(int);
void Codigo_EDO_3(int);
void Codigo_EDO_4(int);
//-- Creación de la estructura global de la FSM
FSM Maquina_de_Estados[] = {
{Estado_0,Codigo_EDO_0},
{Estado_1,Codigo_EDO_1},
{Estado_2,Codigo_EDO_2},
{Estado_3,Codigo_EDO_3},
{Estado_4,Codigo_EDO_4},
};
Es importante que los prototipos de las funciones asociadas a cada estado aparezcan antes de la creación de la estructura (estas funciones serán definidas más adelante en el código). El segmento de código principal queda reducido elegantemente de la siguiente manera:
void main(void) {
int sw = 0;
setup();
//-- FSM ---
while(1){
sw = PORTBbits.RB0;
(*Maquina_de_Estados[Estado_Actual].func)(sw);
}
return;
}
Código completo:
Circuito utilizado:
Etiquetas:
C,
Electrónica,
MPLAB X,
PIC's
viernes, 22 de febrero de 2019
Iniciando con el PIC18F45K50 / 25K50 en XC8
El PIC18F4550 es uno de los microcontroladores más populares entre estudiantes y hobbistas. Sin embargo ya es algo viejo (no tiene soporte para MCC , los K50 si). Poco a poco, se está migrando a su sustituto más nuevo: el PIC18F45K50. En México, fecha de 2019, aún no es muy fácil de conseguir en tiendas pero puede comprarse con envío gratis en Newark Mexico. Si nunca han usado MPLAB con XC8 aquí hay un tutorial bastante bueno (con PIC16, pero estén pendientes a mi canal porque subiré un curso para los K50). Vamos a realizar una práctica sencilla para comenzar a familiarizarnos con este MCU: Prender y apagar un led conectado a RB0 mediante un switch conectado a RD0 con un reloj a 48 MHz. Tengan a la mano la datasheet y vayamos por partes:
1. Configuración del reloj
El esquema de reloj es distinto al de su antecesor [pag. 29]. Usando un cristal de 16 MHz, este es el camino que debe estar habitado para conseguir los 48 MHz:
Los configuraciones necesarios son las siguientes:
#pragma config PLLSEL = PLL3X
#pragma config CFGPLLEN = OFF // ver Tabla 3-3
#pragma config CPUDIV = NOCLKDIV
#pragma config FOSC = HSM
#pragma config PCLKEN = ON
2. Configuración de puertos
Los pines RB0 y RD0 son usados por el módulo ADC por lo que deben desactivarse para ellos. En el caso del puerto B, esto puede hacerse al generar la cabecera de fuses con la linea:
#pragma config PBADEN = OFF
Para el caso de RDO deberá hacerse en el código principal escribiendo en el registro ANSELD [la tabla con todos los registros de función especial está en la página 84 de la datasheet] :
3 Código completo en C
Como regla general siempre se debe leer en puerto y escribir en latch:
1. Configuración del reloj
El esquema de reloj es distinto al de su antecesor [pag. 29]. Usando un cristal de 16 MHz, este es el camino que debe estar habitado para conseguir los 48 MHz:
![]() |
| Click para agrandar |
#pragma config PLLSEL = PLL3X
#pragma config CFGPLLEN = OFF // ver Tabla 3-3
#pragma config CPUDIV = NOCLKDIV
#pragma config FOSC = HSM
#pragma config PCLKEN = ON
Los pines RB0 y RD0 son usados por el módulo ADC por lo que deben desactivarse para ellos. En el caso del puerto B, esto puede hacerse al generar la cabecera de fuses con la linea:
#pragma config PBADEN = OFF
Para el caso de RDO deberá hacerse en el código principal escribiendo en el registro ANSELD [la tabla con todos los registros de función especial está en la página 84 de la datasheet] :
3 Código completo en C
Como regla general siempre se debe leer en puerto y escribir en latch:
lunes, 4 de febrero de 2019
Toolbox de Control para Python
Para aquellos que busquen un sustituto de código abierto para Matlab hay una buena noticia: Existe el módulo Python Control Systems Library. Acabo de probarlo y me parece mucho mejor que otras alternativas como los toolbox de control para Scilab y Octave. Si usan Anaconda, pueden instalarlo desde la terminal usando conda:
$ conda install -c conda-forge control
Quiero mostrarles algunos ejemplos simples utilizando el modelo de un motor NXT de Lego que describo en una entrada anterior. El modelo es el siguiente:
Creamos el objeto del modelo de la siguiente forma:
#Modelo como función de transferencia
num = [193.3]
den = [1.0, 18.735, 0.0]
sys = ctrl.tf(num,den) #Lazo abierto
print(sys)
El print nos mostrara la función de transferencia como una fracción en texto (al igual que en Matlab). Vamos a graficar ahora la respuesta al escalón de la planta en lazo cerrado:
#Modelo en lazo cerrado
sys_cl = ctrl.feedback(sys,1)
#Respuesta al escalón
t,y = ctrl.step_response(sys_cl)
#Graficas
plt.plot(t,y)
plt.grid(True)
plt.title(u"Respuesta al escalón")
plt.xlabel("segundos")
Lo que nos dará el siguiente resultado:
Para obtener el diagrama de bode:
plt.figure(2)
ctrl.bode_plot(sys)
Para visualizar el diagrama de polos y zeros:
from control.pzmap import pzmap
plt.figure(3)
polos,zeros = pzmap(sys_cl), plt.grid(True)
print(polos[0])
print(polos[1])
¡Trataré de crear notebook's con más ejemplos y subirlos en mi GitHub!
$ conda install -c conda-forge control
Quiero mostrarles algunos ejemplos simples utilizando el modelo de un motor NXT de Lego que describo en una entrada anterior. El modelo es el siguiente:
Creamos el objeto del modelo de la siguiente forma:
#Modelo como función de transferencia
num = [193.3]
den = [1.0, 18.735, 0.0]
sys = ctrl.tf(num,den) #Lazo abierto
print(sys)
El print nos mostrara la función de transferencia como una fracción en texto (al igual que en Matlab). Vamos a graficar ahora la respuesta al escalón de la planta en lazo cerrado:
#Modelo en lazo cerrado
sys_cl = ctrl.feedback(sys,1)
#Respuesta al escalón
t,y = ctrl.step_response(sys_cl)
#Graficas
plt.plot(t,y)
plt.grid(True)
plt.title(u"Respuesta al escalón")
plt.xlabel("segundos")
Lo que nos dará el siguiente resultado:
Para obtener el diagrama de bode:
plt.figure(2)
ctrl.bode_plot(sys)
Para visualizar el diagrama de polos y zeros:
from control.pzmap import pzmap
plt.figure(3)
polos,zeros = pzmap(sys_cl), plt.grid(True)
print(polos[0])
print(polos[1])
¡Trataré de crear notebook's con más ejemplos y subirlos en mi GitHub!
viernes, 1 de febrero de 2019
This Must Be The Place
Hoy descubrí una canción que no conocía de The Talking Heads que ahora quisiera escuchar por el resto de mi vida. Se me ha quedado muy grabado en la mente uno de los comentarios del video. Just buried a dear friend after his long battle with a cruel disease. Instead of a moment of silence, he requested this song be played. Momentos después, un tanto por accidente, me puse a escarbar en la antigua blogosfera. Suelo añorar la época en la que gente escribía con frecuencia sobre sus vidas e ideas. Entre blog y blog empecé a notar que la mayoría parecieron detenerse entre 2009 y 2011, habiendo algunos que aguantaron hasta 2013. De todos hubo uno que atrapó mi atención. El (no tan) maravilloso mundo del Jedi... Suelo saltarme las primeras entradas para tratar de recuperar la secuencia temporal. De haber leído la última entrada hubiera adelantado lo que averigüé después. El autor me cayó bien, de esas personas que hubiera disfrutado leer en 2008. Una costumbre de ex-blogger es mudarse a Twitter así que se me ocurrió buscarlo ahí. Su último tweet, fechado el 10 de agosto de 2013, era una corta despedida. Por un enlace a su Facebook publicado desde su Twitter me di cuenta, por los comentarios de sus amigos y familia, que había fallecido por leucemia en septiembre de 2013. Había visto perfiles de dueños ausentes antes, pero nunca uno tan lleno de escritos abundantes de buenos detalles. El tipo de cosas que muchos quisiéramos que nos escribieran al dejar el mundo. Sin haberlo conocido puedo decir que fue una persona que verdaderamente supo dejar huella en la gente. Incluso en un extraño como yo. This Must Be The Place me suena en la mente como el final de una pelicula.
miércoles, 23 de enero de 2019
Tres libros que verdaremante pueden cambiarte la vida
Al menos lo han sido para mí y considero buena idea hacer algunos comentarios. No me considero muy bueno haciendo reseñas pero creo que si puedo puntualizar por qué me hicieron cambiar mi modo de ver la vida.
The Practicing Mind (Ejercita Tu Mente en la edición en español), Thomas Sterner. Es un libro corto que te da una idea simple pero poderosa. Es una observación aparentemente obvia pero yo no vi hasta muchos años adelante en mi vida: Cada minuto de práctica/estudio cuenta y los minutos se acumulan con el tiempo. Ninguna habilidad se crea de la nada (ni se nace con ella), sino que debe crearse paso a paso a través de la práctica. El libro explica a detalle la profundidad que se oculta en esta idea y los consejos para llevarla a la práctica. Sin duda un libro que hubiera cambiado enormemente mi vida si lo hubiera leído a los 15 o 12.
Learned Optimism (Aprenda Optimismo), Martin Seligman. De acuerdo a las investigaciones del Prof. Seligman los consejos de este libro me habrían evitado muy probablemente el desorden de ansiedad generalizada contra el que luché por casi dos años. Y así lo creo. No se dejen engañar por el título que suena a superación personal barata. Lo digo teniendo una mente científica que no se traga cualquier cosa. En la definición del autor, optimismo es el entendimiento de que nuestras acciones cuentan y que, en la mayoría de las veces, tenemos mucho más control del que creemos, todo esto sin caer en una fastidiosa "actitud positiva" ciega.
Attached (Maneras de Amar), Amir Levine. No creo que en pocas lineas pueda hacer justicia a la manera en que este libro me abrió los ojos a todos los errores que había cometido en mi vida amorosa. Pueden quizá omitir mis anteriores recomendaciones, pero no esta. Este libro debería ser lectura obligatoria en la secundaria o preparatoria. El libro aborda el tema de de los modelos de apego en las relaciones humanas y de como aplicarlos para elegir a una pareja que se adecue a nuestro modo de apego y hasta incluso rescatar una relación. Les puedo asegurar que cuando lo lean lamentarán no haberlo hecho antes.
The Practicing Mind (Ejercita Tu Mente en la edición en español), Thomas Sterner. Es un libro corto que te da una idea simple pero poderosa. Es una observación aparentemente obvia pero yo no vi hasta muchos años adelante en mi vida: Cada minuto de práctica/estudio cuenta y los minutos se acumulan con el tiempo. Ninguna habilidad se crea de la nada (ni se nace con ella), sino que debe crearse paso a paso a través de la práctica. El libro explica a detalle la profundidad que se oculta en esta idea y los consejos para llevarla a la práctica. Sin duda un libro que hubiera cambiado enormemente mi vida si lo hubiera leído a los 15 o 12.
Learned Optimism (Aprenda Optimismo), Martin Seligman. De acuerdo a las investigaciones del Prof. Seligman los consejos de este libro me habrían evitado muy probablemente el desorden de ansiedad generalizada contra el que luché por casi dos años. Y así lo creo. No se dejen engañar por el título que suena a superación personal barata. Lo digo teniendo una mente científica que no se traga cualquier cosa. En la definición del autor, optimismo es el entendimiento de que nuestras acciones cuentan y que, en la mayoría de las veces, tenemos mucho más control del que creemos, todo esto sin caer en una fastidiosa "actitud positiva" ciega.
Attached (Maneras de Amar), Amir Levine. No creo que en pocas lineas pueda hacer justicia a la manera en que este libro me abrió los ojos a todos los errores que había cometido en mi vida amorosa. Pueden quizá omitir mis anteriores recomendaciones, pero no esta. Este libro debería ser lectura obligatoria en la secundaria o preparatoria. El libro aborda el tema de de los modelos de apego en las relaciones humanas y de como aplicarlos para elegir a una pareja que se adecue a nuestro modo de apego y hasta incluso rescatar una relación. Les puedo asegurar que cuando lo lean lamentarán no haberlo hecho antes.
Suscribirse a:
Entradas (Atom)














