Cette année j'ai utilisé la base du montage de l'an dernier. En remplaçant le moteur électrique par de la fumée et une animation laser.
Ma machine à fumée n'étant pas pilotable en DMX, j'ai utilisé un relais branché en parallèle du poussoir de sa télécommande (Les LED témoins et le poussoir sont directement alimentés en 230V...bon elle n'était pas chère du tout cette machine à fumée, tout s'explique...).
Le projecteur laser est situé dans le coffre de ma voiture, piloté en DMX via un sketch Processing et cette interface. Sur réception d'une commande envoyée par l'Arduino MKR1000, le sketch lance la lecture d'un fichier ILDA stocké sur la carte SD du projecteur et le déplacement du faisceau.
A toutes fins utiles, le voici (faudrait que je le mette sur mon Github un de ces jours):
import processing.net.*;
import opendmx.*;
OpenDmx openDmx = null;
Server srv;
Client client;
boolean pressed=false;
int universeSize=11;
byte[] data = new byte[universeSize];
boolean initialized = false;
void setup()
{
frameRate(50);
background(#dd0000);
srv = new Server(this, 12346);
noStroke();
try {
openDmx = new OpenDmx(0);
initialized = true;
println("DMX Adapter found");
} catch (FTDIException e) {
initialized = false;
println(e);
// do something reasonable other than exit..
println("LaserLess Mode");
}
}
void draw(){
//wait for a keypress or mousepress to trigger laser animation
if (keyPressed == true && pressed == false) {
mousePressed();
pressed = true;
}
if(keyPressed == false){
pressed = false;
}
//wait for an incoming TCP connection to trigger laser animation
client = srv.available();
if (client != null) {
client.read();
mousePressed();
print("client.read()");
}
}
void mousePressed()
{
anim();
}
void anim(){
println("animating laser");
if (!initialized){
println("Laserless mode on, skipping.");
return;
}
int animationLength = 4000; //ms
long t0 = System.currentTimeMillis();
long t1 = 0;
//prepare DMX Buffer
for(int i=0;i<universeSize;i++){
data[i] = 0;
}
data[0] = byte(150); //select manual DMX mode
data[2] = byte(130); //select 14th entry of PlayList.pla on SD CARD
data[10] = byte(100); //zoom out a bit to make the bat smaller
data[8] = byte(40); //move beam to left
openDmx.sendData(data, universeSize);
try{
Thread.sleep(100);
}catch(InterruptedException e) {}
data[0] = byte(150); //select manual DMX mode
data[2] = byte(130); //select 14th entry of PlayList.pla on SD CARD
data[8] = byte(140); //auto-translate to the right at medium speed
data[10] = byte(100); //zoom out a bit to make the bat smaller
//send DMX buffer for animationLength ms
do{
openDmx.sendData(data, universeSize);
try{
Thread.sleep(100);
}catch(InterruptedException e) {}
t1 = System.currentTimeMillis();
}while(t1 - t0 < animationLength);
}
Le système en action:
J'ai aussi fait un chaudron à bonbons, à l'aide d'un brumisateur comme celui-ci, placé dans un saladier.
J'ai fait une grille découpée au laser pour laisser passer le brouillard mais j'ai constaté qu'il se condense sur la grille. Il faut laisser libre le jet de brouillard sortant du brumisateur. L'effet est vraiment sympa, pour peu qu'on ait des bonbons water-proof. Ca chauffe aussi un peu alors faut pas laisser trop longtemps les chocobons dans le chaudron .
La version améliorée de l'an prochain sera encore plus sympa.