Mon-Reveil-Hack

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche


MCHobby investit du temps et de l'argent dans la réalisation de traduction et/ou documentation. C'est un travail long et fastidieux réalisé dans l'esprit Open-Source... donc gratuit et librement accessible.
SI vous aimez nos traductions et documentations ALORS aidez nous à en produire plus en achetant vos produits chez MCHobby.

Introduction

Il est possible de changer le code facilement de manière à optimiser le réveil à vos besoins.

Je vais vous expliquer comment modifier la mélodie et ajouter un autre hack (un GONG).

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 se trouvent dans le fichier melodie.h.

// --- Exemple ---
// Changer MARIO
const int MELODIE[][ 2 ] = MARIO;
// Par AXEL_F
const int MELODIE[][ 2 ] = AXEL_F;

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

#define ALARM1{  \
  {NOTE_A4,  20},\
  {NOTE_C4,  20}}

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

#define ALARM1{  \
  {NOTE_A4,  20},\
  {NOTE_C4,  20}}
  • 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 GitHub de nseidle.
  • 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 phases des alarmes

Premièrement, il est nécessaire de comprendre les 3 fonctions principale. Chacune de ses fonctions sont appelées à chacune des phases des alarmes.

Chaque fois qu'une alarme change de phase, elle envoie comme argument la position de l'alarme (dans notre cas de 0 à 3). Il est donc facile de personnaliser chacunes des alarmes.

Voici les 3 fonctions:

/*
 * Alarme qui commence à sonner
 */
void alarmeStart( int alarmePos ){
  activerMelodie();
}

/*
 * Pendant que l'alarme sonne, répéter une étape
 */
void alarmePulse( int alarmePos ){
  jouerMelodie();
}

/*
 * Alarme qui cesse de sonner
 */
void alarmeStop( int alarmePos ){
  arreterMelodie();
}
  • alarmeStart est appelée quand une alarme se met en route.
  • alarmePulse est appelée durant le moment où l'alarme est active.
  • alarmeStop est appelée quand une alarme s'arrête.

Exemples de hacks

Je vais vous montrer comment ajouter facilement différentes fonctionnalités à vos alarmes.

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.

Choix du matériel :

  • Pour la clochette, nous avons choisi une clochette pour chats.
  • Pour le servo moteur, nous avons pris un micro servo tower (disponible sur le shop)
  • Pour le support, nous avons utilisé des pièces du kit MakerBeam (disponible sur le shop)
  • Pour l'alimantation supplémentaire, nous avons choisis une alimentation de 5v.

Branchement de l'alimentation possible :

Le servo moteur consomme plus de ressources que l'arduino peut fournir, il est donc nécessaire d'utiliser une alimentation supplémentaire.

Je vous propose plusieurs montages possibles, à vous de choisir celui qui vous convient le mieux.

Voici le schéma simplifié des connectiques des alimentations de l'Arduino :

 
Cliquez pour agrandir

  • Pont entre 5V et Vin

 
Cliquez pour agrandir

    • Avantages
      • Propre niveau du câblages.
      • Un seul fil nécessaire.
      • Une seule alimentation nécessaire.
    • Inconvénients
      • Nécessite uniquement une alimentation de 5V.
      • Risque d'endommager les composants de l'Arduino.
      • On ne peut que alimenter l'ensemble du circuit avec une seule alimentation !
  • Alimenter le moteur avec une autre alimentation.

 
Cliquez pour agrandir

    • Avantages
      • En cas de problèmes, l'Arduino n'est pas endommagé.
      • 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 faire de nouvelles liaisons.

Code :

Premièrement, il sera nécessaire d'ajouter dans l'entête :

... 

// ### 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

...

Dans la fonction setup :

void setup() {
  ... 

  // ### ZONE HACK ###
  // Activer le servo
  monServo.attach( SERVO_MOTEUR ); 
 
  // Position du servo de base
  monServo.write( 1 );
  delay( 500 );
  
  // Désactiver le servo
  monServo.detach();
}

