martes, 31 de mayo de 2016

Enviar comandos vía ethernet a Arduino con Java 3/X

     Bueno amigos, en este artículo vamos a ver como enviar comandos desde la consola programada en Java con Swing  usando la conexión ethernet a nuestro Arduino con la misma programación que tenía en el artículo Entrada 120 - Proyecto Arduino ethernet SD + consola en Java 1/X.

     La idea es sencilla y simple:
Empleando los métodos GET ó POST del protocolo HTTP se le envía cualquier comando a Arduino.

El programa hará la misma función que un navegador de Internet cualquiera, donde desde la URL se le envían datos al servidor web (para nuestro caso Arduino) y éste devuelve la página web que tiene programada. Un ejemplo de petición por el método GET es: http://192.168.0.20/?L=7
A lo que el servidor web Arduino realiza el procesado mediante las instrucciones
 
. . .
if (c == 'L')
{
     Serial.print("Toggling Pin ");
     pin = client.parseInt();
     Serial.println(pin);
     digitalWrite(pin, !digitalRead(pin));
           
     delay(1000);
     for(int i=0; i<10; i++) {
          digitalWrite(pin, !digitalRead(pin));
          Serial.println(pin);
          delay(200);
     }
           
     break;
}
. . .

 

Y además devuelve la página solicitada.
Desde Java el conjunto total de instrucciones sería:
 
public static void main(String[] args) throws MalformedURLException, IOException
{
        // Se configura la URL con el comando a enviar.
        // Y solo hay que cambiar el L=7 por el comando que se quiera
        URL url = new URL("http://192.168.0.20/?L=7");

        // Se configura la petición
        URLConnection con = url.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
       
        String linea;
        // Al realizar este bucle se le realiza la petición GET e imprime los
        // datos devueltos por el servidor
        while ((linea = in.readLine()) != null)
        {
            System.out.println(linea);
        }
}


Y así de sencillo es el código para realizar la petición. Adaptando nuestro código al de la consola con Swing quedaría:

public void enviarComando(String mensaje){
        jTextFieldComandos.setText("");
        jTextAreaTransferencias.append(mensaje + "\n");
        URL url = new URL("http://192.168.0.20/?" + mensaje);

        // Se configura la petición
        URLConnection con = url.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
       
        String linea;
        // Al realizar este bucle se le realiza la petición GET e imprime los
        // datos devueltos por el servidor
        while ((linea = in.readLine()) != null)
        {
            System.out.println(linea);
        }
}


Y nos queda la mar de molón el resultado.

     Los código fuente de Java de estos dos ejemplos los podéis descargar desde los enlaces:
Código fuente petición GET.
Código fuente Consola Java  + petición GET.

     Saludos de @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice/
Artículos relacionados:
Entrada 128 - Mi primera clase en YouTube sobre Java y Swing
Entrada 126 - Seguimiento del proyecto Arduino ethernet SD + Java
Entrada 124 - Programando una consola en Java con NetBeans 2/X
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 120 - Proyecto Arduino ethernet SD + consola en Java 1/X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

sábado, 28 de mayo de 2016

Mi primera clase en YouTube sobre Java y Swing

     Este es mi primer vídeo con audio (el primero fue sin audio y totalmente olvidable) donde explico como crear un proyecto en Java con Swing en NetBeans 8.0.2.

     No me ha quedado todo lo bien que yo quisiera ni por asomo, pero es el primero, y espero ir mejorando muy mucho.

     Este vídeo correspondería con los artículos del blog:
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 124 - Programando una consola en Java con NetBeans 2/X

     Me gustaría que me dijérais que es mejor para explicar estas cosas, si un artículo en blog o un vídeo en YouTube. O las dos cosas.

     @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice

domingo, 22 de mayo de 2016

Incidencia de la inteligencia artificial en nuestra vida

     Rescato una vez más el tema de la IA pues me gusta mucho, siendo parte de lo que estudié en ingeniería y que intentaré abordar de forma técnica y de una forma práctica más adelante. Pero de momento voy a tratar el tema desde los puntos de vista de los participantes de la mesa de Cuarto Mileneo en el programa 454 y desde la visión planteada por una serie de televisión que recomendó una usuaria por Twitter: Humans.

     Iker hace la presentación sobre los autómatas a los que daba vida a principios del siglo XX Francisco Sanz. Lo que hacía este ventrílocuo era una "simulación" de lo que podría ser una persona. Las máquinas como nosotros creemos que podrían llegar a ser

simplemente son (y serán) una proyección que nosotros hacemos sobre unos simples trozos de plástico y metal, a los que queremos darles, y ver en ellos, propiedades humanas como la inteligencia, bondad o maldad.
     Hay una escena en Teminator Genesis donde el protagonista dice:
»No quiero seguir viviendo matando«. Que sería como decir: »No quiero matar más tostadoras« No nos confundamos, y que no nos confundan. Destruir un objeto animado, por mucha cara de persona que tenga o cualidades que hayamos visto en él, sigue siendo un muñeco.

Si tuvieras que elegir entre una de las dos, ¿a cuál eligirias?
Si tuvieras que eliminar a una de las dos para salvar el mundo,
¿a quién preferirías liquidar?

      Otra cuestión es que los robots son producto del trabajo en grupo de un enorme equipo multidisciplinar. Para superar a un robot habrá que ser más listo de lo que sus creadores han sido. Para luchar contra esa vicisitud los muchachos del futuro deberán estudiar muchísimo o hacer cosas que ese equipo de ingenieros no sea capaz de diseñar, o se verán superados por algo que no podrán comprender. De hecho los primeros en caer del sistema serán los que viven inmersos en su mundo pensando que trabajar para tener un sueldo a final de mes es suficiente. Sencillamente porque se debería preguntar en cada momento: ¿Que tipo de robot podrá sustituirme en el trabajo?

Otras preguntas que nos podemos plantear son:
¿Para qué se van a utilizar a los robots?
¿Quién trabajará en el futuro? Y ¿en qué trabajarán?

