Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 13

Uso de la librera Arduino versin 2.

7 en Eclipse
(por Gustavo Circelli)
Para aquellos desarrolladores que utilizan el Eclipse como herramienta y entorno de programacin,
les cuento que he probado la librera de Antony en esta plataforma para encender y apagar el Led
del pin 13 de la placa Arduino Uno. No obstante lo que he realizado es una comunicacin
bidireccional de manera que cuando Arduino encienda o apague dicho led, esta enve un mensaje de
confirmacin a la interface Java. Por otra parte en envo de datos desde la interface utiliza la funcin
sendByte, que a diferencia de otros Post lo hace mediante sendData. La diferencia es que sendBye
tiene la posibilidad de enviar enteros entre 0 y 255. Para conocer ms de esta librera se encuentran
los Post anteriores, incluso navegando dentro de los Archivos de la API encontraran la
implementacin de dichas funciones y sus diferencias, para ello deben utilizar un editor de texto de
su agrado para leer los archivos.java.
https://github.com/PanamaHitek/Arduino-JavaAPI/releases/tag/v2.7.0
En principio no debera haber inconvenientes en cuanto al uso de la librera dado que NetBeans es
tambin una plataforma en Java , aunque siempre encontramos alguna que otra diferencia en cuanto
a las implementaciones.
El Eclipse que utilizo es el Indigo, ya que posee la ventaja de disponer del WindowBuider que nos
permite disponer de todas las herramientas y objetos Swing para disear una interface grfica.
El sitio para el Eclipse Indigo lo pueden encontrar en:
https://eclipse.org/downloads/packages/release/Indigo/SR2
La intencin no es hacer un aporte sobre Eclipse, y entiendo que quienes lo utilicen ya estn
familiarizados con este entorno.
Lo primero que sucede al ejecutar Eclipse es preguntarnos el WorkSpace a utilizar. Este es una
carpeta donde ustedes realizan sus proyectos, incluso pueden tener diferentes WorkSpace para
distintos tipos de proyecto. Lo pueden crear en cualquier Disco, C, D, E etc, pero es conveniente
hacerlo en la carpeta donde tengan el Eclipse y su archivo de ejecucin.
File - new JavaProyect , le damos el nombre Ejemplo LEDD2.7
Crearemos

el

proyecto

LED2.7

una

vez

creado

debe

lucir

Vamos src new Others WindowsBuilder SwingDesigner y escogemos Jframe

como

esto:

Y en el campo Name, le damos el nombre a nuestra Clase , por ejemplo LED.


Cabe aclarar que en este paso estamos creando la Clase Led que va a extender a Jframe y que
Eclipse va a pre construir el marco inicial para nuestra interface, y es all, donde arrastraremos los
componentes u Objetos que necesitemos, botones, campos de texto, Labels, etc.

Ahora en la carpeta src, debemos ver la clase creada Led:

Podemos observar como Eclipse inserta el mtodo esttico Main() que es el encargado de ejecutar
la aplicacin. Dentro de este mtodo se crea el objeto frame , como instancia de la clase creada Led:
LED frame = new LED();
Incluso podramos agregar un ttulo al frame que se va a visualizar:
frame.setTitle(Probando librera arduino 2.7);
frame.setVisible(true); har visible dicho marco.

Lo que hago ahora es una forma de trabajo que considero es ms ordenada. Debemos importar la
librera de Arduino, pero previo a ello creamos una carpeta dentro del proyecto llamada por ejemplo
Librerias, con el objeto de colocar all los archivos .jar necesarios de la librera. De esta manera en
cada proyecto sabremos las libreras que utiliza, es a mi entender , ms ordenado.
Hay varias maneras de crear esta carpeta Librera, se puede hacer manualmente entrando a la
carpeta del proyecto y crearla como cualquier carpeta. La otra manera es hacerlo desde Eclipse.
Desde Eclipse nos posicionamos en src new SourceFolder , y le damos el nombre Librerias.

Paso siguiente, debemos descargar la librera PanamaHitek_Arduino.jar del sitio :


https://github.com/PanamaHitek/Arduino-JavaAPI/releases/tag/v2.7.0
y guardarla donde quieran ustedes. Una vez descargada la copiamos y la pegamos dentro de la
carpeta Libreras ya creada. Para esto posicionamos sobre la carpeta Librerias y Click derecho
Paste.

Lo que haremos ahora es Importar la librera, ya que el hecho de haber creado esta carpeta no
implica haberla importado, recordar que es solo a los efectos de orden.
Para importar nos posicionamos sobre el Proyecto LEDD2.7 Click derecho properties:
Vamos a JavaBuiltPath . Aqu hay varias opciones , entre ellas Add External Jar y Add Jar.
Como la librera est en una carpeta local que hemos creada hacemos Add Jar.

Buscamos la carpeta Libreras y seleccionamos PanamaHitek_Arduino v2.7.jar y le decimos OK.


Para asegurarse que la librera ser encontrada debemos decirle a Eclipse la ruta Nativa, para ello
vamos a observar lo siguiente:

