Modifications

Sauter à la navigation Sauter à la recherche
21 317 octets ajoutés ,  26 avril 2018 à 12:19
Ligne 1 : Ligne 1 :  
{{Mon-Reveil-NAV}}
 
{{Mon-Reveil-NAV}}
   −
{{traduction}}
+
== Introduction ==
   −
Plusieurs exemples de hacking:
+
Il est possible de changer le code facilement de manière à optimiser le réveil à vos besoins.  
* changer la pseudo mélodie de l'alarme.
  −
* Utiliser un audio FX
  −
* Utiliser un gong + gyrophare.
      +
L'alarme n° 1 est tout spécialement destiné au hacking (personnalisation) du réveil.
 +
 +
Vous pourrez modifier la mélodie et ajouter un hack pour faire sonner un gong, une clochette, etc.
 +
 +
Le code du réveil est disponible, vous pourrez donc le modifier à votre guise.
 +
 +
Pour les Hack faisant intervenir du matériel complémentaire, nous avons prévu un connecteur complémentaire à l'arrière du réveil.
 +
 +
Celui-ci est raccordé sur différentes entrées/sorties encore libre sur notre Arduino.
 +
 +
[[Fichier:Mon-Reveil-83a.jpg|480px]]
 +
 +
== Mélodies ==
 +
 +
=== Changer de mélodie ===
 +
Il est possible de changer simplement de mélodie en changant le nom de celle-ci dant la variable '''MELODIE'''.
 +
 +
