LEER DE ARDUINO

PUERTO SERIAL. Hace poco estuve jugando con arduino para leer eventos emitidos por el puerto serial desde una aplicación groovy...

LEER DE ARDUINO

PUERTO SERIAL

Hace poco estuve jugando con arduino para leer eventos emitidos por el puerto serial desde una aplicación groovy. En mi caso, necesitaba leer la temperatura de la sala con un pequeño circuito usando arduino y su sensor de temperatura.

Lo primero de todo, usé la librería RXTX para la comunicación serial de los puertos. Puedes descargártela de la página http://rxtx.qbang.org/wiki/index.php/Download. Usé la versión rxtx 2.2pre2 (prerelease)

Una vez descargada, añádela a tu proyecto asegurándote que tiene acceso a las librerías nativas que necesites según sea tu sistema operativo (vienen incluidas en la descarga).

En mi caso, linux x64 y con gradle, sería algo así (dejando el archivo nativo, librxtxSerial.so, en la misma ruta que el .jar) por ejemplo:


//build.gradle                            
dependencies {
    ...
    compile files("src/main/ext/rxtx/RXTXcomm.jar")
    ...
}
                            

Una vez configurado tu proyecto para poder comunicarte, una posible implementación podría ser:


package com.mallotore.monitoring.service

import java.io.BufferedReader
import java.io.InputStreamReader
import java.io.OutputStream
import gnu.io.CommPortIdentifier
import gnu.io.SerialPort
import gnu.io.SerialPortEvent
import gnu.io.SerialPortEventListener
import java.util.Enumeration
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import com.mallotore.monitoring.repository.TemperatureRepository
import com.mallotore.monitoring.model.Temperature

class TemperatureReader implements SerialPortEventListener {

    static Logger LOG = LoggerFactory.getLogger(TemperatureReader.class)

    SerialPort serialPort

    static final PORT_NAMES = [ "/dev/tty.usbserial-A9007UX1", "/dev/ttyACM0", "/dev/ttyUSB0", "COM3" ]
    private BufferedReader inputReader
    private OutputStream outputStream
    private static final int TIME_OUT = 2000
    private static final int DATA_RATE = 9600
    private TemperatureRepository temperatureRepository

    public TemperatureReader(TemperatureRepository temperatureRepository){
        this.temperatureRepository = temperatureRepository
    }

    public void initialize() {
        withPortId(){ portId ->
            try {
                serialPort = (SerialPort) portId.open(this.getClass().getName(),TIME_OUT);
                serialPort.setSerialPortParams(DATA_RATE,
                        SerialPort.DATABITS_8,
                        SerialPort.STOPBITS_1,
                        SerialPort.PARITY_NONE)
                inputReader = new BufferedReader(new InputStreamReader(serialPort.getInputStream()))
                outputStream = serialPort.getOutputStream()
                serialPort.addEventListener(this)
                serialPort.notifyOnDataAvailable(true)
            } catch (Exception e) {
                LOG.error("Unhandled exception initializing serial port listener",e)
            }
        }
    }

    private withPortId(Closure closure){
        System.setProperty("gnu.io.rxtx.SerialPorts", "/dev/ttyACM0")
        def portId = findAvailablePort()
        if(portId){
            closure(portId)
        }
        else{
            LOG.error("Could not find COM port.")
        }
    }

    private findAvailablePort(){
        for(def portName in PORT_NAMES){

            def portId = CommPortIdentifier.getPortIdentifiers().find{ 
                it.getName().equals(portName) 
            }

            if(portId) return portId
        }
    }

    public synchronized void close() {
        if (serialPort) {
            serialPort.removeEventListener()
            serialPort.close()
            inputReader.close()
            outputStream.close()
        }
    }

    public synchronized void serialEvent(SerialPortEvent oEvent) {
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                String temperature = inputReader.readLine()
                def currentTemperature = Float.parseFloat(temperature)
                temperatureRepository.save(new Temperature(temperature:temperature))
            } catch (Exception e) {
                LOG.error("Unhandled exception on serial port event",e)
            }
        }
    }
}
                            

La parte con la que escucharás los eventos es el método serialEvent(SerialPortEvent oEvent). Haz lo que necesites dentro de ese método.


Share Tweet Send
0 Comentarios
Cargando...