I. Java
El Arduino IDE esta escrito en Java, y puede comunicarse al Puerto serial
a travs de la libreria RXTX. Esta libreria es muy similar a la extensin de
la Java Communications API. Internamente la IDE cual puerto y velocidad
en baudios que se uso la ultima vez. Desafortunadamente esta
implementacion interna no puede ser considerada API publica para uso
cotidiano. Por esa razon, el desarrollador tendr que determinar
manualmente cual puerto COM est usando su tarjeta Arduino.
Instalacion de RxTx
En primer lugar ubicar el lugar donde esta la librera, en este caso en la
versin IDE 1.0.5 y se observa que se encuentra en la siguiente carpeta:
Para poder usarlo en Java (en este caso con la IDE Eclipse) , se debe
crear el proyecto que se desee, y luego agregar la librera a travs de la
opcin Properties Java build path y agregarlo como librera externa:
Pero para completar su configuracin hay que determinar que librera dll
se ejecutara cuanto el jar sea invocado, por ello primero debe localizarse
el archivo rxtxSerial.dll, su carpeta es la siguiente:
Con esta ruta se busca la librera jar ya configurada para realizar la tarea
de agregar esta nueva ruta en la propiedad Native library location, como
muestra:
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JToggleButton;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JLabel;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JButton;
import com.conexion.Conectar;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.OutputStream;
import java.util.Enumeration;
SerialPort pserial;
private JPanel contentPane;
private JButton btnled2;
private JButton btnled1;
Conectar xcon;
private JLabel lblMensajes;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
new ControlAcceso().setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ControlAcceso() {
setTitle("Control de dispositivos en Arduino");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 539, 390);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
}
btnled1.setText(condicion[iled1]);
}
});
gl_contentPane
gl_contentPane
.setHorizontalGroup(gl_contentPane
new
.createParallelGroup(Alignment.LEADI
NG)
.addGroup(
gl_contentPane
.createSequen
tialGroup()
.addGroup(
gl_contentPane
.createParallelGroup(
Alignment.LEADING)
.addGroup(
gl_contentPane
.createSequentialGroup()
.addGap(22)
.addComponent(
lblMensajes,
GroupLayout.PREFERRED_SIZE,
377,
GroupLayout.PREFERRED_SIZE))
.addGroup(
gl_contentPane
.createSequentialGroup()
.addGap(33)
.addGroup(
gl_contentPane
.createParallel
Group(
Alignment.TRAILING)
.addCompone
nt(
btnled2)
.addCompone
nt(
btnled1))
.addGap(34)
.addGroup(
gl_contentPane
.createParallel
Group(
Alignment.LEADING)
.addCompone
nt(
lblLed_1)
.addCompone
nt(
lblLed))))
.addContainer
Gap(114, Short.MAX_VALUE)));
gl_contentPane.setVerticalGroup(gl_contentPane.createParallelGroup(
Alignment.LEADING)
.addGroup(
gl_contentPane
.createSequentialGroup()
.addGap(28)
.addGroup(
gl_contentPane
.cr
eateParallelGroup(
Alignment.BASELINE)
.a
ddComponent(btnled1)
.a
ddComponent(lblLed))
.addGap(28)
.addGroup(
gl_contentPane
.cr
eateParallelGroup(
Alignment.BASELINE)
.a
ddComponent(btnled2)
.a
ddComponent(lblLed_1))
.addGap(202).addCompo
nent(lblMensajes)
.addContainerGap(24,
Short.MAX_VALUE)));
contentPane.setLayout(gl_contentPane);
comenzar();
}
package com.conexion;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.swing.JOptionPane;
public class Conectar {
private final String PORT_NAME = "COM20";
/** Milliseconds to block while waiting for port open */
private static final int TIME_OUT = 2000;
/** Default bits per second for COM port. */
private static final int DATA_RATE = 9600;
private OutputStream salida = null;
SerialPort pserial;
public Conectar() {
// TODO Auto-generated constructor stub
}
public boolean iniciarArduino() {
// TODO Auto-generated method stub
boolean hecho=false;
CommPortIdentifier portId = null;
Enumeration
portEnum
CommPortIdentifier.getPortIdentifiers();
(SerialPort)
void setup(){
Serial.begin(9600); //Open the serial port
pinMode(LED1, OUTPUT); //Set the digital pin as output
pinMode(LED2, OUTPUT); //Set the digital pin as output
}
void loop(){
if(inByte == '1')
digitalWrite(LED1, HIGH); //turn the LED1 on
else if(inByte == '2')
digitalWrite(LED1, LOW); //turn the LED1 of
else if(inByte == '3')
digitalWrite(LED2, HIGH); //turn the LED2 of
else if(inByte == '4')
digitalWrite(LED2, LOW); //turn the LED2 of
}
}
II. Processing
para
serial:
4. En Processing, abrir uno de los ejemplos que viene con la librera Arduino.
5. Modificar el cdigo de ejemplo seleccionando el puerto serie correcto.
6. Ejecute el ejemplo.
Para saber que puertos estn disponibles en Arduino se puede ejecutar el
siguiente codigo:
import processing.serial.*;
import cc.arduino.*;
println(Arduino.list());
La pantalla de salida mostrara los puertos reconocidos por lo que se escogera
el conveniente para el cdigo.
Las siguientes funciones se encuentran en la Librera Arduino para Processing y
comunican
(a partir de Processing) con un Arduino, una vez que el Firmata se ha instalado
en la tarjeta
Arduino.list():devuelve una lista con los dispositivos serie (puertos serie)
disponibles. Si
su tarjeta Arduino est conectada a la computadora cuando usted llama a esta
funcin, su
dispositivo estar en la lista.
Arduino(parent, name, rate): crea un objeto Arduino (objeto a nivel de
elemento de
programacin). parent debe aparecer sn comillas; name es el nombre del
dispositivo serie
(es decir, uno de los nombres devueltos por Arduino.list ()); rate es la velocidad
de la
conexin (57600 para la versin actual del de firmware).
pinMode(pin, mode): pin configura un pin digital como entrada (input) o
como salida
(output) mode (Arduino.INPUT o Arduino.OUTPUT).
digitalRead(pin): devuelve el valor ledo de una de las entradas digitales,
Arduino.LOW o
a. En Arduino:
#include <Servo.h>
int analogVal = 0;
int smoothed = 0;
int alpha = 15;
void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
Serial.begin(9600);
establishContact();
void loop()
{
val = analogRead(potpin);
(value between 0 and 1023)
val = map(val, 0, 1023, 0, 179);
between 0 and 180)
myservo.write(val);
scaled value
// lo suaviza
if (Serial.available() > 0) {
// recibe n byte
inByte = Serial.read();
// si el byte es una a
if (inByte == 'A') {
// mada el valor del sensor
Serial.write(val);
}
}
// espera 10 milisegundos
//delay(15);
b. En Processing:
void setup(){
size(600,600);
fill(255,0,0);
stroke(255);
println(Serial.list()); // imprime en oantala la lista de pestos disponibles
String portName = Serial.list()[1]; // escoje el primer puerto
myPort = new Serial(this, portName, 9600); // inicializa el puero a 9600
}
void draw(){
//background(0);
fill(0,47);
rect(0,0,width,height);
//tamano ++;
}
}
else {
// Add the latest byte from the serial port to array:
serialInArray[serialCount] = inByte;
serialCount++;
// If we have 3 bytes:
if (serialCount > 0 ) {
tamanoRecibido = serialInArray[0];