VAML

VAML
Victor Manzanero

jueves, 22 de diciembre de 2011

Sensor de temperatura con arduino y java

Sensor de temperatura LM35 y java


Saludos nuevamente de mi parte.
Estamos a qui para un nuevo tutorial, esta vez de nuevo con arduino y java, pero en esta ocasión utilizando un sensor de temperatura (LM35).

***************************************************************************
para llevar acabo este tutorial se da por hecho que  ha visto el post anterior ya que la manera en que arduino se comunicara con java es la misma por lo tantos los pasos a seguir son los mismo. no ser asi por favor miviste el   ----> post 
***************************************************************************

Un LM35 es un dispositivo electrónico capas de poder medir la temperatura, consta de tres bases o patas, cada una con su propio propósito uno para gnd o tierra, otro para vin o voltaje de entrada y por ultimo vout o voltaje de salida.

El LM35 funciona de la siguiente manera.
1°c = 10mlv                     lo que es igual a un grado centigrado es igual a 10 mili volts
por lo que si en  temperatura ambiente tenemos 32°c
el LM35 tendría en su base de salida  320 mlv;

La forma en que se conecta a arduino y la función de cada una de sus bases es la siguiente:


Con esta unión se pueden dar mil usos, desde mecánicos, electrónicos y por que no hasta médicos  como fue en mi caso, ver otro de mis blogs donde use este cirucitor para fines medicos.

paso 1.-
preparar java para la conexión con arduino llamando librerías y ajustando directorios de archivos. (visto en el post anterior mismos pasos) ir al post anterios

paso 2.- 
preparar la interfaz en java encargada de recibir los datos que arduino le ara llegar, para este tutorial yo he preparado un termómetro dibujado en el metodo paint() de una clase java. quedando asi


Esta interfaz ira representando los valores que arduino le haga llegar.

CÓDIGO

public void paint(Graphics g)
    {
   //super.paint(g);//para algunos sistemas windoxs
   repaint();
      //temp=(redonde((n/.30)));
        

        if ((x-c<=156)&&(x-c>=106))
        {
        fondo=Color.BLUE;
        }
         if ((x-c<=106)&&(x-c>=74))
        {
        fondo=Color.ORANGE;
        }
        if ((x-c<=74)&&(x-c>=34))
        {
        fondo=Color.RED;
        }
        //base
        //fuente de todas las letras en el termometro
        Font f = new Font( "Helvetica",Font.BOLD,16 );

     g.setFont( f );
       g.setColor(Color.BLACK);
    g.drawArc(90,230,50,50, 130,280);//base arriba
     g.drawArc(80,230,70,60, 130,277);//base abajo
     g.drawLine(100,80,100,235);
          g.drawLine(92,80,92,237);
     g.drawLine(132,80,132,235);

     g.drawLine(140,80,140,238);
      //base
g.drawArc(92,60,48,48,8,180);//tapa de arriba
g.drawArc(100,65,32,32,5,180);//tapa de abajo


      //g.drawArc(90,50,50,50, 540,360);
//rellono que simula al mercurio
        g.setColor(fondo);

g.fillArc(90,230,50,50, 0,360);
g.fillRect(101,80,31,156);//rellono mercurio
g.setColor(Color.WHITE);
g.fillRect(101,80,31,x-c);//rellono mercurio
//fuentes
g.setColor(Color.white);
 g.fillArc(100,65,32,32,5,180);//tapa de abajo
 g.drawString((c)+"ºC", 95,260);
       //letras
        
        g.setColor(Color.BLUE);
         g.drawString("0 -", 70,240);
            g.drawString("20 -", 65,220);
             g.setColor(Color.ORANGE);
             g.drawString("40 -", 65,200);
              g.drawString("60 -",65,180);
                  g.setColor(Color.RED);
               g.drawString("80 -", 65,160);
                g.drawString("100 -",55,140);
                  //g.drawString("120 -", 55,120);
                //g.drawString("140 -",55,100);
         
                if(x<=10)
                {
                g.setColor(Color.RED);
 g.fillArc(100,65,32,32,5,180);//tapa de abajo
                }
    }

Es fácil notar que el termómetro ira adquiriendo otro color mientras la temperatura vaya aumentando.

paso 3.

hasta ahora solo se ha preparado la interfaz de usuario, entramos a la parte de la conexión pues prepararemos arduino para mandar los datos a java.
el codigo es muy simple.

void setup()
{
//abrimos el puerto serie a una tasa de bits de 9600 estantar
Serial.begin(9600);
}//fin de setup

