Un Minuteur qui parle !!!!
Il ne lui manquait que la parole: Maintenant il l'a !
Quand on imagine que la cuisson du rosbif tient à un échappement à ancre, la psychose a vite fait de s'installer ! Ma belle et jolie fille était prévenue, ou pas, par un minuteur dont la sonnerie reste aléatoire, et a décidée de confier cette rude tâche à Djo. Bien qu'amateur de bonne chaire, le pauvre garçon a d'autres chats à fouetter que regarder les secondes s'égrainer lentement ... D'où l'idée de rendre service à l'un et à l'autre, et au rosbif, en utilisant un minuteur qui parle avec la voix et les expressions de Djo !
Le but est donc maintenant de créer un minuteur compact, aux dimensions acceptables, avec une autonomie suffisante et qui parle ! J'en avais marre de mettre dans mes montages les classiques afficheurs deux lignes, seize caractères monochromes; J'ai donc utilisé cette fois-ci un écran TFT de couleur et un Arduino nano pour le piloter, ainsi que la synthèse vocale qui est une DFminiPlayeur. Ces produits sont relativement bon marché chez certains fournisseurs asiatiques. Trois boutons poussoirs suffisent à commander toutes les fonctions et programmer le temps à décompter; en plus la synthèse vocale sert de mode d'emploi une fois la mise en route effectuée, comme sur les défibrillateurs . Je ne vous donnerai pas les fichier MP3 chargés dans la carte SD, ceux-ci étant personnels, et vous aurez tout le plaisir d'utiliser ceux que vous créerez avec les voix des personnes qui vous sont chères ! Un enregistrement de bonne qualité sur un ordiphone, re-dynamisé avec Audacity, et le tour est joué ! J'ai préféré utiliser Arduino plutôt qu'un pic de chez Microchip, car des algorythmes pré-développés existent déjà et facilitent grandement la mise en oeuvre. On ne va pas réinventer le fil à couper le beurre. Le boitier qui contient l'ensemble est disponible chez Hammond et le haut parleur en mini box chez Farnell ou Aliexpress .
Bon, Comment ça marche !
On plonge dans la technique ! Je ne surprendrai personne en reprenant Lapalisse et en disant que les choses les plus simples sont les moins compliquées, voir les plus fiables. Donc on ne va pas refaire le monde en utilisant Arduino nano pour gérer tout ça. Une synthèse DFmini player pour le son et la visualisation est faite par un écran TFT HY1.8 SPI, histoire de mettre un peu de couleur dans l'affichage et de se différencier des classiques afficheurs 2x16 caractères . En plus ce n'est pas cher, car le tout coûte moins de 10 Euros au pays du soleil levant .
Le Schémas :
Comme annoncé plus haut, le chef est un Arduino Nano qui va gérer l'affichage,commençons par là, via quelques lignes de commandes. On y retrouve l'alimentation 5 volts (VCC) fabriquée par le régulateur de l'Arduino, et la masse (GND) pour référencer tout le reste. Une ligne de sélection de l'écran (CS), l'horloge série (SCK) et la transmission de données synchronisées (SDA), un sélecteur (A0) sépare, par son état logique, les commandes et les données, et une ligne facultative de remise à Zéro (RESET) qui peut être connectée au +5v....Et c'est tout ! Dans le but d'économiser la pile pendant le décomptage, j'ai associé le rétro éclairage de l'afficheur à une sortie PWM (Pulse Wave Modulation: modulation de largeur d'impulsion) du microcontrôleur, via un transistor 2N2222 dans la ligne positive de la commande des leds, pour permettre d'en abaisser la brillance, en faisant travailler le transistor en commutation, en réduisant à souhait la valeur efficace de la puissance envoyée à l'écran sans échauffement du transistor. Le négatif est relié en interne à la masse. La résistance R2 limite le courant de base de U$3 !
La communication Homme/Machine se fait par trois boutons qui tirent les informations à la masse... Le premier poussoir va venir shunter le contact du relais pour apporter le moins (-) de la pile à l'ensemble du circuit; le temps de mise en route et c'est le relais qui prend le relais ! (c'est lourd comme tournure de phrase mais je ne voulais pas rater cette occasion ) Les deux autres poussoirs viennent tirer deux entrées à la masse pour effectuer, principalement, les fonctions d'avance (ADV) et de validation (OK) des menus. Un gros avantage du Nano, on peut inclure par logiciel des résistances de Pull-Up sur les entrées, ce qui permet de s'affranchir de résistances physiques ; avantage que j'ai utilisé ici pour limiter le nombre de fils reliant le circuit principal à l'interface de commande .
Le premier bouton poussoir permet d'alimenter le circuit au démarrage, mais on ne va pas garder le doigt dessus pendant toute la durée de la temporisation; c'est le rôle du relais inséré dans le circuit de la pile. Dès que l'Arduino est alimenté et que son boot est terminé, on vient mettre la sortie REL au niveau haut, qui, via la résistance R5 et le transistor U$4, va faire tirer le relais RR1A et le maintenir tiré jusqu'à la fin de l'utilisation; mais si vous vous êtes trompé dans la programmation, on peut faire tomber le relais prématurément et recommencer.
La synthèse vocale est alimentée à travers un régulateur intégré 5 volts pris sur le + de la pile; ce 5 volts est nettoyé par une série de condensateurs et abaissé à 4,2 volts par la diode D2 et filtré/stabilisé par un 220µF ! Pourquoi tout ça ? pour éviter le "Motor Boating", car si la synthèse est prise directement sur le 5 volts du VCC, elle se met en LFO et le message devient à peine audible (j'en ai fais la triste expérience et ça m'a valus de recommencer le PCB). Bien évidement, il ne faut pas que les lignes de communication TX et RX soit à un potentiel supérieur à celui de l'alim; c'est la raison d'être des deux résistances R6 et R7... Pour revenir sur les lignes RX et TX, ce sont des lignes émulées par logiciel, afin de laisser libre les broches de communication série prévue à cet effet, pour conserver le mode monitoring pendant le développement et la mise au point du montage.
Le circuit Imprimé:
Un circuit simple face (et sans strap) supporte tout les composants, qui sont montés coté soudure pour les CMS et dessus pour les composants traversants. Il est évident que les premiers à monter sont les CMS, et avec le plus grand soins; une bonne inspection visuelle évitera des fumées et des crises de nerfs .
Tout un sketch !
C'est quoi ce sketch ?
C'est ainsi qu'Arduino appelle ses programmes; donc je vous soumets ci-dessous le programme que j'ai crée pour faire fonctionner mon minuteur ! Le gros avantage des programmes en open sources, c'est que l'on n'a pas à réinventer chaque fois le fil à couper le beurre... On puise dans ce qui existe déjà et on y ajoute sa sauce, si bien qu'en quelques lignes on peut déjà avoir un résultat spectaculaire.
Comme vous le voyez chaque ligne est commentée, ce qui facilite vraiment la compréhension de ce que j'ai voulu faire. Et qui va vous permettre de personnaliser votre réalisation, jusque dans vos délires les plus inattendus .
// Bernard Leclerc 03/2017 Ae1
// Définition des pinuches de l'écran
#define TFT_PIN_CS 10 // Arduino-Pin an Display CS
#define TFT_PIN_DC 9 // Arduino-Pin an A0
#define TFT_PIN_RST 8 // Arduino Reset-Pin
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
#include <SPI.h>
#include <Adafruit_GFX.h> // Adafruit Grafique Library
#include <Adafruit_ST7735.h> // Adafruit ST7735 Library
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_PIN_CS, TFT_PIN_DC, TFT_PIN_RST); // Display-Library Setup
// Declaration des entrees et des variables
int relay = 7;
int led = 3;
int adv = 5;
int ok = 6;
int mn = 0;
int sk = 0;
int x =0;
// Declaration du port serie pour la synthese vocale
SoftwareSerial mySoftwareSerial(4,2); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void setup()
{
digitalWrite(relay, HIGH); // Automaintien de l'alimentation par le relais
analogWrite(led, 200);// Allume l'écran en PWM a 80%
pinMode(adv, INPUT_PULLUP);// Attribut Bouton "Avance" avec résistance de tirage à vcc
pinMode(ok, INPUT_PULLUP);// Attribut Bouton "OK"avec résistance de tirage à vcc
tft.initR(INITR_BLACKTAB); // Initialisation ST7735-Chip
mySoftwareSerial.begin(9600);
Serial.begin(115200);
if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3.
while(true);
}
//Reglage du volume et envoi du 1er message
myDFPlayer.volume(25); //Reglage du volume de 0 à 30
myDFPlayer.play(1); //Envoi le premier message
}
void loop()
{
tft.fillScreen(ST7735_BLACK);// couleur du fond d'ecran
delay(200); // 0,2 secondes d'attente
//Ecriture du titre
tft.setTextSize(2); // reglage grandeur de caracteres
tft.setTextWrap(true); // Enveloppement Signature?
tft.setCursor(24,4); // Définir la position du texte
tft.setTextColor(ST7735_WHITE);// couleur du texte
tft.print("MINUTES"); // texte ecrit
delay(200); // 0,2 secondes d'attente
//Tracé de la ligne verte
tft.drawLine(10,24,118,24,ST7735_GREEN);// drawLine(x_start,y_start,x_end,y_end,couleur);
//Ecriture du Copyright
tft.setTextSize(1);// Réglage nouvelle grandeur de caracteres
tft.setTextColor(ST7735_GREEN);// Reglage Nouvelle couleur de text
tft.setCursor(18,140);// Position du nouveau texte
tft.print("bernard.leclerc");// Ecriture du texte première ligne
tft.setCursor(30,148);// Position du nouveau texte seconde ligne
tft.print("@wanadoo.fr");// Ecriture du texte seconde ligne
delay(200); // 0,2 secondes d'attente
goto minutes;
// reglage des minutes à decompter
minutes:
tft.setTextSize(5); // reglage grandeur de caracteres
tft.setTextWrap(true); // Enveloppement Signature?
tft.setCursor(30,50); // Définir la position du texte
tft.setTextColor(ST7735_BLUE);// Couleur du texte
tft.print(mn);// Variable de texte ecrit
delay(300); // 0,2 secondes d'attente
//Controle de l'état du bouton incrementation
if (!digitalRead(adv)) { //Si le bouton est appuye
mn = mn + 1; //Les minutes sont incrementees
tft.fillRect(30,50,60,35,ST7735_BLACK); //et on efface la partie d'ecran pour preparer une nouvelle ecriture
}
//Controle de l'état du bouton validation
if (!digitalRead(ok)) { //Si le bouton est appuye
myDFPlayer.play(2); //Envoi le second message
tft.fillRect(30,50,60,35,ST7735_BLACK); //et on efface la partie d'ecran pour preparer une nouvelle ecriture
tft.fillRect(24,4,100,15,ST7735_BLACK); // sur l'entete et la valeur
tft.setTextSize(2); // reglage grandeur des caracteres
tft.setTextWrap(true); // Enveloppement Signature?
tft.setCursor(18,4); // Définir la position du texte
tft.setTextColor(ST7735_WHITE);// Couleur du texte
tft.print("SECONDES"); // texte ecrit
delay(300); // 0,2 secondes d'attente
goto secondes; //Etape suivante
}
goto minutes;//On boucle jusqu'a action sur 'ok'
// reglage des secondes à decompter
secondes:
tft.setTextSize(5); // reglage grandeur de caracteres
tft.setTextWrap(true); // Enveloppement Signature?
tft.setCursor(30,50); // Définir la position du texte
tft.setTextColor(ST7735_RED);// set couleur du texte
tft.print(sk);// variable du texte ecrit
delay(300); // 0,2 secondes d'attente
//Controle de l'état du bouton incrementation
if (!digitalRead(adv)) { //Si le bouton est appuye
sk = sk + 5; // les secondes sont incrementé de 5 unitees
tft.fillRect(30,50,60,35,ST7735_BLACK); //et on efface la partie d'ecran pour preparer une nouvelle ecriture
}
// Si l'afichage des secondes depasse la minute
if (sk > 59) {
sk = 0; //on remet a zero
}
//Controle de l'état du bouton validation
if (!digitalRead(ok)){ //Si le bouton est appuye
myDFPlayer.play(3); //Envoi le troisième message
tft.fillRect(30,50,60,35,ST7735_BLACK); //et on efface la partie d'ecran pour preparer une nouvelle ecriture
tft.fillRect(4,4,130,15,ST7735_BLACK); // sur l'entete et la valeur
tft.setTextSize(2); // reglage grandeur caractère
tft.setTextWrap(true); // Enveloppement Signature?
tft.setCursor(40,4); // Définir la position du texte
tft.setTextColor(ST7735_WHITE);// Couleur du texte
tft.print("TIME"); // texte ecrit
delay(300); // 0,2 secondes d'attente
goto decompte; //Etape suivante
}
goto secondes; //On boucle jusqu'a action sur 'ok'
//Lancement du décompte
decompte:
//affichage des minutes pour le décompte
tft.fillRect(40,40,60,80,ST7735_BLACK); //et on efface la partie d'ecran pour preparer une nouvelle ecriture
tft.setTextSize(5); // reglage grandeur de caracteres
tft.setTextWrap(true); // Enveloppement Signature?
tft.setCursor(40,40); // Définir la position du texte
tft.setTextColor(ST7735_BLUE);// Couleur du texte
tft.print(mn);//texte ecrit
delay(200); // 0,2 secondes d'attente
//affichage des secondes pour le décompte
tft.setTextSize(5); // reglage grandeur des caracteres
tft.setTextWrap(true); // Enveloppement Signature?
tft.setCursor(40,80); // Définir la position du texte
tft.setTextColor(ST7735_RED);// Couleur du texte
tft.print(sk);//texte ecrit
delay(790); // delay à ajuster XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
//Décrementation du temps
sk = sk - 1; // On soustrait 1 seconde
if(mn<1 && sk<1) { // Le temps est écoule
goto arret;
}
if(sk < 1) { // Décrementation des minutes si les secondes sont écoulées
sk = 59; // Remise des secondes à 59
mn = mn - 1;
}
// Gestion du rétroeclairage pour economiser la batterie
if(mn < 1) {
analogWrite(led, 200);// Allume l'écran en PWM a 80%
}
else {
analogWrite(led,55);// Reduit l'eclairage a 15% avant la dernière minute
}
//Arret forcé si les deux boutons sont appuyes simultanement
if (!digitalRead (adv) && !digitalRead (ok)) {
digitalWrite(relay, LOW); // Coupure de l'alimentation
}
goto decompte;
arret:
myDFPlayer.play(4); //Envoi le quatrième message
tft.fillScreen(ST7735_BLACK);// couleur du fond d'ecran
delay(200); // 0,2 secondes d'attente
tft.setTextSize(4); // reglage grandeur de caracteres
tft.setTextWrap(true); // Enveloppement Signature?
tft.setTextColor(ST7735_BLUE);// Couleur du texte
tft.setCursor(20,10); // Définir la position du texte
tft.print("Ho!");//texte ecrit
tft.setCursor(00,60); // Définir la position du texte
tft.print("C'est");//texte ecrit
tft.setCursor(20,110); // Définir la position du texte
tft.print("CUIT");//texte ecrit
delay(200); // 0,2 secondes d'attente
//Messages Finaux avec arret forcé
do
{
delay(50); // delay de la boucle
x = x + 1;
if (!digitalRead (adv) && !digitalRead (ok)) {
digitalWrite(relay, LOW); // Coupure de l'alimentation
}
} while (x < 400); // Et on boucle 400 fois
myDFPlayer.play(5); //Envoi le cinqième message
delay(200); // 0,2 secondes d'attente
// Autre message si pas arreté
x = 0; //Remise à Zero de la boucle
do
{
delay(50); // delay de la boucle
x = x + 1;
if (!digitalRead (adv) && !digitalRead (ok)) {
digitalWrite(relay, LOW); // Coupure de l'alimentation
}
} while (x < 400); // Et on boucle 400 fois
myDFPlayer.play(6); //Envoi le sixième message
delay (10000);
digitalWrite(relay, LOW); // Coupure de l'alimentation
}
Afin de réduire la consommation, et de prolonger la durée de vie de la pile, j'utilise une sortie PWM (à Modulation de Largeur d'Impulsion) pour réduire le rétro-éclairage de l'écran, pendant la phase de décomptage du temps et tant que celui-ci est supérieur à 1 minute !
Egalement, pendant cette même phase de décomptage, une pression simultanée sur les deux boutons (ADV et OK) permet de forcer l'arrêt ! En cas d'erreur de réglage du temps ou pour arrêter prématurément le minuteur, que ce soit en cours ou en fin de cycle .
Il reste énormément de place dans l'Arduino, pour ajouter des lignes et des fonctions, car dans l'état qu'il est ce sketch n'occupe que 39% de la capacité de stockage de la mémoire programme ... Donc on peut encore en mettre .
Pour des raisons de respect de la vie privée, je ne vous joindrai pas les fichiers sonores que j'ai chargé dans ma synthèse vocale ! L'intérêt de ce minuteur est justement de le faire parler avec la voix et les expressions d'une (ou plusieurs) personne (s) que vous souhaitez entendre encore pendant quelques années . Il suffit pour cela d'un PC , et si vous êtes un maniaque de la qualité, d'un bon micro pour enregistrer les phrases à prononcer (on peut y inclure le mode d'emploi, par exemple). On pauffine l'intelligibilité avec un logiciel genre Audacity pour crée des fichiers MP3 (sans tag) appelés 001, 002, 003 ... placés sur une carte micro SD sous un répertoire 01.
Pour copier les fichiers sonores dans la carte SD, faites un formatage complet de celle-ci (Fat32) et attendez bien la fin de la copie ... J'ai eu quelques aventures là dessus qui m'ont pris pas mal de temps avant de voir que je ne respectais pas les règles minimums .
La Synthèse vocale: La petite carte mémoire est glissée ensuite dans le support prévu à cet effet sur le circuit de la DFPlayer Mini, et doit y demeurer !
Vue de l'électronique terminée:
L'écran TFT vient prendre place sur le circuit Arduino ! Attention lors des manipulations, ces écrans sont assez fragiles...
La mise en boite :
Lors de la mise en boite des circuits, il est prudent de respecter les isolations des éléments métalliques en contact avec le circuit imprimé et surtout les picots de composants ... Bien isoler le corps de la pile à pression de 9 volts ! celui-ci est en tôle. Pour ma part , j'ai mis un carton d'isolation et un ruban adhésif autour.
L'enceinte acoustique est montée sur le panneau arrière, ainsi que les boutons de commande .
Je dis enceinte acoustique car si l'on veut un minimum d'intelligibilité dans la voix, on ne peut pas se contenter d'utiliser un haut-parleur sans charge .Vous reconnaîtrez sur la photo une mini box ou haut-parleur de PC.
Ci-dessous, l'ensemble des fichiers pour réalisation :
Timer synth (59.01 Ko)
Ajouter un commentaire