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 :

Utiliser Processing avec Arduino, communication série.


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    pourquoi dans la fonction rempliSauveDataLdc(), faut-il mettre une variable et pas le nom du paramètre transféré
    On donne un nom aux paramètres et généralement on utilise quelque chose qui n'est pas en conflit avec le nom d'une variable globale.

    ==> c'est pour bien voir que c'est un paramètre de la fonction et que c'est cela qui sera utilisé dans la fonction: sa valeur sera remplacée lors de l'appel par le paramètre donné

    si vous faites une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void imprimer(int toto) {
      print(toto);
    }
    vous pouvez l'appeler avec imprimer(4) ou imprimer(25) ou imprimer(x) (si x est un entier). dans l'exécution de la fonction toto vaudra respectivement 4, 25 ou la valeur de x.

    ---
    dans votre cas ldcState est une variable globale, on pourrait donc ne pas passer de paramètre du tout - mais dans ce cas à l'exécution c'est la valeur courante de cette variable qui sera utilisée

  2. #2
    Membre confirmé
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Par défaut Utiliser Arduino avec Processing etc..
    Encore et toujours moi.

    Je crois que je n'ai rien compris, les modifications ne fonctionne pas.

    J'ai mis des messages de contrôle qui s'affiche dans la console, et je me rend compte que serialEvent (myPort) n'est jamais exécutée.
    On dirait que draw tourne en boucle, vous me direz c'est son rôle; mais là il abuse quand même.

    Faut-il appeler d'une manière quelconque la fonction serialEvent (myPort)

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    /* lecture_defauts_test_9_004.pde
     * Fonctionne avec sketch_test_9_F_000.ino.
     * Fermer le port série et afficher le message "Fin Test" au bout de 330 changements d'état de Ldc.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche; le programme est ensuite fermé.
     * Toutes les variables de la version finale sont déclarées.
     * Les variables non utilisées dans cette version sont annulées comme des commentaires.
     * Affichage des titres en statique, dans la fonction setup puisqu'ils n'ont besoin d'être affichée qu'une seule fois.
     * Utilisation du tableau façon M.Jay pour l'affichage des titres.
     * Affichages des messages; Attente Test; Test en Cours; Fin de test.
     * Le message "Attente Test" s'affiche tant qu'il n'y a pas de donnée à lire sur le port série.
     * Le message "Test en cours" s'affiche tant qu'il y a des données à lire sur le port série.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche puis exit du programme.
     * Utilisation du drapeau FLAG1 qui prends les valeurs suivantes: 0 Attente Test; 1 Test en Cours; 2 Fin de test.
     * Affichage des messages par fonction afficheMessage (). * Utilisation de if + compteur à la place de switch case.
     * Affichage des messages dans un rectangle dessiné par le fonction afficheRectMessage ().
     * --------------Fonctionnement du programme ---------------------------------
     * Appel de la fonction afficheMessage () FLAG1 == 0 (1ère boucle de draw).
     * Affiche le message "Attente Test".
     * Test si une donnée est présente sur le port série D7 LOW.
     * TRUE Mets le drapeau message à 1. Appel de la fonction rempliSauveDataLdc ().
     * Appel suivant de afficheMessage () FLAG1 == 1; le message "Test en Cours" est affiché.
     * rempliSauveDataLdc () lit; sauve; et affiche les données. Vérifie la valeur de valeur pas si >=330 FLAG1 = 2 pour fin de test.
     * Appel suivant de afficheMessage () FLAG1 == 2; le message "Fin Test" est affiché le port série est fermé et on attend ESC pour sortir du programme.
     */
    // Déclaration
    // Utilisation de la police de caractères par défaut.
    import processing.serial.* ; // Import la bibliothèque communication série + classes associées.
    Serial myPort ; // Contient N° port utilisé ici 0 pour COM1.
    int FLAG1 = 0; // Drapeau pour affichage des messages de test.
    Table dataLdc; // Déclaration d'une variable de type table (table vide et non existante).
    String titreColonnes[] = { // Tableau d'une seule ligne, qui contient sous forme string, les titres à afficher .
      "Pas", "Etat Ldc", "Temps Réel", "Temps Précédent", "Durée Etat Précédent", } ;
    // Variables pour l'acquisition des data. 
    int ldcState;// Dans cet indice représente toutes les valeurs lues sur le port série.
    int cpteTemps = 0 ; // Temps écoulé depuis le début du programme.
    int preCpteTemps = 0 ; // Temps au dernier changement d'état de led Ldc
    int dureeLdcState = 0 ; // Durée calculé d'un état donné non utilisé dans cet indice.
    int valeurPas = 0 ; // Numéro de ligne pour compteur acquisition données, utilisé pour la création de la table.
    // Variables pour le calcul des codes. Non utilisé dans cet indice.
    // int CODE = 0 ;// Valeur code défaut.
     
    void setup () {
      size (600, 600); // Taille de la fenêtre d'affichage.
      background (255) ; // Couleur de fond de la fenêtre blanc.
      textSize (20) ;
      fill (0) ; // Couleur du texte noire.
      //frameRate (5);
      dataLdc=new Table (); // Allocation de la mémoire pour la table.
      // Création de la table et ajout des colonnes de titre.
      for (int i = 0; i <titreColonnes.length; i++) dataLdc.addColumn (titreColonnes[i]);
      afficheTitresDataLdcState ();
      afficheRectMessage ();
      //printArray (Serial.list()) ; // Affiche la liste des port série disponibles.
      myPort = new Serial (this, Serial.list () [0], 115200) ; // Port série utilisé et vitesse de transmission.
      myPort.bufferUntil ('\n');
    }
     
    void draw () {
      afficheMessage ();
     println ("  Flag  ", FLAG1);
      //if (myPort.available () >0) { // Début condition 1; Vérifie si il y a une donnée à lire.
        // TRUE.
       // FLAG1 = 1;
     }
     
    void serialEvent (Serial myPort) {
       println ("Où suis-je");
      String lireLdcState = myPort.readStringUntil ('\n'); // Acquisition de la donnée en code ASCII.
      //print (lireLdcState) ; // Affiche bien 0 et 1 dans la console.
      if (lireLdcState != null) { // Vérifie si une donnée est présente sur myPort.
          lireLdcState = trim (lireLdcState); // Elimine les blancs ?
        //print (lireLdcState) ; // Affiche bien 0 et 1 dans la console.
        ldcState = (int (lireLdcState)) ;
        println (ldcState) ;
        rempliSauveDataLdc (ldcState);
      }
    } 
    void afficheTitresDataLdcState () { // Appel de la fonction pour l'affichage des titres.
      fill (0);
      smooth ();
      for (int i =0; i<titreColonnes.length; i++) text(titreColonnes[i], 20, 50*(i+1)) ; // 25*(i+1) pour séparer de 25 points chaque ligne (la police fait 20 de haut)
      strokeWeight (3); 
      stroke (#FA0808);
      line( 20, 300, 550, 300);
    }
     
    void   afficheRectMessage () {
      fill (#FAB6EA);
      noStroke ();
      rect (178, 435, 244, 30);
    }
     
    void afficheMessage () {
      if (FLAG1 == 0) {
        fill (0);
       smooth ();
        text ("Attente Test", 250, 457 );
        println ("T'es là con!");
      } else if (FLAG1 == 1) {
        afficheRectMessage ();
        fill (0);
        text ("Test en Cours", 250, 457 );
      } else if (FLAG1 == 2) {
        afficheRectMessage ();
        fill (0);
        text ("Fin Test", 250, 457 );
        myPort.stop ();
        // Le message Fin de test reste affiché jusqu'à l'appui de la touche 1 du clavier numérique.
        if (keyPressed) {
          if (key == ESC) 
            exit () ;
        }
      }
    }
    void rempliSauveDataLdc (int valeur) {
     // ldcState = myPort.read ();
     // print (ldcState);
      cpteTemps = millis () ;
      TableRow newRow = dataLdc.addRow () ;
      newRow.setInt (titreColonnes [0], valeurPas) ;
      newRow.setInt (titreColonnes [1], valeur) ;
      newRow.setInt (titreColonnes [2], cpteTemps) ;
      newRow.setInt (titreColonnes [3], preCpteTemps) ;
      newRow.setInt (titreColonnes [3], (cpteTemps - preCpteTemps)) ;
      saveTable ( dataLdc, "data/newdataLdc.csv") ;
      preCpteTemps = cpteTemps ;
      valeurPas ++ ;
      FLAG1 = 1;
      if (valeurPas ==20) {
        FLAG1 = 2; // Indique que les acquisitions de données sont en cours.
      }
     
      }
    Pour l'exemple, j'ai une autre version qui elle fonctionne, mais me donne les code ASCII 48 et 49 au lieu des caractères. Mais j'aimerai comprendre comment on utilise serialEvent.
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    /* lecture_defauts_test_9_003.pde
     * Fonctionne avec sketch_test_9_F_000.ino.
     * Fermer le port série et afficher le message "Fin Test" au bout de 330 changements d'état de Ldc.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche; le programme est ensuite fermé.
     * Toutes les variables de la version finale sont déclarées.
     * Les variables non utilisées dans cette version sont annulées comme des commentaires.
     * Affichage des titres en statique, dans la fonction setup puisqu'ils n'ont besoin d'être affichée qu'une seule fois.
     * Utilisation du tableau façon M.Jay pour l'affichage des titres.
     * Affichages des messages; Attente Test; Test en Cours; Fin de test.
     * Le message "Attente Test" s'affiche tant qu'il n'y a pas de donnée à lire sur le port série.
     * Le message "Test en cours" s'affiche tant qu'il y a des données à lire sur le port série.
     * Le message "Fin Test" reste affiché jusqu'à l'appui d'une touche puis exit du programme.
     * Utilisation du drapeau FLAG1 qui prends les valeurs suivantes: 0 Attente Test; 1 Test en Cours; 2 Fin de test.
     * Affichage des messages par fonction afficheMessage (). * Utilisation de if + compteur à la place de switch case.
     * Affichage des messages dans un rectangle dessiné par le fonction afficheRectMessage ().
     * --------------Fonctionnement du programme ---------------------------------
     * Appel de la fonction afficheMessage () FLAG1 == 0 (1ère boucle de draw).
     * Affiche le message "Attente Test".
     * Test si une donnée est présente sur le port série D7 LOW.
     * TRUE Mets le drapeau message à 1. Appel de la fonction rempliSauveDataLdc ().
     * Appel suivant de afficheMessage () FLAG1 == 1; le message "Test en Cours" est affiché.
     * rempliSauveDataLdc () lit; sauve; et affiche les données. Vérifie la valeur de valeur pas si >=330 FLAG1 = 2 pour fin de test.
     * Appel suivant de afficheMessage () FLAG1 == 2; le message "Fin Test" est affiché le port série est fermé et on attend ESC pour sortir du programme.
     */
    // Déclaration
    // Utilisation de la police de caractères par défaut.
    import processing.serial.* ; // Import la bibliothèque communication série + classes associées.
    Serial myPort ; // Contient N° port utilisé ici 0 pour COM1.
    int FLAG1 = 0; // Drapeau pour affichage des messages de test.
    Table dataLdc; // Déclaration d'une variable de type table (table vide et non existante).
    String titreColonnes[] = { // Tableau d'une seule ligne, qui contient sous forme string, les titres à afficher .
      "Pas", "Etat Ldc", "Temps Réel", "Temps Précédent", "Durée Etat Précédent", } ;
    // Variables pour l'acquisition des data. 
    int ldcState;// Dans cet indice représente toutes les valeurs lues sur le port série.
    int cpteTemps = 0 ; // Temps écoulé depuis le début du programme.
    int preCpteTemps = 0 ; // Temps au dernier changement d'état de led Ldc
    int dureeLdcState = 0 ; // Durée calculé d'un état donné non utilisé dans cet indice.
    int valeurPas = 0 ; // Numéro de ligne pour compteur acquisition données, utilisé pour la création de la table.
    // Variables pour le calcul des codes. Non utilisé dans cet indice.
    // int CODE = 0 ;// Valeur code défaut.
     
    void setup () {
      size (600, 600); // Taille de la fenêtre d'affichage.
      background (255) ; // Couleur de fond de la fenêtre blanc.
      textSize (20) ;
      fill (0) ; // Couleur du texte noire.
      //frameRate (5);
      dataLdc=new Table (); // Allocation de la mémoire pour la table.
      // Création de la table et ajout des colonnes de titre.
      for (int i = 0; i <titreColonnes.length; i++) dataLdc.addColumn (titreColonnes[i]);
      afficheTitresDataLdcState ();
      afficheRectMessage ();
      printArray (Serial.list()) ; // Affiche la liste des port série disponibles.
      myPort = new Serial (this, Serial.list () [0], 115200) ; // Port série utilisé et vitesse de transmission.
    }
     
    void draw () {
      afficheMessage ();
      // Lecture port série.
      if (myPort.available () >0) { // Début condition 1; Vérifie si il y a une donnée à lire.
        // TRUE.
        FLAG1 = 1;
       // myPort.clear ();
        rempliSauveDataLdc ();
      }
    }
     
    void afficheTitresDataLdcState () { // Appel de la fonction pour l'affichage des titres.
      fill (0);
      smooth ();
      for (int i =0; i<titreColonnes.length; i++) text(titreColonnes[i], 20, 50*(i+1)) ; // 25*(i+1) pour séparer de 25 points chaque ligne (la police fait 20 de haut)
      strokeWeight (3); 
      stroke (#FA0808);
      line( 20, 300, 550, 300);
    }
     
    void   afficheRectMessage () {
      fill (#FAB6EA);
      noStroke ();
      rect (178, 435, 244, 30);
    }
    void rempliSauveDataLdc () {
      ldcState = myPort.read ();
      print (ldcState);
      cpteTemps = millis () ;
      TableRow newRow = dataLdc.addRow () ;
      newRow.setInt (titreColonnes [0], valeurPas) ;
      newRow.setInt (titreColonnes [1], ldcState) ;
      newRow.setInt (titreColonnes [2], cpteTemps) ;
      newRow.setInt (titreColonnes [3], preCpteTemps) ;
      newRow.setInt (titreColonnes [3], (cpteTemps - preCpteTemps)) ;
      saveTable ( dataLdc, "data/newdataLdc.csv") ;
      preCpteTemps = cpteTemps ;
      valeurPas ++ ;
      FLAG1 = 1; // Indique que les acquisitions de données sont en cours.
      if (valeurPas >= 329) { // Pour fin de test.
        FLAG1 = 2;
      }
    }
    void afficheMessage () {
      if (FLAG1 == 0) {
        fill (0);
        text ("Attente Test", 250, 457 );
      } else if (FLAG1 == 1) {
        afficheRectMessage ();
        fill (0);
        text ("Test en Cours", 250, 457 );
      } else if (FLAG1 == 2) {
        afficheRectMessage ();
        fill (0);
        text ("Fin Test", 250, 457 );
        myPort.stop ();
        // Le message Fin de test reste affiché jusqu'à l'appui de la touche 1 du clavier numérique.
       if (keyPressed) {
        if (key == ESC) 
             exit () ;
        }
      }
    }

  3. #3
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    c'est dans la doc
    - la fonction est appelée pour vous quand des données sont dispos sur le port série choisi.
    - Cependant comme vous utilisez myPort.bufferUntil('\n'); dans le setup, il va attendre d'avoir reçu le '\n' avant d'appeler la fonction

    essayez avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String lireLdcState = myPort.readString();
    en début de votre fonction

    Quand vous voulez tester quelque chose, faites simple pour commencer et tester si cela fonctionne:

    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
    import processing.serial.*; 
    Serial myPort;
    String lecture;
     
    void setup() { 
      size(400, 200); 
      myPort = new Serial (this, Serial.list () [0], 115200) ; // Port série utilisé et vitesse de transmission.
      myPort.bufferUntil ('\n');
    } 
     
    void draw() {
    } 
     
    void serialEvent(Serial p) { 
      lecture = p.readString(); 
      print(lecture);
    }
    par exemple à tester avec le code Arduino
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void setup() {
      Serial.begin(115200);
    }
     
    void loop() {
      Serial.print(millis()); Serial.println(" -> Hello World");
      delay(2000);
    }
    vous devriez voir un message défiler toutes les 2 secondes (sous le code Processing, dans sa console de debug)

    PS/ êtes vous sûr que votre Arduino est sur l'entrée 0 dans le tableau Serial.list? et êtes vous sûr d'envoyer de '\n'?

  4. #4
    Membre confirmé
    Homme Profil pro
    loisirs
    Inscrit en
    Février 2020
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : loisirs

    Informations forums :
    Inscription : Février 2020
    Messages : 118
    Par défaut Utiliser Processing avec Arduino, communication série
    Bonjour à tous

    De retour sur la brèche après une longue absence due à un projet de déménagement; les news sur le sujet.

    La détection de l'allumage de la led = échec et mat; luminosité trop faible; j'ai jeté l'éponge et trouver une autre solution.
    Ce post n'est donc plus d'actualité.

    Je passe maintenant à la phase contrôle des différent capteurs et actionneurs de mon installation; essentiellement des mesures de tension entre 0 et 5v et des signaux tout ou rien.

    Je compte utiliser Processing / Arduino et la communication série pour visualiser les résultats.

    Pour des raisons de clarté, je pense qu'il vaut mieux fermer ce post et en ouvrir un autre, même si ce qui à été dit dans ce post me sera très utile, voire indispensable.

    Qu'en pensez vous?
    @+

Discussions similaires

  1. [Embarqué] Communication avec le port série vers Arduino
    Par YannGTT dans le forum Plateformes
    Réponses: 0
    Dernier message: 05/04/2020, 04h45
  2. communication série via rs232 avec vb.net
    Par lemabs dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/11/2009, 16h35
  3. Problème de communication avec un port série
    Par hélène2 dans le forum C#
    Réponses: 8
    Dernier message: 22/04/2009, 09h26
  4. Code VBA pour communication avec un port série dans EXCEL
    Par Fbroom dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/05/2008, 10h14
  5. Problèmes avec la communication série
    Par rzayani dans le forum Windows
    Réponses: 3
    Dernier message: 18/06/2007, 11h57

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