Fleur de clown connectée

De Wiki d'activités IMA

Fleur de clown connectée


Présentation du projet

Ce projet de création d'objet connecté part d'une idée toute simple : remettre des vieux gags au gout du jour. L'objectif est de créer, pour un utilisateur, une fleur lumineuse attrayante à l'oeuil qui peut arroser ses victimes.

Constitué de leds multicolores, la fleur s'allume lorsqu'un clap est perçu. Au bout d'un certain nombre de clap une pompe à eau s'active pour projeter de l'eau et arroser la cible.

Objectifs

  • Acquérir un signal audio (analogique)
  • Le traiter en le décomposant selon le volume
  • Commander les matrices de leds NeoPixels et/ou la pompe

Liste du matériel

  • Pompe à eau OK
  • Arduino OK
  • Micro OK
  • Pont en H 12V OK
  • Neopixels OK
  • Aimants OK
  • Allimentation 12V OK
  • Pile 9V OK
  • Fleur en bois (Fabricarium)

Montage

Giordan Malherbe IOT bb.png

Dimension de la fleur

  • rond centrale = 4,5 cm de diamètre
  • trou du milieu = 4,5 mm
  • pétale = 3 cm
  • largeur minimal = 1,5 cm

Solution retenue : Arduino !

Voici le code de notre Arduino :

  1. include <Adafruit_NeoPixel.h>
  1. define PIN 7
  2. define PILOT_PWMA 6 // entrée "Enable" du pont en H
  1. define THRESHOLD 170

Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800); const int sampleWindow = 50; // Sample window width in mS (50 mS = 20Hz) const int PILOT_A = 3; const int PILOT_B = 4; const int standby = 2; unsigned int sample;

    int sensorPin = A0;
   int sensorValue = 0;
   int iteration = 0;
   int farce = 0;
   double volts;
   double moyenne=0;
   int compteur=0;

void setup() {

 strip.begin();
 strip.setBrightness(30); //adjust brightness here
 strip.show(); // Initialize all pixels to 'off'
 Serial.begin (115200);
 //a decommenter pour moteur
 pinMode(standby,OUTPUT);
 digitalWrite(standby,HIGH);
 pinMode(PILOT_A, OUTPUT) ;
 pinMode(PILOT_B, OUTPUT) ;
 pinMode(PILOT_PWMA, OUTPUT) ;

}

void loop() {

  unsigned long startMillis= millis();  // Start of sample window
  unsigned int peakToPeak = 0;   // peak-to-peak level
  unsigned int signalMax = 0;
  unsigned int signalMin = 1024;
  
   
  sample = analogRead(0);
  compteur=compteur+1;
  moyenne=(moyenne*(compteur-1)+sample)/compteur;
  Serial.println(moyenne);
  if (sample>moyenne+THRESHOLD){
    Serial.println("wazawa");
    iteration=iteration+1;
    colorWipe(strip.Color(255, 0, 0), 50); // red
  }
  else {
    colorWipe(strip.Color(0, 0, 0), 0); // eteind
  }
  
  if (iteration%3==2){
    Serial.println("moteur");
      digitalWrite (PILOT_A, LOW) ;
      digitalWrite (PILOT_B, HIGH) ;
      analogWrite(PILOT_PWMA,255);
      rainbow(500);
      digitalWrite (PILOT_A, LOW) ;
  digitalWrite (PILOT_B, LOW) ;
   analogWrite(PILOT_PWMA,0);
   iteration=iteration+1;
  }
    

}

// Fill the dots one after the other with a color void colorWipe(uint32_t c, uint8_t wait) {

 for(uint16_t i=0; i<strip.numPixels(); i++) {
     strip.setPixelColor(i, c);
     strip.show();
     delay(wait);
 }

}

void rainbow(uint8_t wait) {

 uint16_t i, j;

 for(j=0; j<256; j++) {
   for(i=0; i<strip.numPixels(); i++) {
     strip.setPixelColor(i, Wheel((i+j) & 255));
   }
   strip.show();
   delay(wait);
 }

}

// Slightly different, this makes the rainbow equally distributed throughout void rainbowCycle(uint8_t wait) {

 uint16_t i, j;

 for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
   for(i=0; i< strip.numPixels(); i++) {
     strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
   }
   strip.show();
   delay(wait);
 }

}

// Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. uint32_t Wheel(byte WheelPos) {

 if(WheelPos < 85) {
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
 } else if(WheelPos < 170) {
  WheelPos -= 85;
  return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
 } else {
  WheelPos -= 170;
  return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
 }

}

void direction (byte dir){

if (dir == 0){

digitalWrite (PILOT_A, LOW) ; digitalWrite (PILOT_B, LOW) ; } else{

digitalWrite (PILOT_A, LOW) ; digitalWrite (PILOT_B, HIGH) ; } }


Lien utile : http://www.instructables.com/id/A-Very-Quick-NeoPixel-16-Ring-Test-With-Arduino-Un/

Ultimate tuto, a preview of the simplicity : Free efficient project here


Objet final

  • Nous avons un objet portable, plus besoins d'alimentation secteur il peut être déplacé facilement, il est cependant un peu encombrant et les câbles ne sont pas très long ni protégés.
  • La fleur capte d'abord le volume ambiant et en fait une moyenne sur quelque seconde (il est conseillé de faire du bruit initialement afin que la fleur ne se déclenche pas toute seul).
  • La première fois que la fleur capte un son élevé, une lumière rouge s'affiche, la deuxième fois le moteur se met en route et projette de l'eau
  • Le tuyau du moteur est écrasé pour qu'il y ait de la pression et pouvoir arroser la personne à une certaine distance.

Possibilités d'amélioration

  • Ajout d'une fonction via téléphone type modification des couleurs/ nombre de clap etc...(dans ce cas là besoin d'une puce bluetooth)
  • Amélioration du packaging et du matériel pour que le système soit plus portable

Avancement

03/01/2017

Début du projet, listing de nos besoins. Et début du montage

05/01/2017

Avancement du montage

10/01/2017

Début de la programmation de l'arduino

12/01/2017

Le montage est fini, nous arrivons à allumer la lumière quand un son d'une certaine intensité est detecté Nous avons reçu la carte nous allons faire les branchements.

17/01/2017

Impression de la feuille au fab-lab.

19/01/2017

Test avec la fleur qui a été imprimé quelque jours plus tôt, finalement nous n'avons pas besoin de 12V, 9V suffisent puisqu'on est obligé de mettre une pression sur la le bout de la pompe.

20/01/2017

Assemblage de l'ensemble de la fleur à l'aide de fil de fer.

Poster final

http://projets-ima.plil.net/mediawiki/images/d/d1/Fleur-Connect%C3%A9e-Giordan_Malherbe_Ben_mustapha.pdf