Arduino + Led RGB + Visual Basic 2010

Ciao a tutti, è da circa 2-3 giorni che sto impazzendo per realizzare un semplice programma in Visual Basic 2010 per controllare un led RGB: non riesco ad inviare i valori da 1 a 255 dei 3 colori, in sequenza (Rosso, Verde e Blu)… Vi posto il codice di Vb.net e Arduino
Vb.net

Imports System.IO
Imports System.IO.Ports
Imports System.Threading

Public Class RGB
    Private Sub RGB_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim PortName As String
        Dim a() = System.IO.Ports.SerialPort.GetPortNames() 'Dichiara un array che si occupa della porte disponibili 
        SerialPort1.Close()
        For Each PortName In a 'Elenca le porte seriali disponibili
            ComboBox1.Items.Add(PortName)
        Next
        TextBox_R.Text = 0
        TextBox_G.Text = 0
        TextBox_B.Text = 0
        TextBox_RGB.Text = Format(0, "000000000")
    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
        Panel1.BackColor = System.Drawing.Color.FromArgb(TextBox_R.Text, TextBox_G.Text, TextBox_B.Text)
    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
        Panel1.BackColor = System.Drawing.Color.FromArgb(TextBox_R.Text, TextBox_G.Text, TextBox_B.Text)
    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
        Panel1.BackColor = System.Drawing.Color.FromArgb(TextBox_R.Text, TextBox_G.Text, TextBox_B.Text)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles EnviarDatos.Click
        TextBox_RGB.Text = Format(0 + TextBox_R.Text * 1000000 + TextBox_G.Text * 1000 + TextBox_B.Text, "000000000")
        InitPortComunication()
        SerialPort1.Write(TextBox_RGB.Text)
        SerialPort1.Close()
    End Sub

    Private Sub Panel1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Panel1.Paint

    End Sub

    Private ClD As New ColorDialog
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        If ClD.ShowDialog = Windows.Forms.DialogResult.OK Then
            Panel1.BackColor = ClD.Color
            Dim tmpBrush As New SolidBrush(Panel1.BackColor)
            With tmpBrush.Color
                TextBox_B.Text = .B
                TextBox_G.Text = .G
                TextBox_R.Text = .R
                TrackBar_R.Value = TextBox_R.Text
                TrackBar_G.Value = TextBox_G.Text
                TrackBar_B.Value = TextBox_B.Text
            End With
        End If
    End Sub
    Private Sub Delet_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Delet.Click
        Panel1.BackColor = Color.Black
        TextBox_B.Text = 0
        TextBox_G.Text = 0
        TextBox_R.Text = 0
        TrackBar_R.Value = 0
        TrackBar_G.Value = 0
        TrackBar_B.Value = 0
        SerialPort1.Write(Format(0, "000000000"))
    End Sub

    Private Sub InitPortComunication()
        With SerialPort1
            .BaudRate = 9600
            .DataBits = 8
            .PortName = ComboBox1.Text
            .Parity = IO.Ports.Parity.None
            .StopBits = IO.Ports.StopBits.One
            .Handshake = IO.Ports.Handshake.None
            .Encoding = System.Text.Encoding.Default
        End With
        Try
            SerialPort1.Open()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        SerialPort1.DiscardInBuffer()
    End Sub
End Class

Arduino

int ledR= 11; 
int ledG= 10; 
int ledB= 9; 

void setup()
{
   pinMode(ledR, OUTPUT); 
   pinMode(ledG, OUTPUT); 
   pinMode(ledB, OUTPUT);
   Serial.begin(9600); 
}

