Transmettre de VB.Net et reception Arduino par USB

Signaler
Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021
-
Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
-
Bonjour,

Voici mon problème, j'ai réaliser un petit logiciel en VB.Net qui a pour but de contrôler trois LED rgb en utilisent des trackBar dans VB et une plateforme Arduino.

Mon problème est que je parviens a contrôler une seule des trois LED. Je pence que je ne comprend pas bien la transmission en string de VB a et la réception string dans Arduino.

Je vous fournie le code VB et Arduino parce que je voudrais de l'aide pour comprendre comment envoyez plusieurs variable en string avec SerialPort1.Write et la réceptions de plusieurs string avec Arduino.

Merci a tous de votre aide.


Voici le code VB:

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

Public Class Form1
    Dim myPort As Array
    Dim PortNames()


    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        myPort = IO.Ports.SerialPort.GetPortNames() 'Obtiens tous les ports COM disponibles On récupère les ports COM

        For i = 0 To UBound(myPort)
            ComboBox1.Items.Add(myPort(i))
        Next

        ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
        ComboBox1.Text = ComboBox1.SelectedIndex = 0

        ComboBox1.Text = My.Settings.COM 'Ici on vérifie le COM Port qui a été sauvegardé et l'affiche automatiquement dans le ComboBox1

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        My.Settings.COM = ComboBox1.Text 'Ici une fois le Port COM sélection dans le ComboBox il est sauvegarder pour la réouverture du logiciel
        My.Settings.Save() 'Sauvegarder le Port COM sélection dans les Settings

        Try
            SerialPort1.PortName = ComboBox1.Text                     'Set le Serial Port au port COM sélectionné
            SerialPort1.Open()
            ComboBox1.Enabled = False
            Button1.Enabled = False
            Button2.Enabled = True
            BtnOn.Enabled = True
            BtnOff.Enabled = True
            TrackBar1.Enabled = True
            LblRed.Enabled = True
            SerialPort1.BaudRate = 9600
            SerialPort1.DataBits = 8
            SerialPort1.Parity = Parity.None
            SerialPort1.StopBits = StopBits.One
            SerialPort1.Handshake = Handshake.None
            SerialPort1.Encoding = System.Text.Encoding.Default
            Timer1.Start()
            SerialPort1.Write(TrackBar1.Value & Chr(10))


        Catch ex As Exception
            Console.WriteLine(ex.Message)
            MsgBox("COM Port Pas trouvé", MsgBoxStyle.Exclamation)       'Affiche le message COM non found
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        SerialPort1.Close()
        ComboBox1.Enabled = True
        Button1.Enabled = True
        Button2.Enabled = False

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Try
            Dim i As Single = SerialPort1.ReadExisting
            LblRed.Text = "Red Value : " & i.ToString
            LblRed.Text = "Gree Value : " & i.ToString
            LblRed.Text = "Blue Value : " & i.ToString
            SerialPort1.Write(TrackBar1.Value & Chr(10))

        Catch ex As Exception

        End Try
    End Sub

    Private Sub BtnOn_Click(sender As Object, e As EventArgs) Handles BtnOn.Click
        TrackBar1.Value = 255
    End Sub

    Private Sub BtnOff_Click(sender As Object, e As EventArgs) Handles BtnOff.Click
        TrackBar1.Value = 0
    End Sub

End Class


Et voici le code Arduino:

/*
  Serial Event example

 When new serial data arrives, this sketch adds it to a String.
 When a newline is received, the loop prints the string and
 clears it.

 A good test for this is to try it with a GPS receiver
 that sends out NMEA 0183 sentences.

 Created 9 May 2011
 by Tom Igoe

 This example code is in the public domain.

 [https://www.arduino.cc/en/Tutorial/BuiltInExamples/SerialEvent/]


*/

String inputString = "";         // a string to hold incoming data
boolean stringComplete = false;  // whether the string is complete
String inputString1 = "";         // a string to hold incoming data
boolean stringComplete1 = false;  // whether the string is complete
int ledPinA = 9;
int ledPinB = 10;
int ValA = 0;
int ValB = 0;
void setup(){
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop(){
  // print the string when a newline arrives:
  if (stringComplete) {
    ValA = inputString.toInt();
    analogWrite(ledPinA, ValA); 
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }



  
}


void serialEvent(){
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }
     while (Serial.available()) {
    // get the new byte:
    char inChar1 = (char)Serial.read();
    // add it to the inputString:
    inputString1 += inChar1;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar1 == '\n') {
      stringComplete1 = true;
    }
  }
}
}

13 réponses

Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516
Bonjour

Tout d’abord, pense à remercier Karamel d’avoir rendu ton code lisible.
Pour tes prochains posts merci de lire attentivement et d’appliquer ceci https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

A noter que je n’ai jamais codé en arduino, mais c’est suffisamment proche de que je connais pour pouvoir faire une analyse.

