À l'occasion d'une soirée avec le collectif OTTO10, je réalise un chapo♥ original. J'utilise des leds multicolores et un Arduino Uno que je viens d’acquérir dans un haut de forme en mousse pour en faire une animation originale.
Et pour le nom de ce modèle, ce sera le ChapoCœur (Heart Top Hat) !!!
J'ai déjà réalisé plusieurs chapeaux en mousse 100% polyéthylène et j'ai dessiné de nombreux patrons de plusieurs formes différentes.
Pour cet événement sur le thème du mariage, j'utilise une multitude de cœurs .
J'ai trouvé sur internet une image intéressante.
J'adapte et je redimensionne le dessin pour obtenir un patron prêt à découper. Le chapeau est adapté à ma petite tête de 56cm.
Je découpe la mousse à la découpeuse laser et j'assemble le tout au pistolet à colle en y intégrant 7 perles de fée (5 de plusieurs couleurs et 2 rouges).
Je câble les leds sur un Arduino Uno (Schema-ChapoCœur.zip ← fichier du schéma sur le logiciel Fritzing).
Je simule tous les effets de lumières et de séquences possibles sur banc de test, pour écrire le programme. Je m'oriente sur une utilisation d'interrupteur en “Capacitive Sensor” avec une librairie de l'Arduino (http://playground.arduino.cc/Main/CapacitiveSensor) qui permet par un simple touché d'une partie conductrice de changer le programme instantanément en bouclant indéfiniment sur celui-ci.
Je mets en place 4 interrupteurs discrets à l'arrière du chapeau qui permettent de sélectionner instantanément le programme pour éviter tout loupé de l'utilisateur.
SWITCH1 | SWITCH2 | SWITCH3 | SWITCH4 | PROGRAM |
---|---|---|---|---|
false | false | false | false | 1 (FADE RDM + LIGHTNING) |
false | false | false | true | 2 (FADE RDM + LIGHTNING) |
false | false | true | false | 3 (LIGHTNING RDM) |
false | true | false | false | 4 (HEART BEAT) |
true | false | false | false | 5 (FADE 2 RDM) |
Vous trouverez ci-dessous la version “présentoir” qui est la version la plus complète de mon programme car celui-ci inclut un choix aléatoire des 4 programmes sur quelques secondes pour représenter toutes les possibilités de ce chapeau.
#include <CapacitiveSensor.h> CapacitiveSensor cs_2_4 = CapacitiveSensor(2,4); // 8M resistor between pins 2 & 4, pin 4 is sensor pin, add a wire and or foil if desired CapacitiveSensor cs_2_7 = CapacitiveSensor(2,7); // 8M resistor between pins 2 & 7, pin 7 is sensor pin, add a wire and or foil if desired CapacitiveSensor cs_2_8 = CapacitiveSensor(2,8); // 8M resistor between pins 2 & 8, pin 8 is sensor pin, add a wire and or foil if desired CapacitiveSensor cs_2_12 = CapacitiveSensor(2,12); // 8M resistor between pins 2 & 12, pin 12 is sensor pin, add a wire and or foil if desired //Set up Global variables boolean pin_touched2_4 = false; //true if the pin is being touched, false if it is not being touched boolean pin_touched2_7 = false; //true if the pin is being touched, false if it is not being touched boolean pin_touched2_8 = false; //true if the pin is being touched, false if it is not being touched boolean pin_touched2_12 = false; //true if the pin is being touched, false if it is not being touched int brightness = 0; // how bright the LED is int fadeAmount = 5; // how many points to fade the LED by int RdmNumber = 3; int RdmNumber2 = 5; int OldRdmNumber = 0; int OldRdmNumber2 = 0; int count = 0; int Prog = 0; int Program=0; int OldProg1 = 0; int OldProg2 = 0; int OldProg3 = 0; int OldProg4 = 0; int LastProg = 0; int i = 0; int count1 = 0; int count3 = 0; int count4 = 0; int count5 = 0; long total1; long touch=1000; long total1_2_4 = 0; long total1_2_7 = 0; long total1_2_8 = 0; long total1_2_12 = 0; // the setup routine runs once when you press reset: void setup() { Serial.begin(115200); cs_2_4.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example cs_2_7.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example cs_2_8.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example cs_2_12.set_CS_AutocaL_Millis(0xFFFFFFFF); // turn off autocalibrate on channel 1 - just as an example pinMode(3, OUTPUT); pinMode(5, OUTPUT); pinMode(6, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(13, OUTPUT); } void loop() { if (count1 > 3 || count3 > 100 || count4 > 3 || count5 > 3 || Program == 0){ // 3 time PROG1&2, 100 time PROG3, 3 time PROG4, 3 time PROG5, digitalWrite(3, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); i=i+1; if (i<=4) { while(Prog == OldProg1 || Prog == OldProg2 || Prog == OldProg3 || Prog == LastProg){ Prog = random(2, 6); } if (i==1) {OldProg1 = Prog;} if (i==2) {OldProg2 = Prog;} if (i==3) {OldProg3 = Prog;} if (i==4) {OldProg4 = Prog;} Serial.print("\t"); Serial.print("RDM - "); Serial.print("LastProg = "); Serial.print(LastProg); Serial.print(" Prog = "); Serial.print(Prog); Serial.print(" OldProg1 = "); Serial.print(OldProg1); Serial.print(" OldProg2 = "); Serial.print(OldProg2); Serial.print(" OldProg3 = "); Serial.print(OldProg3); Serial.print(" OldProg4 = "); Serial.print(OldProg4); Serial.print("\n"); LastProg = Prog; Program = Prog; count1 = 0; count3 = 0; count4 = 0; count5 = 0; } else { i = 0; OldProg1 = 0; OldProg2 = 0; OldProg3 = 0; OldProg4 = 0; } } total1_2_4 = 0; total1_2_7 = 0; total1_2_8 = 0; total1_2_12 = 0; total1 = cs_2_4.capacitiveSensor(30); if (total1 > touch){ total1_2_4 = total1; } // Serial.print("\t"); // Serial.print(total1); total1 = cs_2_7.capacitiveSensor(30); if (total1 > touch){ total1_2_7 = total1; } // Serial.print("\t"); // Serial.print(total1); total1 = cs_2_8.capacitiveSensor(30); if (total1 > touch){ total1_2_8 = total1; } // Serial.print("\t"); // Serial.print(total1); total1 = cs_2_12.capacitiveSensor(30); if (total1 > touch){ total1_2_12 = total1; } if (total1_2_4 > touch || total1_2_7 > touch || total1_2_8 > touch || total1_2_12 > touch){ if (total1_2_4 < touch && total1_2_7 < touch && total1_2_8 < touch && total1_2_12 > touch){pin_touched2_4 = false; pin_touched2_7 = false; pin_touched2_8 = false; pin_touched2_12 =true;} if (total1_2_4 < touch && total1_2_7 < touch && total1_2_8 > touch && total1_2_12 < touch){pin_touched2_4 = false; pin_touched2_7 = false; pin_touched2_8 = true; pin_touched2_12 =false;} if (total1_2_4 < touch && total1_2_7 > touch && total1_2_8 < touch && total1_2_12 < touch){pin_touched2_4 = false; pin_touched2_7 = true; pin_touched2_8 = false; pin_touched2_12 =false;} if (total1_2_4 > touch && total1_2_7 < touch && total1_2_8 < touch && total1_2_12 < touch){pin_touched2_4 = true; pin_touched2_7 = false; pin_touched2_8 = false; pin_touched2_12 =false;} digitalWrite(3, LOW); digitalWrite(5, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); count = 0; count1 = 0; count3 = 0; count4 = 0; count5 = 0; OldProg1 = 0; OldProg2 = 0; OldProg3 = 0; OldProg4 = 0; i = 0; brightness = 0; } // ------------------------------------------------------------------------------------------------- // | pin_touched2_4 | pin_touched2_7 | pin_touched2_8 | pin_touched2_12 | PROGRAM | // ------------------------------------------------------------------------------------------------- // | false | false | false | false | 1 (FADE RDM + LIGHTNING) | // | false | false | false | true | 2 (FADE RDM + LIGHTNING) | // | false | false | true | false | 3 (LIGHTNING RDM) | // | false | true | false | false | 4 (HEART BEAT) | // | true | false | false | false | 5 (FADE 2 RDM) | // ------------------------------------------------------------------------------------------------- if (total1_2_4 > touch || total1_2_7 > touch || total1_2_8 > touch || total1_2_12 > touch){ if (pin_touched2_4 == false && pin_touched2_7 == false && pin_touched2_8 == false && pin_touched2_12 == false){ Program = 1;} if (pin_touched2_4 == false && pin_touched2_7 == false && pin_touched2_8 == false && pin_touched2_12 == true) { Program = 2;} if (pin_touched2_4 == false && pin_touched2_7 == false && pin_touched2_8 == true && pin_touched2_12 == false) { Program = 3;} if (pin_touched2_4 == false && pin_touched2_7 == true && pin_touched2_8 == false && pin_touched2_12 == false) { Program = 4;} if (pin_touched2_4 == true && pin_touched2_7 == false && pin_touched2_8 == false && pin_touched2_12 == false) { Program = 5;} } // Serial.print("\t"); // Serial.print(Program); // Serial.print("\n"); if (count >= 102) { digitalWrite(RdmNumber, LOW); digitalWrite(RdmNumber2, LOW); if (Program == 1 || Program == 2) { digitalWrite(RdmNumber, HIGH); if (RdmNumber == 3) { digitalWrite(3, HIGH); } delay(30); digitalWrite(3, LOW); digitalWrite(RdmNumber, LOW); delay(30); } if (Program == 4) { digitalWrite(3, HIGH); digitalWrite(13, HIGH); delay(30); digitalWrite(3, LOW); digitalWrite(13, LOW); delay(30); } OldRdmNumber = RdmNumber; while(RdmNumber == 4 || RdmNumber == 7 || RdmNumber == 8 || RdmNumber == OldRdmNumber){ RdmNumber = random(3, 12); } OldRdmNumber2 = RdmNumber2; while(RdmNumber2 == 4 || RdmNumber2 == 7 || RdmNumber2 == 8 || RdmNumber2 == RdmNumber || RdmNumber2 == OldRdmNumber || RdmNumber2 == OldRdmNumber2){ RdmNumber2 = random(3, 12); } count = 0; count1 = count1 + 1; count4 = count4 + 1; count5 = count5 + 1; } if (Program == 1 || Program == 2) { analogWrite(RdmNumber, brightness); // change the brightness for next time through the loop: brightness = brightness + fadeAmount; if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } // wait for 30 milliseconds to see the dimming effect delay(30); count = count + 1; } else if (Program == 3) { OldRdmNumber = RdmNumber; while(RdmNumber == 4 || RdmNumber == 7 || RdmNumber == 8 || RdmNumber == 12 || RdmNumber == OldRdmNumber){ RdmNumber = random(3, 14); } digitalWrite(RdmNumber, HIGH); delay(30); digitalWrite(RdmNumber, LOW); delay(30); count3 = count3 + 1; } else if (Program == 4) { analogWrite(3, brightness); // change the brightness for next time through the loop: brightness = brightness + fadeAmount; if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } // wait for 30 milliseconds to see the dimming effect delay(30); count = count + 1; } else if (Program == 5) { analogWrite(RdmNumber, brightness); analogWrite(RdmNumber2, brightness); // change the brightness for next time through the loop: brightness = brightness + fadeAmount; if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } // wait for 30 milliseconds to see the dimming effect delay(30); count = count + 1; } }
Mise en place de l'Arduino Uno et de sa batterie externe dans le haut du chapeau pour la soirée (une simple batterie de téléphone portable qui a une charge de 4400mAh). Estimation de durée de fonctionnement : 60 heures en continu.
Comme tous projets, les limites matérielles ou logicielles demandent de s'adapter tout au long du développement. Au départ pour éviter de multiples boutons pour sélectionner le programme, un codage sur 3 bits aurait pu permettre de choisir un des sept programmes différents mais les difficultés rencontrées dans la mise au point sur les seuils de détection du “Capacitive Sensor” m'ont posé pas mal de problèmes. L'alimentation de l'Arduino Uno par l'USB d'un PC ou par l'USB d'une batterie externe change les seuils de détection du “Capacitive Sensor”. Je suis donc revenu à une solution plus simple avec quatre interrupteurs et donc quatre programmes aux choix.
Le réglage du seuil pour le “Capacitive Sensor” n'a pas été évident car l'espionnage des données sur le port USB de l'Arduino Uno n'était pas facile sans l'alimenter. Réfléchir à mettre en place un moyen d'espionner ces données facilement sans alimenter l'Arduino Uno.
Le premier Support Coeur du Chapo♥ !
Afin d'exposer cette réalisation dans la vitrine du Carrefour numérique², j'ai dessiné et réalisé un support réglable sans colle dans le même thème que le chapeau ! Vous pouvez admirer le tout jusqu'à que je le récupère pour utiliser l'électronique dans de nouvelles réalisations.