Vamos a desplegar la librera importada sobre el panel:

Vamos a Native Library Location(None) , aparece None porque no est configurado an.

Vamos a Edit y luego a WorkSpace: y seleccionamos la carpeta Libreras que es donde est la
librera de Arduino. Y le decimos OK.

Hasta aqu ya est todo preparado , no


hace falta nada ms , no es necesario
traer la librera RXTXComm.jar , como
tampoco instalar los Drivers. La versin
2.7 lo hace automticamente y crea los
accesos a los drivers RxTxserial y
RxTxParallel.dll(este ltimo innecesario
para esta aplicacin).
Al ejecutarse el proyecto pueden ir al
disco C y va a estar creada una carpeta con dichos Drivers
C:\JavaRxTx y dentro de ella dos subcarpetas para W32 y W64 bits.
Ahora vamos a la aplicacin en s:
Eclipse con el WindowsBuilder, permite ver dos vistas del proyecto:
La solapa Source: permite ver el cdigo.
La solapa Design: la interface grfica .
Vamos a la solapa DESIGN y lo primero que vamos a hacer es definir el Layout de los
componentes. Hay varios tipos de Layout pero el ms flexible es el AbsoluteLayout que nos va a
permitir posicionar nuestros componentes donde queramos.
Para esto vamos a la interface grfica que est vaca y hacemos click derecho y seleccionamos
SetLayout y luego Absolute Layout.

Ahora podemos arrastrar nuestros componentes:


En este caso les voy a mostrar cmo queda la interface ya creada para no extender el tutorial:

JButto
n

JPanel

JLabel

A los botones debemos cambiarle la propiedad Name : OK y OFF tambin podemos darle estilos a
los botones, colores, etc.
Es importante que los componentes se definan como globales , es decir variables de clase globales
que se definen al inicio de la clase LED.java:
private JPanel contentPane;

private
private
private
private

JButton btnOn;
JButton btnOf;
static JPanel panel;
static JLabel lblEstado;

Para hacer que estas variables de clase sean globales y accesibles desde cualquier lugar del cdigo
nos posicionamos sobre el componente: sobre el panel de navegacin de las propiedades del objeto
y hacemos Convert Local to Fiel

Conve
rt

El cdigo:
Para que no haya errores vamos a tener que ir importando libreras en la medida que se vayan
solicitando.
Lo comn es que al ir generando cdigo, java , en caso de errores nos va indicando opciones para
eliminarlos, y la mayora se resuelven importando las libreras.
Creamos ahora una instancia de la Clase Ardunio, es decir un Objeto:
public class LED extends JFrame { // Nuestra CLASE
private JPanel contentPane;
private JButton btnOn;
private JButton btnOf;
private static JPanel panel;
private static JLabel lblEstado;
static PanamaHitek_Arduino ardu = new PanamaHitek_Arduino(); // Creamos Objeto ardu

en este caso lo llame ardu.


Para poder escuchar los eventos del puerto vamos a crear un objeto escucha llamado evento que va
a ser el encargado de escuchar la recepcin de datos del puerto. Este objeto es static dado que
habr un solo puerto de comunicacin serie conectado a Arduino, es decir que todos los objetos
creados dentro de la aplicacin si lo utilizan, sern nico, vale decir que no tiene sentido instanciar
ms de una vez a la clase SerialPortEventListener ya que fsicamente es un solo puerto.
public class LED extends JFrame {
private
private
private
private
private

JPanel contentPane;
JButton btnOn;
JButton btnOf;
static JPanel panel;
static JLabel lblEstado;

static PanamaHitek_Arduino ardu = new PanamaHitek_Arduino(); // Creamos Objeto ardu


static SerialPortEventListener evento = new SerialPortEventListener() { // Objeto evento

public void serialEvent(SerialPortEvent ev) {


}
};

Luego lo que hacemos es ir al constructor de la Clase LED, y creamos la conexin. Al instanciar a la


Clase LED , como vimos en el mtodo Main, se llama al constructor, que es el mtodo que construye
el objeto frame ( ver Main).
public LED() { // CONSTRUCTOR DE LA CLASE
try {
ardu.arduinoRXTX("COM5", 9600, evento); // Creamos la conexin
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
.
// sigue el cdigo, pero solo muestro esta parte
.
.}

En mi caso uso el COM5, pero cada uno debe ver cual es el puerto conectado a Arduino. Ver Post
anteriores.
Notar que la conexin lleva como argumento al objeto evento. Lo dems es conocido, el puerto y
la velocidad ( misma que Arduino)
Volvemos a nuestra Clase donde creamos el objeto evento para ver como queda la recepcin desde
Arduino:
static SerialPortEventListener evento = new SerialPortEventListener() {

public void serialEvent(SerialPortEvent ev) {


if(ardu.isMessageAvailable()==true){ // Si hay datos disponibles ???
String mensage= ardu.printMessage(); // Creamos variable mensaje y le asignamos lo
//recibido
System.out.println(mensage); // Imprimimos por CONSOLA JAVA
if(mensage.equals("encendido")){
panel.setBackground(new Color(0, 255, 0)); // PANEL VERDE
lblEstado.setText("ARDUINO DICE: *** led encendido");
}
if(mensage.equals("apagado")){
panel.setBackground(new Color(255, 0, 0)); // PANEL ROJ0
lblEstado.setText("ARDUINO DICE: *** led apagado");
}
}

};

Arduino al encender o apagar el Led confirma con un mensaje encendido o apagado y de


acuerdo a este se actualiza el color del JPanel y el mensaje en el JLabel.
Envo de los comandos encender y apagar:
La fraccin de cdigo importante es:
btnOn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
ardu.sendByte(10); // envia entero 10
} catch (Exception e) {
// TODO Auto-generated catch block

e.printStackTrace();
} // envia un Byte desde 0 a 255
}
});
btnOf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
ardu.sendByte(78); // envia entero 78
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

Se utiliz el mtodo sendByte para enviar enteros.

Codigo completo:
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import
import

gnu.io.SerialPortEvent;
gnu.io.SerialPortEventListener;
java.awt.BorderLayout;
java.awt.EventQueue;
javax.swing.JFrame;
javax.swing.JPanel;
javax.swing.border.EmptyBorder;
javax.swing.JButton;
javax.swing.border.LineBorder;
java.awt.Color;
javax.swing.UIManager;
java.awt.event.ActionListener;
java.awt.event.ActionEvent;
javax.swing.JLabel;
panamahitek.Arduino.PanamaHitek_Arduino;
java.awt.Font;
javax.swing.border.CompoundBorder;
javax.swing.border.MatteBorder;
java.awt.Cursor;

public class LED extends JFrame {


private
private
private
private
private

JPanel contentPane;
JButton btnOn;
JButton btnOf;
static JPanel panel;
static JLabel lblEstado;

static PanamaHitek_Arduino ardu = new PanamaHitek_Arduino(); // Creamos Objeto ardu


static SerialPortEventListener evento = new SerialPortEventListener() {
@Override
public void serialEvent(SerialPortEvent ev) {
if(ardu.isMessageAvailable()==true){

String mensage= ardu.printMessage();


System.out.println(mensage);
if(mensage.equals("encendido")){
panel.setBackground(new Color(0, 255, 0));
lblEstado.setText("ARDUINO DICE: *** led encendido");
}
if(mensage.equals("apagado")){
panel.setBackground(new Color(255, 0, 0));
lblEstado.setText("ARDUINO DICE: *** led apagado");
}
}
}
};

public static void main(String[] args) {


EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Led3 frame = new LED();
frame.setVisible(true);
frame.setTitle("Usando Librera 2.7 en Eclipse Indigo");
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public LED() {
//ardu.ArduinoRXTX("COM5", 2000, 9600, evento);
try {
ardu.arduinoRXTX("COM5", 9600, evento);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 380, 225);
contentPane = new JPanel();
contentPane.setBackground(new Color(245, 222, 179));
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
btnOn = new JButton("ON");
btnOn.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnOn.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 255)));

btnOn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
ardu.sendByte(10);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // envia un Byte desde 0 a 255
}
});
btnOn.setBackground(new Color(216, 191, 216));
btnOn.setFont(UIManager.getFont("Button.font"));
btnOn.setForeground(new Color(0, 0, 0));
btnOn.setBounds(37, 22, 89, 23);
contentPane.add(btnOn);
btnOf = new JButton("OFF");
btnOf.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
btnOf.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
ardu.sendByte(78);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
btnOf.setForeground(Color.BLACK);
btnOf.setFont(UIManager.getFont("Button.font"));
btnOf.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 255)));
btnOf.setBackground(new Color(216, 191, 216));
btnOf.setBounds(37, 104, 89, 23);
contentPane.add(btnOf);
panel = new JPanel();
panel.setBackground(new Color(255, 0, 0));
panel.setBounds(205, 58, 35, 23);
contentPane.add(panel);
lblEstado = new JLabel("ARDUINO DICE:");
lblEstado.setFont(new Font("Tahoma", Font.BOLD, 11));
lblEstado.setBounds(37, 150, 317, 26);
contentPane.add(lblEstado);
}

Cdigo ARDUINO:
/*
Reading a serial ASCII-encoded string
*/
// pins for the LEDs:

const int ledPin = 13;


byte entrada;
void setup() {
// initialize serial:
Serial.begin(9600);
// make the pins outputs:
pinMode(ledPin, OUTPUT);
}
void loop() {
while (Serial.available() > 0) {
// look for the next valid integer in the incoming serial stream:
entrada = Serial.read();
Serial.println(entrada);
if (entrada == 10) {
// print the three numbers in one string as hexadecimal:
digitalWrite(ledPin, HIGH);
Serial.println("encendido");
}
if (entrada==78) {
// print the three numbers in one string as hexadecimal:
digitalWrite(ledPin, LOW);
Serial.println("apagado");
}
}
}

También podría gustarte