Fleur de clown connectée : Différence entre versions
(→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 | ||
− | = | + | =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){ | ||
− | + | 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
Sommaire
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).
Dimension de la fleur
- rond centrale = 4,5 cm de diamètre
- trou du milieu = 4,5 mm
- pétale = 3 cm
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){
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.