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

  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 : ","

  7. #7
    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
    GENIAL, ça marche et c'est exactement ce que je voulais.
    Un grand MERCI à vous.
    Un code super léger et super rapide, J'aurais jamais trouvé ça tous seul.
    Si je code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "a" & "," & "b" & "," & "c" & "#"
    et dans le code C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = Serial.readBytesUntil('#', buf, 13);
    Arduino attends de recevoir tous les paramètres et agit sur le servo, mais il y a environ 1 seconde de délai entre l'envoie des données et le mouvement du servo
    Si je code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "a" & "," & "b" & "," & "c" & chr(10)
    et dans le code C++ :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    n = Serial.readBytesUntil('\n', buf, 13);
    Aucune pause et de cette façon c'est tellement rapide que je peux envoyer plusieurs ordres à plusieurs servos en même temps et la réaction est immédiat.
    Je met ici mon code C++ pour Arduino final qui pourra peut être servir à d'autres.
    Je rappelle ma config:Arduino R3 sur PC via USB et carte contrôleur Adafruit 16 servos sur Arduino via le port I2C de l'Arduino
    Code : 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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);//Sans l'adresse (Ox40) ça ne fonctionne pas!
     
    void setup() {
       Serial.begin(9600);
      pwm.begin();
      pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
      yield();
    }
     
    void loop() {
     
    char buf[13];  // taille du buffer de lecture (max 13 caractères).
    byte n;
    String strA, strB, strC;
    int A, B, C;
    char *pch;
     
     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);
          //n = Serial.readBytesUntil('#', 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 ver
          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);
     
        }
      }
    }
    Et pour le code VB6:
    Code : 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
     
    Private Sub Form_Load()
    On Error Resume Next
    If (MSComm1.PortOpen = False) Then
    MSComm1.CommPort = 8
    MSComm1.Settings = "9600,n,8,1"
    MSComm1.RThreshold = 1
    MSComm1.InputLen = 1
    MSComm1.InBufferSize = 16
    MSComm1.PortOpen = True
    Else
    MSComm1.PortOpen = False
    End If
    End Sub
     
     
    Private Sub Command1_Click()
    Dim a,b,c
    a = Text1.Text
    b = Text2.Text
    c = Text3.Text
    MSComm1.Output = a & "," & b & "," & c & Chr(10)
    End Sub
    Encore mille MERCI
    Bonne fêtes de fin d'année a tous

  8. #8
    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
    De rien, je suis content que cela fonctionne.

    Je suis juste surpris par ce que tu as écrit :
    Avec "#" comme caractère de fin tu indiques :
    Arduino attends de recevoir tous les paramètres et agit sur le servo, mais il y a environ 1 seconde de délai entre l'envoie des données et le mouvement du servo
    et avec "\n" comme caractère de fin de chaine tu as :
    Aucune pause et de cette façon c'est tellement rapide que je peux envoyer plusieurs ordres à plusieurs servos en même temps et la réaction est immédiat.
    ça me semble bien étrange.


    Merci pour ta contribution.

  9. #9
    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
    Bonjour.
    Je reviens vers vous car je me suis rendu compte hier d'un petit problème concernant ce code que je n'arrive pas à résoudre:
    Tant que j'utilise les servos de 0 à 9, tout ce passe très bien, mais si j'envoie un ordre aux servos de 10 à 15, ces derniers fonctionnent correctement, mais plus possible de faire fonctionner les servos 0 à 9. J'ai essayer de vider le buffer en fin de programme mais rien n'y fait???
    Le problème apparait aussi bien quand j'envoie mes données avec mon code VB qu'avec le console série Arduino.

  10. #10
    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
    Ah... qu'affiche la console arduino dans ces cas ? Le caractère de fin de chaîne n'a pas été oublié ?

  11. #11
    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
    Quand j'envoie 0,0,300 la console affiche : 0 0 0 300 tant que je n'envoie pas d'ordre à un servo supérieur à 9 et active bien le bon servo, à la bonne vitesse et avec le bon angle, même après de nombreux envois sur n'importe quel servo de 0 à 9.
    Dès que j'envoie un ordre à un servo compris entre 10 et 15(le bon servo bouge, à la bonne vitesse...), Puis si je renvoie 0,0,300 la console affiche:
    0 0 0 3000, j'ai un '0' en trop au 3eme paramètre.
    Les servos de 0 à 9 ne fonctionne plus mais ceux de 10 à 15 fonctionne toujours.Bizarre!

  12. #12
    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
    Je viens de résoudre mon problème en ajoutant à mon code Arduino :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(C>600)
    {
    C=C/10;
     }
    Je ne sais pas si c'est LA solution mais ça fonctionne!

  13. #13
    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
    bizarre... Le pansement que tu proposes ne me satisfait pas.

    Côté VB, je pense que tu devrais également exécuter la fonction Trim() sur tes chaînes de caractères pour supprimer les éventuels espaces superflus.
    Code VB : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    a = Trim(Text1.Text)
    b = Trim(Text2.Text)
    c = Trim(Text3.Text)

    C'est bien un Arduino UNO que tu possèdes ?

  14. #14
    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,
    oui c'est bien une Uno R3.
    J'ai essayé votre idée en ajoutant des 'trim' à mon code VB mais pas de changement, je m'en doutais un peu puisque j'ai aussi le problème avec la console série Arduino.
    Je comprends que mon 'bricolage' ne plaise pas trop à un programmeur, mais la bidouille, moi c'est mon métier, je saurais m'en contenter. Je ne voudrais pas vous ennuyer avec un problème qui en fait n'en plus vraiment un. Vous m'avez déjà tellement aidé...
    Le code que vous m'avez fait 'sur mesure' ma va parfaitement: simple, efficace et ultra rapide.
    Je préfère revenir vous embêter quand j'ajouterais une seconde carte Adafruit sur mon bus I2C, vu l'efficacité de l'Arduino, (que je suis en train de découvrir) mon projet à de forte chance d’évoluer dans ce sens... Avant je travaillais avec une carte Velleman K8000, j'ai fais un pas de la préhistoire au 21eme siècle.
    Encore merci pour votre aide, on voit que vous aimez ça.
    Bon Noël à toute l'équipe de Développez.com...
    Et, à bientôt...

  15. #15
    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
    Bonne continuation dans ton projet.


    Mais, je vais tenter une dernière approche. Si les chaines envoyées ont toute la même longueur, qu'est-ce que cela donne ?
    Par exemple pour le servo 00 :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "00,0000,0300" & chr(10)
    puis le 12 :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "12,0000,0300" & chr(10)
    puis le 01 :
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "01,0000,0300" & chr(10)

  16. #16
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    CedNewbies,

    Si Auteur insiste c'est parce qu'il se méfie d'une erreur du genre débordement mémoire, et moi ça me fait sacrément penser à ça.

    Si tu étais sur un PC, trouver ce genre de problème est plus simple, quoi que parfois..., tu as une erreur "segment fault" remonté par ton OS.

    Auteur veut savoir si c'est pas une erreur de ce genre car le problème sur un micro c'est que tu n'as pas d'OS pour te dire qu'un pointeur ou quelque chose à débordé en mémoire.

    La ton code fonction mais si ça se trouve tu vas ajouter quelques lignes dans le programme et tout va aller dans tous les sens (des variables qui s'incrementent toutes seules par exemple). Sur un micro c'est très dur de trouver ce genre de problème et il faut chercher.

  17. #17
    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
    Bonjour.
    Je viens d’essayer votre nouvelle solution pour résoudre mon problème et effectivement ça fonctionne à merveille. Je me contentais d'envoyer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "0,0,300" & chr(10)
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MSComm1.Output = "00,0000,0300" & chr(10)
    Maintenant j'ai donc un code sans bidouille, et qui, surement ne me fera pas de mauvaises surprises si j'ajoute une autre carte avec d'autres fonctions (Merci aussi à Vincent Petit pour ses conseils et explications).
    Je vais modifier mon code VB pour envoyer le bon nombre d'octets, sans prendre de raccourcis.
    Merci à vous.
    A très bientôt.

  18. #18
    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. Si cela fonctionne avec une chaîne de longueur constante (là, j'ai imposé la longueur maximale admissible, c'est à dire 13 caractères, voir le message #6) c'est que le problème vient de la fonction (ou plutôt de la gestion de son résultat) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.readBytesUntil()
    Je vais relire la documentation sur le port série. En particulier les fonction Serial.avaible() et Serial.readBytesUntil(). Un truc m'a échappé, et je vais faire quelques tests.


    Citation Envoyé par Vincent Petit
    La ton code fonctionne mais si ça se trouve tu vas ajouter quelques lignes dans le programme et tout va aller dans tous les sens (des variables qui s'incrémentent toutes seules par exemple). Sur un micro c'est très dur de trouver ce genre de problème et il faut chercher.
    En effet, si en sortie tu n'obtiens pas ce que tu envoies c'est qu'il y a un problème quelque part

  19. #19
    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
    1- Déjà je n'avais pas vu que tu déclarais tes variables dans la fonction loop(). Fais ta déclaration avant le setup.
    2- J'ai ajouté deux instructions, lignes 50 et 51. Une pour réinitialiser le contenu de la variable buf et l'autre pour vider la mémoire du port série.
    et là je pense aussi qu'avec le caractère "#" en fin de chaîne tu n'auras plus le souci que tu as rencontré précédemment.

    Je me suis inspiré de ce billet : http://pwillard.com/?p=249

    Essaye donc comme ceci :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #include <Wire.h>
    #include <Adafruit_PWMServoDriver.h>
    Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);//Sans l'adresse (Ox40) ça ne fonctionne pas!
     
    char buf[13];  // taille du buffer de lecture (max 13 caractères).
    byte n;
    String strA, strB, strC;
    int A, B, C;
    char *pch;
     
     
    void setup() {
       Serial.begin(9600);
      pwm.begin();
      pwm.setPWMFreq(60);  // Analog servos run at ~60 Hz updates
      yield();
    }
     
    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);
          //n = Serial.readBytesUntil('#', 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 ver
          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);
     
          memset(buf, 0, sizeof(buf));
          Serial.flush();      
     
        }
      }
    }

+ 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