Go Down

Topic: Problème de connexion entre Arduino et Processing (Read 1 time) previous topic - next topic

sindou

Bonjour, je suis newbie en Arduino et Processing
et cette année pour un projet de diplôme j'ai décidé de me lancer vers l'inconnue.

J'ai réalisé un système d'interaction avec des diodes laser, Processing et Arduino.
Lorsqu'un laser est activé, un son + une vidéo sont générés.
Jusque là tout va bien.
Je programme donc avec Processing ( utilisation fraîche de cette année aussi) tout fonctionne parfaitement quand j'utilise à la place d'Arduino, mon clavier, mais lorsque je relie l'Arduino à mon ordinateur... rien ne va plus, il m'affiche ce qui suit.

Exception in thread "Animation Thread" java.lang.NullPointerException
     at LASERHARPE2_pde.keyReleased(LASERHARPE2_pde.java:155)
     at processing.core.PApplet.handleKeyEvent(PApplet.java:1756)
     at processing.core.PApplet.dequeueKeyEvents(PApplet.java:1735)
     at processing.core.PApplet.handleDraw(PApplet.java:1437)
     at processing.core.PApplet.run(PApplet.java:1327)
     at java.lang.Thread.run(Thread.java:613)

je ne suis pas encore capable de déchiffrer ce genre de code, donc je ne sais pas ce qu'il en ressort.

J'ai huit lasers, chaque laser a un nom : laser a, b, c, d, e ,f ,g ,h.
et sur Processing chaque laser à une fonction.

Voici mon code :


/**
 * This sketch demonstrates how to use the <code>addListener</code> method of a <code>Recordable</code> class.
 * The class used here is <code>AudioPlayer</code>, but you can also add listeners to <code>AudioInput</code>,
 * <code>AudioOutput</code>, and <code>AudioSample</code> objects. The class defined in waveform.pde implements
 * the <code>AudioListener</code> interface and can therefore be added as a listener to <code>groove</code>.
 */
float chrono;
float a;
float b;
float c;
float d;
float e;
float f;
float g;
float h;
import ddf.minim.*;
float av;
float bv;
float cv;
float dv;
float ev;
float fv;
float gv;
float hv;

Minim minim;
AudioPlayer ason;
AudioPlayer hson;
AudioPlayer bson;
AudioPlayer cson;
AudioPlayer dson;
AudioPlayer eson;
AudioPlayer fson;
AudioPlayer gson;