L'ensemble des mélodies sont définies dans le fichier '''melodie.h'''.
 +
 +
Pour modifier la mélodie, il faut changer la ligne portant la mention {{fname|const int MELODIE[][2]}}
 +
 +
<syntaxhighlight lang="c">
 +
// --- Exemple ---
 +
// Changer MARIO
 +
const int MELODIE[][ 2 ] = MARIO;
 +
</syntaxhighlight>
 +
 +
Ou encore:
 +
 +
<syntaxhighlight lang="c">
 +
// Par AXEL_F
 +
const int MELODIE[][ 2 ] = AXEL_F;
 +
</syntaxhighlight>
 +
 +
=== Créer une mélodie ===
 +
 +
Il est possible d'ajouter facilement une mélodie à la bibliothèque '''melodie.h'''.
 +
 +
Je vous invite à lire la bibliothèque de manière à comprendre son fonctionnement et si vous ne comprenez pas tout, je vous invite à lire le contenu suivant.
 +
 +
==== A quoi sert l'antislash ? ====
 +
 +
Comme vous pouvez voir dans la bibliothèque, chacune des mélodies contiennent un antislash à la fin de chaques lignes de code (excepté la dernière) :
 +
 +
<syntaxhighlight lang="c">
 +
#define ALARM1{  \
 +
  {NOTE_A4,  20},\
 +
  {NOTE_C4,  20}}
 +
</syntaxhighlight>
 +
 +
L'antislash ('''\''') sert de remise à la ligne pour le define et son contenu. Si cet antislash n'est pas mit, il sera impossible de compiler le code.
 +
 +
Si vous ne désirez pas mettre d'antislash, il vous sera obligatoire d'écrire tout le contenu du define en une ligne de code.
 +
 +
Pour des raisons de mise en page, nous avons préféré mettre l'antislash à fin de chaques lignes de façon à rendre le code plus lisible.
 +
 +
==== Que contiennent les define ? ====
 +
 +
Le define est un tableau 2 dimensions contenant des nombres entiers (int).
 +
 +
<syntaxhighlight lang="c">
 +
#define ALARM1{  \
 +
  {NOTE_A4,  20},\
 +
  {NOTE_C4,  20}}
 +
</syntaxhighlight>
 +
 +
* La première colonne contient les notes a jouer
 +
** La note (exemple: NOTE_A4) fait référence à un nombre entier se trouvant dans la bibliothèque ''pitches.h''. Cette bibliothèque provient du [https://github.com/nseidle/AxelF_DoorBell/blob/master/pitches.h GitHub de nseidle].
 +
{{ambox | text = Pour plus de précisons sur le fonctionnement de ''pitches.h'', visitez le [https://github.com/nseidle/AxelF_DoorBell/wiki/How-to-convert-sheet-music-into-an-Arduino-Sketch wiki de nseidle] (en anglais).}}
 +
* La deuxièmre colonne contient la durée de chaques notes en milisecondes
 +
 +
==== Comment convertir une musique en mélodie ? ====
 +
 +
Malheureusement, nous avons pas trouvé un outil capable de convertir une musique (entière) en mélodie polyphonique.
 +
 +
== Les 3 fonctions de contrôle d'alarmes ==
 +
 +
Premièrement, il est nécessaire de comprendre les 3 fonctions principales. Chacune de ces fonctions est appelée à chacune des phases des alarmes.
 +
 +
Chaque fois qu'une alarme change de phase, elle envoie comme argument l'index identifiant l'alarme (dans notre cas de 0 à 3, 0 étant la première alarme).
 +
 +
Il est donc facile de personnaliser chacune des alarmes. L'alarme 1 (index = 0) étant libre à la personnalisation, les 3 autres alarmes jouent la mélodie sur le piezo buzzer.
 +
 +
Voici les 3 fonctions:
 +
<syntaxhighlight lang="c">
 +
/*
 +
* Fonction appelée lorsque l'Alarme doit commencer à sonner.
 +
*/
 +
void alarmeStart( int alarmePos ){
 +
  activerMelodie();
 +
}
 +
 +
/*
 +
* Fonction appelée répétitivement pendant que l'alarme sonne.
 +
* Cette fonction permet de réaliser des opérations à intervalle régulier.
 +
*/
 +
void alarmePulse( int alarmePos ){
 +
  jouerMelodie();
 +
}
 +
 +
/*
 +
* Fonction appelée lorsque l'alarme doit cesser de fonctionner
 +
*/
 +
void alarmeStop( int alarmePos ){
 +
  arreterMelodie();
 +
}
 +
</syntaxhighlight>
 +
 +
En résumé:
 +
* '''alarmeStart''' est appelée quand l'alarme doit démarrer.
 +
* '''alarmePulse''' est appelée répétitivement pendant que l'alarme est active.
 +
* '''alarmeStop''' est appelée quand une alarme doit s'arrête.
 +
 +
 +
== Hack d'alimentations ==
 +
Parmi les hacks, nous utilisons un servo moteur (mais cela serait également vrai avec un solénoïde).
 +
 +
Un servo moteur consomme plus de courant que le régulateur de tension d'un Arduino peut délivrer (350mA).
 +
 +
Il est donc nécessaire:
 +
* soit d'utiliser une alimentation supplémentaire pour le servo moteur.
 +
* soit d'alimenter directement la carte Arduino en 5V.
 +
 +
Nous vous proposons ici plusieurs montages possibles, à vous de choisir celui qui vous convient le mieux.
 +
 +
Voici le schéma simplifié des connectiques des alimentations de l'Arduino :
 +
 +
[[Fichier:Mon-Reveil-104.jpg|640px]]<small><br />''Cliquez pour agrandir''</small>
 +
 +
=== Pont entre 5V et Vin ===
 +
Ce moyen permet de contourner le régulateur de tension au niveau de l'entrée Jack et donc de fournir directement le courant nécessaire au circuit 5V de votre Arduino.
 +
 +
[[Fichier:Mon-Reveil-106.jpg|640px]]<small><br />''Cliquez pour agrandir''</small>
 +
 +
{{ambox|text=Truc et actuce: si vous avez monté le connecteur 6 broches à l'arrière de votre réveil, vous pourrez aussi réaliser le pontage Vin -> 5V directement sur ce connecteur :-) }}
 +
 +
* '''Avantages'''
 +
** Propre niveau du câblages.
 +
** Un seul fil nécessaire.
 +
** Une seule alimentation 5V nécessaire (directement sur le connecteur Jack d'Arduino).
 +
* '''Inconvénients'''
 +
** <font color="red">Risque d'endommager les composants de l'Arduino si vous appliquez une tension supérieur à 5V.</font>
 +
** <font color="red">Le circuit ne peut être alimenté que par une seule alimentation à la fois! Hors de question de brancher l'USB et l'alimentation 5V en même temps... au risque de détériorer votre Arduino.</font>
 +
 +
{{ambox-stop | text = Connectez uniquement une alimentation de 5v !}}
 +
 +
=== Alimenter le moteur avec une seconde alimentation. ===
 +
 +
[[Fichier:Mon-Reveil-108.jpg|320px]]<small><br />''Cliquez pour agrandir''</small>
 +
 +
* '''Avantages'''
 +
** Ne risque pas d'endommager votre Arduino (si vous vous tromper de tension d'alimentation).
 +
** Les plages des tensions pour alimenter le moteur se trouvent entre 4.8v et 6v.
 +
* '''Inconvénients'''
 +
** Nécessite une deuxième alimentation.
 +
** Nécessite de réaliser des connexions supplémentaires.
 +
 +
=== Alimenter l'arduino en 5V directement ===
 +
 +
[[Fichier:Mon-Reveil-109.jpg|300px]]<small><br />''Cliquez pour agrandir''</small>
 +
 +
* '''Avantages'''
 +
** L'ensemble de l'Arduino possède une entrée 5v avec plus d'intensité
 +
* '''Inconvénients'''
 +
** <font color="red">Nécessite une alimentation de 5V. Toute tension supérieure détruira votre Arduino.</font>
 +
** <font color="red">Le circuit ne peut être alimenter que par une seule source d'alimentation ! Hors de question de brancher votre Arduino en USB en meêm temps que l'alimentation externe.</font>
 +
 +
{{ambox-stop | text = Connectez uniquement une alimentation de 5v ! Toute tension supérieure injectera une surtension sur le circuit 5V du microcontrôleur et détruira votre Arduino.}}
 +
 +
== Faire sonner une clochette ==
 +
 +
Pour faire sonner une clochette, il sera nécessaire d'utiliser un servo moteur, une clochette, une alimentation supplémentaire et un support/pied.
 +
 +
{{ambox|text=L'activation permanente du servo moteur à répétition créera des appels de courant important sur le régulateur de tension de votre Arduino. Les chutes de tension que cela va provoquer fera redémarrer votre Arduino.
 +
 +
IL FAUT DONC OPTER POUR UNE SOURCE D'ALIMENTATION EXTERNE!}}
 +
 +
Dans notre cas de figure, nous avons opté pour un pontage Vin -> 5V (décrit au point précédent) avec l'utilisation d'une {{pl|311|alimentation externe 5V}}.
 +
 +
{{#Widget:Iframe
 +
|url=https://www.youtube.com/embed/N0VNmWjmfHs
 +
|width=420
 +
|height=315
 +
|border=0
 +
}}
 +
=== Choix du matériel ===
 +
* Pour la clochette, nous avons choisi une clochette pour chats.
 +
* Pour le servo moteur, nous avons pris un {{pl|64|micro servo moteur}}
 +
* Pour le support, nous avons utilisé des pièces du {{pl|328|kit MakerBeam}}
 +
* Une {{pl|311|alimentation 5V externe}} (avec le 5V injecté directement sur le 5V de l'Arduino).
 +
 +
=== Code ===
 +
 +
{{download-box|Code exemple de la clochette sur Github|https://github.com/mchobby/Mon-Reveil-1/blob/master/Exemples/clochette.ino}}
 +
 +
Premièrement, il sera nécessaire d'ajouter dans l'entête :
 +
<syntaxhighlight lang="c">
 +
...
 +
 +
// ### ZONE HACK ###
 +
 +
// -- Clochette --
 +
#include <Servo.h>          // Ajouter la bibliothèque
 +
#define SERVO_MOTEUR  6    // Définit la broche du servo moteur du gong
 +
Servo monServo;            // Initialisation du servo
 +
unsigned long moteurTempsAvant = 0 ; // Délai
 +
int sens = -1;              // Sens de rotation
 +
 +
...
 +
</syntaxhighlight>
 +
 +
Dans la fonction setup :
 +
<syntaxhighlight lang="c">
 +
void setup() {
 +
  ...
 +
 +
  // ### ZONE HACK ###
 +
  // Activer le servo
 +
  monServo.attach( SERVO_MOTEUR );
 +
 +
  // Position de base du servo de base
 +
  monServo.write( 1 );
 +
  // laisser au servo le temps de se positionner
 +
  delay( 500 );
 +
 
 +
  // Désactiver l'asservissement du servo
 +
  // pour qu'il ne fasse plus de bruit.
 +
  monServo.detach();
 +
}
 +
</syntaxhighlight>
 +
 +
Dans les différentes phases, seul l'alarme 1 (alarmPos=0) active la sonnette et les autres alarmes activent la mélodie.
 +
 +
<syntaxhighlight lang="c">
 +
/*
 +
* Alarme qui commence à sonner
 +
*/
 +
void alarmeStart( int alarmePos ){
 +
  // Hack
 +
  if( alarmePos == 0)
 +
    activerMoteur();
 +
  // Sonnerie
 +
  else
 +
    activerMelodie();
 +
}
 +
 +
/*
 +
* Pendant que l'alarme sonne:
 +
* balancer la clochette -OU- jouer un morceau de la mélodie
 +
*/
 +
void alarmePulse( int alarmePos ){
 +
  // Hack moteur
 +
  if( alarmePos == 0)
 +
    jouerMoteur();
 +
 
 +
  else
 +
    // Sonnerie
 +
    jouerMelodie();
 +
}
 +
 +
/*
 +
* Alarme qui cesse de sonner
 +
*/
 +
void alarmeStop( int alarmePos ){
 +
  // Hack moteur
 +
  if( alarmePos == 0)
 +
    stopMoteur();
 +
  // Sonnerie
 +
  else
 +
    arreterMelodie();
 +
}
 +
</syntaxhighlight>
 +
 +
* '''activerMoteur();''' dans cette fonction, il remettre le servo à l'angle zéro, au cas ou il n'est pas encore à cette position.
 +
* '''jouerMoteur();''' dans cette fonction, il faut changer la position du servo moteur régulièrement de façon à faire sonner la clochette (ou un gong).
 +
* '''stopMoteur();''' dans cette fonction, remettre le servo à l'angle zéro.
 +
 +
<syntaxhighlight lang="c">
 +
/*
 +
* Exemple servo moteur
 +
*/
 +
void activerMoteur(){
 +
    // Remise à zéro du moteur
 +
    moteurTempsAvant = 0;
 +
    // Activation du servo
 +
    monServo.attach( SERVO_MOTEUR );
 +
}
 +
void jouerMoteur(){
 +
  // Tous les 0.1 secondes effectuer
 +
  unsigned estIlTemps = effectuerAction( moteurTempsAvant, 10 );
 +
 
 +
  if( estIlTemps != 0 ){
 +
    // Changer quand a été effectué l'action précédente
 +
    moteurTempsAvant = estIlTemps;
 +
 +
    // Inverser le sens de rotation du servo
 +
    sens *= -1;
 +
    // Bouger le servo entre 1° à 61°
 +
    monServo.write( 31 + (sens*30) );   
 +
  }
 +
}
 +
 +
void stopMoteur(){
 +
  monServo.write( 1 );
 +
  delay( 300 );
 +
  monServo.detach();
 +
}
 +
</syntaxhighlight>
 +
 +
La fonction '''effectuerAction''', ci dessous, permet de répéter une tâche tous les x temps.
 +
 +
Cette fonction peut être réutiliser dans d'autres cas.
 +
 +
<syntaxhighlight lang="c">
 +
/*
 +
* Vérifier si c'est le moment d'effectuer l'action
 +
*
 +
* ARGUMENTS
 +
* tempsAvant est temps précédent en millisecondes
 +
* dureeAttente est le temps avant de relancer l'exécution
 +
*
 +
* RETURN
 +
* 0 Signifie pas maintenant
 +
* x valeur (unsigned long) : effectuer l'action + changer le tempsAvant (définie dans l'entête du code)
 +
*/
 +
unsigned long effectuerAction( unsigned long tempsAvant, int dureeAttente ){
 +
  unsigned long maintenant = millis();
 +
 +
  if( maintenant - tempsAvant >= dureeAttente )
 +
    return maintenant;
 +
   
 +
  return 0;
 +
 +
</syntaxhighlight>
 +
 +
== Activer une peluche qui danse et chante ==
 +
 +
Pour interagir avec la peluche, il sera nécessaire de posséder une peluche et deux relais (dans notre cas).
 +
 +
{{#Widget:Iframe
 +
|url=https://www.youtube.com/embed/L64j_Xo0hzs
 +
|width=420
 +
|height=315
 +
|border=0
 +
}}
 +
 +
==== Choix du matériel ====
 +
* Pour la peluche, nous l'avons trouvé dans le commerce (elle se nomme "What Does The Fox Say")
 +
* Pour les relais, nous utilisons {{pl|507|un module bi-relais Pololu}}.
 +
 +
==== Démontage/montage de la peluche ====
 +
 +
Nous avons démonté le pied où se trouvait l'ensemble des connectiques à hacker.
 +
 +
Les visses (en rouge) sont a retirer pour retirer le couvercle du pied. En bleu, se sont celle pour retirer l'interrupteur.
 +
 +
[[Fichier:Mon-Reveil-100.jpg|640px]]<small><br />''Cliquez pour agrandir''</small>
 +
 +
Hacks réalisés
 +
 +
[[Fichier:Mon-Reveil-101.jpg|640px]]<small><br />''Cliquez pour agrandir''</small>
 +
 +
Sortie des fils quand tout est fini
 +
 +
[[Fichier:Mon-Reveil-103.jpg|640px]]<small><br />''Cliquez pour agrandir''</small>
 +
 +
Connectique sur le {{pl|507|module bi-relais de Pololu}}.
 +
 +
[[Fichier:Mon-Reveil-102.jpg|640px]]<small><br />''Cliquez pour agrandir''</small>
 +
 +
L'entrée IN1 du relais est utilisé pour activer l'interrupteur d'alimentation.
 +
 +
L'entrée IN2 du relais est utilisé pour activer la séquence musicale.
 +
 +
Pour activer la peluche:
 +
# Activer IN1 pour activer l'alimentation
 +
# Activer IN2 pendant 1 seconde pour activer la séquence musicale.
 +
 +
Pour d'activer la peluche:
 +
# S'assurer que la sortie IN2 soit désactivée (ce qui est normalement le cas)
 +
# Désactiver la sortie IN1 pour désactiver la peluche.
 +
 +
==== Code ====
 +
 +
{{download-box|Code exemple de la peluche sur Github|https://github.com/mchobby/Mon-Reveil-1/blob/master/Exemples/renard.ino}}
 +
 +
Premièrement, il sera nécessaire d'ajouter dans l'entête :
 +
<syntaxhighlight lang="c">
 +
...
 +
 +
// ### ZONE HACK ###
 +
 +
// -- Renard --
 +
// Pin 6
 +
#define RENARD_ACTIVE 6
 +
// Pin 12
 +
#define RENARD_JOUE  12
 +
 +
...
 +
</syntaxhighlight>
 +
 +
Dans la fonction setup :
 +
<syntaxhighlight lang="c">
 +
  ...
 +
 
 +
  // ### ZONE HACK ###
 +
 +
  // Initialisation des entrées des relais
 +
  pinMode( RENARD_ACTIVE, OUTPUT );
 +
  pinMode( RENARD_JOUE, OUTPUT );
 +
</syntaxhighlight>
 +
 +
Dans les différentes phases, on va définir que uniquement l'alarme 1 possède l'activation de la peluche et les autres possèdent la mélodie.
 +
 +
<syntaxhighlight lang="c">
 +
  ...
 +
 +
  /*
 +
  * Alarme qui commence à sonner
 +
  */
 +
  void alarmeStart( int alarmePos ){
 +
    if( alarmePos == 0 )
 +
      activerRenard();
 +
    else
 +
      activerMelodie();
 +
  }
 +
 +
  /*
 +
  * Pendant que l'alarme sonne, répéter une étape
 +
  */
 +
  void alarmePulse( int alarmePos ){
 +
    // Renard
 +
    if( alarmePos == 0 ){}
 +
    // Mélodie
 +
    else
 +
      jouerMelodie();
 +
  }
 +
 +
  /*
 +
  * Alarme qui cesse de sonner
 +
  */
 +
  void alarmeStop(int alarmePos){
 +
      arreterMelodie();
 +
      stopRenard();
 +
  }
 +
 +
  ...
 +
</syntaxhighlight>
 +
 +
* '''activerRenard();''' dans cette fonction, il faudrait activer le relais RENARD_ACTIVE et simuler la pression d'un bouton en laissant pendant 1 seconde le relais RENARD_JOUE actif.
 +
* '''stopRenard();''' dans cette fonction, il faudrait arrêter le relais RENARD_ACTIVE.
 +
 +
<syntaxhighlight lang="c">
 +
void activerRenard(){
 +
  // Activer le renard
 +
  digitalWrite( RENARD_ACTIVE, HIGH );
 +
 
 +
  // Faire jouer le renard
 +
  digitalWrite( RENARD_JOUE, HIGH );
 +
  delay( 1000 );
 +
  digitalWrite( RENARD_JOUE, LOW );
 +
}
 +
 +
void stopRenard(){
 +
  digitalWrite( RENARD_ACTIVE, LOW );
 +
}
 +
</syntaxhighlight>
 +
 +
== Activer un relais ==
 +
 +
Pour activer un matériel électronique, il sera nécessaire d'utiliser un relais.
 +
Dans notre cas, nous allons utiliser un {{pl|1289|Power Switch Tail}} pour allumer une lampe.
 +
 +
{{#Widget:Iframe
 +
|url=https://www.youtube.com/embed/pyNeF3LREjo
 +
|width=420
 +
|height=315
 +
|border=0
 +
}}
 +
 +
=== Choix du matériel ===
 +
 +
* Pour le relais, nous avons choisis le {{pl|1289|Power Switch Tail}}, qui est un relais protégé par un boîtier. Ce relais est alimenté directement par le secteur. Ensuite, le circuit base tension est isolé du circuit haute tension.
 +
 +
[[Fichier:Mon-Reveil-Hack-10a.png|480px]]
 +
 +
{| class="wikitable" border="1"
 +
|-
 +
| align="center" | PowerSwitchTail
 +
| align="center" | Arduino
 +
|- style="font-size: 90%"
 +
| align="left" | 1: +IN
 +
| align="left" | 12
 +
|- style="font-size: 90%"
 +
| align="left" | 2: -IN
 +
| align="left" | GND (masse)
 +
|}
 +
 +
=== Code ===
 +
 +
{{download-box|Code exemple du relais sur Github|https://github.com/mchobby/Mon-Reveil-1/blob/master/Exemples/relai.ino}}
 +
 +
Premièrement, il sera nécessaire d'ajouter la broche utilisé (la N° 12) pour commander le PowerSwitchTail.
 +
 +
Faites la déclaration suivante dans l'entête du programme:
 +
<syntaxhighlight lang="c">
 +
...
 +
 +
// ### ZONE HACK ###
 +
 +
// -- Relais --
 +
#define RELAIS  12   
 +
 +
...
 +
</syntaxhighlight>
 +
 +
Dans la fonction setup :
 +
<syntaxhighlight lang="c">
 +
void setup() {
 +
  ...
 +
 +
  // ### ZONE HACK ###
 +
 +
  // Initialiser le relais
 +
  pinMode( RELAIS , OUTPUT );
 +
}
 +
</syntaxhighlight>
 +
 +
Dans les différentes phases, on va définir que uniquement l'alarme 1 possède l'activation du relais et les autres possèdent la mélodie.
 +
 +
<syntaxhighlight lang="c">
 +
/*
 +
* Alarme qui commence à sonner
 +
*/
 +
void alarmeStart( int alarmePos ){
 +
  // Hack relais
 +
  if( alarmePos == 0)
 +
    activerRelais();
 +
  // Sonnerie
 +
  else
 +
    activerMelodie();
 +
}
 +
 +
/*
 +
* Pendant que l'alarme sonne, répéter une étape
 +
*/
 +
void alarmePulse( int alarmePos ){
 +
  // Hack relais
 +
  if( alarmePos == 0){}
 +
  // Sonnerie
 +
  else
 +
    jouerMelodie();
 +
}
 +
 +
/*
 +
* Alarme qui cesse de sonner
 +
*/
 +
void alarmeStop( int alarmePos ){
 +
  // Hack relais
 +
  if( alarmePos == 0)
 +
    stopRelais();
 +
  // Sonnerie
 +
  else
 +
    arreterMelodie();
 +
}
 +
</syntaxhighlight>
 +
 +
* '''activerRelais();''' dans cette fonction, il faudrait simplement activer le relais.
 +
* '''stopRelais();''' dans cette fonction, il faudrait simplement stopper le relais.
 +
 +
<syntaxhighlight lang="c">
 +
void activerRelais(){
 +
  digitalWrite( RELAIS , HIGH );
 +
}
 +
void stopRelais(){
 +
  digitalWrite( RELAIS , LOW );
 +
}
 +
</syntaxhighlight>
 +
 +
== La boîte à musique ==
 +
 +
Pour jouer la mélodie de la boîte à musique, il sera nécessaire d'utiliser un servo moteur, un régulateur pwm et d'utiliser deux entrées de l'arduino, dont une en PWM.
 +
 +
Voir la [https://youtu.be/-50OEOMNhro vidéo sur YouTube].
 +
 +
{{#Widget:Iframe
 +
|url=https://www.youtube.com/embed/-50OEOMNhro
 +
|width=420
 +
|height=315
 +
|border=0
 +
}}
 +
 +
=== Choix du matériel ===
 +
* Nous avons trouvé la boîte à musique dans le commerce (site [http://fridolin.de/ officiel]).
 +
* {{pl|155|Pont-H L293D}} permettant de commander un moteur à partir d'un Arduino. L'utilisation d'un signal PWM sur une broche Arduino permettra de contrôler plus finement la vitesse du moteur. Voir aussi le [[Pont-H L293D|tutoriel sur le pont-H L293]]
 +
* {{pl|438|Un mini moteur avec boîte de réduction}} disponible chez MC Hobby.
 +
 +
=== Branchement ===
 +
 +
Pour brancher le moteur avec le régulateur :
 +
 +
Petit erratum: La broche Enable est branchée sur Arduino #12 (et non pas #2 comme libellé sur le breadboard).
 +
 +
[[Fichier:Mon-Reveil-Hack-10b.jpg|480px]]
 +
 +
Pour plus d'informations, visitez [[Pont-H L293D|tutoriel L293D sur notre wiki]].
 +
 +
=== Code ===
 +
 +
{{download-box|Code exemple de la boîte à musique sur Github|https://github.com/mchobby/Mon-Reveil-1/blob/master/Exemples/boite-a-musique.ino}}
 +
 +
Premièrement, il sera nécessaire d'ajouter dans l'entête :
 +
<syntaxhighlight lang="c">
 +
...
 +
 +
// ### ZONE HACK ###
 +
 +
// -- Boite à musique --
 +
#define BOITE_ENABLE  11
 +
#define BOITE_INPUT  6 
 +
 +
...
 +
</syntaxhighlight>
 +
 +
Dans la fonction setup :
 +
<syntaxhighlight lang="c">
 +
void setup() {
 +
  ...
 +
 +
  // ### ZONE HACK ###
 +
  pinMode( BOITE_ENABLE, OUTPUT );
 +
  pinMode( BOITE_INPUT, OUTPUT );
 +
  digitalWrite( BOITE_ENABLE , LOW );
 +
 +
}
 +
</syntaxhighlight>
 +
 +
Dans les différentes phases, on va définir que uniquement l'alarme 1 joue la musique de la boîte et les autres alarmes jouent la mélodie.
 +
 +
<syntaxhighlight lang="c">
 +
/*
 +
* Alarme qui commence à sonner
 +
*/
 +
void alarmeStart( int alarmePos ){
 +
  // Boite à musique
 +
  if( alarmePos == 0)
 +
    activerBoite();
 +
  // Sonnerie
 +
  else
 +
    activerMelodie();
 +
}
 +
 +
/*
 +
* Pendant que l'alarme sonne, répéter une étape
 +
*/
 +
void alarmePulse( int alarmePos ){
 +
  // Boite à musique
 +
  if( alarmePos == 0)
 +
    jouerBoite();
 +
  // Sonnerie
 +
  else
 +
    jouerMelodie();
 +
}
 +
 +
/*
 +
* Alarme qui cesse de sonner
 +
*/
 +
void alarmeStop( int alarmePos ){
 +
  // Boite à musique
 +
  if( alarmePos == 0)
 +
    stopBoite();
 +
  // Sonnerie
 +
  else
 +
    arreterMelodie();
 +
}
 +
</syntaxhighlight>
 +
 +
* '''activerBoite();''' dans cette fonction, il faudrait simplement activer l'entrée enable 2.
 +
* '''jouerBoite();''' dans cette fonction, on définira la vitesse (en pwm) du moteur.
 +
* '''stopBoite();''' dans cette fonction, il faudrait simplement désactiver l'entrée enable 2.
 +
<syntaxhighlight lang="c">
 +
void activerBoite(){
 +
  digitalWrite( BOITE_ENABLE , HIGH );
 +
}
 +
void jouerBoite(){
 +
  // La vitesse en pwm, dans notre cas 220, peut varier de 0 à 255
 +
  analogWrite( BOITE_INPUT , 220);
 +
}
 +
void stopBoite(){
 +
  digitalWrite( BOITE_ENABLE , LOW );
 +
}
 +
</syntaxhighlight>
 +
 +
== Idées de hacks possibles ==
 +
 +
* Couper l'écran après un certains temps et le rallumer avec le bouton snooze
 +
 +
* Faire sonner un GONG
 +
 +
* Faire sonner un audio FX
 +
 +
* Faire tourner une main en mousse de façon à se giffler
    
{{Mon-Reveil-TRAILER}}
 
{{Mon-Reveil-TRAILER}}
29 917

modifications

Menu de navigation