Por medio del puerto serie, esta interfaz enviá un número de 10 cifras al Arduino ( 1Cifra simbólica, 3 cifras Rojo, 3 cifras Verde y 3 cifras Azul), cuando este lo recibe identifica cada cifra y escribe su correspondiente valor de cada color en su pin.
El número que enviá se calcula de esta manera ( 1.000.000.000 + Canal R* 1.000.000 + Canal G* 1.000 + Canal B)
Código Visual Basic:
Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.Parity = IO.Ports.Parity.None
SerialPort1.StopBits = IO.Ports.StopBits.One
SerialPort1.PortName = "COM3"
SerialPort1.Open()
TextBox_R.Text = 0 'Valor inicial canal R (entre 0-255)
TextBox_G.Text = 0 'Valor inicial canal G (entre 0-255)
TextBox_B.Text = 0 'Valor inicial canal B (entre 0-255)
TextBox_RGB.Text = 0 'Valor inicial RGB ( 1000000000 + R*1000000 + G*1000 + B)
'El 1000000000 es para forzar a RGB a que tenga una cifra constante (por si el canal R es menor de 100 0 10)
End Sub
Private Sub TrackBar1_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_R.Scroll
TextBox_R.Text = TrackBar_R.Value
End Sub
Private Sub TrackBar2_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_G.Scroll
TextBox_G.Text = TrackBar_G.Value
End Sub
Private Sub TrackBar3_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TrackBar_B.Scroll
TextBox_B.Text = TrackBar_B.Value
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EnviarDatos.Click
TextBox_RGB.Text = 1000000000 + TextBox_R.Text * 1000000 + TextBox_G.Text * 1000 + TextBox_B.Text
SerialPort1.Write(TextBox_RGB.Text)
End Sub
End Class
Código Arduino:
// By: jsslxs
// 15 de Desembre 2013
int ledR= 8; //Led rojo
int ledG= 9; //Led verde
int ledB= 10; //Led azul
void setup()
{
pinMode(ledR,OUTPUT);
pinMode(ledG,OUTPUT);
pinMode(ledB,OUTPUT);
Serial.begin(9600); //Inicio puerto serie
}
void loop()
{
int val, r, g, b;
if (Serial.available())
{
delay(100); //Espera 100ms
while (Serial.available ()>9) // ejemplo datos recibidos: 1 255 166 094
{
val=Serial.read();
int numser[8] = {0,0,0,0,0,0,0,0}; //matriz de bytes
for (int i = 0; i < 9; i = i++) // El primer dato es un 1 simbólico, no lo guardo
{
numser[i]= Serial.read();
}
int num0 = numser[0]-'0'; //Rojo 255
int num1 = numser[1]-'0';
int num2 = numser[2]-'0';
r= num0*100+ num1*10 + num2;
int num3= numser[3]-'0'; //Verde 166
int num4 = numser[4]-'0';
int num5 = numser[5]-'0';
g= num3*100+ num4*10 + num5;
int num6 = numser[6]-'0'; //Azul 094
int num7= numser[7]-'0';
int num8= numser[8]-'0';
b= num6*100+ num7*10 + num8;
color( r, g, b); //Llamo a la función color
//Serial.write(num3+'0');
//Serial.write(num4+'0');
//Serial.write(num5+'0');
}
Serial.flush();
}
}
void color(int rojo, int verde, int azul)
{
//Escritura de PWM del color Rojo
analogWrite(ledR, rojo);
//Escritura de PWM del color Verde
analogWrite(ledG, verde);
//Escritura de PWM del color Azul
analogWrite(ledB, azul);
}
Descargar proyecto: http://www.4shared.com/zip/ucIrUOIm/Control_LedRGB.html
buenas jesus ,he estado trabajando con tu proyecto ,solo queria preguntarte ¿como hariamos lo mismo con 14 led?
ResponderEliminarBuenas Miguel, para 14 leds yo utilizaría una cadena con (2 Cifras identificadoras, 3 cifras Rojo, 3 cifras Verde y 3 cifras Azul) Las dos primeras cifras son para identificar a los leds, iría del 01 al 14 y ahora enviaras 14 cadenas al Arduino .El Arduino cuando lee una cadena, gracias a estas cifras ya sabe a que pin le debe asignar los valores RGB de la cadena.
EliminarEl problema es que 14x3=42 y creo que ni el Arduino Mega tiene tantos pins analógicos, por lo que necesitaras un multiplexor de salidas analógicas, en este blog explican como utilizar un multiplexor HEF4051B http://alonsodub.wordpress.com/2012/08/02/lectura-analogica-usando-mux-8a1-hef4051b/
Un saludo!
Hola Jesus!
Eliminarque tal?
disculpa que me entrometa en el comentario pero quisiera saber si cuentas con algun proyecto de ejemplo que contenga arduino uno con HEF4051B utilizando el Visual Basic?
agradezco tu atension.
Este comentario ha sido eliminado por el autor.
ResponderEliminarMUCHAS GRACIAS JESUS POR TU RESPUESTA ,PERO ME HE EXPRESADO MAL NO SON 14 LED RGB) SI NO 14 PINES (14 LED).SOBRE TU RESPUESTA ME PIERDO Y NO ENTIENDO (MUCHAS GRACIAS POR ATENDERME
EliminarPues asi es más facil, que el PC envie al Arduino una cadena con los 14 estados de los leds por ejemplo: 00111111111111 en este caso todos los leds estarian encendidos excepto los dos primeros.
EliminarTengo un ejemplo donde enciendo un led ,puede servirte para empeza rhttp://jsslxs.blogspot.com.es/2013/12/enviar-y-recibir-datos-al-arduino-con.html
Buenas Jesus ,segui tus indicaciones con el ejemplo de un led ,segui implantado button/led hasta 5 (
ResponderEliminarpwm 12 (button 1)
pwm11(button 2)
pwm10(button 3)
pwm9(button 4)
pwm8(button 5)
y perfecto se activa y desactiva, el problema llega cuando le llega el button/led 6 ,este de por si no enciende el led al pin correspondiente (pwm7).pero si desactiva y activa el pin (pwm12),es decir el button 1 y 6 apaga y enciende el pin pwm12 te paso el archivo del protecto para que le puedas echar una mirada haber que es .me da que el tema esta en que arduino no interpreta el val=10 y 11 como es ,si no como 0 y1.un sld y perdona por el tocho y mi incistencia estoy un poco pegado en esto .
https://www.dropbox.com/s/o2lnoawncznnm4l/Arduino_LED%20-%205-.rar
EliminarHola Miguel, es lo que tu dices, tu programa para el Arduino solo lee el primer caracter que le envías, así que tienes dos opciones:
Eliminar-Hacer que el Arduino lea cada vez dos caracteres Serial.available ()>1 . Ahora no enviarías 1, 2, 3... sino 01, 02, 03...
-O otra forma más simple es que envié un 1, 2,3 pero cuando llegas al 10 envías una A... para el 11 una B....
Animo y suerte!