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 !

 

Timer synth

 

       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 :

Timer synth sch

 

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

Timer synth brd

 

Timer synth cmp

 

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 . 

 

Timer synth dessous

Timer synth nano

Timer synth button

 

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 .

 

Timer synth synth

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:

Timer synth dessus

L'écran TFT vient prendre place sur le circuit Arduino ! Attention lors des manipulations, ces écrans sont assez fragiles...

 

La mise en boite :

Timer synth inboxar1

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.

 

Timer synth inboxar

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.

 

Timer synth hp 

 

Ci-dessous, l'ensemble des fichiers pour réalisation :

Timer synthTimer synth (59.01 Ko)

 

 

Ajouter un commentaire