Il y a un problème dans la partie arduino ici (voir les commentaires que j’ai ajouté)

void serialEvent(){
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar == '\n') {
      stringComplete = true;
    }

//la première boucle while s’arrête quand Serial.available() est false, donc ça ne peut pas venir dans la seconde.
//de toute façon ce n’est pas comme ça qu’il faut faire

     while (Serial.available()) {
    // get the new byte:
    char inChar1 = (char)Serial.read();
    // add it to the inputString:
    inputString1 += inChar1;
    // if the incoming character is a newline, set a flag
    // so the main loop can do something about it:
    if (inChar1 == '\n') {
      stringComplete1 = true;
    }
  }


L’exemple que tu as trouvé considère que le message série ne fait qu’une ligne, le dernier caractère c’est le retour à la ligne
char(10)
ou
‘\n’
en arduino


Pour l’utiliser tel quel, il faut construire une string de telle sorte que toutes les informations soient contenues sur une seule ligne, par exemple
"123;213;79\n"
et côté arduino tu découpes cette string pour reconstituer tes 3 valeurs.
Y’a ce sujet qui en parle https://arduino.stackexchange.com/questions/1013/how-do-i-split-an-incoming-string

Cependant, ça ne me parait pas approprié. Tu veux envoyer 3 valeurs de 0 à 255, donc 3 bytes (au lieu de 11 pour l’exemple plus haut) que tu peux envoyer sous la forme d’un tableau et récupérer côté arduino aussi dans un tableau ou peut-être directement dans tes variables. Et la ni construction, ni découpe de string.

Ça devrait ressembler à ça VB
Dim rouge As Integer = 123
    Dim vert As Integer = 213
    Dim bleu As Integer = 79
    Dim tab As Byte() = {CByte(rouge), CByte(vert), CByte(bleu)}
    SerialPort1.Write(tab, 0, 3)


Et côté arduino
void serialEvent(){
  int index =0;
  int[] tab = new int[3]
  while (Serial.available() & index < 3) {
      tab[index] = (int)Serial.read();
      index++;
    }

Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Bonjour Whismeril,

Tout d'abord Merci a Karamel d’avoir rendu mon code lisible.

Whismeril, tu as raison je parfaire transmettre 3 bytes que de transmettre du string.

J'ai corriger mon code VB en suivent tes conseil ainsi que celui de Arduino, mais ma question est dans Arduino quand je veux extraire mes trois bytes comment je procède exactement?

Es-que je dois utiliser la variable "index"?

Je ne suis pas sur de bien saisir cette partie!

Merci de ton aide, j'apprécie ;-)

Chris
Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516
Non index sert à "charger" la bonne "case" dans le tableau.

Soit tu rends le tableau un peu plus global et tu utilises directement tab[0], tab[1] et tab[2], soit juste après la boucle, tu charges tes variables globale,
ValA = tab[0]; //etc

Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Je m'excuse mais la je suis un peut perdu :-(

Voici j'ai coriger mon code Arduino pour etre plus facile a lire et j'ai tenter d'ajouter apres ma boucle les variable globales
 Rouge = tab[0]; //etc 
et j'ai eu des erreurs...

Voici mon nouveau code Ardiuno, pourrais-tu me dire ou exactement tu placerais les variables globale?

int RougePin = 9;
int VertPin = 10;
int BleuPin = 11;
int Rouge = 0;
int Vert = 0;
int Bleu = 0;

void setup(){
// initialize serial:
Serial.begin(9600);


}

void loop(){



if (Serial.available() > 0) {



}
}


void serialEvent(){
int index =0;
int tab = new int[3];
while (Serial.available()& index < 3) {
index = (int)Serial.read();
index++;

}

}


Merci de ton aide!

Chris
Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516
Peux tu copier coller les messages d'erreurs et préciser les lignes concernées?

Déjà là,
Serial.available()& index < 3
il manque un espace avant le &
Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Voici le code Arduino qui génère l'erreur.

int RougePin = 9;
int VertPin = 10;
int BleuPin = 11;
int Rouge = 0;
int Vert = 0;
int Bleu = 0;
int index =0;
int tab = new int[3];

void setup(){
// initialize serial:
Serial.begin(9600);
pinMode(RougePin, OUTPUT);

}

void loop(){



if (Serial.available() > 0) {

Rouge = tab[0];
analogWrite(RougePin, Rouge);
Vert = tab[1];
analogWrite(VertPin, Vert);
Bleu = tab[2];
analogWrite(BleuPin, Bleu);
}

}


void serialEvent(){
int index =0;
int tab = new int[3];

while (Serial.available() & index < 3) {
index = (int)Serial.read();
index++;

}
}



Et voici l'erreur émis par le compilateur Arduino:

E:\Arduino Projets\Arduino VB.NET Projets\Arduino LED Dimmer\Arduino_LED_Dimmer\Arduino_LED_Dimmer.ino: In function 'void loop()':

Arduino_LED_Dimmer:25: error: invalid types 'int[int]' for array subscript

Rouge = tab[0];

^

Arduino_LED_Dimmer:27: error: invalid types 'int[int]' for array subscript

Vert = tab[1];

^

Arduino_LED_Dimmer:29: error: invalid types 'int[int]' for array subscript

Bleu = tab[2];

^

exit status 1
invalid types 'int[int]' for array subscript


Merci
Messages postés
2377
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 février 2021
124
Bonjour

1) Vous avez oublié de mettre les broches Verte et Bleue en sortie ( pins 10 et 11 )
2) Dans void SerialEvent() c'est tab[index] qui est lu pour allumer selon une certaine intensité sur les broches analogiques les LEDs . L'intensité va de 0 à 255 en octet soit de 0V à 5V ( 127 octet correspondant à 2,5 V ) .
3) Regarde la disposition des accolades { et } . L'accolade de début d'un bloc de programme void est placé à la ligne suivante . ainsi on a une vision de l'ensemble du bloc entre les 2 accolades ouvrante et fermante .
4) Je ne suis pas un expert en C . A tester le code qui suit .

int RougePin = 9;
int VertPin = 10;
int BleuPin = 11;
int Rouge = 0;
int Vert = 0;
int Bleu = 0;
int index =0;
int tab = new int[3];

void setup()
{
    // initialize serial:
    Serial.begin(9600);
   // 3 pins OUTPOUT
    pinMode(RougePin, OUTPUT);
    pinMode(VertPin, OUTPUT);
    pinMode(BleuPin, OUTPUT);
}

void loop()
{
    if (Serial.available() > 0)
    {   
         Rouge = tab[0];
         analogWrite(RougePin, Rouge);
         Vert = tab[1];
         analogWrite(VertPin, Vert);
         Bleu = tab[2];
         analogWrite(BleuPin, Bleu);
    }
}

void serialEvent()
{
     int index =0;
     int tab = new int[3];
     while (Serial.available() & index < 3)
     {
          // intensité LED de 0 à 255          
          tab[index] = (int)Serial.read();
          index++;
     }  
}


Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516
Bonjour à tous les 2

Le message d’erreur vient de la déclaration de tab, qui est déclaré comme un entier
int tab = new int[3];
et devrait l’être comme un tableau
int[] tab = new int[3];


D’autre part, il semble qu’il faille doubler l’esperluette ici
while (Serial.available() && index < 3)
sinon ça fait un et bit à bit et non un et logique

Un booléen doit être passé à true dans la méthode SerialEvent (tout à la fin). Il sert de drapeau à la méthode loop pour déclencher le changement de couleur de tes led. Comme dans ton premier code.
Vérifier qu’il y a des octets disponibles sur le port série n.est pas bon car ça rentre en conflit avec le code de serialevent


@VB, l’accolade ouvrante sur la même ligne que la déclaration de la méthode est la norme en java.
Il y a d’autres indices qui laissent penser que ce langage est orienté objet ou objet. Ce n’est donc pas du c
Messages postés
2377
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 février 2021
124
bonjour Whis

Merci pour ces informations . Le Java a un "faux air" de C ou C++ en tout cas .
voici mon code java corrigé donc
int RougePin = 9;
int VertPin = 10;
int BleuPin = 11;
int Rouge = 0;
int Vert = 0;
int Bleu = 0;
int index =0;
int[] tab = new int[3];

void setup(){
    // initialize serial:
    Serial.begin(9600);
   // 3 pins OUTPOUT
    pinMode(RougePin, OUTPUT);
    pinMode(VertPin, OUTPUT);
    pinMode(BleuPin, OUTPUT);
}

void loop(){
    if (Serial.available() > 0)
    {   
         Rouge = tab[0];
         analogWrite(RougePin, Rouge);
         Vert = tab[1];
         analogWrite(VertPin, Vert);
         Bleu = tab[2];
         analogWrite(BleuPin, Bleu);
    }
}

void serialEvent(){
     int index =0;
     int[] tab = new int[3];
     while (Serial.available() && index < 3)
     {
          // intensité LED de 0 à 255          
          tab[index] = (int)Serial.read();
          index++;
     }  
}


J'ai rien compris pour le boolean avec serialEvent .
Dis-moi si le code est correct.
Merci !

Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516
Attention, j'ai pas dit que c'est du Java, ça y ressemble seulement. Plus qu'à du C, mais pas forcément plus que du C++ (à part la mise en forme des accolades).
Java descends de C++, tout comme C#, mais c'est 2 "branches parallèles".
Le fait que Serial dispose de méthodes en fait clairement un objet, donc à minima ce langage est orienté objet, et vu la structure la filiation avec C++ est établie.

