Outils d'utilisateurs

Outils du Site


projets:le_chapeau_coeur

Le Chapeau Coeur

À 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) !!!

Conception

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.

Heart

Réalisation

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.

HeartHat

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).

LED

COLOR LED

Je câble les leds sur un Arduino Uno (Schema-ChapoCœur.zip ← fichier du schéma sur le logiciel Fritzing).

Platine d'essai

Vue schématique

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.

Capacitive Sensor

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.

Intérieur

Difficultés rencontrées

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.

Propositions d'amélioration

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.

Suites du projet

Le premier Support Coeur du Chapo♥ !

Support Cœur

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.

TrayHeartTopHat

Photos

Chapo♥

Intérieur Chapo♥

Intérieur

Vitrine

Vidéo

Enigme du Projet

Quel est le rapport entre ce personnage et cette réalisation ?

Qui c'est ?

Bonne chance :D !

un indice : Ça pourra servir pour nos voyage futur !

Made by Go2

projets/le_chapeau_coeur.txt · Dernière modification: 2022/05/15 23:45 par go2