Ligne 5 : |
Ligne 5 : |
| Il est possible de changer le code facilement de manière à optimiser le réveil à vos besoins. | | 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).
| + | 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 == | | == Mélodies == |
| | | |
Ligne 11 : |
Ligne 22 : |
| Il est possible de changer simplement de mélodie en changant le nom de celle-ci dant la variable '''MELODIE'''. | | 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'''. | + | 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"> | | <syntaxhighlight lang="c"> |
Ligne 17 : |
Ligne 30 : |
| // Changer MARIO | | // Changer MARIO |
| const int MELODIE[][ 2 ] = MARIO; | | const int MELODIE[][ 2 ] = MARIO; |
| + | </syntaxhighlight> |
| + | |
| + | Ou encore: |
| + | |
| + | <syntaxhighlight lang="c"> |
| // Par AXEL_F | | // Par AXEL_F |
| const int MELODIE[][ 2 ] = AXEL_F; | | const int MELODIE[][ 2 ] = AXEL_F; |
Ligne 62 : |
Ligne 80 : |
| Malheureusement, nous avons pas trouvé un outil capable de convertir une musique (entière) en mélodie polyphonique. | | Malheureusement, nous avons pas trouvé un outil capable de convertir une musique (entière) en mélodie polyphonique. |
| | | |
− | == Les 3 phases des alarmes == | + | == Les 3 fonctions de contrôle d'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. | + | 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 la position de l'alarme (dans notre cas de 0 à 3). Il est donc facile de personnaliser chacunes 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: | | Voici les 3 fonctions: |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
| /* | | /* |
− | * Alarme qui commence à sonner | + | * Fonction appelée lorsque l'Alarme doit commencer à sonner. |
| */ | | */ |
| void alarmeStart( int alarmePos ){ | | void alarmeStart( int alarmePos ){ |
Ligne 78 : |
Ligne 98 : |
| | | |
| /* | | /* |
− | * Pendant que l'alarme sonne, répéter une étape | + | * 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 ){ | | void alarmePulse( int alarmePos ){ |
| jouerMelodie(); | | jouerMelodie(); |
Ligne 85 : |
Ligne 106 : |
| | | |
| /* | | /* |
− | * Alarme qui cesse de sonner | + | * Fonction appelée lorsque l'alarme doit cesser de fonctionner |
| */ | | */ |
| void alarmeStop( int alarmePos ){ | | void alarmeStop( int alarmePos ){ |
Ligne 92 : |
Ligne 113 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | * '''alarmeStart''' est appelée quand une alarme se met en route. | + | En résumé: |
− | * '''alarmePulse''' est appelée durant le moment où l'alarme est active. | + | * '''alarmeStart''' est appelée quand l'alarme doit démarrer. |
− | * '''alarmeStop''' est appelée quand une alarme s'arrête. | + | * '''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. |
| | | |
− | == Exemples de hacks ==
| + | [[Fichier:Mon-Reveil-106.jpg|640px]]<small><br />''Cliquez pour agrandir''</small> |
| | | |
− | Je vais vous montrer comment ajouter facilement différentes fonctionnalités à vos alarmes.
| + | {{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 :-) }} |
| | | |
− | === Faire sonner une clochette === | + | * '''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> |
| | | |
− | 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-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 === |
| | | |
− | '''Choix du matériel :''' | + | [[Fichier:Mon-Reveil-109.jpg|300px]]<small><br />''Cliquez pour agrandir''</small> |
| | | |
− | * Pour la clochette, nous avons choisi une clochette pour chats. | + | * '''Avantages''' |
− | * Pour le servo moteur, nous avons pris un micro servo tower (disponible sur le [https://shop.mchobby.be/servo-moteurs/64-micro-servo-tower-pro-sg90-3232100000643.html shop]) | + | ** L'ensemble de l'Arduino possède une entrée 5v avec plus d'intensité |
− | * Pour le support, nous avons utilisé des pièces du kit MakerBeam (disponible sur le [https://shop.mchobby.be/makerbeam/328-makerbeam-kit-de-demarrage-noir-anodise-3232100003286-makerbeam.html shop]) | + | * '''Inconvénients''' |
− | * Pour l'alimantation supplémentaire, nous avons choisis une alimentation de 5v. | + | ** <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> |
| | | |
− | '''Branchement de l'alimentation possible : '''
| + | {{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.}} |
| | | |
− | Le servo moteur consomme plus de ressources que l'arduino peut fournir, il est donc nécessaire d'utiliser une alimentation supplémentaire.
| + | == Faire sonner une clochette == |
| | | |
− | Je vous propose plusieurs montages possibles, à vous de choisir celui qui vous convient le mieux.
| + | Pour faire sonner une clochette, il sera nécessaire d'utiliser un servo moteur, une clochette, une alimentation supplémentaire et un support/pied. |
| | | |
− | Voici le schéma simplifié des connectiques des alimentations de l'arduino :
| + | {{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. |
| | | |
− | [[Fichier:Mon-Reveil-104.jpg|640px]]<small><br />''Cliquez pour agrandir''</small>
| + | 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). |
| | | |
− | * Pont entre 5V et Vin
| + | === Code === |
− | **On peut alimenter l'ensemble du cirucit uniquement avec une seule alimentation !
| |
| | | |
− | [[Fichier:Mon-Reveil-105.jpg|640px]]<small><br />''Cliquez pour agrandir''</small>
| + | {{download-box|Code exemple de la clochette sur Github|https://github.com/mchobby/Mon-Reveil-1/blob/master/Exemples/clochette.ino}} |
− | * d
| |
− | ** d
| |
− | Code :'''
| |
| | | |
| Premièrement, il sera nécessaire d'ajouter dans l'entête : | | Premièrement, il sera nécessaire d'ajouter dans l'entête : |
Ligne 154 : |
Ligne 225 : |
| monServo.attach( SERVO_MOTEUR ); | | monServo.attach( SERVO_MOTEUR ); |
| | | |
− | // Position du servo de base | + | // Position de base du servo de base |
| monServo.write( 1 ); | | monServo.write( 1 ); |
| + | // laisser au servo le temps de se positionner |
| delay( 500 ); | | delay( 500 ); |
| | | |
− | // Désactiver le servo | + | // Désactiver l'asservissement du servo |
| + | // pour qu'il ne fasse plus de bruit. |
| monServo.detach(); | | monServo.detach(); |
| } | | } |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | 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. | + | 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"> | | <syntaxhighlight lang="c"> |
Ligne 179 : |
Ligne 252 : |
| | | |
| /* | | /* |
− | * Pendant que l'alarme sonne, répéter une étape | + | * Pendant que l'alarme sonne: |
| + | * balancer la clochette -OU- jouer un morceau de la mélodie |
| */ | | */ |
| void alarmePulse( int alarmePos ){ | | void alarmePulse( int alarmePos ){ |
Ligne 185 : |
Ligne 259 : |
| if( alarmePos == 0) | | if( alarmePos == 0) |
| jouerMoteur(); | | jouerMoteur(); |
− | // Sonnerie | + | |
| else | | else |
| + | // Sonnerie |
| jouerMelodie(); | | jouerMelodie(); |
| } | | } |
Ligne 203 : |
Ligne 278 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | * '''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. | + | * '''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 faudrait changer la position du servo moteur de façon à faire sonner le gong. | + | * '''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, il faudrait remettre le servo à l'angle zéro. | + | * '''stopMoteur();''' dans cette fonction, remettre le servo à l'angle zéro. |
| | | |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
Ligne 225 : |
Ligne 300 : |
| moteurTempsAvant = estIlTemps; | | moteurTempsAvant = estIlTemps; |
| | | |
− | // Inverser le sens | + | // Inverser le sens de rotation du servo |
| sens *= -1; | | sens *= -1; |
− | // Bouger le servo de 1° à 46° | + | // Bouger le servo entre 1° à 61° |
| monServo.write( 31 + (sens*30) ); | | monServo.write( 31 + (sens*30) ); |
| } | | } |
| } | | } |
| + | |
| void stopMoteur(){ | | void stopMoteur(){ |
| monServo.write( 1 ); | | monServo.write( 1 ); |
Ligne 264 : |
Ligne 340 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | === Activer une peluche qui danse et chante ===
| + | == 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). | + | Pour interagir avec la peluche, il sera nécessaire de posséder une peluche et deux relais (dans notre cas). |
| | | |
− | '''Choix du matériel :'''
| + | {{#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 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 [https://shop.mchobby.be/breakout/507-module-deux-relais-3232100005075-pololu.html shop]) | + | * Pour les relais, nous utilisons {{pl|507|un module bi-relais Pololu}}. |
| | | |
− | '''Démontage/montage de la peluche: '''
| + | ==== Démontage/montage de la peluche ==== |
| | | |
| Nous avons démonté le pied où se trouvait l'ensemble des connectiques à hacker. | | Nous avons démonté le pied où se trouvait l'ensemble des connectiques à hacker. |
Ligne 289 : |
Ligne 371 : |
| [[Fichier:Mon-Reveil-103.jpg|640px]]<small><br />''Cliquez pour agrandir''</small> | | [[Fichier:Mon-Reveil-103.jpg|640px]]<small><br />''Cliquez pour agrandir''</small> |
| | | |
− | Connectique avec le relais | + | Connectique sur le {{pl|507|module bi-relais de Pololu}}. |
| | | |
| [[Fichier:Mon-Reveil-102.jpg|640px]]<small><br />''Cliquez pour agrandir''</small> | | [[Fichier:Mon-Reveil-102.jpg|640px]]<small><br />''Cliquez pour agrandir''</small> |
| | | |
− | '''Code :''' | + | 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 : | | Premièrement, il sera nécessaire d'ajouter dans l'entête : |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
Ligne 300 : |
Ligne 397 : |
| // ### ZONE HACK ### | | // ### ZONE HACK ### |
| | | |
− | // -- Clochette -- | + | // -- Renard -- |
− | #include <Servo.h> // Ajouter la bibliothèque | + | // Pin 6 |
− | #define SERVO_MOTEUR 6 // Définit la broche du servo moteur du gong
| + | #define RENARD_ACTIVE 6 |
− | Servo monServo; // Initialisation du servo
| + | // Pin 12 |
− | unsigned long moteurTempsAvant = 0 ; // Délai
| + | #define RENARD_JOUE 12 |
− | int sens = -1; // Sens de rotation | + | |
| + | ... |
| + | </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 |
| | | |
| ... | | ... |
Ligne 316 : |
Ligne 527 : |
| | | |
| // ### ZONE HACK ### | | // ### ZONE HACK ### |
− | // Activer le servo
| + | |
− | monServo.attach( SERVO_MOTEUR );
| + | // Initialiser le relais |
− |
| + | pinMode( RELAIS , OUTPUT ); |
− | // Position du servo de base
| |
− | monServo.write( 1 );
| |
− | delay( 500 );
| |
− |
| |
− | // Désactiver le servo | |
− | monServo.detach(); | |
| } | | } |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | 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. | + | 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"> | | <syntaxhighlight lang="c"> |
Ligne 335 : |
Ligne 540 : |
| */ | | */ |
| void alarmeStart( int alarmePos ){ | | void alarmeStart( int alarmePos ){ |
− | // Hack | + | // Hack relais |
| if( alarmePos == 0) | | if( alarmePos == 0) |
− | activerMoteur(); | + | activerRelais(); |
| // Sonnerie | | // Sonnerie |
| else | | else |
Ligne 347 : |
Ligne 552 : |
| */ | | */ |
| void alarmePulse( int alarmePos ){ | | void alarmePulse( int alarmePos ){ |
− | // Hack moteur | + | // Hack relais |
− | if( alarmePos == 0) | + | if( alarmePos == 0){} |
− | jouerMoteur();
| |
| // Sonnerie | | // Sonnerie |
| else | | else |
Ligne 359 : |
Ligne 563 : |
| */ | | */ |
| void alarmeStop( int alarmePos ){ | | void alarmeStop( int alarmePos ){ |
− | // Hack moteur | + | // Hack relais |
| if( alarmePos == 0) | | if( alarmePos == 0) |
− | stopMoteur(); | + | stopRelais(); |
| // Sonnerie | | // Sonnerie |
| else | | else |
Ligne 368 : |
Ligne 572 : |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | * '''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. | + | * '''activerRelais();''' dans cette fonction, il faudrait simplement activer le relais. |
− | * '''jouerMoteur();''' dans cette fonction, il faudrait changer la position du servo moteur de façon à faire sonner le gong. | + | * '''stopRelais();''' dans cette fonction, il faudrait simplement stopper le relais. |
− | * '''stopMoteur();''' dans cette fonction, il faudrait remettre le servo à l'angle zéro.
| |
| | | |
| <syntaxhighlight lang="c"> | | <syntaxhighlight lang="c"> |
− | /*
| + | void activerRelais(){ |
− | * Exemple servo moteur
| + | digitalWrite( RELAIS , HIGH ); |
− | */
| + | } |
− | void activerMoteur(){ | + | void stopRelais(){ |
− | // Remise à zéro du moteur
| + | digitalWrite( RELAIS , LOW ); |
− | moteurTempsAvant = 0;
| |
− | // Activation du servo
| |
− | monServo.attach( SERVO_MOTEUR );
| |
| } | | } |
− | void jouerMoteur(){
| + | </syntaxhighlight> |
− | // Tous les 0.1 secondes effectuer
| + | |
− | unsigned estIlTemps = effectuerAction( moteurTempsAvant, 10 ); | + | == La boîte à musique == |
− | | + | |
− | if( estIlTemps != 0 ){ | + | 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. |
− | // Changer quand a été effectué l'action précédente
| + | |
− | moteurTempsAvant = estIlTemps;
| + | 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 ); |
| | | |
− | // 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();
| |
| } | | } |
| </syntaxhighlight> | | </syntaxhighlight> |
| | | |
− | La fonction '''effectuerAction''', ci dessous, permet de répéter une tâche tous les x temps.
| + | 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(); |
| + | } |
| | | |
− | Cette fonction peut être réutiliser dans d'autres cas.
| + | /* |
| + | * Pendant que l'alarme sonne, répéter une étape |
| + | */ |
| + | void alarmePulse( int alarmePos ){ |
| + | // Boite à musique |
| + | if( alarmePos == 0) |
| + | jouerBoite(); |
| + | // Sonnerie |
| + | else |
| + | jouerMelodie(); |
| + | } |
| | | |
− | <syntaxhighlight lang="c">
| |
| /* | | /* |
− | * Vérifier si c'est le moment d'effectuer l'action | + | * Alarme qui cesse de sonner |
− | *
| |
− | * 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 ){
| + | void alarmeStop( int alarmePos ){ |
− | unsigned long maintenant = millis(); | + | // Boite à musique |
| + | if( alarmePos == 0) |
| + | stopBoite(); |
| + | // Sonnerie |
| + | else |
| + | arreterMelodie(); |
| + | } |
| + | </syntaxhighlight> |
| | | |
− | if( maintenant - tempsAvant >= dureeAttente )
| + | * '''activerBoite();''' dans cette fonction, il faudrait simplement activer l'entrée enable 2. |
− | return maintenant;
| + | * '''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. |
− | return 0; | + | <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> | | </syntaxhighlight> |
| | | |