Falacias
La falacia de que la tecnología nos permitirá vivir mejor, o  nos hace más libres e incluso que podría eliminar el hambre en el mundo es tan falsa como decir que en economía "Para repartir la riqueza primero hay que crearla, si no lo que repartimos en parte aliquota es la miseria."

Para empezar, en la falacia de la economía, se ha ido generando tanto dinero y se está generando tanto en forma de burbuja que bien distribuido todo el mundo podría vivir comodamente. El dinero está en manos de unos pocos, en concreto dicen que el 5% de los más ricos tienen el 95% del dinero de todo el mundo. En un artículo son más exactos: Los 85 más ricos del mundo tienen el mismo dinero que la mitad más pobre del planeta.
Pues exactamente lo mismo, pasa con la tecnológia. Hay tanta tecnología que bien usada y siendo usada por todo el mundo podría ayudar en la agricultura o a que los paises en desarrollo pudieran dedicarse a la fabricación de sus propios recursos mecánicos o tecnológicos. Y de igual modo los alimentos también están mal distribuidos, pues bien distribuidos se podría erradicar el hambre del mundo en menos de dos mes.

Ahora mismo entre las empresas que explotan la mano de obra barata como Inditex y las empresas que tienen toda su producción basada en máquinas como Adidas estamos entra la espada y la pared. En el debate de Cuarto Milenio se puso un tiempo en el que la tecnología del tipo robot sería de uso comun de 5 años. Me parece muy poco tiempo la verdad. Una cosa sí es cierta o las generaciones venideras espabilan o el nuevo orden mundial se los come. Ya digo que 5 años me parece muy poco tiempo, pero hay que darse cuenta de qué de los 60’ a los 70’, de los 70’ a los 80’ y de los 80’ a los 90’ hubieron cambios muy graduales, pero desde el 2002 al 2016 la tecnología ha dado un gran empujón. Ayudada también por los diversos descubrientos físicos y aplicación de la tecnología avanzada al alcande de casi todo el mundo. En cierto modo José Manuel Nieves tiene razón: las máquinas trabajarán y las personas vivirán. Pero esas personas son la gente adinerada. Muy adinerada. El resto mal vivirá o directamente morirá

     Para mí la IA sin sentimientos es una simple simulación muy bien programada. No siente, ni padece solo ejecuta un código programado. Otra cosa es que se creen máquinas a partir de tejido vivo y puedan sentir. Entonces, estamos hablando de otra cosa. El auténtico dilema vendrá con los cyborgs como muy bien decía José Vicente en el debate o como plantea la serie Humans. Hace relativamente poco escribí este artículo sobre las leyes para con los cyborgs. Pero es posible que escriba otro artículo exclusivamente sobre ellos.

     Otra cosa que se planteó en el debate fue que las máquinas ya están haciendo tareas como la resolución de problemas vía teléfono. Aunque gracias a Dios aún no lo hacen demasiado bien. Todo está también en la medida en que nosotros nos dejemos pisotear. Tendremos que organizarnos sí o sí y hacer lobbying ciudadano. Actuando de forma concentrada en asuntos como: Si Coca-Cola despide a 500 trabajadores de una fabrica en tal sitio → nosotros no compraremos ninguno de tus productos.
Cosa que también podrían poner en práctica en USA ya mismo aplicándoselo a Donald Trump: si eres un xenófobo → no compramos tus productos. Incluso sus empleados en Las Vegas podrían decir: si nos tratas como esclavos → hasta luego Donald.

Y por último para concluir por ahora: La auténtica IA no será a la que ordenes una cosa y por compleja que sea la haga en cuestión de segundos, sino que un militar le diga:
- ¡Ataca esa posición!
Y que la máquina conteste:
- ¿Por qué?
En un concepto claro y simple: Que se cuestionen cosas. Para nosotros muy fácil, pero muy muy difícil de programar.

     @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice

jueves, 19 de mayo de 2016

Seguimiento del proyecto Arduino ethernet SD + Java

     Este artículo es solo para proporcionar meta información del proyecto Arduino ethernet SD + Java presentando un par de esquemas para saber por donde va el proyecto y cuales serán los siguientes artículos.
     El primer esquema (descarga) esta hecho con LibreOffice y separa por colores la parte que pertenece a Arduino en celeste, la parte que pertece a Java en rojo y los artículos que pertenecen a ambos en violeta. No hace falta saber Java para hacer la parte de Arduino, ni hace falta saber la parte de Arduino para programar la parte de Java, pero saber lo que hacen ambos es mucho más divertido.
Mapa mental para tener una idea global del proyecto Arduino.


     Los dos siguientes esquemas los he realizado con herramientas que he descubierto recientemente, y la verdad es que lo único que quería era probarlas. La primera está pensada para hacer mapas mentales y es un poco menos flexible:
https://www.mindmeister.com/703097385/proyecto-arduino-ethernet-sd-consola-java

     La segunda web permite esquemas más flexibles en la organización de iconos/ideas la utiliza el periódico eldiario.es en algunos artículos y es más divertida de lo que yo he hecho. Ya iré bicheando poco a poco en ella:
https://kumu.io/pacovalverde/proyecto-arduino-ethernet-sd-java

     El cuarto no es un esquema de las entradas, sino como debería ser planteado el proyecto si huebiera sido para un trabajo. Está hecho con Planner 0.14.6 y es un diagrama de Gantt (descarga):
http://www.pacovalverde.es/proyecto_arduino/gantt.html

     Para cualquier duda o sugerencia no dudéis en comentar.

     @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice/

miércoles, 18 de mayo de 2016

Folder Forbidden en el acceso a un sitio web con configuración de multiples sitios web

     Cuando tienes muchos sitios web en tu computadora Linux y los has configurado ya sean sitios virtuales o por IP (aquí tienes un manual de configuración de los distintos tipos), le habrás dado permiso de ejecución en la máquina a las carpetas donde están alojadas las webs al usuario local, de la manera:

sudo chmod 775 -R nombre_carpeta_web
o
sudo chmod u+x -R nombre_carpeta_web

     Pero es posible que al intentar acceder al sitio desde el navegador web (¿como sino?) te haya aparecido Folder Forbidden. Si es así bienvenido al club. Lo que tienes que hacer es darle permisos a todos esos sitios web desde el fichero /etc/apache2/apache2.conf y en las siguientes lineas:

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>


