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

17
3568

En esta entrega, les guiaré a través de un emocionante proceso para manipular los colores de un LED RGB empleando la técnica de modulación por ancho de pulsos (PWM). Para lograr esto, desarrollaremos una interfaz interactiva en Java, utilizando Sliders como herramientas para ajustar los colores del LED RGB.

Como muchos recordarán, ya hemos explorado el mundo de los LEDs RGB en una publicación anterior: Java + Arduino: Encendiendo un LED RGB desde un programa en nuestra PC. En aquel post, nos enfocamos en crear una interfaz con botones para seleccionar distintos colores. Esta vez, avanzaremos un paso más allá, buscando obtener una gama más amplia de tonalidades a través del ajuste de la intensidad de los colores mediante PWM.

Nuestro primer paso será diseñar y construir la interfaz. Para ello, iniciaremos un proyecto en Java, integraremos un JFrame e incluiremos controles específicos, los cuales serán de gran ayuda especialmente para aquellos que recién comienzan (para más detalles, pueden consultar Cómo crear nuestro primer programa en Java con NetBeans).

Pasando a la fase de programación, empezaremos por importar las bibliotecas RXTX y Arduino, ambas disponibles en este blog: RXTX y Arduino. Cabe destacar que la biblioteca Arduino es una creación propia, cuyo principal objetivo es facilitar la comunicación entre Arduino y Java.

A continuación, presento 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:

https://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.

0 0 votes
Article Rating
Suscríbete
Notify of
guest

17 Comments
newest
oldest most voted
Inline Feedbacks
View all comments
Nallely
Nallely
5 years ago

hola, me podrías ayudar con la siguiente cuestión, ¿Puedo guardar los datos que recibe java desde arduino? Utilizo la versión 3.0 de la librería. Estoy recibiendo 8 impresiones por el puerto serial, pero una de esas impresiones no necesita visualizarse en un campo de texto, sino, que sea un indicador para abrir una ventana emergente en Java (JOptionPane).

Gracias

Javier
Javier
5 years ago

el proyecto java en ese link de google docs es de un grafico, no para manejar los leds.

Javier Mancilla Vidrio
Javier Mancilla Vidrio
6 years ago

amigo, una pregunta, porque me marca error en
import Arduino.Arduino ??

Antony García González
Antony García González
6 years ago

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
Juan Pablo
6 years ago

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
Antony García González
6 years ago
Reply to  Juan Pablo

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

Jack Garfield
Jack Garfield
6 years ago

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
Antony García González
6 years ago
Reply to  Jack Garfield

Porque nadie me paga por hacerlo

LeizaR_Imp
LeizaR_Imp
6 years ago

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

Dante
Dante
7 years ago

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
Yeison Ipia
8 years ago

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.

juanquique22
10 years ago

Muy bien, gracias.

juanquique22
10 years ago

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

antonygarciagonzalez
10 years ago
Reply to  juanquique22

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

juanquique22
10 years ago

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.

antonygarciagonzalez
10 years ago
Reply to  juanquique22

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