"Aquí nadie está loco, solo vive un realidad distinta"
Jim Morrison.

" ¿De qué serviría hablar de aquello? Nadie me creería"
Napoleón Bonaparte.

lunes, 24 de noviembre de 2014

Multiplexado de displays de 7 segmentos, utilizando un PIC16F84A programado en ensamblador con el MPLABX

Hace unos meses atrás, uno de mis amigos me pidió apoyo para hacer un pequeño obsequio para su novia. Yo le dije: "Trata de portarte bien con ella y e intenta cumplir la mayoría de sus deseos o antojos, ése es un buen regalo"; después de conversar y bromear un rato mi amigo y yo, optamos por hacer un circuito que mostrara la muy famosa frase: "I love you". 

El diseño inicial que le propuse a mi compañero, consistía en utilizar un contador BCD, un circuito integrado NE555 como temporizador astable y circuitos lógicos combinacionales, para que mediante minitérminos y mapas de Karnaugh, controlar el encendido/apagado de displays de 7 segmentos y mostrar la frase antes mencionada, desplazándose en modo marquesina. Años atrás, en el 2002, me había tocado diseñar y armar un circuito similar para la materia de Circuitos Lógicos II en el bachillerato; de dicho circuito sólo encontré una fotografía entre el acervo de imágenes que tengo, el procedimiento de diseño plasmado en papel lo deseché a finales del 2013. El circuito de aquel entonces se muestra a continuación:


(Para expandir, clic en la imagen).

En éste documento en formato PDF, se muestra parte del diseño inicial del circuito para la novia de mi compañero (puede tardar un poco en cargar el documento, ya que pesa 3 MB):


Después, le hice la observación a mi compañero, de que el circuito quedaría un poco extenso, que lo mejor era tratar de hacerlo compacto y portable. Y opté por cambiar el diseño y armar dicho circuito con un microcotrolador (le sugerí el PIC16F84A), enviando datos a través de un BUS de 7 bits conectado a los displays de 7 segmentos, y multiplexando éstos últimos para mostrar datos diferentes en cada uno.

Después de un par de días programando en lenguaje ensamblador y alambrando el circuito en una tablilla de experimentación, se obtuvo un diagrama final, que se muestra a continuación:



En éste video, se muestra el circuito armado de manera física y funcionando, en una tablilla de experimentación (protoboard):


Por último, para aquell@s que deseen armar éste circuito, pueden descargar el diagrama y el código en lenguaje ensamblador (se compila con el MPLABX de Microchip), en el siguiente link:
¡Muchas gracias por leer ésta entrada del blog!

ALF

jueves, 6 de noviembre de 2014

Conectando 2 puertos serie virtuales (COM), utilizando Virtual Serial Ports Emulator

Hace un tiempo, recibí la llamada de uno de mis amigos estudiante de Ingeniería en Sistemas Computacionales, él se encontraba con un pequeño problema: Intentaba construir un circuito con un microcontrolador PIC18F2550, que se conectase a la PC, usando comunicación serial (RS232), y que respondiera a una serie de caracteres, enviados desde la PC hacia el circuito usando el software Hyperterminal, para que el PIC hiciera encender/apagar LED's

Mi camarada contaba con todo lo necesario para implementar el circuito, pero no sabía muy bien por donde empezar el programa del microcontrolador. Por otra parte, yo, al encontrarme momentáneamente fuera de mi lugar de trabajo y de mi casa, sólo contaba con mi computadora portátil, conexión a internet y con unos cuantos programas de simulación de circuitos, así como del compilador de C CCS para microcontroladores PIC.

Entre los programas que tenía de simulación, se encontraba el ISIS de la paquetería Proteus (que para este caso usé la versión 8 SP0) de Labcenter Electronics; recordé entonces que podía programar el microcontrolador de manera virtual, posteriormente usar un emulador de puerto COM que trae el ISIS y enviar caracteres por el Hyperterminal. Pero el dilema era ¿Cómo voy a interconectar mi circuito virtual con el Hyperterminal?, si al abrir el puerto COM virtual en ISIS, no iba a permitirme abrirlo también en Hyperterminal de manera simultánea, además, tampoco contaba con cables convertidores de USB a Serial.

