Logo Mon Club Elec

EeePC-Bot : Interface Processing Mplayer + Espeaker + Envoi / Réception chaine série

http://web.archive.org/web/20210804223007/https://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertSerie

Le EeePC-Bot est une interface de traitement innovante qui combine Mplayer, Espeaker et un système d’envoi et de réception de chaîne série. Il offre une solution complète pour les utilisateurs qui souhaitent créer des robots autonomes et des systèmes de contrôle à distance. Grâce à sa conception modulaire, le EeePC-Bot peut être facilement adapté à différents projets et applications. Dans cet article, nous allons examiner en détail les fonctionnalités et les avantages du EeePC-Bot et comment il peut être utilisé pour créer des robots autonomes et des systèmes de contrôle à distance.

EeePC-Bot : Interface Processing Mplayer + Espeaker + Envoi / Réception chaine série

Description

  • en réception série : réception chaîne caractères sur le port série et déclenchement en ligne de commande progammée :
    • du logiciel espeak pour la synthèse vocale
    • du logiciel mplayer pour les bruitages sonores
  • en envoi série : envoi chaine de caractère sur le port Série par Champ Texte + bouton graphique

Code Processing du programme :

// Programme processing
// généré avec le générateur de code Processing
// www.mon-club-elec.fr
// par X. HINAULT – Avril 2011 – tous droits réservés

/////////////// Description du programme ////////////
// Utilise un/des objets String (chaîne de caractère)
// Utilise le port Serie

// Utilise la librairie GUI controlP5
// Utilise un/des bouton(s) simple(s) (Button)
// Utilise un/des champ(s) texte (Textfield)
// Ajoute un bouton et un champ pour chemin fichier

// Utilise la ligne de commande programmée
// Utilise mplayer pour jouer des sons (Ubuntu)
// Utilise espeaker pour la synthèse vocale des sons (Ubuntu)

/*
Reçoit la chaine renvoyée par Arduino et l’affiche dans la console.
La chaine de texte reçue est synthétisée si le format est valide.  

Le fichier son voulu est joué en fonction de la chaine de caractères reçue
à l’aide d’une ligne de commande programmée qui lance le logiciel système Mplayer (Ubuntu)

Permet également l’envoi vers Arduino pour tests d’une chaîne saisie dans un champ texte.
*/

// XXXXXXXXXXXXXXXXXXXXXX ENTETE DECLARATIVE XXXXXXXXXXXXXXXXXXXXXX

// inclusion des librairies utilisées

import processing.serial.*; // importe la librairie série processing

import controlP5.*; // importe la librairie GUI controlP5
// cette librairie doit être présente dans le répertoire /libraries du répertoire Processing
// voir ici : http://www.sojamo.de/libraries/controlP5/

// déclaration objets

String chaineEnvoi = «  »; // déclare un objet String (chaine de caractère)

String[] command ; // pour envoi ligne de commande espeak

String nomFichier=«  »; // variable pour nom du fichier son à jouer
String cheminFichier=« /home/xavier/Bureau/mes_sons/ »; // chemin complet avec / de fin

//— chemin où se trouvent les fichiers sons – à adapter selon les cas —

// — port Série —
Serial  myPort; // Création objet désignant le port série

// — interface GUI —
ControlP5 controlP5; // déclare un objet principal de la librairie GUI controlP5

Button envoiButton; // déclare objet Button  

Textfield chaineText; // déclare des objets Textfield

// déclaration variables globales

//—— déclaration des variables de couleur utiles —-
int jaune=color(255,255,0);
int vert=color(0,255,0);
int rouge=color(255,0,0);
int bleu=color(0,0,255);
int noir=color(0,0,0);
int blanc=color(255,255,255);
int bleuclair=color(0,255,255);
int violet=color(255,0,255);

// XXXXXXXXXXXXXXXXXXXXXX  Fonction SETUP XXXXXXXXXXXXXXXXXXXXXX

void setup(){ // fonction d’initialisation exécutée 1 fois au démarrage

        // —- initialisation paramètres graphiques utilisés
        colorMode(RGB, 255,255,255); // fixe format couleur R G B pour fill, stroke, etc…
        fill(0,0,255); // couleur remplissage RGB
        stroke (0,0,0); // couleur pourtour RGB
        rectMode(CORNER); // origine rectangle : CORNER = coin sup gauche | CENTER : centre
        imageMode(CORNER); // origine image : CORNER = coin sup gauche | CENTER : centre
        //strokeWeight(0); // largeur pourtour
        frameRate(30);// Images par seconde

        // — initialisation fenêtre de base —
        size(400, 130); // ouvre une fenêtre xpixels  x ypixels
        background(0,0,0); // couleur fond fenetre

// — initialisation des objets et fonctionnalités utilisées —

        //————- initialisation port série —-
        println(Serial.list()); // affiche dans la console la liste des ports séries
        // Vérifier que le numéro du port série utilisé est le meme que celui utilisé avec  Serial.list()[index]
        myPort = new Serial(this, Serial.list()[0], 115200); // Initialise une nouvelle instance du port Série
        //myPort = new Serial(this, « /dev/ttyUSB0 », 115200); // Initialise une nouvelle instance du port Série
        myPort.bufferUntil(\n); // attendre arrivée d’un saut de ligne pour générer évènement série

        //======== Initialisation Objets GUI ControlP5 =========

        controlP5 = new ControlP5(this); // initialise l’objet principal de la librairie GUI controlP5

        // typeObjet nomObjet=controlP5.addObjet(paramètres); // pour info : déclaration / initialisation possible en 1 ligne
        // Textfield field = controlP5.addTextfield(« myWindowTextfield »,70,130,100,20); // exemple

        //======== Initialisation Objets Button =========

        //—- le bouton envoi chaine
        envoiButton=controlP5.addButton(« envoiButton »,0,width60,height40,50,24); // initialise et ajoute un Button au ControlP5
        envoiButton.setLabelVisible(true); // affichage des labels
        envoiButton.setLabel(« ENVOI »); // fixe label du bouton
        envoiButton.setColorActive(color(255,0,0)); // fixe la couleur active
        envoiButton.setColorForeground(color(0,255,255)); // fixe couleur avant

        //======== Initialisation Objets Textfield =========

        //—- champ texte saisie chaine
        chaineText=controlP5.addTextfield(« cheminText »,10,height40,300,20); // initialise et ajoute un Textfield au ControlP5
        chaineText.setAutoClear(false); // autoeffacement après return
        chaineText.setValue(chaineEnvoi); // initialise Texte du champ
        chaineText.setLabelVisible(true); // affichage des labels
        chaineText.setLabel(« CHEMIN »); // fixe label
        chaineText.setColorActive(color(255,0,0)); // fixe la couleur active
        chaineText.setColorForeground(color(0,255,255)); // fixe couleur avant

} // fin fonction Setup

// XXXXXXXXXXXXXXXXXXXXXX Fonction Draw XXXXXXXXXXXXXXXXXXXX

void  draw() { // fonction exécutée en boucle

// tout se passe dans SerialEvent

} // fin de la fonction draw()

// XXXXXXXXXXXXXXXXXXXXXX Autres Fonctions XXXXXXXXXXXXXXXXXXXXXX

//————- Fonction de gestion des évènements série —-
void serialEvent (Serial myPort) { // fonction appelée lors de la survenue d’un évènement série

        // ******** Gestion de la valeur reçue sur le port série : **********

        String inString = myPort.readStringUntil(\n); // chaine stockant la chaîne reçue sur le port Série
        // saut de ligne en marque de fin

        if (inString != null) { // si la chaine recue n’est pas vide

        print (inString); // affichage brut de la chaine recue        

        //xxxxxxxxxxxxxxxxxxxxxxxxxx Gestion du nom de fichier son v2 xxxxxxxxxxxxxxxxxxxxxxxxxx

        //———— analyse de la chaine reçue et sélection son ——–
        //String nomFichier= » »; // String pour nom fichier

          if (match(inString,« mplayer= »)!=null) { // si chaine contenant mplayer= reçue

            println(« Chaine mplayer valide reçue ! « ); // debug

            String[] chaines = split(inString, ‘=’); // sépare chaine par le signe =

            println (chaines[0]); // chaine mplayer=
            println (chaines[1]); // chaine nomfichier

            if (chaines[1]!=«  ») { // si une chaine valide a été reçue

            joueSonMplayer(cheminFichier, chaines[1]); // appelle la fonction lecture son avec mplayer – sous Ubuntu

             //— signale à Arduino fin son
             myPort.write(‘H’); // envoie le caractère sur le port Série

            } // fin si list[1] pas vide

          } // fin si chaine espeak

          //xxxxxxxxxxxxxxxxxxxxxxxx Gestion chaine texte pour espeak xxxxxxxxxxxxxxxx

          if (match(inString,« espeak= »)!=null) { // si chaine contenant espeak= reçue

            println(« Chaine espeak valide reçue ! « ); // debug

            String[] chaines = split(inString, ‘=’); // sépare chaine par le signe =

            println (chaines[0]); // chaine espeak
            println (chaines[1]); // chaine à parler

            if (chaines[1]!=«  ») { // si une chaine valide a été reçue

              direTexte (chaines[1]); // espeak la chaine extraite

             //— signale à Arduino fin son
             myPort.write(‘H’); // envoie le caractère sur le port Série

            } // fin si list[1] pas vide

          } // fin si chaine espeak

        } // fin condition chaine recue pas vide

} // fin de la fonction de gestion des évènements Série

// Gestion des évènements des objets GUI controlP5 —-

//—— fonction gestion globale des évènements GUI controlP5
public void controlEvent(ControlEvent theEvent) {
        //println(theEvent.controller().name());// affiche le nom de l’évènement
}

        //—- evenement bouton envoi chaine

void envoiButton(int theValue) { // fonction évènement Button de meme nom – reçoit la valeur

        println(« Evènement envoiButton »);

        myPort.write(chaineText.getText()+« \n« ); // envoie la chaine suivi saut ligne sur le port Série
        print(« Envoi de la chaine : »);
        print(chaineText.getText()+« \n« );
        chaineText.setValue(«  »); // vide le champ texte

} // fin evènement bouton envoi

// —— gestion évènement Textfield ——

        //—- evenement champ texte chemin fichier

public void chaineText(String theText) { // fonction évènement Textfield de meme nom – déclenché par return – reçoit la chaine

        //println(« Evènement CheminText avec valeur = « +theText);

        chaineEnvoi=theText; // mémorise le contenu du champ

        //println(« Le chemin est : »+chaineEnvoi);

} // fin evènement champ texte chemin fichier

//——————— fonction lecture son avec Mplayer —————
void joueSonMplayer(String cheminSon, String fichierSon) {

 //—— code type pour jouer son avec mplayer par ligne commande (Ubuntu) —-

command = new String[3]; // tableau String pour la ligne de commande

// mplayer /home/hinault/Bureau/mes_sons/r2d2_2.mp3 -quiet
command[0] = « mplayer »;
command[1] = cheminSon+fichierSon;
command[2]=« -quiet »;

//— pour info :  mplayer r2d2_1.mp3 -af volume=3

//— exécution de la ligne de commande (code Java)

try {
    Process p = exec(command); // exécute la commande

    //— récupère la sortie de la commande dans la console de Processing
    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = null;
    while ((line = in.readLine()) != null) {
      System.out.println(line);
    }//fin while
  } // fin try
  catch (IOException e) { // gestion exception
    e.printStackTrace();
  }  // fin catch

} //——————— fin joueSonMplayer

//————- fonction d’appel à espeak par ligne de commande —–

void direTexte(String texte) {
  // le paquet espeak doit etre installé sous Ubuntu (depuis la logithèque)

command = new String[10];
// espeak -v fr -s 140 « lecture texte espeak »
// espeak -v fr -s 80 -p 30 \ »moteur droit en marche avant\ »
command[0] = « espeak »;
command[1] = « -v »;
command[2]=« fr+m4 »;
// les voix sont dans /usr/share/espeak-data/voices/!v
// les variantes dispo sont : croak  f1  f2  f3  f4  fast  klatt  klatt2  klatt3  m1  m2  m3  m4  m5  m6  m7  whisper
// pour utiliser une variante faire :  espeak -ven+m3
command[3]=« -s »; // la vitesse
command[4]=« 120 »; // entre 30 et 200
command[5]=« -p »; // la tonalité
command[6]=« 40 »; // entre 0 et 99
command[7]=« -a »; // l’amplitude = volume  
command[8]=« 7 »; // entre 0 et 20
command[9]=« \ »« +texte+« \ »« ; // le texte entre guillemets

// param bien : voix m4/vitesse 120/ tonalité =40
// param bien : voix m2 / vitesse 100 / Tonalité = 20

//— exécution de la ligne de commande
try {
    Process p = exec(command); // exécute la commande

    //— récupère la sortie de la commande dans la console de Processing
    BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = null;
    while ((line = in.readLine()) != null) {
      System.out.println(line);

    }

  }
  catch (IOException e) {
    e.printStackTrace();
  }  

}

//XXXXXXXXXXXXXXXXXX Fin du programme XXXXXXXXXXXXXXXXX
 

Noter cet article

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Archive Mon Club Elec

Articles populaires

Newsletter

Inscrivez-vous maintenant et bénéficiez d'un soutien continu pour réaliser vos travaux électriques en toute sécurité.