Arduino + Java: Variar los colores de un LED RGB con PWM

14
571

Hola a todos.

En esta ocasión les mostraré como variar los colores de un LED RGB utilizando modulación por ancho de pulsos (PWM).

Vamos a crear una interfaz en Java con Sliders que serán los que nos permitirán variar los colores del LED RGB.

Antes hemos trabajado con LEDs RGB, como en este post: Java + Arduino: Encendiendo un LED RGB desde un programa en nuestra PC.

En ese post creamos una interfaz con botones para obtener diferentes colores. Ahora lo que haremos es obtener diferentes tonalidades variando la intensidad de los colores con PWM.

Primero trabajaremos en la interfaz.

Creamos un proyecto en Java, insertamos un JFrame y colocamos los siguientes controles (para los principiantes consultar Cómo crear nuestro primer programa en Java con NetBeans):

Ahora vamos a lo que es la programación.

Primero importaremos las librerías RXTX y Arduino. Ambas librerías se encuentran disponibles en este blog: RXTX y Arduino. La librería Arduino la he creado yo y su principal función es facilitar la comunicación entre Arduino y Java.

He aquí la declaración de variables:

Aquí está como debe quedar:

Sin título

Ahora vamos a los métodos.

Haremos un método para el color de fondo del panel que colocamos en la interfaz. Dicho “cuadrito” mostrará el color que en teoría debería mostrar el LED.

El método es el siguiente:

Ahora crearemos un método para “setear” los datos que enviaremos a Arduino. Como los valores que mandaremos serán entre 0 y 255 lo que haremos será enviarlos cifra a cifra. Si vamos a mandar por ejemplo el 255, Arduino recibirá el 2, luego el 5 y luego el otro 5. Lo que haremos con Arduino será recibir las centenas, decenas y unidades. El 2 lo multiplicamos por 100, el 5 por 10 y el último 5 lo dejamos así. Luego los sumamos: 200+50+5=255. Sin embargo para que esto funcione primero hay que mandar las centenas, luego las decenas y por último las unidades. Si mandos un 1, Arduino lo multiplicará por 100 y entonces no obtendremos los resultados deseados. Lo que haremos para evitar que esto suceda es mandar “001”. Así que Arduino hará lo siguiente: (0)*100+(0)*10+1=1.

Lo mismo cuando son decenas. Si mandamos el 10, debemos hacerlo de la siguiente manera: “010”. Arduino lo interpretará de la siguiente forma: (0)*100+(1)*10+(0)*0=10.

El método que se encargará de esto será el siguiente:

Este método prepara las variables para mandárselas a Arduino.

En el método principal iniciamos la comunicaión con Arduino:

Aquí se muestra como debe quedar:

Sin título

Sin título

Sin título

Ahora veamos como haremos el envío de datos.

Buscaremos la propiedad StateChanged de los Slider.

Sin título

Aquí el código será el mismo para los tres colores, solo cambiando el nombre de la variable:

Solo cambiamos la R en el jSlider por la B y la G del azul y verde.

Así debe quedarnos el código:

Sin título

Con esto estamos listos con Java. Ahora pasamos a Arduino.

El código que vamos a usar es el siguiente:

Es un código bastante sencillo. Primero lee cual de los tres LEDs se le va a modificar la luminosidad. Luego lee las centenas, decenas y unidades que conforman el valor de la luminosidad. Por último hace la escritura PWM con analogWrite.

Los archivos de este proyecto se encuentran disponibles en el siguiente enlace:

http://docs.google.com/file/d/0B0hsUkhqWH97Y2hscXU0MEhiTzA/edit?usp=sharing

Acá está el esquema del circuito que usaremos:

Untitled Sketch_bb

Aquí les dejo un video donde se muestra el funcionamiento de este este código:

Espero que les guste.

Saludos.

  • Antony García González

    No tengo el nombre. Ni el número de serie Utilicé una bandeja que me encontre en un tiradero un día y construí la incubadora en base a eso

  • Juan Pablo

    Hola Antony! Estaba siguiendo el tutorial y bajé la nueva versión de la librería (PanamaHitek_Arduino 2.8.2) pero al momento de copiar esta línea en netBeans:

    Arduino.ArduinoTX(“COM6”, 2000, 9600);

    Me aparece un error que se refiere a que la cantidad de parámetros es superior a la que le envío, perfecto, intenté con lo siguiente:

    Arduino.arduinoTX(“COM6”, 9600);

    y al ejecutarlo me aparece un error:

    com.panamahitek.ArduinoException: Nombre del puerto – COM3; Nombre del método – arduinoTX(); Tipo de excepción – Puerto no abierto.

    Tenés idea de qué es lo que pasa? Qué me recomendas, utilizar una versión anterior de la librería?

    Saludos, Juan

    • Antony García González

      Utiliza la nueva. En algún lugar estás intentando abrir el puerto COM3

  • Jack Garfield

    Por que no hace una actualizacion de este video pero ahora con la libreria de PanamaHitek_Arduino 2.8.2 y que funcione para servomotores

    • Antony García González

      Porque nadie me paga por hacerlo

  • LeizaR_Imp

    en los archivos en java dice graficas, creo que esta mal

  • Dante

    Hola, como hago para enviar un numero desde la interfaz en java y que sea guardada en una variable en arduino, sin interferir con otras variables. He intentado de diversas formas pero no me funciona. Les agradecería mucho cualquier información al respecto.

  • Yeison Ipia

    amigo tengo una pregunta , lo que sucede es que desearía implementar éste sistema a una tira LED RGB para alimentarla usé un ULN2003AN ya que trabaja con 12 voltios, pero mi problema vino cuando me di cuenta que ese LED era de katodo común y el que yo tengo es de anodo común que debo hacer para editar la programación soy nuevo en esto por favor si alguien quisiera orientarme en más acerca de esto comunicarse a mi correo [email protected] gracias amigo tus post son muy buenos.

  • Muy bien, gracias.

  • Yo pensé que era parte del Serial.read(); jeje pero ya veo lo que hiciste y observando mas códigos me surgió otra duda, si utilizo ‘1’ osea el dato que me están enviando desde java y lo encierro entre apóstrofos(o comillas simples) automáticamente Arduino identifica su código ASCII.
    Por ejemplo:
    Me envían el número “3” en forma de String desde java y en Arduino la guardo como una variable

    variable=Serial.read();

    y despues la utilizo en un if:

    if(variable==’3′)

    Puedo hacer eso en lugar de poner

    if(variable==51) //donde 51 es 3 en codigo ASCII

    • Cuando hago la comparación con el ‘1’ estoy comparando un caracter. Ahí no hago la transformación ASCII a entero sino que trabajo directamente con el ASCII. Si quieres comparar caracteres usas las comillas, si quieres comparar enteros no lo haces. Con las comillas no necesitas transformar a entero

  • Hola soy nuevo manejando Arduino, y quería saber si me puedes resolver dos dudas con el código que pones en esta publicación:
    1- ¿De que sirve el -48 al final del Serial.read()?
    2-No se supone que Arduino recibe los datos en codigo Ascii,¿Por qué en los if’s los comparas con enteros?
    De ante mano muchas gracias y saludos.

    • Efectivamente Arduino recibe los datos en ASCII. Cuando se recibe el 0, Arduino lo interpreta como 48. El 1, 49, el 2, 50…

      Si a los datos que recibo les resto 48, cuando reciba un 0(48) entonces… 48-48=0.

      49-48= 1

      50-48=2

      y así sucesivamente. Eso me permite a mi comparar enteros en vez de caracteres