Auteur Sujet: Interface processing  (Lu 2801 fois)

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 190
    • Voir le profil
    • Locoduino
Interface processing
« le: août 31, 2015, 04:12:50 pm »
Bonjour,
j'ai toujours dans mes petits projets, dans un coin de ma tête, la question de l'ordinateur.
Nous avons déjà parlé avec certains de processing qui a l'avantage de la même interface mais aussi du même langage qu'Arduino (dérive de là) ajouté à cela des trucs de dessins.
Bref, avec une voie série accessible on peut échanger des informations entre les deux trucs, ajouté à cela un adaptateur bluetooth et cela roule.

Je m'y suis remis car Processing est sorti en v3.
Vérification du code tout le temps et interface de gestion des bibliothèques comme Linux  et son dépôt ;)
Bref, une GUI pour parfaire du nom de Guido (G4P ne peut être installé). et hop un début de prog. Cela peut bien donner cette affaire :

import de.bezier.guido.*;
//Variables

int i=0; //Placer la liste après en dessous du dessin
int espace= 20; //espace entre les listes

//Objets listes voies
CheckBox voie1 ;
CheckBox voie2 ;
CheckBox voie3 ;

void setup ()
{
    size( 300, 300 );
   
    Interactive.make(this);
   
    voie1 = new CheckBox("Voie 1 : garage bâtiment", 30, 30+i, 10, 10 );
    voie2 = new CheckBox("Voie 2 : pleine voie", 30, 30+espace+i, 10, 10 );
    voie3 = new CheckBox("Voie 3 : garage extension", 30, 30+espace*2+i, 10, 10 );
   
   
}

void draw ()
{
    background( 0 );
}

public class CheckBox
{
    boolean checked = false;
    float x, y, width, height;
    String label;
    float padx = 7;
   
    CheckBox ( String l, float xx, float yy, float ww, float hh )
    {
        label = l;
        x = xx; y = yy; width = ww; height = hh;
        Interactive.add( this );
    }
   
    void mouseReleased ()
    {
        checked = !checked;
    }
   