void loop()
{
//se prepara los datos para ser enviados  
/*primero se lee lo que esta en la entrada analógica 0 luego lo multiplicamos por 500 por que esta siendo alimentado con 5v y hay 500 veces 10 mlv en el. 10ml por 500 = 5v (LM35 usa 10ml para presesentar un 1°c)
esta es la explicación de por que por 500

luego se divide entre 1023.

esto por que es lo máximo que arduino puede leer de la estragada analogica

y por ultimo escribimos en el puerto serie la cantidad que nos quedo. ya en grados
*/
Serial.write((analogRead(0)*500.00)/1023.00);
//le decimos a arduino  que lee la entrada analógica  cada segundo  
delay(1000);
}

cabe aclarar que hay dos formas en las que arduino envía informacion por el puerto serie son Serial.write ();
y Serial.println();

uno envia el valor real y el otro pinta el resultado sin importarle cual es su valor.

ejemplo si estamos a 61°c
el método  Serial.write (); mandaría una a ¿por que? es simple por que en la tabla ascii a=61 entonces cuando java reciba esta "a" sabrá que es un 61 y lo graficara en el termómetro.

el metodo Serial.println (); este no le importara su valor real y simplemente pondrá en el puerto serie el 61
entonces cuando java reciba este  este 61, tomara el "6"  y graficara en el termómetro el 54, tabla ascci 6 =54
e inmediatamente tomara el  "1" y graficara en el termómetro el 49, por la misma razon 1 en  la tabla ascii=49.

por lo que el metodo Serial.println() no es valido para estas practicas.

el codigo sin comentarios queda asi:


paso 4 y ultimo:

recibir los datos de arduino


//importamos las librerias necesarias para la conexion
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.lang.reflect.*;
import java.io.InputStream;
import processing.app.Preferences;

creamos 

una variable de tipo Input para que este reciba los datos de arduino asi:

 static InputStream input;


luego en el metodo main que previamente fue preparado para la comunicacion 

asemos  int n=0; n=(input.read()) ;//Temperatura
temperatura(n);

y ese valor se lo mandamos a un metodo encargado graficarlo en el termómetro.

public static void temperatura(int t)
{
c=t;

}
 la "c" del código es la que se graficara en arduino.

el código quedara así sin el metodo paint :
import gnu.io.PortInUseException;
import gnu.io.UnsupportedCommOperationException;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import java.io.InputStream;
import java.io.OutputStream;
import processing.app.Preferences;
import java.util.*;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.awt.Color;
/**
 *
 * @author victor
 */
public class Temperatura extends javax.swing.JFrame {
int x=156;static int c=0;static int m=1;
double temp=0;
Color fondo=Color.GREEN;

static byte chunk[]={1};
static int n=0;
    static InputStream input;
    static OutputStream output;
    static SerialPort serialport;
            private static final String PORT_NAMES[] = {
//"/dev/tty.usbserial-A9007UX1", // Mac OS X
//"/dev/ttyUSB0", // Linux
                          "/dev/ttyACM0","/dev/ttyUSB0", "/dev/ttyUSB1", "/dev/ttyUSB2", "/dev/ttyUSB3", "/dev/ttyUSB4", "/dev/ttyUSB5", "/dev/ttyUSB6", "/dev/ttyUSB7", "/dev/ttyUSB8", "/dev/ttyUSB9", "/dev/ttyUSB10", "/dev/ttyUSB11", "/dev/ttyUSB12","/dev/ttyUSB13","/dev/ttyUSB14","/dev/ttyUSB15","/dev/ttyUSB16","/dev/ttyUSB17","/dev/ttyUSB18","/dev/ttyUSB19","/dev/ttyUSB20","/dev/ttyUSB21"
,"COM3","COM0","COM1","COM2","COM4","COM5","COM6","COM7","COM3","COM8","COM9","COM10","COM11","COM12" // Windows
};
    static public class MyPrefs extends Preferences {
        static public void init() {
      Preferences.init("/home/victor/.arduino/preferences.txt");
         //Preferences.init("c:/preferences.txt");
        }
    }
    /** Creates new form Temperatura */
    public Temperatura() {
        initComponents();
    }
public static void temperatura(int t)
{
c=t;

}
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Termometro");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 244, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws IOException, PortInUseException, UnsupportedCommOperationException {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Temperatura.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Temperatura.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Temperatura.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Temperatura.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Temperatura().setVisible(true);
            }
        });
        
        
          MyPrefs.init();
        System.out.println("puerto usado: " + MyPrefs.get("serial.port"));
        System.out.println("targeta utilizada: " + MyPrefs.get("board"));

        /*CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(
                MyPrefs.get("serial.port"));*/

        CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

// iteraciones para buscar el puerto
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
for (String portName:PORT_NAMES) {
if (currPortId.getName().equals(portName)) {
portId = currPortId;
break;
}
}
}

  Temperatura m=new Temperatura();
        serialport = (SerialPort)portId.open(m.getClass().getName(), 9600);

        input = serialport.getInputStream();
        output = serialport.getOutputStream();
        serialport.setSerialPortParams(MyPrefs.getInteger("serial.debug_rate"),
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);
        while(true){
                while(input.available()>0) {
                //System.out.println((char)(input.read()));
try {
    /*
int available = input.available();//esta linea regresa el valor de la cantidad de informaion en el puerto serie
byte chunk[] = new byte[available];//se crea una rreglo de tipo bite que tiene como limite el valor de avalible
input.read(chunk, 0, available);//lee lo que se encuentra pendiente en el puertoserie y lo guarda en el arreglo
// Displayed results are codepage dependent
                //despliega en pantalla todo lo que logro leer
                                System.out.println("");
//System.out.println("Arduino dice: "+new String(chunk));
               n=Integer.parseInt(new String(chunk));
               System.out.println(""+n);
*/int b=0;

 int n=0; n=(input.read()) ;//Temperatura
temperatura(n);
System.out.println(n);

              } catch (Exception e) {
System.err.println(e.toString());
}
//System.out.println(""+ban);
                           }
        }
        
        
        
    }
    
    static public double redonde (double x)
     {
    return  Math.rint(x*1)/1;
    }
   
}
código completos dudas comentarios y/o sugerencias a vctr.31@hotmail.com

un video de su implementacion.





Próximo tutorial comunicación de java con de Internet

martes, 26 de abril de 2011

Primer tutorial: Arduino desde Java

Comenzamos con el primer Tutorial del blog, para los que nos gusta mezclar el Software y hardware, y queremos hacerlo desde Arduino y java. aquí están estos pequeños pasos para hacerlo.


****Damos por hecho que ya tiene instalado Netbeans y Arduino*********

Paso 1.- Preparar arduino .
colocamos un led en arduino de la siguiente manera.

Se encuentra en el pin 13.

Abrimos el ejecutable de arduino nos vamos a File>Examples>Blink

nos abrirá uno de los ejemplo que hacer parpadear un led en el pin 13 cada segundo.
el Código es el Siguiente


Lo tendremos que modificar de la siguiente manera:
Después de modificarlo lo compilamos(-con icono parecido a play debajo de File) y si todo anda bien lo subimos (Verifique que esta en el puerto corecto y que tiene seleccionado la placa correcta).Ya que tengasmos el programa en arduino hasta aquí por el momento con la placa (No desconecte)nos vamos a Netbeans.


Paso 2: Abrimos Netbeans y nos vamos a File>New project... nos aparecerá la siguiente ventana.


Seleccionamos java y java application como se ve en la figura y presionamos next > y veremos la siguiente Ventana.

Escoja un nombre para el proyecto nuevo en mi caso use "ArduinoAndJava", desmarque la opción que dice Create Main Class pues no la necesita remos, la ventana le quedara de la siguiente forma.

Cuando tengamos de esta manera la ventana le damos en Next >.

y ahora tendremos la siguiente Ventana.
 ya podemos ver nuestro nuevo proyecto creado lo seleccionamos y le damos un click derecho(click secundario), y hasta lo ultimo seleccionamos properties..
Se abrirá otra ventana y seleccionamos Run como se ve en la siguiente imagen.
Localizamos la parte que dice Working Directori y damos click en Browse... ahi se abrirá otra ventana para seleccionar la ruta donde se encuentra la carpeta de arduino así como se ve en la sig. imagen.


Después de seleccionar la ruta veremos algo así.
Una vez hecho esto damos a Ok y terminamos con este paso.

Paso 3: Librerias

Localizamos nuestro proyecto y le damos click a la flecha que esta junto y se abrirán nuevas carpetas y seleccionamos la que dice Libraries como se ve enseguida.

La seleccionamos con un click derecho y veremos lo siguiente.

Le damos click en el boton que dice Create veremos ....
En Libreries Name ponemos ARDUINO y pulsamos ok.
Veremos algo parecido a la imagen de arriba, tendremos que buscar la carpeta de arduino que nos descargamos y dentro de esas carpeta localizamos otra llamada > lib ahi se encuentran todas las librerías que necesitamos para que java pueda comunicarse con arduino. veremos lo siguiente
Seleccionamos todos lo Jars que ahi vemos y pulsamos add JAR/Folder.
Ahora veremos la ventana anterior seleccionamos la librería que acavamos de crear y pulsamos en. Add Libra...
listo tenemos todas la librerías necesarias, y ahora solo necesitamos el código. espero que hasta aquí todo vaya perfecto. continuamos.
Paso 4:Añadir clases
Le damos click derecho a nuestro proyecto nuevo y seleccionamos New>Java class
y le ponemos  nombre a nuestra clase, en mi caso le puse "led".  como vemos enseguida.
y presionamos Finish. veremos....

y agregamos los siguientes métodos para que todo funcione muy bien.

//arreglo que contine los posibles nombres que tendrán los puertos donde se conectara el arduino
            private static final String PORT_NAMES[] = {
            //"/dev/tty.usbserial-A9007UX1", // Mac OS X
            //"/dev/ttyUSB0", // Linux
                        "/dev/ttyUSB0"
            ,"COM3" // Windows
            };


    static public class MyPrefs extends Preferences {
        static public void init() {
            Preferences.init("/home/victor/.arduino/preferences.txt");//para linux
           //Preferences.init("c:/preferences.txt");//para windows
        }
    }

    /** Creates new form led */
    public led() {
        initComponents();
    }


    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:

        //Este es el codigo del boton que prendera el led se manda un uno que arduino interpretara por su respectivo codigo ascii que para el uno es 49
        sendMessage("1");


    }//GEN-LAST:event_jButton1ActionPerformed

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton2ActionPerformed
        // TODO add your handling code here:
           //Este es el codigo del boton que apagara el led se manda un dos que arduino interpretara por su respectivo codigo ascii que para el dos es 50
        sendMessage("2");

    }//GEN-LAST:event_jButton2ActionPerformed

    private void jMenu3MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jMenu3MouseClicked
        // TODO add your handling code here:
        //extra al darle click cierra toda la aplicacion
        this.dispose();
    }//GEN-LAST:event_jMenu3MouseClicked

    //metodo encardago de mandar los datos a arduino
   public static synchronized void sendMessage(String cadena) {

            byte[] asd;//arrglo de tipo byte
            asd=cadena.getBytes();//linea que sirve para descomponer un caracte a una forma de bits(ascii)
            try {
                output.write(asd);//escribe en el puerto serie lo que se encuentre en el arreglo bite
            } catch (IOException ex) {
             Logger.getLogger(led.class.getName()).log(Level.SEVERE, null, ex);//si no loga enviar la cadena lo intenta de nuevo
            }
    }

    /**
    * @param args the command line arguments
    */


   //metodo principal o main
    public static void main(String args[])throws Exception {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new led().setVisible(true);
            }
        });
         MyPrefs.init();
        System.out.println("puerto usado: " + MyPrefs.get("serial.port"));
        System.out.println("targeta utilizada: " + MyPrefs.get("board"));

        /*CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier(
                MyPrefs.get("serial.port"));*/

        CommPortIdentifier portId = null;
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

        // iteraciones para buscar el puerto
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
            for (String portName:PORT_NAMES) {
                if (currPortId.getName().equals(portName)) {
                    portId = currPortId;
                    break;
                }
            }
        }

                //se crea objeto de la clase
        led m=new led();
        //inicializar  serialport
        serialport = (SerialPort)portId.open(m.getClass().getName(), 9600);

   
        output = serialport.getOutputStream();
        serialport.setSerialPortParams(MyPrefs.getInteger("serial.debug_rate"),
                SerialPort.DATABITS_8,
                SerialPort.STOPBITS_1,
                SerialPort.PARITY_NONE);

    }
Listo estos son los métodos principales.
Código completo librerías o lo que necesiten solo manden un correo a vctr.31@hotmail.com y con gusto se los are llegar.
una ves que tenga el codigo veran lo siguiente.

(El arduino debe estar conectado con el programa del principio del tutorial)
Y como se puede ver un click en el boton encender y el led lo hara. asi como tambien reaccionara al botón apagado.

Les dejo un vídeo con el funcionamiento del mismo.
  por el momento es todo espero que les guste, muchas gracias.





código completo, librerías , dudas y lo que necesiten a vctr.31@hotmail.com
y comente si quiere algún otro tutorial.
hasta pronto








lunes, 25 de abril de 2011

Bienvenidos

Les doy la más cordial de las bienvenidas a este nuevo Blog en el que iremos aprendiendo a manejar java un poco más. Manejo de puertos, Gráficas, MySQL, Enviar y recibir datos de Internet y lo que a ustedes se les ocurra.

En nuestra primera publicacion aprenderemos a manejar arduino desde Java, encenderemos y apagaremos un Led con una interfaz gráfica de java.

Antes de comenzar este pequeño tutoríal Cabe mencionar que, damos por hecho que tiene Netbeans de ID para Java y que ya tiene Funcionando arduino.
Locations of visitors to this page