IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Vb et Arduino


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 9
    Par défaut Vb et Arduino
    Bonjour
    J'ai fait l'acquisition d'une carte Arduino R3 et d'une carte driver de servomoteurs (à base du PCA 9685, bibliothèque Adafruit) relié sur l'Arduino via le bus I²C.
    J'ai fait, pour Arduino un programme qui "attends" de recevoir un byte et bouge le servo demandé de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void loop() {
    data=Serial.read();
     if(data=='a')
    {
    pwm.setPWM(0, 0, 150);
     }
    if(data=='b')
    {
    pwm.setPWM(0, 0, 600);
     }
     if(data=='c')
    Etc...
    Mon problème est que chaque byte reçu correspond à un servo et une seule position.
    J'aimerais avoir un programme du genre : data=Serial.read(); pwm.setPWM(a,b,c); ce qui me permettrai d'avoir un programme dans Arduino "ultra light" et envoyer ces 3 paramètres via VB6 en une seule fois
    Je suis pas trop mauvais en VB mais nul en C#
    S'il vous plait, un peu d'aide pendant qu'il me reste encore des cheveux!!!
    Merci d'avance
    Cedric

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    J'aimerai avoir un programme du genre : data=Serial.read(); pwm.setPWM(a,b,c); ce qui me permettrai d'avoir un programme dans Arduino "ultra light" et envoyer ces 3 paramètres via VB6 en une seule fois
    j'avoue ne pas bien comprendre ce qui viennent faire VB6 et C# : l'IDE Arduino te permet de programmer la tâche en C++. Et rien ne t'empêche de lire 3 caractères à la suite.

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 9
    Par défaut
    Bonsoir, et merci d'avoir répondu aussi vite
    C'est justement ça mon problème: lire 3 paramètres à la suite.
    Je sais les envoyer via VB6 un par un, mon code en C++ les interprète bien,(en utilisant des conditions 'IF') mais je n'arrive pas à écrire un code en C++ qui interpréterait 3 paramètres en même temps. Cela doit vous paraitre "bête" tant c'est simple à faire (pour moi) en VB, mais en C++, je bloque.

  4. #4
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Comment sont envoyés tes caractères à ton Arduino ? Je voudrais voir ton code VB.

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2015
    Messages : 9
    Par défaut
    Mes caractères sont envoyé de façon très simple. Après avoir initialisé le port com (avec un contrôle MSCOMM) dans mon 'Form Load' j'envoie simplement mes données comme ceci :
    Code VB6 : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "a" & "b" & "c"
    mais je peux aussi faire
    Code VB6 : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "a" &","& "b" & "," & "c"
    , ou 'a' (de 0 à 15)est mon N° de servo, 'b' (de 0 à 99)le paramètre de vitesse et 'c' (DE 160 à 600) défini le déplacement voulu. Mais peu importe je saurais adapter mon code VB aux exigences du C++.
    Mon code qui fait bouger un servo dans l'Arduino est sous forme :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void loop() {
    data=Serial.read();
     if(data=='a')
    {
    pwm.setPWM(0, 0, 150);
     }
    ce qui correspond à: 0 = servo 1
    0 = vitesse 100%
    150 = Valeur de la fréquence du PWM
    J'aimerai juste avoir quelque chose comme :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    pwm.setPWM(a, b, c);

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Ok. Je comprends un peu mieux

    mais je peux aussi faire
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "a" & "," & "b" & "," & "c"
    oui, c'est comme ça qu'il faut envoyer tes valeurs, avec un séparateur. Je vais même te suggérer d'ajouter un caractère de fin de chaîne car ta chaine n'aura jamais la même longueur : tu peux aussi bien envoyer "0,0,0" (5 caractères) que "10,10,10" (8 caractères). Le caractère de fin de chaîne confirmera que tu as bien tout envoyé.

    Donc
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "a" & "," & "b" & "," & "c" & chr(10)
    Le chr(10) est le retour chariot. Voilà pour le côté VB.


    Côté C++ il faut donc décoder cette chaîne.
    Je vais déjà fixer une limite à la longueur de cette chaine. La documentation Adafruit indique que la fonction setPWMadmet 3 paramètres : channel, on et off.
    • Channel : voie de l'arduino, deux caractères pour des voies de "0" à "15".
    • On et off : sont des valeurs qui vont de 0 à 4096 donc maximum 4 caractères.
    • et on ajoute 2 séparateurs (la virgule) et le caractère de fin de chaine (chr(10) ou \n en C++).


    La chaîne la plus courte sera donc de la forme "X,X,X\n" soient 6 caractères
    La chaîne la plus longue sera donc de la forme "XX,XXXX,XXXX\n" soient 13 caractères

    Donc ton code Arduino est :
    Variables
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char buf[13];  // taille du buffer de lecture (max 13 caractères).
    byte n;
    String strA, strB, strC;
    int A, B, C;
    char *pch;
    loop :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    void loop
    {
    	if (Serial.available() > 0) // nouvelles données sur le port série ?
    	{
    		// Lecture de la donnée reçue (max 13 caractères)
    		n = Serial.readBytesUntil('\n', buf, 13);
     
    		if (n > 0) // pas d'erreur ?
    		{
    			pch = strtok(buf, ","); // découper la chaîne reçue
    			strA = pch;
    			pch = strtok(NULL, ",");
    			strB = pch;
    			pch = strtok(NULL, ",");
    			strC = pch;		
     
    			A = strA.toInt();  // conversion vers entier
    			B = strB.toInt();
    			C = strC.toInt();
     
    			// Debug (activer le moniteur Arduino)
    			Serial.println("Code=");
    			Serial.println(buf);
    			Serial.println(A);
    			Serial.println(B);
    			Serial.println(C);
     
    			// exécuter la fonction avec les paramètres voulus			
    			pwm.setPWM(A,B,C);
     
    		}
    	}
    }

    documentation sur la fonction strtok.

    -----
    Je doute juste sur un point : chr(10) est le code ASCII du retour chariot (LF), mais je ne sais pas si cela correspond bien au \n de C++.
    Éventuellement tu peux choisir un autre caractère pour terminer ta chaine : "#" par exemple.

    Du coup en VB :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "a" & "," & "b" & "," & "c" & "#"
    et dans le code C++ :
    Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
    n = Serial.readBytesUntil('#', buf, 13);

    -----
    Attention dans la fonction readBytesUntil le paramètre est entre simples quotes : '#', mais pour strtock() ce sont des doubles quotes : ","

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Port série] Arduino et QSerialDevice
    Par krapo13 dans le forum Bibliothèques
    Réponses: 3
    Dernier message: 15/09/2011, 09h36
  2. Xbee et arduino: pourquoi un arret ?
    Par alx4t1 dans le forum Embarqué
    Réponses: 0
    Dernier message: 05/07/2011, 11h25
  3. arduino et début en dev
    Par zerros dans le forum C
    Réponses: 1
    Dernier message: 23/02/2011, 11h32
  4. Réponses: 3
    Dernier message: 01/02/2010, 09h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo