domingo, 15 de diciembre de 2013

Control de Led RGB con Visual Basic y Arduino

Los valores de cada canal están comprendidos entre 0-255 por tanto en decimal tienen 3 cifras.
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

9 comentarios:

  1. buenas jesus ,he estado trabajando con tu proyecto ,solo queria preguntarte ¿como hariamos lo mismo con 14 led?

    ResponderEliminar
    Respuestas
    1. Buenas 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.

      El 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!

      Eliminar
    2. Hola Jesus!

      que 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.

      Eliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
    Respuestas
    1. MUCHAS 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

      Eliminar
    2. Pues 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.
      Tengo 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

      Eliminar
  3. Buenas Jesus ,segui tus indicaciones con el ejemplo de un led ,segui implantado button/led hasta 5 (
    pwm 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 .

    ResponderEliminar
    Respuestas
    1. https://www.dropbox.com/s/o2lnoawncznnm4l/Arduino_LED%20-%205-.rar

      Eliminar
    2. Hola 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:
      -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!

      Eliminar