donde aparece Requiere all denied debes cambiarlo por Require all granted (si eres novato u olvidadizo como yo la linea la puedes comentar la original) para que todos los demás sitios tengan permiso concedido por defecto. Con lo que el conjunto de lineas queda así:

<Directory />
    Options FollowSymLinks
    AllowOverride None
    # Con 'Require all denied' no tienes permiso

    # para ver el resto de webs
    Require all granted
</Directory>




    Si tienes alguna duda sobre algo de las configuraciones o tengo algo mal explicado en los manuales no tengas pegas en comentar.

    @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice/

lunes, 16 de mayo de 2016

Programando una consola en Java con NetBeans 2/X

     Como vimos en el artículo anterior en el que hemos creado la base de una aplicación para trabajar con Java Swing y siguiendo con el proyecto para tener una consola completa que envíe comandos tanto por el puerto serie como por ethernet, ahora vamos a continuar con la parte de la consola.

    Siguiendo con el código generado en el artículo anterior vamos a agregarle un par de componentes de texto y un botón de envío.
    Abrimos el proyecto ConsolaControlArduino y pinchamos en Design.

     1º En el panel de la derecha pinchamos sobre Campo de texto y seguidamente pinchamos sobre el marco que tenemos en el centro. Esto hará que se cree una caja de texto donde, en tiempo de ejecución, escribiremos los comandos que le enviaremos a Arduino.

     2º Le vamos a cambiar un par de propiedades a este componente. Con él seleccionado, pinchamos en el panel derecho sobre Codigo y pinchamos en Nombre de variable y modificamos el nombre del objeto por uno más descriptivo. Por ejemplo: jTextFieldComandos.


Es buena práctica utilizar nombres descriptivos que podamos identificar rápidamente cuando tengamos más objetos, y más si son del mismo tipo. Tener nombres como jTextField1, jTextField2, jTextField3 no es buena idea.
Después pinchamos en Propiedades y la propiedad text la dejamos en blanco. Estiramos el componente en el marco para que ocupe casi todo el marco y ya tenemos el primer componente.

     3º De la misma forma que el anterior componente agregamos un Área de texto donde aparecerán los comandos que se le envían a Arduino. Le cambiamos el nombre por jTextAreaTransferencias y lo ajustamos al tamaño deseado.

     4º Y de la misma forma agregamos un Botón para enviar los comandos. Le cambiamos el nombre por jButtonEnviar. Y en la propiedad text escribimos Envidar comando.

     5º Ahora hacemos una pequeña programación para que al presionar el botón enviar la cadena de texto que se haya escrito en la caja jTextFieldComandos se borre de esa caja y pase a jTextAreaTransferencias. Primeramente pinchamos sobre el botón que ejecutará esa acción y nos vamos al panel derecho y pinchamos sobre Eventos. Y nos vamos hasta el evento mouseClicked y seleccionamos jButtonEnviarMouseClicked. Esto generará un pequeño código al que agreraremos las sentencias.

if (!"".equals(jTextComandos.getText()))  // Si la caja de texto no está vacía
            enviarComando(jTextComandos.getText()); // ejecuta la función



NetBeans crea la cabecera del método y las llaves y solo podemos escribir en medio:

private void jButtonEnviarMouseClicked(java.awt.event.MouseEvent evt) {                                         
        if (!"".equals(jTextComandos.getText()))
            enviarComando(jTextComandos.getText());
}


     6º Ahora escribimos la función enviarComando(String mensaje).

public void enviarComando(String mensaje){
        jTextComandos.setText("");     // Borra el comando de la caja de texto
        jTextAreaTransferencias.append(mensaje + "\n");  // Escribe el mensaje                                                             // en el TextArea
}


Aunque de momento lo único que hace es borrar el texto de un sitio y escribirlo en otro.

     7º También vamos a programar un evento para la caja de texto, que será qué cuando se pulse la tecla Enter, si hay algo en la caja, lo envíe. Más o menos como hace cualquier chat. Pinchamos sobre la caja de texto jTextFieldComandos y en el panel derecho pinchamos sobre Eventos nos vamos a keyPressed y seleccionamos jTextFieldKeyPressed que generará la cabecera de programación para el evento. En su interior escribimos el siguiente código:

private void jTextFieldComandosKeyPressed(java.awt.event.KeyEvent evt) {
        if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
            if (!"".equals(jTextFieldComandos.getText()))
                enviarComando(jTextFieldComandos.getText());
        }
}


Marcará KeyEvent con error pero si le damos a la bombillita de la izquierda para que importe la librería correcta import java.awt.event.KeyEvent; o la escribimos nosotros el error desaparece.

    8º Solo queda ejecutarlo y ver como funciona.

    Sobre este código descrito (descargar) seguiremos para añadirle unas sencillas sentencias para que envíe los comandos por ethernet.

Artículos relacionados:
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 120 - Proyecto Arduino ethernet SD + consola en Java 1/X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

    @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice

domingo, 15 de mayo de 2016

Como crear un proyecto con Swing en NetBeans 8.X

     Para crear un proyecto de Java en NetBeans que tenga un formulario Swing solo debemos:
     1º Crear un nuevo proyecto con Nuevo proyecto → del tipo Java Application y le damos a Siguiente >

     2º Escribir un nombre y seleccionar una carpeta donde estará almacenado. Presionamos Terminar.

     3º Sobre el paquete que se ha creado (icono que parece una caja embalada) le damos a botón derecho para que aparezca el menú contextual y elegimos NuevoFormulario JFrame. Si no aparece esa opción nos vamos al final del menú contextural y elegimos → Otro… nos sale una caja de selección y elegimos en la parte izquierda Formulario de interfaz gráfica de AWT en la derecha Formulario Frame

     4º Ahora tenemos dos clases candidatas a ser ejecutadas aunque solo es la prinpipal la que tiene el main que es la que se creo por defecto con el proyecto. Podemos ver como aparecen en la imagen:

Nos vamos a disponer a borrar la clase que no tiene swing. En la imagen sería la clase ConsolaControlArduino.java. Los iconos son distintos:



     5º Borramos la clase que se creo por defecto. Dando al botón derecho del ratón sobre el archivo que queremos eliminar. Nos sale una nueva ventana y seleccionamos Aceptar.

     6º Ejecutamos la aplicación y nos aparece una ventana en la que decimos que la nueva clase es la principal. Es fácil porque solo podemos aceptar siguiendo los pasos descritos.

     7º Ejecutamos la aplicación y nos sale una ventana vacía.

         A partir de aquí a trabajar.

Entradas relacionadas:
Entrada 124 - Programando una consola en Java con NetBeans 2/X
Entrada 120 - Proyecto Arduino ethernet SD + consola en Java 1/X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

     @eltiopacote
Listado de entradas: http://www.pacovalverde.es/indice/

miércoles, 11 de mayo de 2016

A votar todo el mundo

     Este pequeño artículo es para animar a votar a toda la gente que está (estamos) fuera de España. Que no somos pocos. Hay vuelos muy baratos en Norwegian http://www.norwegian.com/es y podéis aprovechar la gran ola de calor que habrá en julio y agosto, gracias al cambio climático, para no estar en España. Mejor en junio que se está más fresquito.

Las elecciones del 20 de diciembre de 2015 dejaron claras muchísimas cosas. Puedo enumerar las más destacables:

    1ª Los que son votantes del PPSOE saben a conciencia lo que votan y no les importa lo más mínimo que sus dirigentes sean unos corruptos mangantes. Y si es necesario dejarse mear, se dejarán mear encima. En cierto modo la gran culpa la tiene la fuerza de la costumbre: „mejor que nos roben los de siempre que por lo menos sabemos que mangan bien. Y por lo menos tienen las costumbres que nosotros: son cristianos“. Así nos luce el pelo.

    2ª Una frase muy recurrente que estoy leyendo últimamente es:
»Si los que están en el poder de forma democrática son imbéciles, es que los que los han votado están bien representados.« Y esto es lo que ha pasado exactamente los últimos 4 añazos echados a la alcantarilla. Porque ni la economia a mejorado, ni la tasa de crecimiento es mayor, ni el paro a descendido. En fin Mariano, eso es lo que has hecho los últimos tiempos. Este hombre trabaja a base de inacción. Que también es hacer algo: Verlas pasar. También tras el 20D.



¡¡Bravo Mariano!! has defraudado a todos tus votantes. Pero tranquilo, desgraciadamente ellos te lo pendonan.

     4ª Pedro Sánchez: manda menos en su partido que un gato de escayola. Ahí quién reparte el bacalao es el estatismo personificado en Susana Díaz y sus ansias de poder. Luego está ese tal Felipe González, al que le gusta mucho, mucho el dinero, y no quiere que se lo quiten. De socialista obrero tiene muy, muy poco. Aunque sabiendo por fin que el dinero necesario para poner en marcha el partido en la nueva democracia en los 80' fue de un tal Rockefeller. Eso lo explica todo.

     5ª Para saber como es Ciudadano’s solo hay que ver lo que quería pactar durante la segunda transición. Sobre ellos manda el dinero. El IBEX35 son su fuente de financiación. Además de, parece ser, que estafan a sus afiliados. Eso no lo digo yo. Lo dice un excoodinador del partido. Para más detalles aquí: http://postdigital.es/2016/05/08/excoordinador-de-cs-ciudadanos-es-una-empresa-manejada-por-unas-20-personas-miserables-y-un-pelele-venido-de-la-banca-es-decir-un-indeseable-usurero-miserable/

En realidad Ziticen’s es la “nueva” derecha. Si crees que eres de derechas, aunque no tengas un duro, pero pogre: vota Ziticen’s. Se llevarán toda tu pasta y se lo pondrán fácil a las empresas para pagarte un sueldo mísero o despedirte. Todo está en tu mano. ¡Suerte!





     6ª Hablando de progres. Lo más progre y pro es no creer en Dios. Se ve que ninguno tiene religión. Y si la tiene es que es idiota. Podemos peca demasiado de esta teoría. Y una cosa es lo que hizo Carmena en la última cabalgata de reyes, que ya eran de esperar los reproches hiciera lo que hiciera, y otra es lo que hizo Rita Maestre en un altar. Por otro lado, todo el mundo, que no sea de su partido, ha dicho más o menos esto: ¿por qué no haces lo mismo en un bar, en el metro, en el ayuntamiento o en la calle Montera? Puedes reivindicar allí todo lo que quieras y más, de la forma que te parezca mejor.
Pero he leído incluso en su defensa que en el juicio la llamaron puta. No es cierto. La fiscal dijo: "Las señoritas están en su derecho de alardear de ser putas", pero no ante un altar. http://www.eldiario.es/politica/fiscal-Maestre-senoritas-derecho-alardear_0_512699386.html Está claro que si Rita Maestre dijo eso en aquel momento se está haciendo referencia a hechos, no la están insultando. Defender lo indefendible es muy español, pero son ganas de gastar energías en vano.

     7ª Parece ser que finalmente van a concurrir Podemos e IU en la próxima campaña. Realmente me parece bien. Lo tenían que haber hecho antes y nos hubieramos ahorrado unas nuevas elecciones. Juntos podrán incluso superar al PSOE. Porque por suerte o por desgracia los que pudieron votar no van a cambiar su voto en un 80%. Pero esta vicisitud la podemos descompensar los que estamos fuera. Superamos los 2 millones lo que podría suponer unos 10 a 15 escaños dependiendo de la concentración y orientación del voto.

     Si podéis ir a España para votar sería estupendo. Si puedes votar de cualquier otra manera haz todo lo posible por hacerlo. Es lo único en lo que puedes actuar directamente. Tú eliges a tus políticos pero ellos eligen el resto por ti: que pagarás de impuestos. Por que conceptos paragás más o menos impuestos. El tipo de educación que habrá para tus hijos y cuanto pagarás por ella. Políticas antidesahucios, anticorrupción, si se rescata a un banco o a las personas y un larguísimo etcétera directa o indirectamente como el precio de la luz o el combustible.

     No me hartaré de repetirlo: vota, es tu derecho fundamental.

     @eltiopacote