Maintenant, entre un C++ adaptaté ou un Java adapté, mes quelques recherches ne m'ont pas permis de cerner ce point avec certitude, mais peu importe.


Pour le drapeau, un truc comme ça
int RougePin = 9;
int VertPin = 10;
int BleuPin = 11;
int Rouge = 0;
int Vert = 0;
int Bleu = 0;
int index =0;
int[] tab = new int[3];
bool nouveauMessage = false; //initialisation du drapeau

void setup(){
    // initialize serial:
    Serial.begin(9600);
   // 3 pins OUTPOUT
    pinMode(RougePin, OUTPUT);
    pinMode(VertPin, OUTPUT);
    pinMode(BleuPin, OUTPUT);
}

void loop(){
    if (nouveauMessage)//si le drapeau signifie l'arrivée d'une nouvelle instruction
    {   
         nouveauMessage = false; //on le réinitialise aussitôt
         Rouge = tab[0];
         analogWrite(RougePin, Rouge);
         Vert = tab[1];
         analogWrite(VertPin, Vert);
         Bleu = tab[2];
         analogWrite(BleuPin, Bleu);
    }
}

void serialEvent(){
     int index =0;
     int[] tab = new int[3];
     while (Serial.available() && index < 3)
     {
          // intensité LED de 0 à 255          
          tab[index] = (int)Serial.read();
          index++;
     }  
     nouveauMessage = true; //activation du drapeau
}

Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Bonjour Whis,

J'ai compiler votre dernier code et voici les erreurs !?

Arduino_LED_Dimmer:8: error: expected unqualified-id before '[' token

int[] tab = new int[3];

^

E:\Arduino Projets\Arduino VB.NET Projets\Arduino LED Dimmer\Arduino_LED_Dimmer\Arduino_LED_Dimmer.ino: In function 'void loop()':

Arduino_LED_Dimmer:24: error: 'tab' was not declared in this scope

Rouge = tab[0];

^

E:\Arduino Projets\Arduino VB.NET Projets\Arduino LED Dimmer\Arduino_LED_Dimmer\Arduino_LED_Dimmer.ino: In function 'void serialEvent()':

Arduino_LED_Dimmer:35: error: expected unqualified-id before '[' token

int[] tab = new int[3];

^

Arduino_LED_Dimmer:39: error: 'tab' was not declared in this scope

tab[index] = (int)Serial.read();

^

exit status 1
expected unqualified-id before '[' token
Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Re bonjour Whis,

Voici j'ai modifier le code en remplacent
int[] tab = new int[3];
par
byte tab = new byte[3];


et
 tab[index] = (int)Serial.read();
par
index = (byte)Serial.read();


Le compileur me génère seulement ces erreurs maintenant!

E:\Arduino Projets\Arduino VB.NET Projets\Arduino LED Dimmer\Arduino_LED_Dimmer\Arduino_LED_Dimmer.ino: In function 'void loop()':

Arduino_LED_Dimmer:24: error: invalid types 'byte {aka unsigned char}[int]' for array subscript

Rouge = tab[0];

^

Arduino_LED_Dimmer:26: error: invalid types 'byte {aka unsigned char}[int]' for array subscript

Vert = tab[1];

^

Arduino_LED_Dimmer:28: error: invalid types 'byte {aka unsigned char}[int]' for array subscript

Bleu = tab[2];

^

exit status 1
invalid types 'byte {aka unsigned char}[int]' for array subscript

Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516 >
Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Oui, rouge, bleu et vert sont des int, pas des bytes.
Apparemment, il faut faire comme ça
https://forum.arduino.cc/index.php?topic=44055.0

Ps, peux tu relire le petit tuto sur les balises de code s’il te plait, et appliquer la coloration pour du c.
Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021
>
Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021

Oui desole pour les balises de code

Je pence avoir trouver un problème au niveau de mon code VB, on dirait que mon Timer1_Tick ne démarre pas donc il n’envoie pas les bytes a chaque déplacement des mes TrackBar??

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

