Para poder comunicar una aplicación en Java con Arduino se necesita declarar las siguientes variables:
1 2 3 4 5 |
private OutputStream Output = null; SerialPort serialPort; private final String PORT_NAME = "COM3"; private static final int TIME_OUT = 2000; private static final int DATA_RATE = 9600; |
Estas variables funcionan de la siguiente forma:
Output: Es un OutputStream que se utiliza para enviar datos Utilizando el puerto Serie.
serialPort: Con esta variable iniciamos el Puerto Serie.
PORT_NAME: El nombre del puerto COM. En mi caso es COM 3 para Arduino Mega y COM 6 para Arduino Nano que son los 2 microcontroladores que tengo bajo mi poder.
TIME_OUT y DATA_RATE: son variables que utiliza el Puerto Serie para su funcionamiento. Generalmente se utilizan los valores 2000 y 9600, respectivamente.
Ahora veamos la función que llamaremos ArduinoConection:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
public void ArduinoConnection() { CommPortIdentifier portId = null; Enumeration portEnum = CommPortIdentifier.getPortIdentifiers(); while (portEnum.hasMoreElements()) { CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement(); if (PORT_NAME.equals(currPortId.getName())) { portId = currPortId; break; } } if (portId == null) { System.exit(ERROR); return; } try { serialPort = (SerialPort) portId.open(this.getClass().getName(), TIME_OUT); serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); Output = serialPort.getOutputStream(); } catch (Exception e) { System.exit(ERROR); } } |
Si copiamos esta función en el código de cualquier programa que estemos construyendo en Java, podremos enviarle datos a Arduino.
Una última función, EnviarDatos, será la función que recibirá los parámetros que desemos enviar.
1 2 3 4 5 6 7 8 9 10 |
private void EnviarDatos(String data) { try { Output.write(data.getBytes()); } catch (IOException e) { System.exit(ERROR); } } |
Con las variables declaradas en el inicio de un programa en Java, junto con estos 2 métodos podremos hacer miles de cosas interesantes con Arduino.
Hola he seguido todos los pasos de play ground:
http://playground.arduino.cc//Interfacing/Java
Pero nada que logro recibir datos:
Es un arduino Leonardo, sobre Windows 7.
El programa se ejecuta correctamente, pero no recibe nada de nada.
Hola. Te recomiendo que consultes este post:
https://panamahitek.com/2013/01/23/arduino-ide-configuracion-inicial/
Ahí se explica como iniciarse en Arduino. Los drivers que se necesitan y como configurar el IDE.
Si quieres comunicarte con Java, puedes consultar el post https://panamahitek.com/2013/01/31/requisitos-para-utilizar-arduino-con-java/
Cuando tengas esos requisitos, puedes tratar de implementar la función ArduinoConnection() como se explica en este post.
Si deseas, también puedes usar mi librería Arduino que está disponible en este post:
https://panamahitek.com/2013/02/15/libreria-arduino-para-java/
Espero que leas esto ¿Es dificil poder crear mi propia libreria de arduino? si es posible que pudieras publicar un post de como hacerlo (digo, solo si el trabajo no es muy cargado). Muchisimas gracias! EXCELENTES TUTORIALES!
Hola.
Sí es posible para mi hacer un tutorial de cómo crear librerías para Java sin embargo esto tendría que quedarse en Stand By durante algunas semanas ya que estoy creando un proyectos a nivel superior y preparándome para una conferencia que dictaré pronto. Cuando me deshaga de esos compromisos preparo el tutorial.
Saludos.
Q tal, oye ya instalé la librería RXTX, pero no sé de donde sacas la clase SeriaPort, ya que no encuentro de que paquete se obtiene.
No entiendo a que te refieres.
Podría ser un poco más específico por favor?
Lo que illuminatus18 pregunta es que de donde se saca «SerialPort» que usaste en «OutputStream Output = null; SerialPort serialPort; private final String PORT_NAME = “COM3″ private static final int TIME_OUT = 2000; private static final int DATA_RATE = 9600; «
El serial port se declara como un tipo de variable SerialPort. Para poder usar este tipo de variables hay que importar gnu.io.SerialPort; lo cual forma parte de la librería RXTX.
Es una variable que se debe usar en cualquier método de comunicación serial utilizando RXTX
Disculpa, me podrías decir lo que tenemos que importar, ósea lo que importaste para este proyecto?
Cuales son las librerias que tendriamos que importar?
Gracias excelentes tutoriales
Te recomiendo que visites el post donde publico mi librería Arduino para Java. Ahí he juntado algunos métodos útiles y fáciles
tengo una duda tengo un ARDUINO UNO con su driver hecho por mi, si me funciona con otra app para controlar el puerto serial, en java segui tu tutorial para utilizar tu libreria, pero al comunicar mi micro con java al ser compilado se queda ahi… porque ?? solo me aparece running y necesito detenerlo porque no realiza nada
Debe estar pasando algo con el initComponents() o quizas no le indicaste a la clase principal que tiene que hacer el Frame visible
Felicitarte por el trabajo que realizas, es genial, y esperando tus tutoriales sobre como creaste la libreria de Arduino, me interesa mucho el tema, porque es genial y como funciona a la mayoria, te doy un 10. Un saludo
Que tal, buen trabajo amigo.
Pero he tenido problemillas al querer implementarlo bajo windows con un arduino nano clonado.
Problema 1. vi que el método
…
serialPort.addEventListener((SerialPortEventListener) events);
…
No está trabajando bien, ya que nunca me regresa el evento de que se ha recibido datos desde el arduino.
Solución 1:
Investigando un poco llegué a esta dirección donde dan la respuesta, quizá sea bueno agregarlo a la libreria que has creado.
http://embeddedfreak.wordpress.com/2008/08/12/serial-port-event-in-rxtx/
Problema 2. Cuando el arduino me devuelve una cadena de datos («por ejemplo») las líneas de codigo siguiente
…
PanamaHitek_Arduino device = new PanamaHitek_Arduino();
device.arduinoRXTX(«COM2»,9600, null); //ignorado el tercer parametro a proposito
device.sendData(«0»);
String response=null;
if (device.isMessageAvailable()){
response = device.printMessage();
}
…
específicamente siempre dice falso, aunque haya recibido el primer valor «p» del ejemplo que el arduino esta devolviendo.
Yo lo cambie así:
…
PanamaHitek_Arduino device = new PanamaHitek_Arduino();
device.arduinoRXTX(«COM2»,9600, null); //ignorar el tercer parametro
device.sendData(«0»);
String response=null;
while(device.isMessageAvailable()==false);
response = device.printMessage();
}
…
Obviamente no es la mejor forma de hacerlo pero me sirvio para salir del paso.
Bueno, este ha sido mi aporte, sigamos mejorando.
Un abrazo desde Bolivia.