import processing.video.*;
Movie amov;
Movie hmov;
Movie bmov;
Movie cmov;
Movie dmov;
Movie emov;
Movie fmov;
Movie gmov;
void setup(){
 size (576, 360);
 amov = new Movie(this, "amov.mov");chrono=0;

 hmov = new Movie(this, "hmov.mov");chrono=0;
 bmov = new Movie(this, "bmov.mov");
 
 cmov = new Movie(this, "cmov.mov");
 dmov = new Movie(this, "dmov.mov");
 emov = new Movie(this, "emov.mov");
 fmov = new Movie(this, "fmov.mov");
 gmov = new Movie(this, "gmov.mov");

 
size(576,360);
background(#000000);
a=0;
h=0;
b=0;
c=0;
d=0;
e=0;
f=0;
g=0;
av=0;
bv=0;
cv=0;
dv=0;
ev=0;
fv=0;
gv=0;
hv=0;}

void draw()

{ println (chrono); if (a==1){
  minim = new Minim(this);
 ason = minim.loadFile("ason.mp3", 512);
 ason.loop();a=3;
 background(0);
} if (av==1){tint(130, 130);amov.read();  image(amov, 0, 0);} if (av==3){chrono=chrono+1;tint(120, 120);amov.read();if (chrono>1024){amov.stop();amov.read();chrono=0;}   image(amov, 0, 0);}
 if (h==1){
  minim = new Minim(this);
 hson = minim.loadFile("hson.mp3", 512);
 hson.loop();h=3;
   background(0);
}println (chrono); if (hv==1){tint(130, 130);hmov.read();  image(hmov, 0, 0);} if (hv==3){chrono=chrono+1;tint(200, 200);hmov.read();if (chrono>380){hmov.stop();hmov.read();chrono=0;}  image(hmov, 0, 0);}
 if (b==1){minim = new Minim(this);
 bson = minim.loadFile("bson.mp3", 512);
 bson.loop();
b=3;} if(bv==1){tint(120, 120);bmov.read();  image(bmov, 0, 0);}
  if (c==1){minim = new Minim(this);
 cson = minim.loadFile("cson.mp3", 512);
 cson.loop();c=3;
   background(0);
}if(cv==1){tint(120, 120);cmov.read();  image(cmov, 0, 0);}
  if (d==1){minim = new Minim(this);
 dson = minim.loadFile("dson.mp3", 512);
 dson.loop();d=3;
   background(0);}if(dv==1){tint(120, 120);dmov.read();  image(dmov, 0, 0);}
  if (e==1){minim = new Minim(this);
 eson = minim.loadFile("eson.mp3", 512);
 eson.loop();e=3;
   background(0);}if(ev==1){tint(120, 120);emov.read();  image(emov, 0, 0);}
  if (f==1){minim = new Minim(this);
 fson = minim.loadFile("fson.mp3", 800);
 fson.loop();f=3;
   background(0);}if(fv==1){tint(120, 120);fmov.read();  image(fmov, 0, 0);}
  if (g==1){minim = new Minim(this);
 gson = minim.loadFile("gson.mp3", 512);
 gson.loop();g=3;
   background(0);}if(gv==1){tint(120, 120);gmov.read();  image(gmov, 0, 0);}
}


void keyPressed(){
if (key=='a'){ if (a==2){ ason.close();a=4;}if (a<3){a=1;}if (av<3){av=1;}if (av==3){av=4;amov.stop();}}
if (key=='h'){ if (h==2){ hson.close();h=4;}if (h<3){h=1;}if (hv<3){hv=1;}if (hv==3){hv=4;hmov.stop();}}
if (key=='b'){ if (b<3) {b=1;}if (bv<3){bv=1;}}
if (key=='c'){ if (c<3) {c=1;}if (cv<3){cv=1;}}
if (key=='d'){ if (d<3) {d=1;}if (dv<3){dv=1;}}
if (key=='e'){ if (e<3) {e=1;}if (ev<3){ev=1;}}
if (key=='f'){ if (f<3) {f=1;}if (fv<3){fv=1;}}
if (key=='g'){ if (g<3) {g=1;}if (gv<3){gv=1;}}


}

void keyReleased() {
if (key=='a'){if (a==4){a=0;}if (a==3) {a=2;}if (av==1){av=3;}if(av==4){av=0;}}
if (key=='h'){if (h==4){h=0;}if (h==3) {h=2;}if (hv==1){hv=3;}if(hv==4){hv=0;}}
if (key=='b'){bson.close();b=0;bv=0;bmov.stop();}
if (key=='c'){cson.close();c=0;cv=0;cmov.stop();}
if (key=='d'){dson.close();d=0;dv=0;dmov.stop();}
if (key=='e'){eson.close();e=0;ev=0;emov.stop();}
if (key=='f'){fson.close();f=0;fv=0;fmov.stop();}
if (key=='g'){gson.close();g=0;gv=0;gmov.stop();}
}


J'aimerais savoir si l'erreur vient de mon code
ou peut être de l'Arduino ( ce que je ne pense pas )


Merci. :)

fdufnews

Quote
tout fonctionne parfaitement quand j'utilise à la place d'Arduino, mon clavier, mais lorsque je relie l'Arduino à mon ordinateur... rien ne va plus
Ils sont reliés comment?
Si ton arduino est connecté en USB, il n'est pas vu comme un clavier par le PC mais comme une interface série.


sindou

quand je veux écrire en fichier texte : a b c d e f g h. avec les laser cela fonctionne, mais c'est pas sous processing.

fdufnews

Si j'ai bien compris c'est l'arduino qui doit envoyer les informations à Processing.
Il faut donc que tu remplaces tes fonctions keyPressed et keyReleased par des fonctions qui vont attendre un caractère venant par la liaison série (virtuelle) constituée par ton arduino.

Jean-François

Avec cette fonction à rajouter en bas du programme ;

Code: [Select]
void serialEvent(Serial p) {
 inString = p.readString();
 myPort.clear();
}
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

sindou

Ok,
j'ai mis le code à la fin du programme
et quand j'active Run il est écrit dans la fenêtre d'erreur : Cannot find a class or type named "Serial"


Jean-François

#7
Jun 15, 2010, 06:58 pm Last Edit: Jun 15, 2010, 06:59 pm by jfs Reason: 1
Je n'avais pas fais attention à ça, tu n'as pas de liaison avec Arduino depuis processing dans ton code, il te manque quelques choses comme ça :

http://processing.org/learning/libraries/simpleread.html


Poste également le code que tu as sur ton arduino.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

sindou

J'ai oublié de préciser que dans le montage de l'arduino
l'usb ne se connecte pas directement à l'arduino mais à part
ca ressemble à ca => http://www.practicalarduino.com/projects/virtual-usb-keyboard

