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 |
sábado, 11 de abril de 2020
Sobre aprendizaje e internet
![]() |
| Foto: Luis Eusébio |
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:
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:
El circuito simulado en Proteus es el siguiente:
El código completo:
RPINR20bits.SDI1R = 2; // SDI -> RP2/RB2
RPOR0bits.RP0R = 8; // SCK -> RP0/RB0
RPOR0bits.RP1R = 7; // SDO -> RP1/RB1
El circuito simulado en Proteus es el siguiente:
![]() |
| (Click para agrandar) |
Etiquetas:
Electrónica,
MPLAB X,
PIC's,
XC16
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:
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:
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):
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:
Para el manejo de múltiples archivos y directorios recomiendo revisar el ejemplo que viene en la documentación de 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
Para el manejo de múltiples archivos y directorios recomiendo revisar el ejemplo que viene en la documentación de la librería.
Suscribirse a:
Entradas (Atom)