Public Class Form1
    Dim myPort As Array
    Dim PortNames()
    'Dim connected As Boolean = False
    'Dim rouge As Integer = 115
    'Dim vert As Integer = 50
    'Dim bleu As Integer = 200
    Dim rouge As Byte
    Dim vert As Byte
    Dim bleu As Byte
    'Dim tab As Byte() = {CByte(rouge), CByte(vert), CByte(bleu)}

    'Version en developement VB.Net et Arduino
    'Date 08-02-2021
    'Firmware v0.0.1

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        myPort = IO.Ports.SerialPort.GetPortNames() 'Obtiens tous les ports COM disponibles On récupère les ports COM

        For i = 0 To UBound(myPort)
            ComboBox1.Items.Add(myPort(i))
        Next

        ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
        ComboBox1.Text = ComboBox1.SelectedIndex = 0

        ComboBox1.Text = My.Settings.COM 'Ici on vérifie le COM Port qui a été sauvegardé et l'affiche automatiquement dans le ComboBox1

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        My.Settings.COM = ComboBox1.Text 'Ici une fois le Port COM sélection dans le ComboBox il est sauvegarder pour la réouverture du logiciel
        My.Settings.Save() 'Sauvegarder le Port COM sélection dans les Settings

        Try
            SerialPort1.PortName = ComboBox1.Text                     'Set le Serial Port au port COM sélectionné
            SerialPort1.Open()
            ComboBox1.Enabled = False
            Button1.Enabled = False
            Button2.Enabled = True
            BtnOn.Enabled = True
            BtnOff.Enabled = True
            red_TrackBar.Enabled = True
            LblRed.Enabled = True
            SerialPort1.BaudRate = 9600
            SerialPort1.DataBits = 8
            SerialPort1.Parity = Parity.None
            SerialPort1.StopBits = StopBits.One
            SerialPort1.Handshake = Handshake.None
            SerialPort1.Encoding = System.Text.Encoding.Default
            SerialPort1.ReadTimeout = 10000
            Timer1.Start()

            'SerialPort1.Write(TrackBar1.Value & Chr(10))
            'SerialPort1.WriteLine(red_TrackBar.Value.ToString)
            'red_TrackBar.Value = rouge
            'green_TrackBar.Value = vert
            'blue_TrackBar.Value = bleu

            Dim data(4) As Byte           'Transmet trois bytes
            data(0) = rouge                 'Data pour entrer dans le mode USB Comand
            data(1) = vert                  'Data pour entrer dans le mode 1 pour Short Packet ou 2 pour Message Data, ici 1
            data(2) = bleu                   'Data reserver

            SerialPort1.Write(data, 0, 3) 'écrire les données sur le port série


        Catch ex As Exception
            Console.WriteLine(ex.Message)
            MsgBox("COM Port Pas trouvé", MsgBoxStyle.Exclamation)       'Affiche le message COM non found
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        SerialPort1.Close()
        ComboBox1.Enabled = True
        Button1.Enabled = True
        Button2.Enabled = False

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Try
            Dim i As Single = SerialPort1.ReadExisting
            LblRed.Text = "Red Value : " & i.ToString
            LblRed.Text = "Gree Value : " & i.ToString
            LblRed.Text = "Blue Value : " & i.ToString
            'SerialPort1.Write(TrackBar1.Value & Chr(10))
            'SerialPort1.WriteLine(red_TrackBar.Value.ToString)

            rouge = red_TrackBar.Value
            vert = green_TrackBar.Value
            bleu = blue_TrackBar.Value

            Dim data(4) As Byte           'Transmet trois bytes
            data(0) = rouge                'Data pour entrer dans le mode USB Comand
            data(1) = vert                 'Data pour entrer dans le mode 1 pour Short Packet ou 2 pour Message Data, ici 1
            data(2) = bleu                'Data reserver

            SerialPort1.Write(data, 0, 3) 'écrire les données sur le port série

        Catch ex As Exception

        End Try
    End Sub

    Private Sub BtnOn_Click(sender As Object, e As EventArgs) Handles BtnOn.Click
        red_TrackBar.Value = 255

    End Sub

    Private Sub BtnOff_Click(sender As Object, e As EventArgs) Handles BtnOff.Click
        red_TrackBar.Value = 0
    End Sub


