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

15
1868

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.

15 Comentarios

  1. 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!

  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,

    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.

Dejar respuesta

Please enter your comment!
Please enter your name here