Panama Hitek Logo
Panama Hitek Logo

Envío de múltiples datos simultáneos de Arduino a Java

Este artículo consiste en una breve demostración sobre el envío de múltiples datos simultáneos de Arduino a Java. Como ya saben muchos de ustedes, nosotros en Panama Hitek hemos creado la llamada librería PanamaHitek_Arrduino, que permite establecer comunicación entre Arduino y Java.

El siguiente video muestra una breve demostración de cómo programar un algoritmo con la capacidad de recibir múltiples datos enviados desde el Arduino hasta una aplicación en Java. Esto es especialmente útil cuando se tienen varios sensores conectados al Arduino y se desea enviar los datos capturados a una aplicación en Java.

 

Sobre este video he subidos algunos códigos de ejemplo a nuestro repositorio en Github. Por ejemplo, subiendo este código en Arduino y ejecutando este código en Java se puede apreciar el resultado del uso de la clase PanamaHitek_Multimessage, tal como se muestra en el video.

Esperamos que la información presentada sea útil para ustedes. Cualquier duda o comentario, no duden en escribirnos a través de la caja de comentarios.

Antony García González
Antony García González
Ingeniero Electromecánico, egresado de la Universidad Tecnológica de Panamá. Miembro fundador de Panama Hitek. Entusiasta de la electrónica y la programación.

Posts relacionados