void loop()
{
  int val, r, g, b;
  
  if (Serial.available()>0)
  { 
      val=Serial.read();
      
    int num0 = (val / 100000000 % 10);
    int num1 = (val / 10000000 % 10);
    int num2 = (val / 1000000 % 10);
    r= num0*100 + num1*10 + num2;
    
    int num3 = (val / 100000 % 10);
    int num4 = (val / 10000 % 10);
    int num5 = (val / 1000 % 10);
    g= num3*100 + num4*10 + num5;
    
    int num6 = (val / 100 % 10);
    int num7 = (val / 10 % 10);
    int num8 = (val % 10);   
    b= num6*100 + num7*10 + num8;
    
    color(r, g, b);
    //svuotaBuffer();
   // Serial.flush();
  }
}   

 void color(int red, int green, int blue)
{
    analogWrite(ledR, red);
 
    analogWrite(ledG, green);
 
    analogWrite(ledB, blue);
}

void svuotaBuffer() {
  while (Serial.available()) {
    byte temp = Serial.read();
  }
}

In pratica quando clicco il tasto “Button1”, lui mi scrive nella TextBoxRGB un numero, come 255000140: 255 indica il valore del rosso, 000 quello del verde e 140 quello del blu. Oltre a scrivere questo numero nella TextBoxRGB, lo scrive anche nella porta seriale COM3 (la porta dove il mio Arduino è collegato). Il problema credo che sia proprio nel ricevere i dati con Arduino, e dividere il numero di 9 cifre (2-5-5-0-0-0-1-4-0) ed assegnare le cifre rispettivamente a num0, num1, num2…num8. Vi prego aiutatemi, sto seriamente impazzendo! Se vi servono screen del Form di Vb.net chiedete pure, idem se vi serve il download del progetto! Grazie in anticipo, Andrea

EDIT BY MOD: editato titolo

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento: Regolamento

non devi spedire delle "stringhe" ma dei byte. 255000140 diventano 3 byte se spediti appunto come byte.

In questo modo quando spedisci il byte con valore 255, lato Arduino non devi fare nessuna conversione, hai già quel valore pronto all'uso.

In alternativa, se vuoi spedire come stringa, devi fare un piccolo parsing dei dati lato Arduino per ricostruire il valore numerico partendo dalle singole cifre.

Ti lascio il link ad un articolo dove spiego la comunicazione seriale da PC ad Arduino.

nid69ita: Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni e a leggere il regolamento: Regolamento - qui una serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections - qui le pinout delle varie schede by xxxPighi: Pinout - qui una serie di link [u]generali[/u] utili: Link Utili Ok mi sono presentato, grazie. Il libro ABC - Arduino Basic Connections l'ho comprato insieme ad Arduino, e gli ho dato una bella letta ;) Ti ringrazio per il link "Link Utili"

leo72: non devi spedire delle "stringhe" ma dei byte. 255000140 diventano 3 byte se spediti appunto come byte.

In questo modo quando spedisci il byte con valore 255, lato Arduino non devi fare nessuna conversione, hai già quel valore pronto all'uso.

In alternativa, se vuoi spedire come stringa, devi fare un piccolo parsing dei dati lato Arduino per ricostruire il valore numerico partendo dalle singole cifre.

Ti lascio il link ad un articolo dove spiego la comunicazione seriale da PC ad Arduino.

Mi sono letto tutto il tuo articolo, ma non capisco una cosa: da Visual Basic devo dichiarare una variabile di tipo byte "Dim rosso As Byte" e al suo interno metterci il valore di "TextBox_R"? Cioè la variabile rosso assumerà il valore 255 e dopo mandare ad Arduino rosso, cioè "Serial.Write(rosso)"?

Nessuno mi sa aiutare? :(

Prova a fare così e vedi cosa succede! Eventualmente inizia con un solo colore.

Evita di fare open e close della porta seriale. Metti l'open della com all'apertura del form ed il close alla chiusura del form.

Metti che i valori RGB sono in tre variabili byte R, G e B

Usi

SerialPort1.Write(Chr(R))
SerialPort1.Write(Chr(G))
SerialPort1.Write(Chr(B))

Il metodo Write supporta solo stringhe ecco perché devi usare la funzione CHR che non fa altro che stampare il carattere corrispondente al valore. Nel vecchio VB6 era invece possibile passare dati binari, se non ricordo male.

Lato arduino hai le stesse variabili R, G e B sempre definite come byte che leggi con serial.read

Questo più o meno.