Después de buscar un poco en internet, encontré la solución: El Virtual Serial Ports Emulator (VSPE).

El cual pueden descargar del siguiente link:


Éste software, además de simular la interconexión de 2 puertos serie virtuales, permite crear otras conexiones, como las que se muestran en las siguientes imágenes:

Connector

(Para expandir, dar clic sobre la imagen).

Splitter

(Para expandir, dar clic sobre la imagen).

Pair

(Para expandir, dar clic sobre la imagen).

Mapper

(Para expandir, dar clic sobre la imagen).

Tcp Server

(Para expandir, dar clic sobre la imagen).

Tcp Client

(Para expandir, dar clic sobre la imagen).

Serial Redirector

(Para expandir, dar clic sobre la imagen).

UDP Manager

(Para expandir, dar clic sobre la imagen).

Bridge

(Para expandir, dar clic sobre la imagen).

Spy

(Para expandir, dar clic sobre la imagen).

A continuación se muestra un video, de cómo instalar y configurar el VSPE para intercambiar caracteres entre 2 ventanas del Hyperterminal:




Por último, se muestra el video de la simulación del circuito en ISIS, que comenté en las líneas de arriba (en alguna entrada posterior detallaré el diagrama y el código del circuito):




¡Muchas gracias por leer esta nueva entrada!

ALF

viernes, 25 de julio de 2014

Comunicación serie vía Bluetooth entre la tarjeta MSP430 Launchpad y Processing.

Pensando en hacer una mejora en el circuito de la entrada anterior denominada Comunicación serie entre la tarjeta MSP430 Launchpad y Processing, se me ocurrió ahora hacer la comunicación de manera inalámbrica utilizando un módulo Bluetooth.


Para construir este circuito necesitamos el siguiente material:

------- Hardware: -------

- Tarjeta MSP430 Launchpad de Texas Instruments Rev. 1.5, con el microcontrolador MSP430G2553 incluido en el kit (la tarjeta que se muestra en la imagen ha sido modificada para cumplir con algunos requerimientos).


Clic en la imagen para expandir.

- Módulo Bluetooth (El módulo mostrado en la imagen fue adquirido en la página de Deal Extreme http://www.dx.com/p/jy-mcu-arduino-bluetooth-wireless-serial-port-module-104299#.U9A9t9zNggs), éste módulo viene configurado por default para trabajar mediante comunicación serie con una velocidad de 9600 baudios y 8 bits para comunicación.

Clic en la imagen para expandir.

- Potenciómetro de 10 KΩ.


Clic en la imagen para expandir.

- Batería de 3.6V (Las baterías de la imagen fueron extraídas de teléfonos fijos inalámbricos que ya no se utilizaban).


Clic en la imagen para expandir.

- Cables con terminales hembra y macho (Se pueden adquirir en la página de Deal Extreme http://www.dx.com/p/arduino-compatible-breadboard-jumper-wires-8-20cm-68-cable-pack-142221#.U9A_39zNggs).


Clic en la imagen para expandir.

- Computadora Portátil con módulo Bluetooth incluido.

------- Software: -------




Clic en la imagen para expandir.

- Processing v2.1 de 32 bits para Windows.


Clic en la imagen para expandir.

- Windows 7 Home Basic SP1 de 64 bits (es donde ha sido probado el funcionamiento de este circuito).

Antes de conectar todos los componentes externos a la tarjeta MSP430 Launchpad, se recomienda leer todo lo que se explica a continuación y ver el video del funcionamiento del circuito.

Primero se debe asegurar que los jumpers de la tarjeta Launchpad marcados con las etiquetas RXD y TXD, se encuentren como se muestra en la siguiente imagen:


Clic en la imagen para expandir.

Posteriormente se carga el siguiente código a la tarjeta MSP430 Launchpad usando el software Energia:


////////////////////////////////////////////
//  Blog: microsysoftware.blogspot.mx     //
//  País: México                          //
//  Fecha: 22/07/2014                     //
////////////////////////////////////////////

//  Programa que lee la entrada analógica pin A3 (P1.3),
//  y envía al valor a una computadora usando 
//  comunicación serial.

//  Hardware Requerido:
//  * MSP-EXP430G2 LaunchPad
//  * Potenciómetro de 10 kilo-Ohms
//  * Cables de conexión

void setup() 
{
//Se declara que se utilizará comunicación serial
//a 9600 baudios, por default la transmisión es de 8 bits. 
Serial.begin(9600);
}

//Este bloque de código hace un bucle infinito. 
void loop() 
{
// Se lee la entrada analógica (pin A3),
// y el valor se guarda en una variable de tipo entero
// llamada adc.
int adc = analogRead(A3);

// Con la siguiente instrucción, se hace un ajuste, 
// ya que la instrucción analogRead entrega valores 
// comprendidos entre 0 y 1023, debido a que el ADC 
// del microcontrolador
// tiene una resolución de 10 bits, y con esta instrucción
// la variable adc solo tomará valores entre 0 y 255.
adc = map(adc, 0, 1023, 0, 255);

// Se envía por el puerto serie el valor del adc.
Serial.write(adc);
delay(100); // Ocurre un retardo de 100 ms.
}

Después de cargar el código al Launchpad, ya se puede empezar a conectar los componentes externos a la tarjeta, empezando por el módulo Bluetooth (las conexiones entre el módulo Bluetooth y el Launchpad van a ir "cruzadas"), de acuerdo a las hojas de especificaciones del microcontrolador M430G2553, el pin RXD es el número 3(P1.1) y el pin TXD es el número 4(P1.2), como se muestra en la figura:


Clic en la imagen para expandir.

El diagrama final de conexión de los componentes se muestra a continuación:
Clic en la imagen para expandir.

El circuito construido de manera física, se muestra en la siguiente imagen:

Clic en la imagen para expandir.

El código que se ejecutará en Processing para recibir los datos por el puerto serie inalámbrico, permitirá controlar el color de fondo de una figura geométrica (que en este caso será un cuadrado) pasando del color blanco al negro y viceversa, en base al valor de ADC del microcontrolador de la tarjeta Launchpad (que originalmente está comprendido entre 0 y 1024, pero se hace un ajuste por código para que los valores sean de 0 a 255, para que puedan ser interpretados por Processing de manera adecuada; 0 para el color negro y 255 para el color blanco).


////////////////////////////////////////////
//  Blog: microsysoftware.blogspot.mx     //
//  País: México                          //
//  Fecha: 22/07/2014                     //
////////////////////////////////////////////

import processing.serial.*;  //Se incluye la librería para usar el puerto serie.

Serial puerto; // Se crea un objeto llamado puerto.
int dato;      // Variable que recibirá el dato del puerto serie.

void setup() 
{
  // La siguiente instrucción define las medidas en pixeles de la pantalla
  // que se genera con el bloque void draw().
  size(400, 400);
  // Posteriormente la siguiente instrucción imprime los puertos
  // disponibles en nuestra computadora.
println(Serial.list());

// Dependiendo de los puertos disponibles de nuestra computadora
// se enumeran partiendo del 0, y se modifica el valor encerrado entre "[]". Ejemplo:
//  Puerto PC      Valor
//   COM1       --> [0]
//   COM3       --> [1]
//   COM5       --> [2]
//   COM6       --> [3]
String portName = Serial.list()[0];

// Se inicializa el puerto seleccionado
// con una velocidad de 9600 bauds y 8 bits en la comunicación.
  puerto = new Serial(this, portName, 9600);
}

// Bloque de código que muestra una pantalla con fondo azul y un cuadrado
// en el centro cuyo color de relleno depende del valor de la variable dato.
void draw()
{
  if (puerto.available() > 0) // Si hay un dato disponible en el puerto serie. 
   {  
    dato = puerto.read();         // Se almacena en la variable dato.
   }
  background(500);             // Hace azul el fondo de la pantalla que se muestra.
  textSize(14);                // Define el tamaño del texto que se va a mostrar.
  text("Valor del ADC="+dato, 50, 25); //Imprime el valor de la variable dato.
                        
  fill(dato); // Cambia el color de fondo de la figura central (cuadrado).
  rect(50, 50, 300, 300); // Dibuja un cuadradado cuyo color de 
                          // fondo depende del valor de la variable dato.
}


Por último se muestra un video con el funcionamiento del circuito y con algunas recomendaciones:





¡Muchas gracias por leer esta nueva entrada!
ALF





martes, 22 de julio de 2014

Comunicación serie entre la tarjeta MSP430 Launchpad y Processing.

En cierta ocasión en el instituto donde laboro, se me acercaron unos alumnos de la especialidad de electrónica, ellos querían que los asesorara para realizar una práctica donde vincularan la tarjeta MSP430 Launchpad de Texas Instruments Rev. 1.5, con un software de computadora. Como ya era casi final del semestre, estaba un poco atareado, así que el primer software que se me vino a la mente para vincular el Launchpad fue Processing (Processing lo llegué a utilizar, gracias a mi amigo Alex, el cual espero se encuentre muy bien).

Processing es un software libre y de código abierto, el cual sirvió de base para los entornos de desarrollo de Arduino y Energia.

Por otro lado, la tarjeta MSP430 Launchpad es detectada por la computadora como un convertidor de USB a Serie, por lo que en el administrador de dispositivos de Windows, aparece como un puerto COM.

(clic en la imagen para expandir)

Esto nos da mucha ventaja, ya que no necesitamos hacer muchos ajustes para comunicar nuestra tarjeta con Processing, el único ajuste que debemos hacer es colocar los jumpers de la tarjeta MSP430 Launchpad como se muestra a continuación:


(clic en la imagen para expandir)

El software que utilizaremos para programar el Laucnhpad será Energia (si es la primera vez que utilizan el MSP430 Launchpad y el software Energia, pueden consultar en mi otro blog de galfama.blogspot.mx el siguiente enlace donde se muestra como utilizarlos: Enlace).

En este ejemplo se leerá el valor de una entrada analógica de la tarjeta MSP430 Launchpad Rev. 1.5 con el microcontrolador M430G2553 (en la cual se conectará un potenciómetro de 10KΩ), y se enviará el valor correspondiente (previo ajuste de rango) a una computadora usando comunicación serial, y en ésta última se controlará el color de fondo de una figura usando Processing. A continuación se muestra la forma de conectar los componentes:


(clic en la imagen para expandir)

(clic en la imagen para expandir)

Para este ejemplo he utilizado la versión Energia 0101E0012 (03/18/2014), la cual pueden descargar del siguiente link:


A continuación les coloco el código que se ha programado en la tarjeta MSP430 Launchpad con el microcontrolador M430G2553 incluido en el kit de desarrollo:


////////////////////////////////////////////
//  Blog: microsysoftware.blogspot.mx     //
//  País: México                          //
//  Fecha: 22/07/2014                     //
////////////////////////////////////////////

//  Programa que lee la entrada analógica pin A3 (P1.3) de la tarjeta MSP430 Launchpad Rev. 1.5,
//  y envía al valor a una computadora usando 
//  comunicación serial.

//  Hardware Requerido:
//  - MSP-EXP430G2 LaunchPad (MSP430G2553)
//  - Potenciómetro de 10 kilo-Ohms
//  - Cables de conexión

void setup() 
{
//Se declara que se utilizará comunicación serial
//a 9600 bauds, por default la transmisión es de 8 bits. 
Serial.begin(9600);
}

//Este bloque de código hace un bucle infinito. 
void loop() 
{
// Se lee la entrada analógica (pin A3),
// y el valor se guarda en una variable de tipo entero
// llamada adc.
int adc = analogRead(A3);

// Con la siguiente instrucción, se hace un ajuste, 
// ya que la instrucción analogRead entrega valores 
// comprendidos entre 0 y 1023, debido a que el ADC 
// del microcontrolador
// tiene una resolución de 10 bits, y con esta instrucción
// la variable adc solo tomará valores entre 0 y 255.
adc = map(adc, 0, 1023, 0, 255);

// Se envía por el puerto serie el valor del adc.
Serial.write(adc);
delay(100); // Ocurre un retardo de 100 ms.
}


A continuación se ha colocado el código que se ha programado en Processing (es una modificación de un código que trae de ejemplo Processing) y el enlace para descargar éste último (en este ejemplo se ha utilizado la versión 2.1 de 32 bits porque la de 64 bits aún no tiene implementado el puerto serie):

http://download.processing.org/processing-2.1.2-windows32.zip


import processing.serial.*; //Se incluye la librería para usar el puerto serie. 
Serial puerto; // Se crea un objeto llamado puerto. 
int dato; // Variable que recibirá el dato del puerto serie. 
void setup() 
{   
// La siguiente instrucción define las medidas en pixeles de la pantalla   
// que se genera con el bloque void draw().   
size(400, 400);   
// Posteriormente la siguiente instrucción imprime los puertos   
// disponibles en nuestra computadora. 
println(Serial.list()); 
// Dependiendo de los puertos disponibles de nuestra computadora
// se enumeran partiendo del 0, y se modifica el valor encerrado entre "[]". Ejemplo: 
//  Puerto PC      Valor 
//   COM1       --> [0] 
//   COM3       --> [1] 
//   COM5       --> [2] 
//   COM6       --> [3] 
String portName = Serial.list()[0]; 

// Se inicializa el puerto seleccionado
// con una velocidad de 9600 bauds y 8 bits en la comunicación.  puerto = new Serial(this, portName, 9600); 

// Bloque de código que muestra una pantalla con fondo azul y un cuadrado
// en el centro cuyo color de relleno depende del valor de la variable dato. 
void draw() 
{   
if (puerto.available() > 0) // Si hay un dato disponible en el puerto serie.    
{       
dato = puerto.read();  // Se almacena en la variable dato.    
}   
background(500);  // Hace azul el fondo de la pantalla que se muestra.   
textSize(14); // Define el tamaño del texto que se va a mostrar.   
text("Valor del ADC="+dato, 50, 25); //Imprime el valor de la variable dato.                            
fill(dato); // Cambia el color de fondo de la figura central (cuadrado).   
rect(50, 50, 300, 300); // Dibuja un cuadrado cuyo color de
// fondo depende del valor de la variable dato. 
}

Por último se muestra un video con el funcionamiento del circuito y del programa descrito arriba, además de algunas recomendaciones:





¡Muchas gracias por leer esta nueva entrada!
ALF



domingo, 8 de junio de 2014

...3, 2, 1 Comenzamos (Presentación del blog)

En esta primera entrada les comento, que este blog puede ser considerado como un "hermano" del blog http://galfama.blogspot.mx (ya que son del mismo "dueño" jajajaja, perdón por la publicidad que le he puesto a mi otro blog, pero necesito tener algunos ingresos). He decidido comenzar con éste segundo blog, para dedicarlo a proyectos con microcontroladores y software pero sin entrar en los detalles previos como en mi otro blog (en pocas palabras, este blog será para personas con conocimientos un poco más avanzados de microcontroladores). También he decidido hacer este blog, porque últimamente he andado un poco enfermo y deprimido (padezco ansiedad y sus consecuencias, pero no estoy loco, o al menos creo que no X-), pero gracias a la inspiración de una chica muy especial, a la que llamaré 'Miss J', quien con su mirada y su sonrisa, apoyo incondicional y paciencia, me ha hecho pasar momentos muy gratos en los últimos días, haciéndome olvidar por algunos momentos mis males (mujeres, ya ven como nos traen jajaja).

Bien, por otro lado, a lo largo de estos últimos años me he dedicado a adquirir nuevas tarjetas de entrenamiento (en su mayoría de Texas Instruments) y algunos Shields o BoosterPacks de las mismas, no es con el afán de presumir, pero al día de publicación de ésta primera entrada poseo el siguiente hardware:

- Stellaris LM4F120 Launchpad.
- Una tarjeta Arduino UNO genérica.
- Prototyting Shield para Arduino.
- Microcontroladores PIC  de Microchip de las series: 16F, 18F, 18LF, dsPICs.
- Programador de PIC's Master-Prog.
- Circuitos modulares que he adquirido en la página www.dx.com
- Entre otras cosas...

Con este material trataré de realizar algunos circuitos sencillos y complejos que poco a poco (si el tiempo y mis males me lo permiten) iré publicando en este blog.

Agradezco mucho su tiempo que se tomaron para leer ésta primera entrada del blog.

ALF.