    void draw ()
    {
        noStroke();
        fill( #E21919 );
        rect( x, y, width, height );
        if ( checked )
        {
            fill( #45EC38 );
            rect( x, y, width, height );
        }
        fill( 255 );
        textAlign( LEFT );
        text( label, x+width+padx, y+height );
    }
   
    // this is a special inside test that includes the label text
   
    boolean isInside ( float mx, float my )
    {
        return Interactive.insideRect( x,y,width+padx+textWidth(label), height, mx, my );
    }
}

G.

Pierre59

  • Full Member
  • ***
  • Messages: 145
    • Voir le profil
Re : Interface processing
« Réponse #1 le: septembre 08, 2015, 11:55:12 am »
Bonjour

J'ai regardé Processing, cela ressemble beaucoup plus à du Java qu'a du C++ (par exemple au niveau des objets et de l'héritage). Mais cela peut être intéressant pour dialoguer entre un PC (Mac) et un Arduino, par exemple pour utiliser la souris et l'écran pour un TCO, ou un gros programme de contrôle d'un réseau.

Pierre

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 190
    • Voir le profil
    • Locoduino
Re : Interface processing
« Réponse #2 le: octobre 21, 2015, 10:34:16 am »
Je reprends le fil.
Processing marche très bien avec Arduino. Je vais utiliser cela pour mon module HOe.
En tout cas, cela marche bien avec les DEL donc avec les autres trucs aucun souci.
Donc voici les 1ères lignes du code :
/*Programme de gestion du module HOe via le PC*/

//Importation des lib
import processing.serial.*;
import g4p_controls.*;

//Configuration de la voie série
Serial arduino;
boolean serialConnected = false;

//Bouton voie série
GDropList serialPortListMenu;
GButton connectButton;
String[] serialPortList;

//Bouton commande canton
GButton Bcanton1;
GButton Bcanton2;
GButton Bcanton3;
boolean canton1 = false;
boolean canton2 = false;
boolean canton3 = false;

void setup()
{
  size(1024, 600);
  serialSetup();
  cantonSetup();
}

void draw()
{
  background(255);
  fill(0);
  stroke(0);
  //Décor des commandes 1
  text("Port série", 630, 35);
  text("Module HOe", 10, 20);
  line(620, 0, 620, 600);//Ligne verticale
  line(0, 40, 620, 40);//Ligne Gauche Ht
  line(620, 80, 1024, 80);//Ligne Droite Ht
  text("Commandes des cantons", 10, 60);
 
  //Dessin du réseau
  text("Canton 1", 80, 105);
  text("Canton 2", 30, 145);
  text("Canton 3", 80, 185);
  //Lignes canton 1
  if (canton1 == true) {
    stroke(#2ECC71);
  } else {
    stroke(#FF0000);
  }
  line(150, 100, 250, 100);
  line(250, 100, 300, 140);
  //Lignes canton 2
  if (canton2 == true) {
    stroke(#2ECC71);
  } else {
    stroke(#FF0000);
  }
  line(100, 140, 300, 140);
  //Lignes canton 3
  if (canton3 == true) {
    stroke(#2ECC71);
  } else {
    stroke(#FF0000);
  }
  line(150, 180, 250, 180);
  line(250, 180, 300, 140);
  //Plaque tournante
  fill(255);
  stroke(0);
  ellipse(300, 140, 70, 70);
 
  //Décor des commandes 2
  line(0,240,620,240);
}

// Fonctions pour la voie série
void serialSetup()
{
  serialPortList = Serial.list();
  serialPortListMenu = new GDropList(this, 700, 20, 300, serialPortList.length*24, serialPortList.length);
  serialPortListMenu.setItems(serialPortList, 0);
  connectButton = new GButton(this, 900, 50, 100, 22, "Connecter");
}

boolean connectSerial(String serialName)
{
  arduino = new Serial(this, serialName, 115200);
  serialConnected = true;
  return true;
}

void disconnectSerial()
{
  serialConnected = false;
  arduino.stop();
}

//Handler pour les boutons
void handleButtonEvents(GButton button, GEvent event) {
  if (button == connectButton && event == GEvent.CLICKED) {
    if (! serialConnected) {
      if (connectSerial(serialPortListMenu.getSelectedText())) {
        connectButton.setText("Deconnecter");
      }
    } else {
      disconnectSerial();
      connectButton.setText("Connecter");
    }
  }
  if (button == Bcanton1 && event == GEvent.CLICKED) {
    actionCanton1();
  }
  if (button == Bcanton2 && event == GEvent.CLICKED) {
    actionCanton2();
  }
  if (button == Bcanton3 && event == GEvent.CLICKED) {
    actionCanton3();
  }
}

//Commande des cantons
void cantonSetup() {
  Bcanton1 = new GButton(this, 400, 89, 100, 22, "Canton 1");
  Bcanton2 = new GButton(this, 400, 129, 100, 22, "Canton 2");
  Bcanton3 = new GButton(this, 400, 169, 100, 22, "Canton 3");
}

void actionCanton1() {
  canton1 = ! canton1;
}

void actionCanton2() {
  canton2 = ! canton2;
}

void actionCanton3() {
  canton3 = ! canton3;
}

//Fonctions pour les boutons de trains


//Touches de clavier qui définit aussi les actions pour le module HOe

Il me reste à insérer les handlers des touches pour faire des raccourcis et après à envoyer les ordres correspondants à l'Arduino. Il faut simplement faire une table de correspondance.

Ci joint une image, les couleurs des voies changent.

Pour l'essayer, téléchargez Processing3 et installez la lib G4P. Très simple, vous allez dans le gestionnaire de lib la cherchez et l'installez.
G.

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 190
    • Voir le profil
    • Locoduino
Re : Interface processing
« Réponse #3 le: octobre 21, 2015, 05:57:24 pm »
Maj du screen
G.

Marc-Henri

  • Full Member
  • ***
  • Messages: 132
    • Voir le profil
    • Modélisme ferroviaire & électronique
Re : Interface processing
« Réponse #4 le: octobre 27, 2015, 01:30:09 pm »
Bonjour Guillaume,

C'est intéressant et tes premiers essais sont encourageants !

Un choix possible pour l'ordinateur serait un Raspberry Pi, mais c'est une considération purement théorique... L'environnement que tu décris doit certainement tourner sur le Raspberry.

Meilleures salutations.

Marc-Henri

Guillaume

  • Global Moderator
  • Full Member
  • *****
  • Messages: 190
    • Voir le profil
    • Locoduino
Re : Interface processing
« Réponse #5 le: novembre 01, 2015, 09:44:37 pm »
Bonjour,
je ne vois pas l'apport d'un Rpi dans le truc. Je n'en vois que des contraintes pour moi.
Un simple ordi portable est amplement suffisant.
G.