Listado de entradas: http://www.pacovalverde.es/indice/


Artículos relacionados:
Entrada 98 - Resumen elecciones 20 dic 2015
Entrada 97 - Votad malditos! Votad!
Entrada 93 - El poder está en tu mano  
Entrada 72 - Elecciones europeas 2014
Entrada 26 - Preparación para las elecciones del 2015

sábado, 7 de mayo de 2016

Acceso directo a VirtualBox en Ubuntu 16.04 LTS

    Parece ser qué, por temas de seguridad no se puede crear un acceso directo a Virtual Box en Ubuntu 16.04 LTS. Por lo que voy a exponer mi solución para tener un icono bonito en el escritorio que arranque Virtual Box.

    Hay dos métodos:

    1º Creamos un script que ejecute la aplicación.
    2º Creamos un programa desde cualquier lenguaje que nos arranque la aplicación Virtual-Box.

    1º Para este caso lo único que tenemos que hacer es escribir en un fichero de texto las sentencias:

/usr/lib/virtualbox/VirtualBox
exit


    El problema de este método es que cuando le das doble click al fichero gedit te pregunta si quieres mostrarlo o ejecutarlo. Y hay que modificar la acción de la aplicación gedit para ejecute los archivos o los edite. Cosa que hace para el resto de archivos. Y como esa opción no me entusiasma pasemos al segundo método.

    2º Para este método he empleado dos lenguajes Java y C++:
    2.A Para Java:


package ejecutarvirtualbox;
public class EjecutarVirtualBox {
    public static void main(String[] args) {
        try {
           Process p = Runtime.getRuntime().exec ("/usr/lib/virtualbox/VirtualBox");
        } catch (Exception e) {
            System.out.println("Aplicación no encontrada: " + e);
        }
    }
}
 

    Lo exportamos como jar, le damos permisos de ejecución y listo para abrir el programa.

    2.B Para C++:


#include <cstdlib>
using namespace std;
int main(int argc, char** argv) {
    system("/usr/lib/virtualbox/VirtualBox");
    return 0;
}


    Arrastramos el jar y/o el ejecutable de C++ al escritorio y ya los tenemos listos. Nos vamos a las propiedades del archivo, pinchamos sobre el icono y lo cambiamos por el icono de VirtualBox que está en la carpeta /usr/share/pixmaps/ llamado virtualbox.xpm.

    Breve pero intenso.
    @eltiopacote
Listado de artículos: http://www.pacovalverde.es/indice

martes, 3 de mayo de 2016

Proyecto Arduino ethernet SD + consola en Java 1/X

     Este proyecto vengo pensándolo desde hace mucho tiempo pero es desde hace poco tiempo que me he puesto con él enserio. Se trata de comunicarse con Arduino usando la tarjeta ethernet SD usando un navegador cualquiera y la conexión USB con una consola programada en Java.

     El concepto del proyecto estaría resumido en el siguiente esquema que podéis descargar desde mi web por si queréis hacer modificaciones:


     El proyecto no está completo. Lo estoy desarrollando de momento solo bajo Linux. Ubuntu para ser exactos. Esto es solo una aproximación. De hecho, esta versión tiene  dos fallos al presentar en la consola los datos enviados y recibidos, y al capturar el evento de datos recibidos siempre da como positivo a tal evento. Cosas muy raras. A lo mejor me puedes ayudar a solucionar estos problemillas.

     El siguiente código es el que estará almacenado en Arduino:


#include <Ethernet.h>
#include <SPI.h>

const int BLUE    =5;
const int GREEN   =6;
const int RED     =7;
const int SPEAKER =3;
// Configuration Night Light
const int RLED    =9;    //Red LED on pin 9 (PWM)
const int LIGHT   =0;    //Lght Sensor on Analog Pin 0
const int MIN_LIGHT=200; //Minimum expected light value
const int MAX_LIGHT=900; //Maximum Expected Light value
int val = 0;             //variable to hold the analog reading
String AnalogLed;

//For controlling LEDS and the speaker
//If you want to control additional things, add variables to control them here.
int freq = 0;
int pin;
char dato[16];
String inString = "";

//Set to your MAC address!
//It should be on your sticker. If you can't find it,
//make one up, or use this one.
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x4A, 0xE0 };
// the dns server ip
IPAddress dnServer(192, 168, 0, 1);
// the router's gateway address:
IPAddress gateway(192, 168, 0, 1);
// the subnet:
IPAddress subnet(255, 255, 255, 0);
// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 0, 20);

//Start the server on port 80
EthernetServer server = EthernetServer(80); //port 80

boolean receiving = false; //To keep track of whether we are getting data.

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

  pinMode(RED, OUTPUT);
  pinMode(GREEN, OUTPUT);
  pinMode(BLUE, OUTPUT);
  // Configuration Night Light
  pinMode(RLED, OUTPUT); //Set LED pin as output
   
  Ethernet.begin(mac, ip, dnServer, gateway, subnet);
  //Start the server
  server.begin();
  Serial.print("Server Started.\nLocal IP: ");
  Serial.println(Ethernet.localIP());

}

