Arduino con java

16
Uso de la librería Arduino versión 2.7 en Eclipse (por Gustavo Circelli) Para aquellos desarrolladores que utilizan el Eclipse como herramienta y entorno de programación, les cuento que he probado la librería 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 comunicación bidireccional de manera que cuando Arduino encienda o apague dicho led, esta envíe un mensaje de confirmación a la interface Java. Por otra parte en envío de datos desde la interface utiliza la función 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 más de esta librería se encuentran los Post anteriores, incluso navegando dentro de los Archivos de la API encontraran la implementación 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 debería haber inconvenientes en cuanto al uso de la librería dado que NetBeans es también 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 diseñar una interface gráfica. El sitio para el Eclipse Indigo lo pueden encontrar en: https://eclipse.org/downloads/packages/release/Indigo/SR2 La intención no es hacer un aporte sobre Eclipse, y entiendo que quienes lo utilicen ya están 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 ejecución. File - new – JavaProyect , le damos el nombre Ejemplo LEDD2.7

description

Uso de Arduino con Java

Transcript of Arduino con java

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.0En 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/SR2La 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 y una vez creado debe lucir como esto:Vamos src new Others WindowsBuilder SwingDesigner y escogemos JframeY 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.0y 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:

JLabelJPanelJButton

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 JButton btnOn;private JButton btnOff;private static JPanel panel;private 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 FielConvert

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 CLASEprivate JPanel contentPane;private JButton btnOn;private JButton btnOff;private static JPanel panel;private static JLabel lblEstado; static PanamaHitek_Arduino ardu = new PanamaHitek_Arduino(); // Creamos Objeto arduen 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 JPanel contentPane;private JButton btnOn;private JButton btnOff;private static JPanel panel;private 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 blocke1.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 blocke.printStackTrace();} // envia un Byte desde 0 a 255}});btnOff.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {ardu.sendByte(78); // envia entero 78} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});

Se utiliz el mtodo sendByte para enviar enteros.

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

public class LED extends JFrame {

private JPanel contentPane;private JButton btnOn;private JButton btnOff;private static JPanel panel;private 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 blocke1.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 blocke.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);btnOff = new JButton("OFF");btnOff.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));btnOff.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {try {ardu.sendByte(78);} catch (Exception e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}});btnOff.setForeground(Color.BLACK);btnOff.setFont(UIManager.getFont("Button.font"));btnOff.setBorder(new MatteBorder(1, 1, 1, 1, (Color) new Color(0, 0, 255)));btnOff.setBackground(new Color(216, 191, 216));btnOff.setBounds(37, 104, 89, 23);contentPane.add(btnOff);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"); } } }