ENIB 2020 : Question pour un misérable
Sommaire
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
Les petits Débrouillards - janvier 2019 CC-By-Sa
- include "Arduino.h"
- include "SoftwareSerial.h"
- include "DFRobotDFPlayerMini.h"
// D5 est le RX du ESP8266, connecté au TX du MP3-TF-16P // D6 est le TX du ESP8266, connecté au RX du MP3-TF-16P SoftwareSerial mySoftwareSerial(D5, D6); // RX, TX DFRobotDFPlayerMini myDFPlayer;
long hasard; // déclaration d'une variable long bool solutions[] = {false,false,false,true}; bool reponse = false; int brocheBp1 = 0; // le GPIO 0 du D1 Mini est la broche D3 int brocheBp2 = 4; // le GPIO 0 du D1 Mini est la broche D3 int brocheBp3 = 5; // le GPIO 0 du D1 Mini est la broche D3 int BrocheLed = 13; // Broche de la LED - le GPIO 13 du D1 Mini est la broche D int BrocheLed2 = 16; // Broche de la LED - le GPIO 16 du D1 Mini est la broche D int brillance = 0; // Intensité lumineuse de la LED int pas = 5; // Gradation de l'intensité lumineuse int nombreDeSons = 4;// indiquer le nombre de son sur la carte SD. Chaque fichier est numeroté de 001 à 047 ici.
void setup() {
mySoftwareSerial.begin(9600); Serial.begin(115200); // initialise la connexion série vers le PC à 115200 bauds Serial.println(); Serial.println(F("Boite à sons")); Serial.println(F("Initialisation du lecteur mp3 ... (peut prendre 3 à 5 secondes)")); if (!myDFPlayer.begin(mySoftwareSerial)) { // utilise softwareSerial pour communiquer avec le MP3-TF-16P. Serial.println(F("Incapable de démarrer :")); Serial.println(F("1. Vérifiez les connexions !")); Serial.println(F("2. Inserez la carte SD !")); while(true); } Serial.println(F("La Boite à sons prête !")); myDFPlayer.setTimeOut(500); // place la communication serie time out 500ms myDFPlayer.volume(30); // règle le volume (de 0 to 30). myDFPlayer.play(9); // joue le fichier son de bienvenue. delay(4500); myDFPlayer.play(10); // joue le fichier son pour l'utilisation. delay(9000); // si la broche analogique 0 n'est pas connectée, le bruit analogique aléatoire // provoquera l'appel de l'instruction randomSeed() pour générer // différent nombre de départ à chaque exécution du programme. // randomSeed() brouillera alors la fonction aléatoire
randomSeed(analogRead(0)); pinMode (brocheBp1, INPUT_PULLUP); // active la résistance de Pull-up interne pinMode (brocheBp2, INPUT_PULLUP); // active la résistance de Pull-up interne pinMode (brocheBp3, INPUT_PULLUP); // active la résistance de Pull-up interne pinMode (BrocheLed, OUTPUT); // déclare la broche en sortie pinMode (BrocheLed2, OUTPUT); // déclare la broche en sortie
}
void loop() {
analogWrite(BrocheLed, brillance); // Allume la led à la valeur souhaitée brillance = brillance + pas; // incrémente la lulimosité de la led if (brillance <= 0 || brillance >= 255) { // inverse l'incrémentation lorsque la luminosité est à un extrême (éteint ou maximum) pas = -pas; } delay(30); if ( digitalRead(brocheBp1) == LOW ) // lorqu'on appuis sur le bouton { analogWrite(BrocheLed, 255); // on allume la led au maximum. delay(250); // délais anti-rebond. Serial.println("Appuis Bouton Question"); // info sur le moniteur série hasard = random(1,nombreDeSons+1); // on tire un nombre au hasard de 1 à 47 (parce que j'ai 47 piste de son). Serial.print("Lecture de la question "); Serial.println(hasard); // le nombre est sur le moniteur série myDFPlayer.play(hasard); // joue le son tiré au hasard. delay(10000); while ((digitalRead(brocheBp3) == HIGH) and (digitalRead(brocheBp2) == HIGH)) { Serial.println("Boucle"); analogWrite(BrocheLed, brillance); // Allume la led à la valeur souhaitée brillance = brillance + pas; // incrémente la lulimosité de la led if (brillance <= 0 || brillance >= 255) { // inverse l'incrémentation lorsque la luminosité est à un extrême (éteint ou maximum) pas = -pas; } delay(30); } if (digitalRead(brocheBp3) == LOW) { reponse = true; } else if (digitalRead(brocheBp2) == LOW) { reponse = false; } if (reponse == solutions[hasard - 1]) { Serial.println("Bien joué"); analogWrite(BrocheLed2, 255); myDFPlayer.play(11); delay(2000); } if (reponse != solutions[hasard - 1]) { Serial.println("Raté"); myDFPlayer.play(random(12,15)); delay(1000); } myDFPlayer.play(hasard+4); delay(8000); } analogWrite(BrocheLed2, 0);
}
Pour faire la voix des questions et des réponses nous avons utilisé ReadSpeaker