Problème de connexion entre Arduino et Processing

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 addListener method of a Recordable class.
  • The class used here is AudioPlayer, but you can also add listeners to AudioInput,
  • AudioOutput, and AudioSample objects. The class defined in waveform.pde implements
  • the AudioListener interface and can therefore be added as a listener to groove.
    /
    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. :slight_smile:

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.

Oui par USB c'est ça.

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.

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.

Avec cette fonction à rajouter en bas du programme ;

void serialEvent(Serial p) { 
  inString = p.readString(); 
  myPort.clear();
}

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"

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.

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 => practicalarduino.com

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

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);
}
}

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 :

println(Serial.list());

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

ça devrait jouer.

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

myPort.bufferUntil(lf);

et ça dans les déclarations :

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é.

Ca fonctionne :slight_smile:

super
merci :slight_smile:

Bonne nouvelle :wink: