Problème transmission arduino/processing

Bonjour,

Je suis actuellement étudiant en dsaa design graphique et j'ai eu la chance de pouvoir découvrir et suivre un certain nombre de cours sur arduino et processing suite à cette formation.

En ce moment, nous travaillons sur des projets mêlants les deux logiciels et mon projet consiste à récupérer les données d'un capteur de vibration piezo afin d'influer sur l'affichage de plusieurs images. En gros, une image de base est affiché pour le cas ou le capteur est proche de 0, j'ai ensuite déterminer 3 autres paliers qui une fois dépassé permette l'affichage d'une autre image. Pour réaliser le montage je me suis inspiré de ce montage là (http://www.flossmanualsfr.net/arduino/ch019_son-qui-provoque-lumiere)

Le problème est que sur arduino je relève des valeurs variant environ de 0 à 1000, j'exécute un map() dans arduino pour que ces valeurs coïncident avec me paliers créés dans processing mais une fois que je relèvent les valeurs dans processing elles varient entre 10 et 50 ce qui ne colle pas au map() que j'ai évoquer plus haut. J'ai essayer de changer les valeurs du map(), je me suis posé là question si la résistance du montage pouvait également influer sur mon problème et j'ai donc tester plusieurs résistances différentes mais rien y fait je retrouve toujours les mêmes valeurs variant entre 10 et 50.

Je suis un peu perdu pour le coup, je ne sais pas si c'est un problème de code ou alors de mon montage. :confused:

Voilà mon code arduino :

// Variable pour désigner quelle pin est utilisée pour le capteur
int capteurPiezo = A0; // pin Analog 0
// Variable pour contenir la valeur du capteur
int valeurPiezo ;


void setup()
{
    // Établit la connextion sérielle à 9600 baud
    Serial.begin(9600);
}

void loop()
{
    // Lit la pin du capteur et l'assigne à la variable valeurPiezo
    valeurPiezo = analogRead(capteurPiezo);
    // Convertit la valeur du capteur en valeur pour la LED
    valeurPiezo = map(valeurPiezo, 0, 1053, 0, 800);
    // Affiche au moniteur sériel la valeur de valeurPiezo
    Serial.println(valeurPiezo);
    delay(300);
}

et voilà mon code processing :

import processing.serial.*;

//Détection de la carte Arduino 
Serial port;

int val;
PImage photo;
PImage photo2;
PImage photo3;
PImage photo4;

void setup() {
  String portName = "/dev/tty.usbmodem411"; //change the 0 to a 1 or 2 etc. to match your port
port = new Serial(this, portName, 9600); 
size(1280,720);
background(0);

photo = loadImage("La_fenetre.jpg");
photo2 = loadImage("La_fenetre_2.jpg");
photo3 = loadImage("La_fenetre_3.jpg");
photo4 = loadImage("La_fenetre_4.jpg");
}



void draw() {
  //Attente de 50 ms avant d'exécuter le programme, doit coincider 
  //avec le delay de la carte Arduino.
  delay(300);
  
   if (0 < port.available()) {  
   val = port.read();         
   }
    image(photo, 0, 0); 

if( val > 200) {
    image(photo2, 0, 0);
  }  

if( val > 400) {
    image(photo3, 0, 0);
  }  
  
  if( val > 600) {
    image(photo4, 0, 0);
  }  
  println(val);

}

Merci d'avance pour votre aide ! :slight_smile:

Salut,

Ta gestion du port série n'est pas bonne, regarde l'exemple ici :
http://arduino.cc/en/tutorial/graph
(le code processing est en commentaire après le code arduino)

Salut,

Déjà merci pour ton aide,

Ensuite, je n'arrive toujours pas à appliquer le code processing à mon cas, j'ai essayé de repérer les éléments propres à la récupération des données d'arduino et de les appliquer dans mon programme, mais visiblement je ne le fais pas bien parce que le message suivant apparait dans processing : " the method buferUntil(int) in thé type serial is not applicable for the arguments (String)

Voilà comment j'ai recomposé le code :

import processing.serial.*;

//Détection de la carte Arduino 
Serial port;

int val;
PImage photo;
PImage photo2;
PImage photo3;
PImage photo4;

void setup() {
 println(Serial.list());
port = new Serial(this, Serial.list()[0], 9600); 
port.bufferUntil("/dev/tty.usbmodem411");

size(1280,720);
background(0);

photo = loadImage("La_fenetre.jpg");
photo2 = loadImage("La_fenetre_2.jpg");
photo3 = loadImage("La_fenetre_3.jpg");
photo4 = loadImage("La_fenetre_4.jpg");
}



void draw() {
  //Attente de 50 ms avant d'exécuter le programme, doit coincider 
  //avec le delay de la carte Arduino.
  delay(100);
    String portName = myPort.readStringUntil("/dev/tty.usbmodem411"); 

   if (0 < port.available()) {  
   val = port.read();         
   }
    image(photo, 0, 0); 

if( val > 200) {
    image(photo2, 0, 0);
  }  

if( val > 400) {
    image(photo3, 0, 0);
  }  
  
  if( val > 600) {
    image(photo4, 0, 0);
  }  
  println(val);

}

Qu'est ce que je fais mal ? :confused:

PS : Même message d'erreur si j'exécute exactement le même programme que dans l'exemple que tu m'as donné

Dembow:
Qu'est ce que je fais mal ? :confused:

A vrai dire tout .... Ca n'a rien a voir avec l'exemple du lien, essaye de le comprendre avant de piquer une ligne au pif en esperant que ça marche par magie

Désolé d'insister, je suis reparti de mon sketch initial, j'ai VRAIMENT essayer de comprendre, mais je n'arrive toujours à rien..

Serait-il possible pour toi de m'expliquer un peu quels sont les erreurs que je fais à partir de ce code ? :confused:

import processing.serial.*;

//Détection de la carte Arduino 
Serial port;

int val;
PImage photo;
PImage photo2;
PImage photo3;
PImage photo4;

void setup() { 
size(1280,720);
port = new Serial(this, "/dev/tty.usbmodem411", 9600);
background(0);

photo = loadImage("La_fenetre.jpg");
photo2 = loadImage("La_fenetre_2.jpg");
photo3 = loadImage("La_fenetre_3.jpg");
photo4 = loadImage("La_fenetre_4.jpg");
}



void draw() {
  //Attente de 300 ms avant d'exécuter le programme, doit coincider 
  //avec le delay de la carte Arduino.
  delay(300);
   
   if (0 < port.available()) {  
   val = port.read();         
   }
    image(photo, 0, 0); 

if( val > 200) {
    image(photo2, 0, 0);
  }  

if( val > 400) {
    image(photo3, 0, 0);
  }  
  
  if( val > 600) {
    image(photo4, 0, 0);
  }  
  println(val);

}

Avant de commencer à afficher tes images avec tes conditions if, commence à régler uniquement ton problème de lecture de valeur.... tu affichera tes belles images après.

Mais l'affichage des images ne me pose pas de problèmes, j'ai réalisé le sketch tout d'abord uniquement sur processing avec mouseY pour faire changer les images, ç'est au moment de remplacer la valeur de mouseY par la valeur de mon capteur arduino que ça bloque.

Si je retire toutes les références aux images mon code ressemble à ça :

import processing.serial.*;

//Détection de la carte Arduino 
Serial port;
int val;


void setup() { 
port = new Serial(this, "/dev/tty.usbmodem411", 9600);
}


void draw() {
  //Attente de 300 ms avant d'exécuter le programme, doit coincider 
  //avec le delay de la carte Arduino.
  delay(300);
   
   if (0 < port.available()) {  
   val = port.read();         
   }
   
  println(val);

}

Mais ça me donne indéfiniment une suite de 3 valeurs qui se répète sans cesse.

vire ce delay(300) pour ce que tu veux faire avec il devrait se trouver dans le setup()

Ouep c'est fait, mais cela ne change rien à mon soucis :s

cette exemple est donné dans les fichiers Processing :

/**
 * Simple Read
 * 
 * Read data from the serial port and change the color of a rectangle
 * when a switch connected to a Wiring or Arduino board is pressed and released.
 * This example works with the Wiring / Arduino program that follows below.
 */


import processing.serial.*;

Serial myPort;  // Create object from Serial class
int val;      // Data received from the serial port

void setup() 
{
  size(200, 200);
  // I know that the first port in the serial list on my mac
  // is always my  FTDI adaptor, so I open Serial.list()[0].
  // On Windows machines, this generally opens COM1.
  // Open whatever port is the one you're using.
  String portName = Serial.list()[0];
  myPort = new Serial(this, portName, 9600);
}

void draw()
{
  if ( myPort.available() > 0) {  // If data is available,
    val = myPort.read();         // read it and store it in val
  }
  background(255);             // Set background to white
  if (val == 0) {              // If the serial value is 0,
    fill(0);                   // set fill to black
  } 
  else {                       // If the serial value is not 0,
    fill(204);                 // set fill to light gray
  }
  rect(50, 50, 100, 100);
}
// Wiring / Arduino Code
// Code for sensing a switch status and writing the value to the serial port.

int switchPin = 4;                       // Switch connected to pin 4

void setup() {
  pinMode(switchPin, INPUT);             // Set pin 0 as an input
  Serial.begin(9600);                    // Start serial communication at 9600 bps
}

void loop() {
  if (digitalRead(switchPin) == HIGH) {  // If switch is ON,
    Serial.print(1, BYTE);               // send 1 to Processing
  } else {                               // If the switch is not ON,
    Serial.print(0, BYTE);               // send 0 to Processing
  }
  delay(100);                            // Wait 100 milliseconds
}

Essaye de t'en inspirer ou tu le modifies pour ce que tu veux faire.