23 COMENTARIOS

  1. Buenas,

    En mi caso arduino envia un mensaje cada vez, pero este puede ser distinto. La placa envia un mensaje dependiendo de que color detecta el sensor.
    Una vez tengo los mensajes en Java, no se como tratarlos de distinto modo cada uno. Es decir, quiero ejecutar una acción concreta dependiendo del color que recibo.
    Pero cuando transformo el byte que me llega desde Arduino a String no parece que el programa lo reconozca.
    Te adjunto mi codigo arduino por si sabes detectar el error.
    Muchas gracias!

    //Compare Colours
    if (isGreen < isBlue){
    if (isRed < isBlue){
    if (isYellow < isBlue){
    // It's blue.
    Serial.println("The color is Blue");
    Serial.print("\t");
    } else{
    //It's yellow.
    Serial.println("The color is Yellow");
    Serial.print("\t");
    }
    } else {
    if (isYellow < isRed){
    //It's red.
    Serial.println("The color is Red");
    Serial.print("\t");
    } else{
    //It's yellow.
    Serial.println("The color is Yellow");
    Serial.print("\t");
    }
    }
    } else{
    if(isRed < isGreen){
    if(isYellow < isGreen){
    //It's green.
    Serial.println("The color is Green");
    Serial.print("\t");
    } else{
    //It's yellow.
    Serial.println("The color is Yellow");
    Serial.print("\t");
    }
    } else{
    if(isYellow < isRed){
    //It's red.
    Serial.println("The color is Red");
    Serial.print("\t");
    } else{
    //It's yellow.
    Serial.println("The color is Yellow");
    Serial.print("\t");
    }
    }
    }

    • Antes de entrar en Java verifica que en el Monitor Serie se está mostrando la información tal cual la necesitas. Luego, pasas a Java. No veo la necesidad de que hagas la transformación a bytes, cuando en el video se muestra claramente que la librería cuenta con las herramientas necesarias para recibir los datos usando printMessage en combinación con isMessageAvailable.

  2. Hola cuando llaamo al método arduinoRX(«COM8», 9600, listener); me saale el siguiente error com.panamahitek.ArduinoException: Nomrbe del puerto – COM8; Nombre del método – arduinoRX(); Tipo de excepción – Puerto no abierto.
    Como habro el puerto; pense que el método ya habría el puerto
    estoy usando la dependencia

    com.github.PanamaHitek
    PanamaHitek_Arduino
    3.0.0

    los felicito por tan buen material

  3. Buenas, se me presento un problema al utilizar la libreria:
    Estoy mandando 8 datos numéricos desde arduino a java con un delay(15), hice pruebas con delay de 15 a 100, y los datos que recibidos los quiero recibir en una jtable.
    El problema es que empiezo a recibir los datos cruzados o en algunos casos no me llegan los datos

    Parte del código en Java:
    public void serialEvent(jssc.SerialPortEvent arg0) {
    contador = 0;
    ArrayList lista = new ArrayList();
    int[] obj = new int[8];
    DefaultTableModel tmodelo = (DefaultTableModel) table.getModel();
    try {
    if (mensage.dataReceptionCompleted())
    {
    System.out.println(mensage.getMessage(0));
    System.out.println(mensage.getMessage(1));
    System.out.println(mensage.getMessage(2));
    System.out.println(mensage.getMessage(3));
    System.out.println(mensage.getMessage(4));
    System.out.println(mensage.getMessage(5));
    System.out.println(mensage.getMessage(6));
    System.out.println(mensage.getMessage(7));
    tmodelo.addRow(new Object[]{ mensage.getMessage(0), mensage.getMessage(1), mensage.getMessage(2), mensage.getMessage(3), mensage.getMessage(4), mensage.getMessage(5), mensage.getMessage(6), mensage.getMessage(7)});
    table.setModel(tmodelo);
    mensage.flushBuffer();
    }
    } catch (ArduinoException ex) {
    System.err.println(«Error»+ex);
    } catch (SerialPortException ex) {
    System.err.println(«Error»+ex);
    } catch (Exception ex) {
    System.err.println(«Error»+ex);
    }
    }
    };

    Código Arduino:
    #include

    int cont = 2;
    int Angulo1a=1;
    int Angulo1b=-1;
    int Angulo2a=2;
    int Angulo2b=-2;
    int Angulo3a=3;
    int Angulo3b=-3;
    int Angulo4a=4;
    int Angulo4b=-4;
    char dato;

    void setup()
    {
    Serial.begin(9600);
    }

    void loop()
    {
    while(cont==2)
    { serialEvent(); }
    Angulo1a++;
    Angulo1b–;
    Angulo2a++;
    Angulo2b++;
    Angulo3a–;
    Angulo3b++;

    Angulo4a++;
    Angulo4b–;
    Serial.println(Angulo1a);
    Serial.println(Angulo1b);
    Serial.println(Angulo2a);
    Serial.println(Angulo2b);
    Serial.println(Angulo3a);
    Serial.println(Angulo3b);
    Serial.println(Angulo4a);
    Serial.println(Angulo4b);
    delay(30);
    }
    void serialEvent()
    {
    if (Serial.available())
    {
    dato = Serial.read();
    if(dato == ‘a’)
    {
    cont = 0;
    delay(500);
    }
    else if(dato == ‘b’)
    {
    cont = 2;
    }
    }
    }
    Sera que me podría dar una orientación, si existe algún método para la translaticio rápida de datos, tengo que recibir datos de 8 sensores a un delay(15) para poder tener resultados reales…

      • Se me presento un problema en la recepción de datos.
        Este es mi código Java:
        try {
        if(message.dataReceptionCompleted()){
        System.out.println(«mensaje: «+contador++);
        System.out.println(«rdx: «+message.getMessage(0));
        System.out.println(«rdy: «+message.getMessage(1));
        System.out.println(«cdx: «+message.getMessage(2));
        System.out.println(«cdy: «+message.getMessage(3));
        System.out.println(«cix: «+message.getMessage(4));
        System.out.println(«ciy: «+message.getMessage(5));
        System.out.println(«rix: «+message.getMessage(6));
        System.out.println(«riy: «+message.getMessage(7))
        message.flushBuffer();
        }
        } catch (ArduinoException | SerialPortException e) {
        e.printStackTrace();
        }
        Mensajes enviados por terminal de arduino:
        2
        -2
        3
        -1
        2
        -2
        5
        -5
        3
        -3
        4
        0
        1
        -1
        6
        -6
        4
        -4
        5
        1
        0
        0
        7
        -7
        Datos que imprime Java:
        mensaje: 1
        rdx: 2
        rdy: -2
        cdx: 3
        cdy: -1
        cix: 2
        ciy: -2
        rix: 5
        riy: -5
        mensaje: 2
        rdx: 10-3
        rdy: 4
        cdx: 0
        cdy: 1
        cix: -1
        ciy: 6
        rix: -6
        riy: 4
        mensaje: 3
        rdx: -4
        rdy: 5
        cdx: 1
        cdy: 0
        cix: 0
        ciy: 7
        rix: -7
        riy: 5
        mensaje: 4
        rdx: 5
        rdy: 6
        cdx: 2
        cdy: -1
        cix: 1
        ciy: 8
        rix: -8
        riy: 6

        Llegan los datos desordenados o sobrepuestos:
        mensaje: 2
        rdx: 10-3
        rdy: 4
        cdx: 0
        cdy: 1
        cix: -1
        ciy: 6
        rix: -6
        riy: 4
        Estoy usando la ultima versión disponible de la librería y no entiendo porque me llegan así los datos

          • static PanamaHitek_Arduino ino = new PanamaHitek_Arduino();
            static PanamaHitek_MultiMessage message = new PanamaHitek_MultiMessage(8, ino);

          • Trata agregándole un pequeño delay en Arduino. La librería no está optimizada para recibir información muy rápido, así que ponle un delay de unos 25 ms entre cada envío talvez. Y prueba aumentando la velocidad de la conexión serie

          • En algún otro lenguaje de programación se podría captar los datos a esa velocidad?
            El proyecto que estoy desarrollando es con 4 aceleremetros, cada acelerometro me da dos datos, eje «x» y «y».
            En base a los datos que recibo de los acelerometros tengo que graficar y me dieron la siguiente restricción: velocidad de transmicion de datos entre 15 a 30 ms.

          • Ingeniero ya pude recibir correctamente los datos, muchas gracias!
            Tenia razón, aumente la velocidad de 9600 a 115200 y funciono

            Gracias!

  4. com.panamahitek.ArduinoException: Nomrbe del puerto – COM5; Nombre del método – arduinoRXTX (); Tipo de excepción – Puerto no abierto.
    en com.panamahitek.PanamaHitek_Arduino.arduinoRXTX (PanamaHitek_Arduino.java:220)

      • gracias amigo
        ahora tengo un problema
        tengo un sensor ultra sonido que manda la distancia en este caso tengo un tanque elevado y mido la distancia del agua
        esa distancia la envio desde el arduino a java
        y recibo como un string
        pero cuando convierto a un entero para hacer un if
        me lanza arror
        mi pregunta es como puedo convertir el dato que me llega

          • La clase pública NumberFormatException este lanza
            extiende IllegalArgumentException
            Se lanza para indicar que la aplicación ha intentado convertir una cadena a uno de los tipos numéricos, pero que la cadena no tiene el formato adecuado.
            Yo en java recibo tres datos que me llegan del arduino

          • El error claramente te está diciendo que estás tratando de convertir algo que no es un número en un número. Talvez sea que estás enviando un decimal con coma en vez de punto o algo así. Podrías tratar de imprimir lo que recibes como un String y verificar que en realidad estás recibiendo lo que esperas recibir

  5. buen día. quisiera saber como hacer que la posición de los datos no cambien ya que al momento de visualizar los datos enviados por el arduino al programa de java en los jtextfiel los datos empiezan a rotar por todos los cuadros de texto, como hago para que los datos que envía el arduino siempre conserve la misma caja de texto.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!
Por favor ingrese su nombre aquí

Post relacionados