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

  1. #1
    Membre à l'essai
    Utiliser Processing avec Arduino, communication série.
    Bonjour

    Suite du projet: Détecter l'allumage d'un led que je viens de passer en résolu.

    Pour cette partie, je vais utiliser la démarche suivante:
    - Collecte d'informations sur la communication série Arduino et Processing.
    - Etude des exemples fournis avec l'Ide Arduino.

    Je vous ferai part des résultats de ces études, afin que vous corrigiez si possible mes erreurs.

    J'en profite pour traduire les commentaires intégrés à ces exemples, qui sont en Anglais; si ça peut servir à quelqu'un!

    Je commencerai par l'exemple "Graph" de la partie communication.
    Visualiser dans Processing, sous forme graphique les valeurs lues sur l'entrée analogique A0.

    Euh! c'est pas gagné d'avance.

    A suivre!

  2. #2
    Membre expérimenté
    bon courage !

    (après C++ faut apprendre Java )

  3. #3
    Membre à l'essai
    Utiliser Arduino avec Processing etc..
    Bonsoir

    Voici le résultat de mes premières élucubrations avec Processing.

    Le circuit c'est Jay M.; lecture sur le port A0.

    Les programmes que j'ai étudiés et adaptés L'exemple Graph dans l'Ide Arduino + quelques autres.

    La documentation, essentiellement les références du langage de Processing + quelques boites de tranquillisants.

    La vidéo du résultat dans la fenêtre Processing, si j'arrive à l'insérer.

    J'arrive pô.

    c'est une .mov; que j'ai créé en utilisant save.frame() et l'outil movie maker de Processing. On fait comment?

    Ben oui on peut pas tout savoir!

  4. #4
    Membre expérimenté
    Salut

    c'est une .mov; que j'ai créé en utilisant save.frame() et l'outil movie maker de Processing. On fait comment?
    est-ce qu'il se joue correctement sur votre ordinateur?
    si oui c'est que le format .mov n'est alors pas reconnu par le forum.
    Il faut soit l'encoder différement en MP4 peut être (il existe plein de convertisseurs) ou alors vous vous créez un compte youTube et vous postez la vidéo là bas (google doit savoir gérer des .mov) et vous mettez le lien dans le forum.

  5. #5
    Membre à l'essai
    Utiliser Processing avec Arduino
    Bonjour

    Oui la vidéo est lue correctement sur mon ordinateur.

    D'ailleurs, je la trouve vraiment très belle!

    Je regarde les formats acceptés.

  6. #6
    Membre à l'essai
    Utiliser Arduino avec Processing etc..
    Ce message n'a pas pu être affiché car il comporte des erreurs.

  7. #7
    Membre à l'essai
    Utiliser Arduino avec Processing etc..
    Encore moi

    Le programme

    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
    // Programme tiré de l'exemple grahp de l'Ide Arduino
    import processing.serial.*; // Importe la bibliothèque communication série + classes associées, le ".*".
    Serial myPort; // Contient N° port utilisé ici 1.
    String valeurInString;
     
    void setup () {
      size(400, 300); // Taille de la fenêtre d'affichage en pixels / Format size(width, height).
      printArray(Serial.list()); // Imprime dans la console la liste des ports séries disponibles. En option, s’il n’y en a qu’un seul.
      myPort = new Serial(this, Serial.list()[0], 115200); // Le port série utilisé et la vitesse de transmission; attention la liste commence à 0 ; idem qu'Arduino.
      myPort.bufferUntil ('\n'); // Ne rien faire sur le port série, tant qu'une donnée nouvelle ligne n'est pas dans le tampon (pas sûr de tout ça).
      textFont(createFont("Grenoble SF", 24)); // Création d’une police de caractères.
      background(0); // Définir le noir pour la fenêtre de visualisation.
    }
    void draw() { // Appelle fonction dessin. On constate que l’axe des x représente le temps, l’axe des y la valeur de la donnée.
      background(0); // Rafraîchissement de l’écran pour éviter de d’écrire les valeurs l’une sur l’autre. 
      text("Valeur lue =   " + valeurInString, 50, 100); // Affichage aux coordonnées définies x = 100, y = 50 tout ça en pixels.
    saveFrame(); // Sauvegarde d’une série d’image ; elles se trouvent au même endroit que le sketch.
    }
    void serialEvent (Serial myPort) { // Appel de la method pour lire le port série.
      String inString = myPort.readStringUntil ('\n'); // Acquisition de la donnée en code ASCII.
      if (inString != null) { // Vérifie si une donnée est présente sur myPort.
        inString = trim (inString); // Elimine les blancs ?
        valeurInString = inString; // Sauve la valeur lue sur le port série, dans la variable valeurInString.
      }
    }


    Les commentaires indiquent le rôle des lignes, où tout au moins ce que j'ai compris.

    J'ai trouvé une erreur dans l'exemple "Graph".

    La suite: Gestion du temps et les tableaux.

  8. #8
    Expert éminent sénior
    Salut Jean Claude du Var.

    La vidéo n'est pas disponible. Cette Vidéo est privée.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Membre à l'essai
    Utiliser Processing avec Arduino
    Bonjour

    Oups

    Je me suis certainement trompé d'option; je vérifie

  10. #10
    Membre expérimenté
    Un bon debut!

    A lire le code processing on voit ce que ça doit faire (en attendant que vous avez rendu publique la vidéo YouTube).

  11. #11
    Membre expérimenté
    Salut à toutes et tous,

    un petit partage qui pourrait être utile éventuellement.

    j'ai un peu nettoyé un bout de code que j'avais et qui trainait dans un vieux dossier et qui me sert de base pour la connexion d'un code processing à un Arduino.

    L'idée est qu'au lancement de l'application une fenêtre de configuration s'ouvre


    il y a une zone de configuration du port série:


    En dessous vous aurez éventuellement des paramètres spécifiques à votre application que l'utilisateur peut modifier, par exemple ici un nombre de lignes et de colonnes.


    Si votre arduino n'apparaît pas dans la liste, on peut appuyer sur le bouton refresh


    et la liste se met à jour


    l'utilisateur choisit son port série et la vitesse en bauds. et puis l'utilisateur valide


    ce qui l'emmène sur l'écran de votre application.

    (ici j'affiche juste une grille avec le bon nombre de lignes et de colonnes. le code montre comment avoir une fenêtre à taille variable et minimum)

    Pour votre programme au lieu de dessiner dans la fonction draw(), vous dessinez dans drawActionScreen() qui est la fonction appelée une fois l'écran initial de configuration passé.

    Notez qu'il y a déjà une instance de CP5 qui est créée pour vous déjà (variable cp5) si vous avez besoin d'autres contrôles dans votre application donc pas la peine de la recréer.

    Notez aussi qu'il y a un bout de code dans le setup() qui s'exécute quand l'application se termine pour fermer le port série.

    Pour le reste vous codez normalement


    Voilà en espérant que ça puisse aider

  12. #12
    Membre à l'essai
    Utiliser Arduino avec Processing etc..
    Bonsoir

    J'ai modifié les paramètre de la vidéo; elle doit être accessible.

    Merci Jay M. pour le partage, mais ça me passe largement au dessus.
    En plus maintenant: avec ma p'tite vidéo j'avais l'air d'un c... ma mère avec ma p'tite vidéo j'avais l'air.....

    Bon allez! on continue.

  13. #13
    Membre expérimenté
    La video est superbe parce que ça fonctionne et c’est ce qui compte.

  14. #14
    Membre à l'essai
    Utiliser Arduino avec Processing etc..
    Bonjour

    Jay M

    Je vous avais dis que c'était un chef d'œuvre!

    Le plus important pour moi = le programme fonctionne; mais je sais pourquoi.
    Je viens de le modifier avec lecture en digital ça fonctionne bien aussi.

    Dans votre partage précédent, je n'ai pas vu le code; ; cela me serait peut être utile pour la phase 2; pour la façon de dessiner à l'écran surtout; si c'est de mon niveau de compréhension bien sur.

    Pourriez vous m'indiquer une bonne lecture pour comprendre les tableaux.
    Merci

  15. #15
    Membre expérimenté
    Salut Jean-Claude,

    Je vous avais dis que c'était un chef d'œuvre!
    Je suis d'accord. Quand on découvre quelque chose de nouveau et qu'on arrive à quelque chose de fonctionnel, c'est un moment magique! bravo.

    Dans votre partage précédent, je n'ai pas vu le code;
    Effectivement ce serait mieux avec le code !! j'ai oublié
    je le mets en attachment (fichier zip car il y plusieurs fichiers dedans)

    Le code n'est pas très compliqué à utiliser, en gros vous ne vous souciez plus de câbler en dur le port série sur lequel votre arduino est connecté, au démarrage de l'application l'utilisateur pourra choisir.

    Ensuite ça donne la main à votre code, il faut juste mettre le code que vous aviez dans draw() dans la fonction drawActionScreen() à la place. (bien sûr si vous initialisez des choses dans le setup() il faut les rajouter, le bon endroit serait dans la fonction prepareActionScreen(). Le port série qui est ouvert s'appelle arduinoPort donc si vous voulez écouter ce qui arrive sur le port série c'est ce nom de variable qu'il faut prendre.

    Et quand vous quittez l'application mon code se charge de fermer le port série de façon à le libérer.

    PS: si vous ne voulez pas de paramètres ou d'autres formes de paramètres, vous virez bien sûr la création des éléments graphiques pour les 2 valeurs
    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
      nbLinesNumberbox = new Slider(cp5, "nbLines")    // associate variable nbLines to this widget
        .setLabel("Number of Lines")
        .setColorLabel(0)
        .setPosition(10, 210)
        .setSize(200, 25)
        .setRange(10, 50)
        .setFont(defaultTextFont)
        ;
     
      nbColumnsNumberbox= new Slider(cp5, "nbColumns")    // associate variable nbColumns to this widget
        .setLabel("Number of Columns")
        .setColorLabel(0)
        .setPosition(10, 245)
        .setSize(200, 25)
        .setRange(10, 50)
        .setFont(defaultTextFont)
        ;
    et enlevez la déclaration des 2 variables nbLines, nbColumns. et toute référence à nbColumnsNumberbox ou nbLinesNumberbox

  16. #16
    Membre à l'essai
    Utiliser Processing avec Arduino
    Merci Jay M.

    Je jetterai un œil; histoire d'apprendre.

    Pour comprendre et utiliser ces "*+-z" de tableaux; une doc à me conseiller? sinon je verrais les "references langage".

    Pour l'instant je me casse les dents sur une boucle if else pour afficher un message différent selon que la led est allumée 1 ou éteinte 0.

    je cherche je cherche je cherche etc.

  17. #17
    Membre expérimenté
    En Java on ne travaille qu’avec des objets.

    il y’a plusieurs façon de représenter des collections de "machins", le tableau est la structure de base mais on peut faire des listes par exemple (Une liste est comme un tableau mais à dimension variable donc on peut y ajouter ou enlever des éléments alors qu’un tableau a une dimension fixe comme en C++)

    Pour faire simple et se consacrer aux tableaux: un tableau (array) est une structure de données contenant un groupe d'éléments tous du même type, avec des adresses consécutives en mémoire. Le tableau a le nombre fixé d'éléments et vous ne pouvez pas changer sa taille. On accède aux éléments d'un tableau par un indice commençant à 0 avec la notation crochets comme en C++

    On peut déclarer le tableau en deux fois
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Déclaration du tableau sans spécifier le nombre d'éléments.
    int[] tableau1;
    // allocation de la mémoire pour 100 éléments (sans valeur précise)
    tableau1 = new int[100];

    Ou en une seule fois pour sa taille, avec ou sans les valeurs
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    int[] tableau2 = new int[10]; // 10 cases réservées
    int[] tableau3 = {10, 20, 30, 40}; // tableau de 4 cases initialisées avec des valeurs connues


    Ensuite c’est comme en C++ on appelle tableau1[3] pour accéder à la 4ème case (l’index commence à zéro)

    Pour vous si vous voulez stocker du texte, le type des éléments du tableau sera String

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    String[] etatLampe = {"lampe éteinte", "lampe allumée"};


    Et vous pouvez appeler par exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    text(etatLampe[0], 10, 10);


    (Tapé sur mon mobile donc pas testé)

  18. #18
    Membre à l'essai
    Utiliser Processing avec Arduino
    Bonjour

    Merci Jay M de ces éclaircissements.

    Si j'ai bien compris, en rajoutant ce que j'ai pu lire par ailleurs, si je veux un tableau (array ) à deux dimensions x lignes y colonnes j'ai la ligne de code suivante:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    int[][] tableau1;
    le premier terme étant le type de données que je veux stocker.
    Puis je dimensionne le nombre d'éléments.

    Donc la grosse différence entre array et une liste, c'est que l'allocation de l'espace mémoire pour la liste est dynamique.
    Donc comme je connais le nombre maximum de données que je dois stocker, je peux prendre un tableau; mais... comme je ne suis pas sûr d'avoir à toujours stocker ce maximum de données, pour faire plus pro, j'ai intérêt à prendre une liste.

    Il faut bien entendu que l'on puisse faire des listes à deux dimensions.

    Je vais chercher la réponse.

    Pour l'instant je cherche pourquoi mes conditions if else sont ignorées.

    A suivre

  19. #19
    Membre expérimenté
    Oui tout à fait, vous pourriez faire
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
     int[][] tableau2D = new int[10][20]; // 10 lignes, 20 colonnes


    si vous voulez utiliser un ArrayList, voici un exemple de déclaration, remplissage et parcours de la liste pour affichage dans la console de Processing (sous le code)
    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
    import java.util.ArrayList;
    import java.util.Iterator;
     
    ArrayList<String> liste = new ArrayList<String>(10); // taille par défaut pour 10 éléments
     
    void setup()
    {
      // on remplit la liste
      liste.add("Hello");
      liste.add("Jean-Claude");
      liste.add("Comment");
      liste.add("allez");
      liste.add("vous?");
     
      // on parcourt la liste avec un itérateur
      Iterator<String> iterateur= liste.iterator();
      while (iterateur.hasNext()) { 
        println(iterateur.next());
      }
    }
     
    void draw() {}


    vous devriez voir dans la console

    Hello
    Jean-Claude
    Comment
    allez
    vous?


    une liste est plus couteuse en resources système qu'un tableau de taille fixe... Si vous connaissez la taille max habituelle, autant l'allouer. Mais bon c'est sur ordinateur, on n'a pas forcément les contraintes d'un petit Arduino.

  20. #20
    Membre à l'essai
    Utiliser Arduino avec Processing etc..
    Bonsoir

    Pour ceux qui ont des insomnies, je vous livre une énigme sous forme de mon programme.

    Après une grosse prise de tête avec if else, qui n'était qu'en fait qu'un problème de compatibilité de variables, problème enfin résolu.

    Voici le programme;: le blême est que je n'arrive pas à éviter que les affichages se superposent; je m'en suis tiré par une pirouette (cacahuète); je n'en suis pas satisfait pour autant.

    Chercher l'erreur!
    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
    // Programme tiré de l'exemple grahp de l'Ide Arduino
    import processing.serial.*; // Import la bibliothèque communication série + classes associées.
    Serial myPort; // Contient N° port utilisé ici 1.
    int valeurInString; // Variable globale, car je ne savais pas où la placer en variable locale.
    String afficheEtat ;
     
    void setup () {
      size(400, 300); // Taille de la fenêtre d'affichage en pixels / Format size(width, height).
      printArray(Serial.list());
      myPort = new Serial(this, Serial.list()[0], 115200);
      myPort.bufferUntil ('\n'); // Ne rien faire sur le port série, tant qu'une donnée nouvelle ligne n'est pas dans le tampon( pas sûr tout ça).
      textFont(createFont("Grenoble SF", 24));
      background(0); // Définir le noir pour la fenêtre de visualisation.
    }
    void draw() { // Appelle fonction dessin. On constate que l’axe des x représente le temps, l’axe des y la valeur de la donnée.
      background(0); // Rafraîchissement de la fenêtre pour éviter d'écrire les valeurs l'un sur l'autre.
      if (valeurInString == 1) { // Test si la donnée lue sur le port série et stockée dans valeurInString est égale à 1.
        afficheEtat = "ON" ; // True Remplace la valeur stockée dans valeurInString.
        text("Etat led =  " + afficheEtat, 50, 100); // Affiche la valeur de valeurInString.
      }
      afficheEtat = "     OFF" ;
      text("Etat led =   " + afficheEtat, 50, 100);
    }
    void serialEvent (Serial myPort) {
      String inString = myPort.readStringUntil ('\n'); // Acquisition de la donnée en code ASCII.
      if (inString != null) { // Vérifie si une donnée est présente sur myPort.
        inString = trim (inString); // Elimine les blancs ?
        print (inString) ; // Affiche bien 0 et 1 dans la console.
        valeurInString = (int (inString)) ;
      }
    }

###raw>template_hook.ano_emploi###