viernes, 7 de diciembre de 2018

Aguacates gratis

Desde finales de julio de este año que termina me entró la espina de plantar arboles de aguacate por toda la Unidad Morelos. Supongo que aquí debería comenzar a relatar todas las cosas que ocurrieron en este año para que tengan más claro el contexto. Es toda una historia que debería utilizar como motivación para regresar a bloggear con más frecuencia. Pero diré por ahora que la razón principal por la que he estado plantando arboles de aguacate ha sido porque me gustaría que en 7 o 10 años en el futuro la gente pueda salir a cortar aguacates sin gastar dinero. Con eso sabría que estoy contribuyendo económicamente al menos un poco en mi comunidad. Además están los beneficios de la sombra, la captación de CO2 y la estética (es más bonito ver arboles por todos lados). Es muy sencillo germinar huesos de aguacate. Hay varios video-tutoriales, aunque lo funciona mejor es enterrar el hueso tan pronto le salen raíces y no hasta después que le salgan las hojas como suelen decir. También funciona muy bien enterrar el hueso directamente (cosa que he hecho por toda la Unidad). Espero que más personas puedan ayudarme a sembrar más arboles por todo el sur de Morelos.

domingo, 25 de noviembre de 2018

¿Existe un método universal para resolver problemas?

No tengo duda de que los genios no nacen, sino se hacen a través de practica efectiva acumulada (recomiendo ver estos videos [Pt1,Pt2]). Entiendo también que debe haber una componente genética en el proceso, pero no la considero sustancial. Si todos podemos ser genios, entonces la pregunta ahora es si existe un método efectivo que no vuelva maestros de la resolución de problemas. No podría dar alguno pero si creo que si es posible hacer un bosquejo inicial que nos lleve al método que buscamos si lo refinamos lo suficiente.

Definir el problema. Aparentemente esto no parece llevarnos a algún lado pero pensémoslo de otra manera. Cuando comencé a aprender Prolog me pareció muy interesante el hecho de que la solución a un problema se encuentra únicamente a través de la definición correcta del problema. No es que la solución brote de la anda. Prolog al ser un lenguaje declarativo, su interprete utiliza una serie de algoritmos que procesan los "hechos" del problema. Si le das al interprete una descripción de los hechos lógicamente consiste al problema que quieres resolver entonces tendrás su solución. Esto es un ejemplo de como un replanteamiento del problema puede abrirnos un camino a su solución.

Dividir el problema en sub-problemas. Si el problema es simple (no necesariamente fácil de resolver, pero simple en el sentido de no ser divisible) este paso no será necesario. Pero si el problema es complejo, resulta muy útil partirlo en diferentes problemas (en principio más fáciles de resolver). Pudiera ser el caso que para resolver el problema sea necesario primero desarrollar alguna habilidad en particular o investigar sobre algún tema en especifico (la práctica e investigación también son sub-tareas en este sentido).

Cuestionar las restricciones. Este punto está relacionado con la definición del problema. Una vez que lo hemos definido tenemos que pensar: ¿son necesarias todas las restricciones que estoy considerando o estoy poniendo restricciones que no existen en el problema? Esto se conoce también como pensar fuera de la caja. Es necesario hacer notar que hace falta definir la caja antes de hablar sobre lo que está fuera de ella. Por ello, esto debe hacerse sólo después de hacer al menos un primer intento de definición del problema.

Explorar los recursos disponibles. Cuando se haya definido el problema y descartado restricciones ficticias es hora de poner manos a la obra. Se deben hacer las siguientes preguntas: ¿qué podría usar de todo lo que sé y de todo lo que está a mi alrededor (o en el ambiente o contexto del problema)? ¿he resuelto antes problemas similares?, en caso de que me falte experiencia o información ¿dónde podría conseguirla o a quién podría consultar? Una técnica también inspirada de Prolog es hacer un diccionario de hechos y reglas , es decir, anotar o tener presente en la mente todas las características de los elementos y relaciones de causa y efecto tanto en el problema como en el ambiente del problema [cosas como: "A es un T","si ocurre X entonces Y", "si se quita W entonces Z", etc].

Pensar al revés. Sé que quisiéramos que las soluciones a nuestros problemas estén a un sólo paso de nosotros. A veces es verdad y esa solución se hace evidente al definir el problema de forma ingeniosa o de eliminar restricciones ficticias. Pero muchas veces los problemas requieren de una solución de varias etapas. Una manera de atacar este tipo de problemas es partir del estado deseado (meta) que llamaremos "G(n)" y tratar de pensar: ¿cual tendría que ser el estado anterior inmediato G(n-1)? ¿cómo podría resolver de G(n-1) a G(n)? Este proceso es básicamente una división en subproblemas pero en orden temporal inverso hasta llegar al primer paso [G(1) a G(2)]. Esto se conoce como análisis retrospectivo.

Resistir la frustración. En lo personal creo que este el punto más importante de todos. No es un aspecto metodológico sino psicológico, pero que al dominarlo nos da una herramienta invaluable. No siempre veremos la solución al primer intento. Somos humanos y no puedo pedir no sentir enojo o desesperación ante una falla, pero si pido aguantarla. La buena noticia es que la resistencia o tolerancia a la frustración es como un musculo que se vuelve más fuerte entre más se ejercite. Algunos recomiendan tomar descansos entre las fallas. A mi en lo personal me ha servido muchas veces la actitud de "no me voy a ir de aquí hasta que funcione". Depende realmente de la persona, pero la idea es aguantarse y hacerse fuerte ante el fracaso.

Buscar tener nuevos problemas. Esto pareciera ser algo que todos queremos evitar, pero volverse un masoquista intelectual te da, con el tiempo, un repertorio muy amplio de experiencias que te permite resolver problemas similares, muchas veces con sólo recordar y modificar ligeramente soluciones pasadas.

Todo lo anterior es un apunte personal. No voy a decir que es el elixir sagrado de la resolución de problemas. Pero es lo que me ha funcionado y son notas que iré extendiendo o mejorando sobre la marcha de mi vida.

martes, 6 de noviembre de 2018

Resolviendo acertijos con Prolog

