Fleur de clown connectée : Différence entre versions

De Wiki d'activités IMA
(Montage)
 
(31 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 12 : Ligne 12 :
 
* Commander les matrices de leds NeoPixels et/ou la pompe
 
* Commander les matrices de leds NeoPixels et/ou la pompe
  
=Solution technique retenue et étude de faisabilité=
+
=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=
 +
Nous utilisons un arduino pour contrôler l'ensemble de notre système. Cet arduino est relié à un micro pour capter le son environnant, un neopixel ring afin de faire de la lumière ainsi qu'à un pont en H pour contrôler la pompe. Pourquoi un pont en H ? Afin de pouvoir contrôler la vitesse de notre moteur, en effet au début du montage nous ne connaissions pas le débit de notre pompe et nous voulions avoir la possibilité de la régler. La pompe est alimenté par une pile de 9V (au début nous pensions à 12V mais nous sommes rendu compte que 9V était suffisant si l'on exerçait une pression sur le tuyau de la pompe).
 +
 
 +
[[Fichier:Giordan_Malherbe_IOT_bb.png|500px]]
 +
 
 +
== Dimension de la fleur ==
 +
* rond centrale = 4,5 cm de diamètre
 +
* trou du milieu = 4,5 mm
 +
* pétale = 3 cm
 +
 
 +
 
 +
[[Fichier:Image_fleur_giordan.jpg|300px]]
  
 
==Solution retenue : Arduino !==
 
==Solution retenue : Arduino !==
  
 +
Voici le code de notre Arduino :
 +
#include <Adafruit_NeoPixel.h>
 +
 +
#define PIN 7
 +
#define PILOT_PWMA 6  // entrée "Enable" du pont en H
 +
 +
#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){
  
Partie Arduino
+
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 : [http://www.pobot.org/Traitement-du-son-par-FFT-fast.html?lang=fr Free efficient project here]
 
Ultimate tuto, a preview of the simplicity : [http://www.pobot.org/Traitement-du-son-par-FFT-fast.html?lang=fr 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

Version actuelle datée du 22 janvier 2017 à 20:42

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

Nous utilisons un arduino pour contrôler l'ensemble de notre système. Cet arduino est relié à un micro pour capter le son environnant, un neopixel ring afin de faire de la lumière ainsi qu'à un pont en H pour contrôler la pompe. Pourquoi un pont en H ? Afin de pouvoir contrôler la vitesse de notre moteur, en effet au début du montage nous ne connaissions pas le débit de notre pompe et nous voulions avoir la possibilité de la régler. La pompe est alimenté par une pile de 9V (au début nous pensions à 12V mais nous sommes rendu compte que 9V était suffisant si l'on exerçait une pression sur le tuyau de la pompe).

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


Image fleur giordan.jpg

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