Dans les différentes phases, on va définir que uniquement l'alarme 1 possède le réveil sonnette et les autres possèdent la mélodie.

/*
 * Alarme qui commence à sonner
 */
void alarmeStart( int alarmePos ){
  // Hack 
  if( alarmePos == 0)
    activerMoteur();
  // Sonnerie
  else 
    activerMelodie();
}

/*
 * Pendant que l'alarme sonne, répéter une étape
 */
void alarmePulse( int alarmePos ){
  // Hack moteur
  if( alarmePos == 0)
    jouerMoteur();
  // Sonnerie
  else 
    jouerMelodie();
}

/*
 * Alarme qui cesse de sonner
 */
void alarmeStop( int alarmePos ){
  // Hack moteur
  if( alarmePos == 0)
    stopMoteur();
  // Sonnerie
  else 
    arreterMelodie();
}
  • activerMoteur(); dans cette fonction, il faudrait remettre le servo à l'angle zéro, au cas ou il n'est pas encore définit à cette position.
  • jouerMoteur(); dans cette fonction, il faudrait changer la position du servo moteur de façon à faire sonner le gong.
  • stopMoteur(); dans cette fonction, il faudrait remettre le servo à l'angle zéro.
/*
 * 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
    sens *= -1;
    // Bouger le servo de 1° à 46°
    monServo.write( 31 + (sens*30) );    
  }
}
void stopMoteur(){
  monServo.write( 1 );
  delay( 300 );
  monServo.detach();
}

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.

/*
 * 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;
}

Activer une peluche qui danse et chante

Pour interagir avec la peluche, il sera nécessaire de posséder une peluche, deux relais (dans notre cas).

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 un binôme de la marque Omron (disponible sur le shop)

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.

 
Cliquez pour agrandir

Hacks réalisés

 
Cliquez pour agrandir

Sortie des fils quand tout est fini

 
Cliquez pour agrandir

Connectique avec le relais

 
Cliquez pour agrandir

Code : Premièrement, il sera nécessaire d'ajouter dans l'entête :

... 

// ### 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

...

Dans la fonction setup :

void setup() {
  ... 

  // ### ZONE HACK ###
  // Activer le servo
  monServo.attach( SERVO_MOTEUR ); 
 
  // Position du servo de base
  monServo.write( 1 );
  delay( 500 );
  
  // Désactiver le servo
  monServo.detach();
}

Dans les différentes phases, on va définir que uniquement l'alarme 1 possède le réveil sonnette et les autres possèdent la mélodie.

/*
 * Alarme qui commence à sonner
 */
void alarmeStart( int alarmePos ){
  // Hack 
  if( alarmePos == 0)
    activerMoteur();
  // Sonnerie
  else 
    activerMelodie();
}

/*
 * Pendant que l'alarme sonne, répéter une étape
 */
void alarmePulse( int alarmePos ){
  // Hack moteur
  if( alarmePos == 0)
    jouerMoteur();
  // Sonnerie
  else 
    jouerMelodie();
}

/*
 * Alarme qui cesse de sonner
 */
void alarmeStop( int alarmePos ){
  // Hack moteur
  if( alarmePos == 0)
    stopMoteur();
  // Sonnerie
  else 
    arreterMelodie();
}
  • activerMoteur(); dans cette fonction, il faudrait remettre le servo à l'angle zéro, au cas ou il n'est pas encore définit à cette position.
  • jouerMoteur(); dans cette fonction, il faudrait changer la position du servo moteur de façon à faire sonner le gong.
  • stopMoteur(); dans cette fonction, il faudrait remettre le servo à l'angle zéro.
/*
 * 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
    sens *= -1;
    // Bouger le servo de 1° à 46°
    monServo.write( 31 + (sens*30) );    
  }
}
void stopMoteur(){
  monServo.write( 1 );
  delay( 300 );
  monServo.detach();
}

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.

/*
 * 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;
}

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

Créé par Stefan pour MCHobby.be

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.