Empecé a aprender Prolog hace unos 2 días. Aunque ya había oído sobre él hace años, me entró mucha curiosidad de aprender a usar este lenguaje en agosto durante un simposio en el IIMAS en dónde presentaron las investigaciones del grupo Golem, quienes desarrollan robots de asistencia. Me impresionó el grado de entendimiento que parecían tener sus robots sobre su entorno a la hora de procesar lenguaje natural y realizar tareas. El sesión de Q@A se comentó que sus programas estaban basados en buena parte en Prolog. La verdad me costó bastante comenzar a pensar como un programador declarativo de forma fluida. Afortunadamente hay bastantes recursos para principiantes, aunque se vuelve más difícil encontrar material claro conforme se avanza en el lenguaje. En esta entrada sólo quiero hacer una corrección a una solución que se da aquí. (Si quieren aprender Prolog desde 0, les recomiendo este curso en Youtube en español. No recuerdo si lo menciona pero pueden usar este compilador en linea: https://swish.swi-prolog.org/ [Este otro curso es más completo pero esta en inglés]). Bien, el acertijo es el siguiente:

”Un alumno de ITS, debido al nerviosismo del primer día de clase, ha anotado el nombre de sus profesores (Elisa, Fernando y Carlos), las asignaturas que se imparten (Lógica, Programación y Matemáticas) y el día de la semana de las distintas clases (lunes, miércoles y viernes), pero sólo
recuerda que:
- La clase de Programación, impartida por Elisa, es posterior a la de Lógica
- A Carlos no le gusta trabajar los lunes, día en el que no se imparte Lógica
Ayudale a relacionar cada profesor con su asignatura, así como el día de la semana que se imparte
(Sabemos que cada profesor imparte una única asignatura y que las clases se dan en días diferentes)”


El acertijo es sencillo y se puede resolver mentalmente. Pero aquí lo interesante es pensar en como resolver este problema con un lenguaje declarativo como Prolog. La falla en el programa de respuesta de este acertijo radica justamente en no considerar que es necesario decirle a la máquina de forma clara cuales son las restricciones del problema. Porque en Prolog, como en el dicho popular, "lo que no está prohibido está permitido". Si se hace la consulta con la base de datos del programa original se puede verificar que trabaja(P,D),imparte(P,M),clase(M,D) devuelve la respuesta correcta del acertijo:

D = miercoles,
M = logica,
P = carlos
D = viernes,
M = programacion,
P = elisa
D = lunes,
M = matematicas,
P = fernando

Si pensamos como un programador tradicional imperativo esto nos debería parecer suficiente. El punto es encontrar esa respuesta ¿no?. El problema es que en un programa de Prolog, todas las consultas deben ser consistentes con las restricciones y soluciones del problema. Observen ahora que si hacemos, por ejemplo, la consulta trabaja(fernando,viernes) ¡la respuesta es verdadera! Esto significa que la computadora no está "entendiendo" realmente la situación. Mi versión de la respuesta que corrige este inconveniente es la siguiente:

Puede verificarse que ahora todas las consultas son consistentes con el problema. La solución la estructuro como una lista de listas con la forma:

S = [[P0,M0,lunes],[P1,M0,miercoles] ,[P2,M0,viernes] ]

Se debe dejar claro que las variables en la lista no pueden repetirse una vez usadas (como lo establece el acertijo). Declaro esto con:

    permutation([P0,P1,P2],Profesores),
    permutation([M0,M1,M2],Materias),  

La función permutation(listaA,listaB) retorna verdadero si listaA es alguna de las posibles permutaciones de listaB. Para entender el resto del programa hará falta revisar el manejo de listas y variables anónimas en los cursos que enlacé. En lo que quiero hacer énfasis es  en que buena parte de los problemas lógicos en los que se requiere repartir atributos a un grupo de objetos pueden resolverse estructurando la respuesta como una lista o una lista de listas y jugando con los operadores de pertenencia, permutación y relaciones de posición entre los elementos de la lista.

jueves, 13 de septiembre de 2018

Librerías de periféricos en MPLAB X v5+ / XC8

Como ya se deben haber dado cuenta todos los que han intentado usar plib.h en las versiones más recientes de XC8, estas bibliotecas han sido descontinuadas en favor de MPLAB Code Configurator y el linker no da la opción de Link in peripheral library. Pero es posible seguir usándolas instalando versiones anteriores de XC8 que pueden ser descargadas desde el archivo de software de Microchip. El usuario de GitHub Burakenes recomienda instalar la versión 1.34 que ya viene con las librerías de periféricos pre-instaladas y da menos problemas que las versiones en dónde deben instalarse por separado. Una vez instalado XC8 v1.34 aún hará falta ir a las propiedades del proyecto linker y seleccionar la casilla de Link in peripheral library. Aquí muestro una captura de una prueba de xlcd.h modificada para la tarjeta de desarrollo Miuva:
 Pueden leer aquí un tutorial de modificacion de los pines para el LCD.

miércoles, 12 de septiembre de 2018

Instalar MPLAB X en Debian 9 (64 bits)

Primero deben activar el soporte multi-arquitectura agregando la arquitectura i386

 $ sudo dpkg --add-architecture i386 

Luego instalar librerias de compatibilidad para i386:

$ sudo apt-get update 
$ sudo apt-get upgrade
$ sudo apt-get install libc6:i386 libx11-6:i386 libxext6:i386 libstdc++6:i386 libexpat1:i386 

Finalmente se ejecuta el instalador descargado de aquí:

$ sudo ./MPLABX-v5.05-linux-installer.sh

Si la instalación se realiza correctamente podemos iniciar MPLAB X buscándolo en las aplicaciones:


NOTA: Deben tener ya instalado Java Runtime Enviroment en su sistema. Aquí hay una guía de instalación en español.

viernes, 3 de agosto de 2018

Empresas de desarrollo de sistemas electrónicos en México


Desde hace ya un tiempo he tenido la idea de hacerme freelancer de desarrollo de prototipos electrónicos para proyectos de investigación. Pero primero tenía que darme la vuelta por el vecindario y averiguar que empresas ya se encuentran ofertando el mismo servicio. A modo de directorio personal iré agregando empresas a esta entrada.

Vantaware (San Luis Potosí)
Diseño e impresión de circuitos, sistemas embebidos/FPGA, Desarrollo de hardware y software a la medida, asesoría y capacitación, servidores.
http://vantware.com/

HAS-IT (Zacatecas)
Diseño e impresión de circuitos, sistemas embebidos/FPGA, Desarrollo de hardware y software a la medida, asesoría y capacitación, impresión 3d.
http://has-it.com.mx/

Stratia (Jalisco)
Desarrollo de hardware y software a la medida, consultoría de software e integración de hardware.
http://stratia.mx/Empresa

Electronics in Evolution (Querétaro)
Diseño, impresión y ensamble de circuitos, ingeniería inversa.
http://www.electronicsine.com

Electronic Cats (Aguascalientes)

Open Hardware y Sistemas Embebidos.
https://electroniccats.com/

Sicom
Desarrollo de hardware y software a la medida, desarrollo de aplicaciones móviles, sistemas embebidos, integración de sistemas.
http://www.sicom.mx

ObliSistemas (Nuevo León)
Desarrollo de hardware y software a la medida, sistemas embebidos, administración de servidores.
www.oblisistemas.com

Gollet Electronics (Jalisco)
Diseño, impresión y ensamble de circuitos, fabricación de arneses.
http://gollet.com.mx/w/

Mextronics (Estado de México)
Diseño, impresión y ensamble de circuitos, ingeniería inversa, migración de tecnologías, integración de arneses.
http://www.mextronics.com/

jueves, 28 de junio de 2018

Guía bibliografica para aprender ingeniería electrónica

Tengo muchos amigos que estudian o han estudiado física y algunos de ellos me habían preguntado sobre que libros podían consultar para aprender electrónica por su cuenta. Para responder a su petición y de paso hacer algo que siempre había querido terminar (una guía de repaso definitiva de mi licenciatura), creé esta guía bibliográfica que incluye todos los conocimientos fundamentales para un ingeniero en electrónica. Para esta guía he utilizado libros que están disponibles en español para que ningún ibero-americano ponga al idioma como un pretexto para no aprender. Los libros que he elegido son aquellos que considero, al igual que otros expertos en Quora, no sólo más claros y amigables para un estudiante autodidacta, sino también los más completos en su materia. Quiero aclarar que está guía representa el corazón de una ingeniería electrónica y deja fuera los temas de especialidad (la mía es en comunicaciones, quizá más adelante pueda hacer una guía en esa área).

Como requisito general es necesario al menos haber tomado los cursos de Calculo diferencial, Cálculo integral, álgebra lineal y ecuaciones diferenciales. Si se empieza desde 0 o se quiere repasar, recomiendo tomar los cursos anteriores en Khan Academy. Recomiendo aprender a usar simuladores de circuitos como Proteus, Multisim o LTspice. Aunque si quieren de paso entrar al mundo Linux y herramientas de simulación de código abierto, recomiendo instalar Fedora que es una distribución con bastantes herramientas para ingeniería electrónica en sus repositorios (Qucs, Oregano, Ngspice y gEDA).  

Electrónica analógica

Quizá para muchos esta sea la única sección de interés, así que de ser el caso pueden prescindir de las demás secciones. Aquí se cubren todos los fundamentos de esta área. (Estoy dejando fuera temas más especializados como electrónica de potencia, MOSFETS y antenas y circuitos de alta frecuencia).
Electrónica digital
 
Quiero comentar que para esta sección he omitido el tema de microcontroladores ya que considero que existe bastante información introductoria sobre el tema en internet (aquí hay un curso muy bueno para PIC18) y en cursos presenciales. Esta sección puede estudiarse simultáneamente con la sección de electrónica analógica.  

Control, señales y sistemas

Esta sección parece la más corta, pero la considero de dificultad un poco más elevada que las anteriores. Es necesario haber estudiado las secciones de electrónica analógica y digital para continuar con ella. Recomiendo instalar y aprender a utilizar Octave, que es el clon de código abierto de Matlab (la sintaxis es prácticamente idéntica).

martes, 26 de junio de 2018

Hoja de apuntes de VHDL (cheatsheet))

