ENIB 2020 : Question pour un misérable
Sommaire
[masquer]Photo de l'équipe
Que fait ce projet ?
Le projet est un jeu de culture générale sous la forme d'un vrai ou faux, mais pas seulement. Pour chacune de vos réponses, c'est la voix d'un de nos profs préférés qui vous annoncera si votre réponse est correcte ( cf titre du projet )
Liste des composants
- Composants
- Une Arduino D1 mini
- Une breadboard
- 3 boutons
- 3 LEDs
- Un interrupteur
- Un haut parleur
- Un lecteur de carte SD et une carte SD
- Des fils
Il est également possible d'utiliser 3 petites breadboards plutôt qu'une grande, pour réduire l'encombrement du circuit et pouvoir le rentrer plus facilement dans le cube
Câblage
BROCHAGE ___________________ / D1 mini \ - |[ ]RST TX[ ]| - - |[ ]A0 -GPIO RX[ ]| - LED VERTE |[X]D0-16 5-D1[X]| - Bouton 3 RX MP3-TF-16P |[X]D5-14 4-D2[X]| - Bouton 2 TX MP3-TF-16P |[X]D6-12 0-D3[X]| - Bouton 1 LED ROUGE |[X]D7-13 2-D4[ ]| LED_BUILTIN - |[ ]D8-15 GND[X]| - GND (Bouton, MP3-TF-16P) - |[ ]3V3 5V[X]| - MP3-TF-16P | +---+ | |_______|USB|________|
+-------\_/--------+ +5V |[X] MP3-TF-16P [ ]| resistance 1K - TX |[X] [ ]| RX |[X] __________ [ ]| |[ ]| |[ ]| |[ ]| CARTE |[ ]| Haut-Parleur |[X]| SD |[ ]| GND |[X]| |[ ]| Haut-Parleur |[X]| |[ ]| |___|__________|___|
Pour le câblage, nous avons opté pour une carte Wemos, nous avons pensé à la Raspberry Pi, mais nous préférions la Wemos pour sa facilité d'utilisation.
Nous avons des boutons pour répondre vrai ou faux aux questions posées, des LEDs pour savoir si on a eu vrai ou faux, et un haut-parleur pour le son des questions et des réponses.
Nous utilisons également une carte SD qui contient tous les sons des questions et réponses.
Nous nous sommes fiés à la datasheet plus haut pour réaliser le câblage.
Création de la boîte
On a créé le patron de la boîte avec le logiciel Inkscape.
Nous avons décidé de créer la boîte avec du bois contreplaqué à l'aide de la découpeuse laser.
On a laissé de la place pour faire passer des LEDs, des boutons, un haut-parleur et un port d'alimentation.
Nous avons assemblé les différentes parties de la boîte avec le pistolet à colle.
Code
1
2 //Les petits Débrouillards - janvier 2019 CC-By-Sa
3
4 #include "Arduino.h"
5 #include "SoftwareSerial.h"
6 #include "DFRobotDFPlayerMini.h"
7
8 // D5 est le RX du ESP8266, connecté au TX du MP3-TF-16P
9 // D6 est le TX du ESP8266, connecté au RX du MP3-TF-16P
10 SoftwareSerial mySoftwareSerial(D5, D6); // RX, TX
11 DFRobotDFPlayerMini myDFPlayer;
12
13 long hasard; // déclaration d'une variable long
14 bool solutions[] = {false,false,false,true};
15 bool reponse = false;
16 int brocheBp1 = 0; // le GPIO 0 du D1 Mini est la broche D3
17 int brocheBp2 = 4; // le GPIO 0 du D1 Mini est la broche D3
18 int brocheBp3 = 5; // le GPIO 0 du D1 Mini est la broche D3
19 int BrocheLed = 13; // Broche de la LED - le GPIO 13 du D1 Mini est la broche D
20 int BrocheLed2 = 16; // Broche de la LED - le GPIO 16 du D1 Mini est la broche D
21 int brillance = 0; // Intensité lumineuse de la LED
22 int pas = 5; // Gradation de l'intensité lumineuse
23 int nombreDeSons = 4;// indiquer le nombre de son sur la carte SD. Chaque fichier est numeroté de 001 à 047 ici.
24
25 void setup() {
26 mySoftwareSerial.begin(9600);
27
28 Serial.begin(115200); // initialise la connexion série vers le PC à 115200 bauds
29
30 Serial.println();
31 Serial.println(F("Boite à sons"));
32 Serial.println(F("Initialisation du lecteur mp3 ... (peut prendre 3 Ã 5 secondes)"));
33
34 if (!myDFPlayer.begin(mySoftwareSerial)) { // utilise softwareSerial pour communiquer avec le MP3-TF-16P.
35 Serial.println(F("Incapable de démarrer :"));
36 Serial.println(F("1. Vérifiez les connexions !"));
37 Serial.println(F("2. Inserez la carte SD !"));
38 while(true);
39 }
40 Serial.println(F("La Boite à sons prête !"));
41
42 myDFPlayer.setTimeOut(500); // place la communication serie time out 500ms
43 myDFPlayer.volume(30); // règle le volume (de 0 to 30).
44 myDFPlayer.play(9); // joue le fichier son de bienvenue.
45 delay(4500);
46 myDFPlayer.play(10); // joue le fichier son pour l'utilisation.
47 delay(9000);
48 // si la broche analogique 0 n'est pas connectée, le bruit analogique aléatoire
49 // provoquera l'appel de l'instruction randomSeed() pour générer
50 // différent nombre de départ à chaque exécution du programme.
51 // randomSeed() brouillera alors la fonction aléatoire
52
53 randomSeed(analogRead(0));
54 pinMode (brocheBp1, INPUT_PULLUP); // active la résistance de Pull-up interne
55 pinMode (brocheBp2, INPUT_PULLUP); // active la résistance de Pull-up interne
56 pinMode (brocheBp3, INPUT_PULLUP); // active la résistance de Pull-up interne
57 pinMode (BrocheLed, OUTPUT); // déclare la broche en sortie
58 pinMode (BrocheLed2, OUTPUT); // déclare la broche en sortie
59 }
60
61 void loop() {
62 analogWrite(BrocheLed, brillance); // Allume la led à la valeur souhaitée
63 brillance = brillance + pas; // incrémente la lulimosité de la led
64 if (brillance <= 0 || brillance >= 255) { // inverse l'incrémentation lorsque la luminosité est à un extrême (éteint ou maximum)
65 pas = -pas;
66 }
67 delay(30);
68
69 if ( digitalRead(brocheBp1) == LOW ) // lorqu'on appuis sur le bouton
70 {
71 analogWrite(BrocheLed, 255); // on allume la led au maximum.
72 delay(250); // délais anti-rebond.
73 Serial.println("Appuis Bouton Question"); // info sur le moniteur série
74 hasard = random(1,nombreDeSons+1); // on tire un nombre au hasard de 1 Ã 47 (parce que j'ai 47 piste de son).
75 Serial.print("Lecture de la question ");
76 Serial.println(hasard); // le nombre est sur le moniteur série
77 myDFPlayer.play(hasard); // joue le son tiré au hasard.
78 delay(10000);
79 while ((digitalRead(brocheBp3) == HIGH) and (digitalRead(brocheBp2) == HIGH))
80 {
81 Serial.println("Boucle");
82 analogWrite(BrocheLed, brillance); // Allume la led à la valeur souhaitée
83 brillance = brillance + pas; // incrémente la lulimosité de la led
84 if (brillance <= 0 || brillance >= 255) { // inverse l'incrémentation lorsque la luminosité est à un extrême (éteint ou maximum)
85 pas = -pas;
86 }
87 delay(30);
88 }
89 if (digitalRead(brocheBp3) == LOW)
90 {
91 reponse = true;
92 }
93 else if (digitalRead(brocheBp2) == LOW)
94 {
95 reponse = false;
96 }
97 if (reponse == solutions[hasard - 1])
98 {
99 Serial.println("Bien joué");
100 analogWrite(BrocheLed2, 255);
101 myDFPlayer.play(11);
102 delay(2000);
103 }
104 if (reponse != solutions[hasard - 1])
105 {
106 Serial.println("Raté");
107 myDFPlayer.play(random(12,15));
108 delay(1000);
109 }
110 myDFPlayer.play(hasard+4);
111 delay(8000);
112 }
113 analogWrite(BrocheLed2, 0);
114 }
Pour faire la voix des questions et des réponses nous avons utilisé ReadSpeaker