void loop()
{
  EthernetClient client = server.available();

  if (Serial.available() > 0)
  {
    // https://www.arduino.cc/en/Tutorial/StringToIntExample
    int inChar = Serial.read();
    if(isDigit(inChar))
    {
      inString += (char)inChar;
    }
    if(inChar == '\n')
    {
      Serial.print("Pin: ");
      pin = inString.toInt();
      Serial.println(pin);
      if (pin == 55)
        digitalWrite(7, !digitalRead(7));
      else
        digitalWrite(pin, !digitalRead(pin));
      inString = "";
    }
   
    delay(1000);
    for(int i=0; i<10; i++) {
      digitalWrite(7, !digitalRead(7));
      if (pin != 0)
        Serial.println(pin);
      delay(200);
    }
  }
     
  if (client)
  {
    //An HTTP request ends with a blank line
    boolean currentLineIsBlank = true;
    boolean sentHeader = false;

    while (client.connected())
    {
      if (client.available())
      {
        char c = client.read(); //Read from the incoming buffer
      
        if(receiving && c == ' ') receiving = false; //done receiving
        if(c == '?') receiving = true; //found arguments
      
        //This looks at the GET requests
        if(receiving)
        {
          //An LED command is specified with an L
          if (c == 'L')
          {
            Serial.print("Toggling Pin ");
            pin = client.parseInt();
            Serial.println(pin);
            digitalWrite(pin, !digitalRead(pin));
           
            delay(1000);
            for(int i=0; i<10; i++) {
              digitalWrite(pin, !digitalRead(pin));
              Serial.println(pin);
              delay(200);
            }
           
            break;
          }
          //A speaker command is specified with an S
          else if (c == 'S')
          {
            Serial.print("Setting Frequency to ");
            freq = client.parseInt();
            Serial.println(freq);
            if (freq == 0)
              noTone(SPEAKER);
            else
              tone(SPEAKER, freq);
            break;
          }
          //Add similarly formatted else if statements here
          //TO CONTROL ADDITIONAL THINGS
          else if (c == 'A')
          {
            if (val < 0 || val > 255)
            {
              val = 0;
              break;
            }
            val = client.parseInt();
            Serial.print("Dando brillo al led con valor analogico: ");
            Serial.println(val);
            analogWrite(RLED, val);                       //control the LED
            break;
          }
        }
      
        //Print out the response header and the HTML page
        if(!sentHeader)
        {
          //Send a standard HTTP response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html\n");
    
          //Red toggle button
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='7' />");
          client.println("<input type='submit' value='Toggle Red' />");
          client.println("</form>");
    
          // Green toggle button
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='6' />");
          client.println("<input type='submit' value='Toggle Green' />");
          client.println("</form>");
    
          //Blue toggle button
          client.println("<form action='' method='get'>");
          client.println("<input type='hidden' name='L' value='5' />");
          client.println("<input type='submit' value='Toggle Orange' />");
          client.println("</form>");
    
          //Speaker frequency slider
          client.println("<form action='' method='get'>");
          client.print("<input type='range' name='S' min='0' max='1000' step='100' value='0'/>");
          client.println("<input type='submit' value='Set Frequency' />");
          client.println("</form>");
         
          // Control de salida analgica
          client.println("<form action='' method='get'>");
          client.println("Introduzca un valor para la salida analogica (0-255): <input type='text' name='A' min='0' max='255' value='0' />");
          //client.println("Introduzca un valor para la salida analogica (0-255): <input type='text' name='A' min='0' max='255' value='"+String(val)+"' />");
          client.println("<input type='submit' value='Set Analogic Blue Light' />");
          client.println("</form>");         
    
          //Add additional forms forms for controlling more things here.
         
          sentHeader = true;
        }
 
        if (c == '\n' && currentLineIsBlank) break;

        if (c == '\n')
        {
          currentLineIsBlank = true;
        }
        else if (c != '\r')
        {
          currentLineIsBlank = false;
        }
      }
    }
    delay(100); //Give the web browser time to receive the data
    client.stop(); //Close the connection:
  }
}


     Es una versión un poco extendida del código expuesto en GitHub control_led_speaker.ino. Solo que le he puesto que trate los datos recibidos por el puerto serie (a la postre USB, en Linux '/dev/ttyUSB0') y que devuelva por el puerto serie el mismo dato enviado por consola desde el PC. Puedes descargar el código desde mi web.

     El código Java es el siguiente:

import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 *//**
 * @author mario
 */
public class JAVADUINO_Frame extends javax.swing.JFrame implements SerialPortEventListener {

    /**
     * Creates new form JAVADUINO_Frame
     */
    private static final String TURN_Verde="5";
    private static final String TURN_Verde_ON="6";
    private static final String TURN_Rojo_OFF="9";
    private static final String TURN_Rojo_ON="7";
    private String vBuffer;
   
    //Variables de conexión
    private OutputStream output = null;
    SerialPort serialPort;
    InputStream inputStream;    // Para leer el puerto serie
    /**
     * A BufferedReader which will be fed by a InputStreamReader converting the
     * bytes into characters making the displayed results codepage independent
     */
    private BufferedReader input;
   
    private InputStreamReader inputBuffer;
   
    private final String PUERTO = "/dev/ttyUSB0";
    private static final int TIMEOUT = 2000; //Milisegundos
    private static final int DATA_RATE = 9600;
   
    /*
     * Bloque de código para abrir del puerto serie
     */
    public SerialPort abrirPuertoSerie(final String nombrePuerto) throws Exception {
        CommPortIdentifier portId;  // puerto: nombre original.
        SerialPort puertoSerie;
        final Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();   // listaPuertos: nombre original.
       
        while (portEnum.hasMoreElements()) {
            portId = (CommPortIdentifier) portEnum.nextElement();
            if (portId.getName().equals(nombrePuerto)) {
                puertoSerie = (SerialPort)portId.open("PuertoSerie", TIMEOUT);
                puertoSerie.setSerialPortParams(9600,
                                                SerialPort.DATABITS_8,
                                                SerialPort.STOPBITS_1,
                                                SerialPort.PARITY_NONE);
                return puertoSerie;
            }
        }
        throw new Exception("Nombre de puerto invalido");
    }
    /**
     * Manualmente un evento sobre el puerto serie. Lee los datos y los imprime.
     * Handle an event on the serial port. Read the data and print it.
     * Código extraido de http://playground.arduino.cc/Interfacing/Java
     * @param oEvent
     */
    @Override
    public synchronized void serialEvent(SerialPortEvent oEvent) {       
        // Web de Oracle que trata los eventos del puerto serie:
        // DATA_AVAILABLE: https://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/javax/comm/SerialPortEvent.html#DATA_AVAILABLE
        // DATA_AVAILABLE: https://docs.oracle.com/cd/E17802_01/products/products/javacomm/reference/api/constant-values.html#javax.comm.SerialPortEvent.DATA_AVAILABLE
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE && oEvent.getNewValue()) { // types int
            try {
               
                jTextAreaEventos.append("Capturado evento: " + Integer.toString(oEvent.getEventType()) + "\n");
                //String inputLine = input.readLine();
                //jAreaMensajes.append(inputLine + "\n");
                // Desde http://playground.arduino.cc/Interfacing/Java
                input = new BufferedReader(new InputStreamReader(serialPort.getInputStream()));
                jAreaMensajes.append(input + "\n");
                System.out.println(oEvent.getSource().toString());  // " " + input
            } catch (Exception e) {
                System.err.println(e.toString());
            }
        }
        // Ignore all the other eventTypes, but you should consider the other ones.
       
    }
   
    public JAVADUINO_Frame() {
        initComponents();
        inicializarConexion();
        jLabel1.setIcon(new ImageIcon("src/IconoLedRojoApagado.png"));
        jLabel3.setIcon(new ImageIcon("src/IconoLedAmarilloApagado.png"));   
        setTitle("JAVADUINO");
        jRadioButton1.setSelected(true);
    }
   
    public void inicializarConexion(){
        CommPortIdentifier puertoID=null;
        Enumeration puertoEnum = CommPortIdentifier.getPortIdentifiers();
       
        while(puertoEnum.hasMoreElements()){
            CommPortIdentifier actualPuertoID=(CommPortIdentifier) puertoEnum.nextElement();
            if(PUERTO.equals(actualPuertoID.getName())){
                puertoID = actualPuertoID;
                // jAreaMensajes.append("Puerto encontrado: " + puertoID.getName() + "\n");
                jLblDatosConexcion.setText("Puerto encontrado: " + PUERTO); // puertoID.getName()
                break;
            }
        }
       
        if(puertoID == null){
            mostrarError("No se puede conectar al puerto");
            System.exit(ERROR);
        }
       
        try{
            serialPort = (SerialPort) puertoID.open(this.getClass().getName(), TIMEOUT);
            //Parámetros puerto serie
            serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            output = serialPort.getOutputStream();
            //input = serialPort.getInputStream();
            jAreaMensajes.append("Puerto seleccionado: " + output.toString() + "\n");
           
            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
            //serialPort.notifyOnOutputEmpty(rootPaneCheckingEnabled);    // Para evaluar la segunda forma de tratar el evento del puerto serie.
            jAreaMensajes.append("Preparado para capturar el evento: " + Integer.toString(SerialPortEvent.DATA_AVAILABLE) + "\n");
        } catch(Exception e){
            mostrarError(e.getMessage());
            System.exit(ERROR);
        }
    }
   
    /**
     * Esto debería ser llamado cuando paras de usar el puerto.
     * Esto prevendrá que el puerto se quede bloqueado en las plataformas Linux.
     * This should be called when you stop using the port. This will prevent
     * port locking on platforms like Linux.
     * Código extraido de http://playground.arduino.cc/Interfacing/Java
     */
    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }
   
    public void openPort() {
        CommPortIdentifier puertoID=null;
        Enumeration puertoEnum = CommPortIdentifier.getPortIdentifiers();
       
        while(puertoEnum.hasMoreElements()){
            CommPortIdentifier actualPuertoID=(CommPortIdentifier) puertoEnum.nextElement();
            if(PUERTO.equals(actualPuertoID.getName())){
                puertoID = actualPuertoID;
                // jAreaMensajes.append("Puerto encontrado: " + puertoID.getName() + "\n");
                jLblDatosConexcion.setText("Puerto encontrado: " + PUERTO); // puertoID.getName()
                break;
            }
        }
       
        if(puertoID == null){
            mostrarError("No se puede conectar al puerto");
            System.exit(ERROR);
        }
       
        if (serialPort == null) {
            try{
            serialPort = (SerialPort) puertoID.open(this.getClass().getName(), TIMEOUT);
            //Parámetros puerto serie
            serialPort.setSerialPortParams(DATA_RATE, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
            output = serialPort.getOutputStream();
            //input = serialPort.getInputStream();
            jAreaMensajes.append("Puerto seleccionado: " + output.toString() + "\n");
           
            // add event listeners
            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
            //serialPort.notifyOnOutputEmpty(rootPaneCheckingEnabled);    // Para evaluar la segunda forma de tratar el evento del puerto serie.
            jAreaMensajes.append("Preparado para capturar el evento: " + Integer.toString(SerialPortEvent.DATA_AVAILABLE) + "\n");
            } catch(Exception e){
                mostrarError(e.getMessage());
                System.exit(ERROR);
            }
        }
    }
   
    private void enviarDatos(String datos){
        try{
            output.write(datos.getBytes());
            //output.write(7);
            jAreaMensajes.append("Enviado: " + datos.getBytes().toString() + "\n"); //  + datos.getBytes()
        } catch(Exception e){
            mostrarError("ERROR");
            System.exit(ERROR);
        }
    }   
   
    public void mostrarError(String mensaje){
        JOptionPane.showMessageDialog(this, mensaje, "ERROR", JOptionPane.ERROR_MESSAGE);
    }
   
    /**
     * 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() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jRadioButton1 = new javax.swing.JRadioButton();
        jRadioButton2 = new javax.swing.JRadioButton();
        jLabel3 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jAreaMensajes = new javax.swing.JTextArea();
        jLabelPort = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLblDatosConexcion = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        jTextAreaEventos = new javax.swing.JTextArea();
        jButtonClosePort = new javax.swing.JButton();
        jButtonBorrarMensajes = new javax.swing.JButton();
        jButtonOpenPort = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        addWindowListener(new java.awt.event.WindowAdapter() {
            public void windowClosing(java.awt.event.WindowEvent evt) {
                close(evt);
            }
        });

        jButton1.setText("OFF");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setText("ON ");
        jButton2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton2ActionPerformed(evt);
            }
        });

        jLabel1.setText("jLabel1");
        jLabel1.setMaximumSize(new java.awt.Dimension(50, 50));
        jLabel1.setMinimumSize(new java.awt.Dimension(50, 50));
        jLabel1.setPreferredSize(new java.awt.Dimension(50, 50));

        jRadioButton1.setText("ROJO");

        jRadioButton2.setText("AMARILLO");

        jLabel3.setText("jLabel3");
        jLabel3.setMaximumSize(new java.awt.Dimension(50, 50));
        jLabel3.setMinimumSize(new java.awt.Dimension(50, 50));
        jLabel3.setPreferredSize(new java.awt.Dimension(50, 50));

        jAreaMensajes.setColumns(20);
        jAreaMensajes.setRows(5);
        jScrollPane1.setViewportView(jAreaMensajes);

        jTextAreaEventos.setColumns(20);
        jTextAreaEventos.setRows(5);
        jScrollPane2.setViewportView(jTextAreaEventos);

        jButtonClosePort.setText("Cerrar puerto");
        jButtonClosePort.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonClosePortMouseClicked(evt);
            }
        });

        jButtonBorrarMensajes.setText("Borrar");
        jButtonBorrarMensajes.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonBorrarMensajesMouseClicked(evt);
            }
        });

        jButtonOpenPort.setText("Abrir puerto");
        jButtonOpenPort.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jButtonOpenPortMouseClicked(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLblDatosConexcion)
                        .addGap(12, 12, 12)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 294, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabelPort, javax.swing.GroupLayout.PREFERRED_SIZE, 977, javax.swing.GroupLayout.PREFERRED_SIZE)))
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jButton2, javax.swing.GroupLayout.PREFERRED_SIZE, 115, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 158, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jButtonClosePort, javax.swing.GroupLayout.PREFERRED_SIZE, 116, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jButtonBorrarMensajes, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jButtonOpenPort, javax.swing.GroupLayout.PREFERRED_SIZE, 136, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(jRadioButton1)
                        .addComponent(jRadioButton2)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 484, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 451, javax.swing.GroupLayout.PREFERRED_SIZE))))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jRadioButton1)
                .addGap(18, 18, 18)
                .addComponent(jRadioButton2)
                .addGap(61, 61, 61)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton1)
                    .addComponent(jButton2)
                    .addComponent(jButtonClosePort)
                    .addComponent(jButtonBorrarMensajes)
                    .addComponent(jButtonOpenPort))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 376, Short.MAX_VALUE)
                    .addComponent(jScrollPane1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLblDatosConexcion, javax.swing.GroupLayout.PREFERRED_SIZE, 17, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabelPort, javax.swing.GroupLayout.PREFERRED_SIZE, 16, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addGap(0, 0, Short.MAX_VALUE))))
        );

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

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        if(jRadioButton1.isSelected()){
            enviarDatos(TURN_Rojo_ON);
            jLabel1.setIcon(new ImageIcon("src/IconoLedRojo.png"));
        }
        if(jRadioButton2.isSelected()){
            enviarDatos(TURN_Verde_ON);
            jLabel3.setIcon(new ImageIcon("src/IconoLedAmarillo.png"));
        }
    }                                       

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        if(jRadioButton1.isSelected()){
            enviarDatos(TURN_Rojo_OFF);
            jLabel1.setIcon(new ImageIcon("src/IconoLedRojoApagado.png"));
        }
        if(jRadioButton2.isSelected()){
            enviarDatos(TURN_Verde);
            jLabel3.setIcon(new ImageIcon("src/IconoLedAmarilloApagado.png"));
        }
    }                                       

    private void close(java.awt.event.WindowEvent evt) {                      
        // TODO add your handling code here:
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }                     

    private void jButtonClosePortMouseClicked(java.awt.event.MouseEvent evt) {                                             
        // TODO add your handling code here:
        close();
        jLabelPort.setText("Puerto encontrado: " + PUERTO);
    }                                            

    private void jButtonBorrarMensajesMouseClicked(java.awt.event.MouseEvent evt) {                                                  
        // TODO add your handling code here:
        jAreaMensajes.setText("");
        jTextAreaEventos.setText("");
    }                                                 

    private void jButtonOpenPortMouseClicked(java.awt.event.MouseEvent evt) {                                            
        // TODO add your handling code here:
        openPort();
    }                                           
  
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws Exception {
        /* 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(JAVADUINO_Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JAVADUINO_Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JAVADUINO_Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JAVADUINO_Frame.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 JAVADUINO_Frame().setVisible(true);
            }
        });
    }
   
    // Variables declaration - do not modify                    
    private javax.swing.JTextArea jAreaMensajes;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButtonBorrarMensajes;
    private javax.swing.JButton jButtonClosePort;
    private javax.swing.JButton jButtonOpenPort;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabelPort;
    private javax.swing.JLabel jLblDatosConexcion;
    private javax.swing.JRadioButton jRadioButton1;
    private javax.swing.JRadioButton jRadioButton2;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTextArea jTextAreaEventos;
    // End of variables declaration                  
}



     Es una modificación sobre un proyecto llamado JAVADUINO hecho con swing. Solo que el código expuesto trata el evento de datos en el buffer de entrada. También lo podéis descargar desde mi web. Tiene algunos fragmentos más de código comentado de las pruebas realizadas para tratar el evento del buffer y leer correctamente del puerto serie.

     El código está bastante comentado por lo que no veo necesario comentarlo externamente. Las webs que nombro ya comentan los códigos extendidamente y hay multitud de webs donde explican por separado cada una de las funciones. Además, es un código muy sencillo. Lo importante en este punto es: '¿que se quiere conseguir?' y el 'objetivo final' expuesto en el esquema. La web, con los archivos correspondientes, que servirá Arduino estará alojada en la tarjeta SD.

     Y esto es todo de momento sobre este proyecto.

Entradas relacionadas:

Entrada 124 - Programando una consola en Java con NetBeans 2/X 
Entrada 123 - Como crear un proyecto con Swing en NetBeans 8.X
Entrada 117 - Configuración de la shield ethernet SD de Arduino

     @eltiopacote
Listado entradas: http://www.pacovalverde.es/indice/