Todas las hojas de apuntes de VHDL que he visto son estéticamente feas e incompletas, así que tuve que hacer la mía en Latex porque la necesitaré para la maestría. Utilice una plantilla bastante bonita que creo un alemán y que posteó en una respuesta en Stackoverflow.

El pdf incluye dos hojas que si se imprimen en dos caras puede doblarse como un folleto y tenerse siempre en la mochila.

jueves, 31 de mayo de 2018

Diagramas de estado en LaTeX (TikZ)

TikZ es una paquetería muy poderosa que permite construir graficos complejos en LaTeX. En esta entrada sólo veremos como crear diagramas de estados para FSM's (Finite State Machine). Primero importamos el paquete y las librerías que vamos a utilizar:

\usepackage{tikz}
\usetikzlibrary{automata, positioning, arrows}

La creación de un diagrama se describe a continuación.

Estados

\node[state,opciones,posición] (nombre) {etiqueta de texto};

Las opciones para el tipo de estado contexto de las FSM son:
  • initial : Estado inicial
  • accepting: Estado de aceptación
  • Vacío para un estado genérico 
 La posición puede establecerse de las siguientes maneras:
  •  of= estado : right, left, above, below (o una combinación, ejem: above right ). Ejemplo:
\node[state, right of=q1] (q2) {$q_2$};
  • xshift=x, yshift=y : Da control manual de la posición relativa a un estado. Ejemplo:
\node[state, right of=q1, xshift=1cm] (q2) {$q_2$};
  • at (x,y) : Coloca la figura del estado en una posición especifica en la figura. Ejemplo:
\node[state] (q) at (2, 3) {$q$};
Flechas de transición
\draw (nodo origen) edge[opciones] node{etiqueta de flecha} (nodo destino);
  • El nodo de origen debe llevar el nombre y no la etiqueta del estado.
  • Las flechas por defecto rectas. Se pueden curvar con la opción bend left/right.
  • Los loops se crean con la opción loop above/below/left/right. 
Ejemplo

viernes, 26 de enero de 2018

ERIS

Cuando estaba empezando mi tesis de licenciatura tuve la sorpresa de encontrar una estación terrena con una enorme antena justo en Chetumal, una ciudad en la que viví por un año con mi papá entre 2005 y 2006. No había encontrado suficiente información así que me quedé con algunas dudas. Ya libre de la universidad, he estado básicamente de vacaciones en el sureste (al menos hasta que termine los detalles de la aplicación a la maestría) desde principios de enero así que me decidí a escribirles a los encargados y solicitar una visita. Esta semana al fin tuve la oportunidad  de ver de cerca esta estación terrena llamada ERIS (Estación de Recepción de Información Satelital). Agradezco enormemente la amabilidad y el recibimiento que me dieron los operadores de las instalaciones. Aprendí mucho y contestaron todas las dudas que tenía.

La estación se encuentra dentro de las instalaciones del Colegio de la Frontera Sur Unidad Chetumal, cerca de Calderitas. Fue instalada en 2007 inicialmente como un proyecto en conjunto entre México (Conacyt) y Alemania (DLR). Unos 6 años después la antena presentó un fallo que la dejó inoperante. El DLR decidió donar la antena a la Agencia Espacial Mexicana. La antena fue reparada en el CIATEQ y entró de nuevo en operación hace unos pocos años y ahora opera bajo un consorcio AEM-CONABIO-INEGI-Ecosur. Por ahora su principal tarea es la descarga de datos de los satélites Aqua y Terra. Tienen un enorme banco de imágenes multi-intrumento que pueden ser aplicado en muchas áreas de pertinencia. Hay mucho trabajo que hacer en reducción y fusión de datos, procesamiento digital de imágenes. Es realmente una mina de oro para proyectos de tesis y de investigación porque valdría mucho la pena hacerle difusión. Me enteré también de la existencia de otras dos estaciones similares: Ermex (Edo. Mex.) y Antena CONABIO (CDMX).

Me llevaron hasta la sala de control y a la azotea del edifico dónde se encuentra montada la antena. Tuve la suerte de estar durante un transito del satélite Aqua. Tomé un corto de video del movimiento del seguimiento del satélite. Fue un transito de alta elevación, el cual es particularmente complicado mecánicamente:

Si requieren más información o proponer una colaboración no duden en contactarlos, son super accesibles. Aún les hace falta una página con información actualizada pero pueden escribirles a este correo: antena@ecosur.mx.