c'était pour que l'ordinateur accepter plus facilement les port usb normal.

sindou

voici le code de mon arduino



#include "UsbKeyboard.h"

int ledPin = 13;
int trigger = 200;

void setup()
{
 pinMode (ledPin, OUTPUT);
 digitalWrite (ledPin, LOW);
 
 TIMSK0&=!(1<<TOIE0);
 cli();

 usbDeviceDisconnect();
 delayMs(250);
 usbDeviceConnect();

 sei();    

}

void loop()
{

 UsbKeyboard.update();
 
 if (analogRead(0) < trigger) {

   digitalWrite (ledPin, HIGH);
   UsbKeyboard.sendKeyStroke(KEY_A);
 }

 if (analogRead(1) < trigger) {
   digitalWrite (ledPin, HIGH);
   UsbKeyboard.sendKeyStroke(KEY_B);
 }
 
 if (analogRead(2) < trigger) {
   digitalWrite (ledPin, HIGH);
   UsbKeyboard.sendKeyStroke(KEY_C);
 }
 
 if (analogRead(3) < trigger) {
   digitalWrite (ledPin, HIGH);
   UsbKeyboard.sendKeyStroke(KEY_D);
 }
 
 if (analogRead(4) < trigger) {
   digitalWrite (ledPin, HIGH);
   UsbKeyboard.sendKeyStroke(KEY_E);
 }
 
 if (analogRead(5) < trigger) {
   digitalWrite (ledPin, HIGH);
   UsbKeyboard.sendKeyStroke(KEY_F);
 }
 
 if (analogRead(6) < trigger) {
   digitalWrite (ledPin, HIGH);
   UsbKeyboard.sendKeyStroke(KEY_G);
 }

 if (analogRead(7) < trigger) {
   digitalWrite (ledPin, HIGH);
   UsbKeyboard.sendKeyStroke(KEY_H);
 }

 else {
   digitalWrite (ledPin, LOW);
   }
}

void delayMs(unsigned int ms)
{
 for (int i = 0; i < ms; i++) {
   delayMicroseconds(1000);
 }
}

Jean-François

Je ne comprend pas trop le branchement de ton usb  :-?

Je ne sais pas si la librairie processing.Serial fonctionne de cette façon.

Normalement elle permet d'afficher tout les ports lus avec la fonction :

Code: [Select]
println(Serial.list());
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

sindou

j'ai changé le code de l'arduino pour utiliser le port usb de l'arduino et non pas celui de l'exterieur


int ledPin = 13;
int trigger = 200;

void setup()
{
 Serial.begin(9600);
 pinMode (ledPin, OUTPUT);
 digitalWrite (ledPin, LOW);
}

void loop()
{

 if (analogRead(0) < trigger) {
   digitalWrite (ledPin, HIGH);
   Serial.println("a");
   delay (100);
 }
 if (analogRead(1) < trigger) {
   digitalWrite (ledPin, HIGH);
   Serial.println("b");
   delay (100);
 }
 if (analogRead(2) < trigger) {
   digitalWrite (ledPin, HIGH);
   Serial.println("c");
   delay (100);
 }
 if (analogRead(3) < trigger) {
   digitalWrite (ledPin, HIGH);
   Serial.println("d");
   delay (100);
 }
 if (analogRead(4) < trigger) {
   digitalWrite (ledPin, HIGH);
   Serial.println("e");
   delay (100);
 }
 if (analogRead(5) < trigger) {
   digitalWrite (ledPin, HIGH);
   Serial.println("f");
   delay (100);
 }
 if (analogRead(6) < trigger) {
   digitalWrite (ledPin, HIGH);
   Serial.println("g");
   delay (100);
 }
 if (analogRead(7) < trigger) {
   digitalWrite (ledPin, HIGH);
   Serial.println("h");
   delay (100);
 }
 else {
   digitalWrite (ledPin, LOW);
   }
}


mais je ne sais pas si il est bon

Jean-François

#12
Jun 16, 2010, 07:33 am Last Edit: Jun 16, 2010, 07:41 am by jfs Reason: 1
ça devrait jouer.

Dans ton prog Processing tu rajoutes ça dans le setup :

Code: [Select]
myPort.bufferUntil(lf);

et ça dans les déclarations :

Code: [Select]
int lf = 10;  // 10 = LN (new line Feed) en ascii

Tu mets en place l'appel de la librairie Serial et ça devrait jouer avec le petit bout de code que je t'avais déjà mentionné.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

sindou


Jean-François

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Go Up