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 :

Problème avec la fonction serialEvent() sous Processing


Sujet :

Arduino

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Par défaut Problème avec la fonction serialEvent() sous Processing
    Bonjour

    Pour tracer une courbe sinusoïdale sous Processing, avec les valeurs calculées par Arduino, il est facile de trouver des exemples sur internet. Par exemple celui de la page:
    http://www.iut-troyes.univ-reims.fr/...uinoProcessing

    Code Arduino:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void setup(){
      Serial.begin(115200);
    }
     
    void loop() {
      static float angle=0.0;
      float sinus;
      int i;
      sinus = (unsigned char) 127.0+127.0*sin(angle);
      Serial.println(sinus);
      angle += 0.1;
      delay(50);
    }
    Code Processing:

    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
    import processing.serial.*;
     
    Serial myPort;
    int xPos = 1;
    int lastxPos=1;
    int lastheight=0;
     
    void setup () {
      size(600, 400);
     
      println(Serial.list());
      myPort = new Serial(this, Serial.list()[0], 115200);
      myPort.bufferUntil('\n');
      background(0);
    }
    void draw () {}
     
    void serialEvent (Serial myPort) {
      String inString = myPort.readStringUntil('\n');
      if (inString != null) {
        inString = trim(inString);
        float inByte = float(inString);
        inByte = map(inByte, 0, 1023, 0, height);
        stroke(127,34,255);
        strokeWeight(4);
        line(lastxPos, lastheight, xPos, height - inByte);
        lastxPos= xPos;
        lastheight= int(height-inByte);
     
     
        if (xPos >= width) {
          xPos = 0;
          lastxPos= 0;
          background(0);
        }
        else {
               xPos++;
        }
      }
    }
    A la compilation, la fenêtre s'ouvre, de la bonne taille et de la bonne couleur, mais la sinusoïde ne se dessine pas. J'ai bien choisi le bon numéro de port. Par exemple, si après la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line(lastxPos, lastheight, xPos, height - inByte);
    je rajoute je vois bien dans la console série de Processing les valeurs de xPos s'afficher. Cela confirme que mon problème ne vient pas de la liaison série.
    J'ai alors décidé de supprimer la fonction void serialEvent (Serial myPort) et d'intégrer son contenu directement dans la fonction void draw(). Et là ça fonctionne correctement. Je ne comprends pas pourquoi la courbe ne se dessine pas si elle codée dans la fonction serialEvent(), puisque celle ci est bien appelée à chaque fois qu'une donnée est disponible sur le port série, mon test dans la console série de Processing, ayant permis de le vérifier.

    Merci d'avance pour votre aide

  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
    Bonjour,

    je viens de trouver cet exemple :
    https://www.arduino.cc/en/Tutorial/Graph
    Peut-être qu'il te permettra de comprendre ton souci.

    Celui-ci permet de modifier le fond d'écran en fonction de la valeur lue :
    http://makerspace56.org/recuperer-un...ec-processing/

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Par défaut
    Bonsoir Auteur

    Merci pour les 2 liens.
    Le 1er fonctionne bien, mais pas le 2ème.
    Le 2ème, comme les codes que j'ai donnés, a la fonction draw() vide, et tout se passe dans la fonction serialEvent(). On a l'impression que les codes comme line() ou background() ne fonctionnent pas à l'intérieur de serialEvent(). Pourtant on trouve sur internet plein de codes avec des commandes de dessin dans la focntion serialEvent() et ils sont présentés comme fonctionnels par leur auteur.

  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
    Bonjour,

    tous les exemples que j'ai pu voir sont similaires au tien. Mais effectivement, en lisant les discussions j'ai eu l'impression que les fonctions graphiques ne fonctionnent que dans la fonction draw(). Eventuellement, essaye de forcer son exécution avec redraw().
    Egalement, je ne sais pas si cela te parle, la bibliothèque "Firmata" est souvent évoquée dans ces discussions.
    http://playground.arduino.cc/Interfacing/Processing

    Par ailleurs, est-ce ennuyeux pour toi de faire appel à la fonction draw() ?

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2016
    Messages : 3
    Par défaut
    bonjour Auteur

    Comme tu le proposes, je crois en effet qu'il va falloir sortir les fonctions graphiques de la fct seriaEvent() pour les écrire dans la fonction draw(). Mais je continue à me poser la question du bon fonctionnement de tous ces exemples que l'on trouve sur internet, donc ceux de X. HINAULT (http://www.mon-club-elec.fr/pmwiki_m...TILSProcessing) qui est pourtant une référence française en la matière.

Discussions similaires

  1. Réponses: 18
    Dernier message: 12/07/2019, 22h59
  2. Problème avec une fonction MERGE sous oracle
    Par coulpie_myri dans le forum Oracle
    Réponses: 2
    Dernier message: 28/05/2010, 20h46
  3. Problème avec une fonction de GDK sous Windows !
    Par Franck.H dans le forum GTK+ avec C & C++
    Réponses: 9
    Dernier message: 08/06/2007, 13h57
  4. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04
  5. Problème avec le port série sous Windows XP
    Par didou2dek dans le forum Composants VCL
    Réponses: 6
    Dernier message: 02/09/2003, 19h50

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