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

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 sobre el tema en internet (especialmente cursos y tutoriales en Youtube) 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. 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.   

viernes, 1 de diciembre de 2017

Multiplicación en punto fijo Pt. 2 [formato fixdt(signed,n,s,b)]

Esta entrada es una continuación del tema de multiplicación punto fijo y tocará el tema de un formato de mapeo lineal que permite ajustar números enteros a un rango lineal arbitrario como puede ser los rangos de voltaje estándar para DAC's y ADC's. El formato es el siguiente:
fixdt(signed,n,s,b
  • signed: toma el valor de 1 si el entero almacenado es signado y 0 en caso contrario.
  • n:  longitud en bits del entero almacenado. 
  • s: pendiente de la función de mapeo lineal. 
  • b: bias de la función de mapeo lineal.
En esta convención un número con parte entera y decimal se representa de la siguiente manera:

 El rango de este formato queda definido por sus parámetros de la siguiente manera:
 La multiplicación queda definida cómo:
 La multiplicación es mas complicada que en el formato fixed(signed,n,l) pero se simplifica cuando b = 0 siendo en este caso similar a la multiplicación en el otro formato. El siguiente paso en definir el procedimiento para computar los valores de n, s y b según el intervalo continuo en que el que deseemos trabajar. Al igual que el formato anterior ,el parámetro n define los valores máximos para los enteres almacenados. Por tanto, teniendo definidos los límites del intervalo real y del intervalo entero, los valores de s y b se calculan resolviendo el siguiente sistema de ecuaciones:
 
 Realizaremos un ejemplo práctico para demostrar la utilizad de este formato su ventaja con respecto a fixed(signed,n,l). Implementaremos en un FPGA un generador de señal cosenoidal (he escrito una entrada sobre los detalles de estos generadores). Utilizaremos una DAC LTC1661 que tiene una resolución de 10 bits y un rango de salida de 0-Vreff*(1023/1024). Las salidas Vcc de la tarjeta que voy a utilizar son de 3.3 volts por lo que este intervalo será aproximadamente de 0-3.3 V. Ya que esta DAC no puede dar salidas de voltaje negativo el valor para signed sera '0'. Con esta información podemos encontrar los valores para establecer nuestro formato. Podemos obtenerlos mediante este código de Matlab:

minimo = 0; %Volts
maximo = 3.3; % Volts
is_signed = false;
word_length = 10;

[E_min, E_max] = range(fi([], is_signed, word_length, 0));

A = double ([E_min, 1; E_max, 1]);
b = double ([minimo; maximo]);
x = A\b;
format long g
slope = x(1)
bias = x(2)


La ejecución del código nos da una pendiente s = 0.0032258064516129 y un bias b = 0. La señal para este ejemplo tendrá una frecuencia de 0.05 Hz y un periodo de muestreo de 1 segundo (si pueden usar un osciloscopio pueden probar con una frecuencia más alta y un periodo de muestro más corto). Generaremos un código VHDL con HDL Coder a partir de este modelo de Simulink:
Los subsitemas que he llamado Fixed-Point Multiplication contienene la implementación de la multiplicación que hemos descrito aquí. Dado que b = 0 la multiplicación de punto fijo simplemente se define como el producto de los enteros almacenados y la pendiente s:
 Algo que podría resultar confuso y difícil de entender al principio es el por qué el producto con s se realiza en formato fixed(signed,n,l). La respuesta es que ese formato se utiliza para principalmente para la multiplicación de números fraccionales en un entorno que solo permita trabajar con números enteros de forma interna (que es el caso de nuestro sistema de hardware). El formato de mapeo lineal fixdt(signed,n,s,b) sólo se encarga de que las operaciones entre enteros tengan el sentido físico que esperamos de forma externa. Esto tambien explica un segundo hecho que tambien puede resultar confuso: las operaciones entre enteros se realizan en modo signed (para facilitar las restas) aunque se ha definido el modo unsigned

Para generar el código nos vamos a Code > HDL Code > Generate HDL. Para la comunicación SPI con la LTC1661 he modificado un código que había publicado anteriormente. Los módulos son los siguiente:
El esquemático del sistema es el siguiente:

Nota: durante la generación del código se indica que el reloj para el modulo del generador sea el doble del establecido. En este caso el divisor tiene una salida de 2 Hz.

Según la simulación, y si implementamos correctamente las cosas, las secuencia de voltaje que deberíamos ver experimentalmente a la salida del DAC es la siguiente:
Aquí muestro un video donde se puede ver que no tengo un buen multímetro y tuve que aumentar a 4 segundos el periodo de muestreo para dar tiempo de estabilizar las lecturas:
Referencias
Compute Slope and Bias, MathWorks
Fixed-Point: Rage and Precision, MathWorks 

lunes, 20 de noviembre de 2017

Generación de una señal coseno discreta

Podemos generar una función senoidal o cosenoidal de forma discreta mediante una ecuación de diferencias que es obtenida a partir de la transformada Z de una función senoidal o cosenoidal según sea el caso. Esta ecuación de diferencias es fácilmente implementable en un microcontrolador o FPGA. En este ejemplo crearemos un generador de señal cosenoidal. Partimos de la transformada Z de una función coseno discreto considerándola como la respuesta al impulso de la función de transferencia de un sistema Y(z)/X(z):
Dónde W0 es la frecuencia angular en tiempo continuo y Ts es el tiempo de muestreo [ver mi entrada sobre el concepto de frecuencia en tiempo discreto]. Multiplicamos ahora por z^-2/z^-2 para obtener un modelo físicamente sintetizable (debido a que los valores positivos en los exponentes de z implican muestras desde el futuro):
Multiplicamos ambos lados por el denominador de la función de transferencia y despejamos para Y(z):
Aplicamos transformada Z inversa para obtener finalmente nuestra ecuación de diferencias:
Para simular el generador utilizaremos Xcos de Scilab que es una alternativa de código abierto de Simulink [si no están familiarizados con esta herramienta aquí hay un video curso en español]. Antes de colocar los bloques debemos ir a menú superior en Simulation>Set Context y definimos las siguientes variables:

Ts = 0.1
W0 = 2*%pi/10
k0 = cos(W0*Ts)
k1 = 2*k0

 
El diagrama en Xcos es el siguiente:
Recordemos que hemos supuesto desde el principio que x[n] = delta[n]. La función Delta de Kronecker (impulso discreto) es un super bloque formado por el siguiente subsistema:
Dónde el retardo 1/z está inicializado a 1. Obsérvese que en el diagrama principal estamos enviando los resultados de la simulación al workspace. Personalmente, las gráficas nativas Scilab me parecen feas. Para hacer una grafica en Python exportaremos los datos de la simulación a un archivo CSV con el siguiente comando en la consola de Scilab después de ejecutar la simulación:

csvWrite([A.time,A.values],'cos_data.csv',',')

Teniendo el archivo podemos generar una gráfica en Python con el siguiente código:

import numpy as np
import matplotlib.pyplot as plt

A = np.loadtxt('cos_data.csv',delimiter = ',')

plt.stem(A[:,0],A[:,1])
plt.ylim([-1.5,1.5])
plt.grid(True)
plt.xlabel('Ts*n')
plt.ylabel('y[n]')
plt.show()



  Se deja como ejercicio construir un generador para función seno.

jueves, 16 de noviembre de 2017

Multiplicación en punto fijo [formato fixdt(signed,n,l)]

Aunque al principio pueda chocar con la intuición, es posible realizar de forma digital una multiplicación de dos números con parte entera y decimal utilizando únicamente números enteros. De hecho, para aplicaciones de instrumentación científica o simulaciones numéricas dónde la precisión sea la prioridad es incluso aconsejable evitar el uso del famoso punto flotante. Recomiendo enormemente ver este capítulo del canal PBS Infinite Series para entender desde el punto de vista matemático el problema fundamental de los tipos double y single. En pocas palabras este problema radica en la en las limitaciones en la accesibilidad sobre la recta numérica computable. La resolución del punto variable no es homogénea a lo largo de todo su rango. Una segunda limitación de las operaciones de punto flotante tiene que ver a su costo de implementación en hardware; construir circuitos digitales de punto flotante consumen más recursos en un FPGA.

El formato de punto fijo con el trabajaremos en esta entrada es:

 fixdt(signed,n,l)
  • signed : toma el valor de 1 si el entero almacenado es signado y 0 en caso contrario
  • n : longitud en bits del entero almacenado 
  • l : longitud en bits de la parte fraccional
En esta convención un número con parte entera y decimal se representa de la siguiente manera:
Los parámetros n y signed nos da el rango del formato:
A partir de la relación entre el Valor del Mundo Real (como se le llama en la jerga de punto fijo y denotaremos como Val) y el entero almacenado (que denotaremos por E) podemos definir la multiplicación de punto fijo de la siguiente forma:

Esto significa que la multiplicación se realiza como el producto de dos enteros mas un bitshift a la derecha de l locaciones. Para comprender mejor este formato realizaremos un ejemplo práctico concreto. Supongamos que queremos digitalizar una señal de voltaje sinusoidal de amplitud de 2 V con una frecuencia de 1 Hz mediante un ADC de 12 bits de resolución y un rango de entrada de 0-4 V. Supongamos que una vez digitalizada la señal queremos realizar un escalamiento de 0.321 y enviar esta nueva señal a un DAC de la misma resolución y rango. ¿Cómo resolveríamos el problema sin utilizar operaciones de punto flotante?

Bien, usaremos el formato fixdt(signed,n,l) para este ejemplo. Lo primero que debemos hacer es establecer los parámetros del formato. Ya que nuestro ADC no puede leer voltajes negativos, el parámetro signed será igual a 0. Dado que la resolución es de 12 bits entonces n = 12. Sabiendo que el voltaje máximo de lectura es 4 V encontramos el valor l de la siguiente manera:
Tenemos que el valor de l es 10 dando un rango de 0-3.99 V. Entonces el formato para nuestro ejemplo queda definido así: fixdt(0,12,10). El siguiente paso en convertir la ganancia de 0.321 en formato fixdt(0,12,10):
El equivalente de la ganancia resulta ser: 329. Podemos realizar ahora una simulación de nuestro ejemplo en Simulink y comparar el desempeño de la operación de punto fijo contra la de punto flotante:
Click para agrandar
El opam en el circuito añade el offset necesario para levantar la señal de la fuente y pueda ser adquirida por el ADC. Los bloques de ADC y DAC son simplemente subsistemas que realizan las operaciones de conversión de decimal a fixdt(1,12,10) y de muestro ZOH. Si bien Matlab/Simulink permite realizar las conversiones al formato fixdt(signed,n,l), decidí manejar uint16 para poder generalizar el ejemplo para ser implementado en microcontroladores y no sólo en FPGA's. Nuestro formato fixdt(0,12,10) cabe en un uint16 y eso también permite hacer una intuición más clara de que simplemente trabajamos con formatos enteros convencionales. La gráfica resultante con la comparativa es la siguiente:
Vemos que la correspondencia entre las operaciones de punto fijo y punto flotante son muy buenas. Podemos ahora a aventurarnos a escribir un codigo VHDL para nuestra operación de escalamiento de este ejemplo:

La simulación del módulo mostrando algunos valores de ejemplo para los enteros almacenados de entrada y salida es la siguiente:
 Click para agrandar
Para finalizar quisiera hacer un último comentario. Quizá notaron que tuvimos mucha suerte al calcular el valor del exponente l y nos dio un número que se ajustaba perfectamente al rango del ADC. No fue suerte, yo elegí el rango para que este ejemplo fuera más sencillo. En la practica los DAC's suelen tener rangos de 0-5.2 V o 0-3.3 V. ¿Que se hace en esos casos? Aquí es donde entra un nuevo formato: fixdt(signed,n,s,b). Pero hablaremos de él en otra entrada.

Referencias: