Interfaz Serial JAVAPROTEUS
Interfaz Serial JAVAPROTEUS
Interfaz Serial JAVAPROTEUS
La práctica consiste en poder realizar una comunicación entre una aplicación de Java y la simulación de
un circuito en Proteus, a través del puerto serial, mandando una instrucción desde la aplicación echa en
NetBeans (Java) y hacer mover un servo motor en la simulación del circuito en Isis Proteus.
Para ello se hizo uso de API’s de java (Librería rxtxcomm.jar), el diseño del circuito en la aplicación
de Isis Proteus (específicamente el uso de microcontroladores, COMPIM “Puerto Virtual”), PIC C
(Comunicación RS232, haciendo uso del archivo .hex de la clase generada) y NetBeans IDE 6.7.1.
PIC16F877A Es micro que usaremos para nuestro diseño, la configuración que vamos a usar es un
Clock de 20 MHz, como control de LCD a los puerto B, los motores se conectar al puerto A y la
interfaz seria a los puerto TX y RX.
MOTOR-PWMSERVO Los motores Servos se van a conectar a una fuente de 5 v y GND
respectivamente y la salida de control a un puerto RA respectivamente iniciando desde RA1 a RA3.
LM016L El uso de una LCD es muy importante ya que en ella, vamos a mostrar los grados de
movimiento de cada motor así como mensajes de control del circuito. La configuración que se va
ocupar es la de 4 bits.
COMPIM este componente es el la simulación de nuestro puerto DB9 el este caso solo usaremos dos
pines de este puerto RXD y TXD, este componente requiere de configurar su velocidad de
comunicación esto se hace en la opción de editar propiedades.
Ya que tenemos todos los componentes y como funciona cada uno, es hora de armar muestro circuito.
En la siguiente tabla se muestran los puerto que se asignaran a cada componente como ya había
mencionado las distribución de los puerto quedan de la siguiente manera.
Componentes Puertos
LCD E RB0
RS RB1
RW RB2
D4 RB4
D5 RB5
D6 RB6
D7 RB7
MOTOR SERVO A RA1
SERVO B RA2
SERVO C RA3
COMPIM TX RC6/TX
RX RC7/RX
Después de a ver configurado todo nuestro proyecto comenzaremos con nuestro código
Lo primero que tenemos que hacer es incluir la librería de LCD los cual se hace da la siguiente manera
#include <lcd.c>
El uso de esta librería facilitara el manejo de la LCD bastara con configurar la librería para que
funcione con el puerto B de nuestro PIC. Esto es bastante sencillo solo debemos entrar al archivo lcd.c
y des comentar las siguiente línea de código.
#define use_portb_lcd TRUE
Esto librería te permite mandar a imprimir en la LCD mansajes con el uso del siguiente comando
printf(lcd_putc,"Motor 0");
Después de a ver configurado correctamente la LCD es hora de trabajar con el puerto
Mandar un valor por el puerto basta con ejecutar la siguiente comando.
printf("\r\n MENU DE COMANDO \r\n");
printf("comando 1 \r\n");
printf("[ENTER] EL COMANDO HA SIDO INTRODUCIDO \r\n");
Para poder leer un carácter del puerto es necesario usar la interrupción #int_rda y el comando getc()
que es que contiene el carácter enviado desde el puerto.
#int_rda
void procesa(void){
comando=getc(); //leer carácter
}
Esto nos permite guardar un carácter, pero en el proyecto se requiere guardar un conjunto de caracteres
el cual va representar un comando. Para esto se requiere de crea algunas funciones extras las cuales se
muestra en las siguiente líneas de código.
Crear funciones para agregar caracteres en el arreglo cbuff, así como hacer cambio de la bandera de
estado que permitirá la ejecución del comando en el momento de inserta un enter.
}
}
}
Función para crear un eco al insertar un dato esto permite ver en pantalla el dato enviado y en el caso
de presionar el enter visualizar en pantalla un mensaje de [intro].
COMAND
OS
MOTOR MOVER 0 MOVER 90 MOVER 180 OSCILAR
A A001 A002 A003 A004
B B001 B002 B003 B004
C C001 C002 C003 C004
Para la esto se valida el primer carácter almacenado en el arreglo xbuff el cual representa que motor
desean mover, y esto a su vez llama la función para dicha operación.
Se selecciona el proyecto a crear (en este caso una aplicación en Java) y pulsamos la tecla de siguiente
Se pone el nombre al nuevo proyecto y pulsamos la tecla terminar.
Agregamos una clase. En el proyecto creado, seleccionamos el paquete del proyecto (nombre del
proyecto)NuevoClase Java
Se coloca el nombre de la clase (en este caso “Comandos”) y se pulsa el botón Terminar
Si todo lo anterior sale bien ya podemos comenzar a programar, para poder hacer uso de la librería
RXTXcomm solo basta con importa esta librería a nuestro proyecto.
import gnu.io.*;
Algunas funciones que nos permite esta API son obtener puertos disponibles, abrir puerto y establecer
la comunicación, Resolver colisiones, saber si el puerto esta utilizado y por quien,…
getPortIdentifier(String) Nos dará el objeto correspondiente al puerto que se le pase como parámetro,
este será el método que normalmente usaremos ya que lo normal es que siempre nos conectemos por el
mismo puerto.
A su vez este método deberá saber tratar la excepción NoSuchPortException que saltara en el caso de
que solicitemos un puerto inexistente.
El siguiente código permite identificar el puerto COM2 en caso de no existir se cacha en la excepción
mostrando un mensaje de ERROR
try
{
portId = CommPortIdentifier.getPortIdentifier("COM2");
} catch (NoSuchPortException e)
{
System.err.println("ERROR al identificar puerto");
}
La clase SerialPort que hereda de la clase CommPort, esta clase permite hacer una petición del puerto,
configurar la velocidad de comunicación y así como la trasmisión y recepción de datos.
Pedir el uso del puerto. SerialPort requiere de abrir el puerto esto se hace el método open de la clase
CommPortIdentifier.
open(String, int) abre y por lo tanto reserva un puerto, en el caso de que intentemos abrir un puerto
que ya se encuentre en uso saltara la excepción PortInUseException. Los parámetros que le
debemos pasar son un:
• String con el nombre de la aplicación que reserva el puerto
• int que indica el tiempo de espera para abrir el puerto.
En este segmento de código se puede apreciar el uso del metodo open el cual pide el uso del puerto por
un tiempo determinado en caso de que el puerto no esté disponible se manda un mensaje de
puerto en uso.
try {
serialPort = (SerialPort) portId.open("SimpleWrite", 2000);
} catch (PortInUseException e) {
System.out.println("Puerto en Uso.");
}
El siguiente paso es establecer los valores de comunicación para esto es necesario el uso del método.
Código de implementación:
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
Con la siguiente línea de código establecemos que la escritura de datos por el puerto se establecerá por
medio de la variable outputStream.
try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {}
Nuestro motor a se a movido a 0 grados ahora si queremos que se mueve mas solo introducimos en
comando necesario, sabemos que es lo que esta haciendo con el mensaje que se nos manda en el area de
texto.
El motor a 90 grados como en la imagen anterior y en mensaje también dice que se movio.
Así como se muestra en la imagen. Si nos damos cuenta cada uno trabajo con el otro desde el principio, si alguno de ellos
no funciona ten por seguro que la simulación no se llevara acabo de manera correcta.