End Class
Messages postés
2377
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 février 2021
124 >
Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Bonjour
J'ai repris votre code et y ai fait quelques améliorations
Par contre il n'a pas été testé : je n'ai pas de port série sur mon PC ( que de l'USB )

voici l'image de mon projet


Et voici le code
'Version en developement VB.Net et Arduino
'Date 08-02-2021
'Firmware v0.0.1
Imports System.IO.Ports

Public Class Form1

    ' Private pour toute la Form
    Private myPort() As String
    Private rouge, vert, bleu As Byte ' on regroupe les types
    Private tab As Byte() = New Byte(3) {} ' reserve un tableau de 3 bytes non initialisés avec une valeur définie

    ''' <summary>
    ''' chargement de la Form
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        myPort = SerialPort.GetPortNames() 'Obtient tous les ports COM disponibles sous forme d'un tableau de String
        With Combobox1 ' évite de répéter dans le code      
            For i = 0 To UBound(myPort)
                .Items.Add(myPort(i))
            Next
            .DropDownStyle = ComboBoxStyle.DropDownList
            .Text = .SelectedIndex = 0
            .Text = My.Settings.COM 'Ici on vérifie le COM Port qui a été sauvegardé et l'affiche automatiquement dans le ComboBox1
        End With

    End Sub

    ''' <summary>
    ''' Ouverture SeialPort
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        My.Settings.COM = ComboBox1.Text 'Ici une fois le Port COM sélectionné dans le ComboBox il est sauvegardé pour la réouverture du logiciel
        My.Settings.Save() 'Sauvegarder le Port COM sélectionné dans les Settings
        Try
            With SerialPort1
                .PortName = ComboBox1.Text 'Set le Serial Port au port COM sélectionné
                .Open()
            End With
            ComboBox1.Enabled = False
            Button1.Enabled = False
            Button2.Enabled = True
            BtnOn.Enabled = True
            BtnOff.Enabled = True
            red_TrackBar.Enabled = True
            green_TrackBar.Enabled = True
            blue_TrackBar.Enabled = True
            LblRed.Enabled = True
            LblGreen.Enabled = True
            LblBlue.Enabled = True
            With SerialPort1
                .BaudRate = 9600
                .DataBits = 8
                .Parity = Parity.None
                .StopBits = StopBits.One
                .Handshake = Handshake.None
                .Encoding = System.Text.Encoding.Default
                .ReadTimeout = 10000
            End With
            Timer1.Start()
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            MsgBox("COM Port Pas trouvé", MsgBoxStyle.Exclamation) 'Affiche le message COM non trouvé
        End Try

    End Sub

    ''' <summary>
    ''' Fermeture SerialPort 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        SerialPort1.Close()
        ComboBox1.Enabled = True
        Button1.Enabled = True
        Button2.Enabled = False

    End Sub

    ''' <summary>
    ''' timer
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick

        Try
            rouge = Convert.ToByte(red_TrackBar.Value)
            vert = Convert.ToByte(green_TrackBar.Value)
            bleu = Convert.ToByte(blue_TrackBar.Value)
            tab = New Byte(){rouge, vert, bleu}
            SerialPort1.Write(tab, 0, 3) ' écrire les 3 octets sur le port série
        Catch ex As Exception

        End Try
    End Sub

    ''' <summary>
    ''' Valeur max pour les TrackBars
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub BtnOn_Click(sender As Object, e As EventArgs) Handles BtnOn.Click

        SetTrackBarValue(255)

    End Sub

    ''' <summary>
    ''' Valeur min pour les TrackBars
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub BtnOff_Click(sender As Object, e As EventArgs) Handles BtnOff.Click

        SetTrackBarValue(0)

    End Sub

    ''' <summary>
    ''' Valeurs Max ou Min des TrackBars et affichage dans les Labels
    ''' </summary>
    ''' <param name="Valeur"></param>
    Private Sub SetTrackBarValue(Valeur As Integer)

        red_TrackBar.Value = Valeur
        green_TrackBar.Value = Valeur
        blue_TrackBar.Value = Valeur
        AfficheLabels()

    End Sub

    ''' <summary>
    ''' Affichage valeurs dans Labels
    ''' </summary>
    Private Sub AfficheLabels()

        LblBlue.Text = "Bleu : " & bleu.ToString
        LblGreen.Text = "Vert : " & vert.ToString
        LblRed.Text = "Rouge : " & rouge.ToString

    End Sub

    ''' <summary>
    ''' Action sur TrackBars et affichage Labels
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Red_TrackBar_ValueChanged(sender As Object, e As EventArgs) Handles red_TrackBar.ValueChanged, blue_TrackBar.ValueChanged, red_TrackBar.ValueChanged

        Dim ControlTrackBar As TrackBar = sender ' récupère le TrackBar sur lequel on vient d'agir
        Select Case ControlTrackBar.Name
            Case "red_TrackBar" ' TrackBar rouge
                rouge = Convert.ToByte(ControlTrackBar.Value)
            Case "green_TrackBar"  ' TrackBar vert
                vert = Convert.ToByte(ControlTrackBar.Value)
            Case "blue_TrackBar"  ' TrackBar bleu
                bleu = Convert.ToByte(ControlTrackBar.Value)
        End Select
        AfficheLabels()

    End Sub

End Class
Messages postés
2377
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 février 2021
124
Salut Whis
Ok là j'ai pigé pour le drapeau ( flag en anglais ) !
J'ai regardé sur le Net : Arduino a un langage basé sur le C / C++ de base .
J'espère que tout va bien pour ta famille .
Merci

Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516
Oui tout va bien et toi?
Messages postés
2377
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 février 2021
124
Tout baigne aussi pour nous Whis !
Merci et a+
Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516
Bonjour

Je ne voies pas l’intérêt d’un timer.

L’objet SerialPort dispose d’un événement qui te signifie l’arrivée de nouvelles données, donc pas besoin d’interroger le port de façon régulière.

De même, les slider disposent d’un événement qui signale quand l’utilisateur change le réglage, on peut donc envoyer le nouvel ordre au moment opportun.
Messages postés
2377
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 février 2021
124
Exact Whis !
comme quoi dans 2 cerveaux il y en a plus que dans un seul !
voici le code corrigé
'Version en developement VB.Net et Arduino
'Date 08-02-2021
'Firmware v0.0.1
Imports System.IO.Ports

Public Class Form1

    ' Private pour toute la Form
    Private myPort() As String
    Private rouge, vert, bleu As Byte ' on regroupe les types
    Private tab As Byte() = New Byte(3) {} ' reserve un tableau de 3 bytes non initialisés avec une valeur définie

    ''' <summary>
    ''' chargement de la Form
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        myPort = SerialPort.GetPortNames() 'Obtient tous les ports COM disponibles sous forme d'un tableau de String
        With Combobox1 ' évite de répéter dans le code      
            For i = 0 To UBound(myPort)
                .Items.Add(myPort(i))
            Next
            .DropDownStyle = ComboBoxStyle.DropDownList
            .Text = .SelectedIndex = 0
            .Text = My.Settings.COM 'Ici on vérifie le COM Port qui a été sauvegardé et l'affiche automatiquement dans le ComboBox1
        End With

    End Sub

    ''' <summary>
    ''' Ouverture SeialPort
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        My.Settings.COM = ComboBox1.Text 'Ici une fois le Port COM sélectionné dans le ComboBox il est sauvegardé pour la réouverture du logiciel
        My.Settings.Save() 'Sauvegarder le Port COM sélectionné dans les Settings
        Try
            With SerialPort1
                .PortName = ComboBox1.Text 'Set le Serial Port au port COM sélectionné
                .Open()
            End With
            ComboBox1.Enabled = False
            Button1.Enabled = False
            Button2.Enabled = True
            BtnOn.Enabled = True
            BtnOff.Enabled = True
            red_TrackBar.Enabled = True
            green_TrackBar.Enabled = True
            blue_TrackBar.Enabled = True
            LblRed.Enabled = True
            LblGreen.Enabled = True
            LblBlue.Enabled = True
            With SerialPort1
                .BaudRate = 9600
                .DataBits = 8
                .Parity = Parity.None
                .StopBits = StopBits.One
                .Handshake = Handshake.None
                .Encoding = System.Text.Encoding.Default
                .ReadTimeout = 10000
            End With
        Catch ex As Exception
            Console.WriteLine(ex.Message)
            MsgBox("COM Port Pas trouvé", MsgBoxStyle.Exclamation) 'Affiche le message COM non trouvé
        End Try

    End Sub

    ''' <summary>
    ''' Fermeture SerialPort 
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

        SerialPort1.Close()
        ComboBox1.Enabled = True
        Button1.Enabled = True
        Button2.Enabled = False

    End Sub

    ''' <summary>
    ''' Valeur max pour les TrackBars
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub BtnOn_Click(sender As Object, e As EventArgs) Handles BtnOn.Click

        SetTrackBarValue(255)

    End Sub

    ''' <summary>
    ''' Valeur min pour les TrackBars
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub BtnOff_Click(sender As Object, e As EventArgs) Handles BtnOff.Click

        SetTrackBarValue(0)

    End Sub

    ''' <summary>
    ''' Valeurs Max ou Min des TrackBars et affichage dans les Labels
    ''' </summary>
    ''' <param name="Valeur"></param>
    Private Sub SetTrackBarValue(Valeur As Integer)

        red_TrackBar.Value = Valeur
        green_TrackBar.Value = Valeur
        blue_TrackBar.Value = Valeur
        AfficheLabels()

    End Sub

    ''' <summary>
    ''' Affichage valeurs dans Labels et envoi vers SerialPort
    ''' </summary>
    Private Sub AfficheLabels()

        LblBlue.Text = "Bleu : " & bleu.ToString
        LblGreen.Text = "Vert : " & vert.ToString
        LblRed.Text = "Rouge : " & rouge.ToString
        SerialWrite()

    End Sub

    ''' <summary>
    ''' Envoi des 3 couleurs sur le SerialPort
    ''' </summary>
    Private Sub SerialWrite()

        Try
            rouge = Convert.ToByte(red_TrackBar.Value)
            vert = Convert.ToByte(green_TrackBar.Value)
            bleu = Convert.ToByte(blue_TrackBar.Value)
            tab = New Byte(){rouge, vert, bleu}
            SerialPort1.Write(tab, 0, 3) ' écrire les 3 octets sur le port série
        Catch ex As Exception
            MessageBox.Show("Exception : " & ex.Message)
        End Try

    End Sub

    ''' <summary>
    ''' Action sur TrackBars et affichage Labels
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    Private Sub Red_TrackBar_ValueChanged(sender As Object, e As EventArgs) Handles red_TrackBar.ValueChanged, blue_TrackBar.ValueChanged, red_TrackBar.ValueChanged

        Dim ControlTrackBar As TrackBar = sender ' récupère le TrackBar sur lequel on vient d'agir
        Select Case ControlTrackBar.Name
            Case "red_TrackBar" ' TrackBar rouge
                rouge = Convert.ToByte(ControlTrackBar.Value)
            Case "green_TrackBar"  ' TrackBar vert
                vert = Convert.ToByte(ControlTrackBar.Value)
            Case "blue_TrackBar"  ' TrackBar bleu
                bleu = Convert.ToByte(ControlTrackBar.Value)
        End Select
        AfficheLabels()

    End Sub

End Class

Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Bonjour vb95,

J'ai tester votre code VB est il fonctionne a merveille sans timer. Moi j'utilisais un timer parce que les exemple trouver sur le web utilisaient tous des timer.

Mon seule souci est au niveau de Arduino, j'ai trouver ce code qui me permet de lire la simultanément réception des bytes envoyez par VB. Le seule problème c'est que je ne sais pas comment stocker les valeurs dans des variable?

#include <SoftwareSerial.h>

SoftwareSerial gtSerial(8, 7); // Arduino RX, Arduino TX
int RougePin = 9;
int VertPin = 10;

byte rxbyte = 0;
void setup(){
  Serial.begin(9600);    // serial / USB port / software serial port
  pinMode(RougePin, OUTPUT);
}

//byte rxbyte = 0;        // stores received byte


void loop(){
  // check if byte available from USB port
  if (Serial.available() > 0) {
     rxbyte = Serial.read();
        
     Serial.print(" Data:");
     Serial.println(rxbyte);
    
     
  }
 }



Merci pour votre aide!
Messages postés
2377
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 février 2021
124 >
Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Bonjour
Côté Arduino je n'y connais pas grand chose . Et C++ n'est pas ma tasse de thé bien que je connaisse assez bien le C # .
Maintenant pourquoi n'utilisez-vous pas le code C++ que Whismeril vous as mis au message n° 10 ?
Il faut aussi prendre en compte que le programme VB Net envoie les 3 valeurs rouge, vert et bleu à chaque envoi . Le code C++ que vous montrez est-il complet ? Il manque SoftwareSerial.h à mon avis.
Si tu regardais le code de Whismeril et que tu le comprenais tu saurais où stocker les valeurs ( attention de bien prendre en compte que le programme VB envoie les valeurs rouge , verte et bleue dans cet ordre ) . Ce qui conditionne la traitement de ces valeurs dans le même ordre côté Arduino.
Et ce n'est pas les tutos Arduino qui manquent sur Internet pour solutionner ton problème . Et ce n'est pas en pompant du code que tu progresseras .
Messages postés
2377
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
28 février 2021
124
Ah j'ai oublié : pour le timer c'est Whismeril qu'il faut remercier !
Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516
Plus ou moins ça
void loop()
{
     int index =0;
     char[] tab = new char[3];
     while (Serial.available() && index < 3)
     {
          // intensité LED de 0 à 255          
          tab[index] = Serial.read();
          index++;
     }
  
     Rouge = (int)(tab[0]- '0');
     Vert = (int)(tab[1]- '0');
     Bleu = (int)(tab[2]- '0');

}



Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Bonjour Whis,

Je suis en train de tester votre code Arduino #24 et j'ai des problème dans la compilation est je ne comprend pas trop pourquoi!?!?

Voici les erreur:


E:\Arduino Projets\Arduino VB.NET Projets\Serial Port\Exemple 3\Exemple_3\Exemple_3.ino: In function 'void loop()':

Exemple_3:21: error: expected unqualified-id before '[' token

      char[] tab = new char[3];

          ^

Exemple_3:25: error: 'tab' was not declared in this scope

           tab[index] = Serial.read();

           ^

Exemple_3:29: error: 'Rouge' was not declared in this scope

      Rouge = (int)(tab[0]- '0');

      ^

Exemple_3:29: error: 'tab' was not declared in this scope

      Rouge = (int)(tab[0]- '0');

                    ^

Exemple_3:30: error: 'Vert' was not declared in this scope

      Vert = (int)(tab[1]- '0');

      ^

Exemple_3:31: error: 'Bleu' was not declared in this scope

      Bleu = (int)(tab[2]- '0');

      ^

E:\Arduino Projets\Arduino VB.NET Projets\Serial Port\Exemple 3\Exemple_3\Exemple_3.ino: At global scope:

Exemple_3:35: error: expected declaration before '}' token

  }
Messages postés
15649
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
4 mars 2021
516 >
Messages postés
14
Date d'inscription
vendredi 24 juillet 2015
Statut
Membre
Dernière intervention
10 février 2021

Au temps pour moi, tab doit être un tableau de byte, comme tu l'avais toi même dit plus haut
byte tab = new byte[3];

//et plus loin
tab[index] = (byte)Serial.read();


Quand à Rouge, Vert et Bleu, ils étaient précédement déclarés en tête de fichier, je suis parti du principe que ça n'avait pas changé