ENIB 2022 - groupe D : Tape-Taupe
Sommaire
Photo de l'équipe
(Ajouter une photo de nous.)
Que fait ce projet ?
Des taupes montent et descendent. Quand elles sortent de leur trou, il faut appuyer dessus pour les faire redescendre. Quand le joueur arrive à appuyer sur la taupe avant qu'elle ne redescende, il marque des points qui sont affichés sur l'écran LCD et la taupe reste en bas.
Liste des composants
- 1 Arduino Mega
- Écran LCD (affichage du score)
- 7 Boutons poussoirs
- 7 solénoïdes
- Carte 2 relais (x4)
- Boitier en bois (découpe laser)
- Attache (bouton sur le solénoïde) (stylo 3D) (x7)
- Traverses (x3)
- Circlip (x7)
- Fils (x beaucoup)
- Breadboard
- Alimentation 12V
- Alimentation 5V (câble USB+PC)
Construction
Le dessus de la boite est percé, dans chaque trou, il y a une taupe.
Construction de la taupe :
Mécanisme prévu à l'origine pour allonger la course de la taupe :
Construction de la boite :
Il y a un trou pour chaque taupes dans le dessus de la boite, chaque rangés de taupes sont attachées sur une traverse. Les traverses servent également à rigidifier la boite.
Schéma électrique
Un Arduino mage était nécessaire pour pouvoir gérer toutes les entrés en sorties du projet : Pour chaque taupes (9 prévues 7 au final) :
- Commande du relais (qui commande le solénoïde)
- Entrée du bouton poussoir
Ecran LCD.
Code
Tout d'abord il faut tester les composants pour s'assurer qu'ils fonctionnent tous bien
Bouton
Ce code permet de verifier le fonctionnement des boutons
int cpt_taupe1 = 22; //22 represente le pin ou sera branché le bouton
void setup() {
pinMode(cpt_taupe1, INPUT); //Cette ligne permet de passer le pin en mode entré
Serial.begin(9600); //Initialise le terminal
}
void loop() {
Serial.print("T1:");
Serial.println(digitalRead(cpt_taupe1)); //Ecris l'etat du pin du bouton (0 ou 1)
}
Solénoïde
Ce code permettra d'activer/desactiver le selenoide 1s/1s
int cmd_taupe1 = 53; //53 represente le pin ou sera branché le bouton
void setup() {
pinMode(cmd_taupe1, OUTPUT); //Cette ligne passe le pin en sortie
}
void loop() {
digitalWrite(cmd_taupe1, HIGH); //Active le relais
delay(1000); //attends 1s
digitalWrite(cmd_taupe1, LOW); //Desactive le relais
delay(1000); //attends 1s
}
LCD
Pour voir toute les possibilité offerte par le LCD nous vous conseillons le site electronique amateur[1].
Ici on ne fait que écrire "vous avez: xx points" sur l'écran
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
Adafruit_SH1106 display(23);
void setup() {
display.begin(); // initialisation de l'afficheur
display.clearDisplay(); // ça efface à la fois le buffer et l'écran
}
void loop() {
display.setCursor(30, 15); // coordonnées du point de départ du texte
display.setTextColor(WHITE);
display.setTextSize(1); // taille par défaut
display.println("Vous avez :");
display.setCursor(50, 35); // coordonnées du point de départ du texte
display.println(" points");
display.setCursor(30, 35); // coordonnées du point de départ du texte
display.print(pts);
display.display(); //Affiche l'ecran
display.clearDisplay(); //Efface l'ecran
}
Taupe
Ici le code rassemble un solenoide et un bouton pour faire une taupe
int cmd_taupe1 = 53;
int int_cmd_taupe1 = 1;
int cpt_taupe1 = 22;
int pts = 0;
int start = 0;
int now = 0;
void setup() {
pinMode(cmd_taupe1, OUTPUT);
pinMode(cpt_taupe1, INPUT);
Serial.begin(9600);
}
void loop() {
now = millis(); //On récupère le temps dans une variable
if (now-start > 1000) //Si il s'est écoulé plus de 1s
{
start = millis(); //On renitialise le temps de départ du timer
if (int_cmd_taupe1 == 1) //Si la taupe est rentré elle sort
int_cmd_taupe1 = 0;
else //sinon elle rentre
int_cmd_taupe1 = 1;
}
digitalWrite(cmd_taupe1, int_cmd_taupe1); //On ecrit sur les pin des selenoide les valeurs de commande de ceux ci
//Capteur
if (digitalRead(cpt_taupe1) == 1 && int_cmd_taupe1 == 0) //Si la taupe est relevé est que le bouton est appuyé on gagne 1 points et la taupe se baisse
{
pts++;
int_cmd_taupe1 = 1;
}
}
Prog final
Aprés avoir vérifié et cablé il ne reste plus qu'a tout rassembler pour le code final
Ici il n'y a que 3 taupes mais vous pouvez en rajouter a votre guise et changer le texte sur l'ecran.
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>
Adafruit_SH1106 display(23);
int cmd_taupe1 = 53;
int cmd_taupe2 = 51;
int cmd_taupe3 = 49;
int int_cmd_taupe1 = 1;
int int_cmd_taupe2 = 1;
int int_cmd_taupe3 = 1;
int cpt_taupe1 = 22;
int cpt_taupe2 = 24;
int cpt_taupe3 = 26;
int pts = 0;
int start = 0;
int now = 0;
int random_int = 0;
void setup() {
pinMode(cmd_taupe1, OUTPUT);
pinMode(cmd_taupe2, OUTPUT);
pinMode(cmd_taupe3, OUTPUT);
pinMode(cpt_taupe1, INPUT);
pinMode(cpt_taupe2, INPUT);
pinMode(cpt_taupe3, INPUT);
Serial.begin(9600);
display.begin(); // initialisation de l'afficheur
display.clearDisplay(); // ça efface à la fois le buffer et l'écran
randomSeed(analogRead(0)); //Initialise le random par la lecture du bruit d'un pin analogique non branché
}
void loop() {
now = millis(); //On récupère le temps dans une variable
if (now-start > 1000) //Si il s'est écoulé plus de 1s
{
start = millis(); //On renitialise le temps de départ du timer
random_int = random(1, 3); //On créer un nombre random entre 1 et le nombre de taupe (ici 3)
if (int_cmd_taupe1 == 1 and random_int == 1) //Si la taupe est rentré est que le random l'indique elle sort
int_cmd_taupe1 = 0;
else //sinon elle rentre
int_cmd_taupe1 = 1;
if (int_cmd_taupe2 == 1 and random_int == 2)
int_cmd_taupe2 = 0;
else
int_cmd_taupe2 = 1;
if (int_cmd_taupe3 == 1 and random_int == 3)
int_cmd_taupe3 = 0;
else
int_cmd_taupe3 = 1;
}
//Taupe
digitalWrite(cmd_taupe1, int_cmd_taupe1); //On ecrit sur les pin des selenoide les valeurs de commande de ceux ci
digitalWrite(cmd_taupe2, int_cmd_taupe2);
digitalWrite(cmd_taupe3, int_cmd_taupe3);
//LCD
display.setCursor(30, 15); // coordonnées du point de départ du texte
display.setTextColor(WHITE);
display.setTextSize(1); // taille par défaut
display.println("Vous avez :");
display.setCursor(50, 35); // coordonnées du point de départ du texte
display.println(" points");
display.setCursor(30, 35); // coordonnées du point de départ du texte
display.print(pts);
display.display(); //Affiche l'ecran
display.clearDisplay(); //Efface l'ecran
//Capteur
if (digitalRead(cpt_taupe1) == 1 && int_cmd_taupe1 == 0) //Si la taupe est relevé est que le bouton est appuyé on gagne 1 points et la taupe se baisse
{
pts++;
int_cmd_taupe1 = 1;
}
if (digitalRead(cpt_taupe2) == 1 && int_cmd_taupe2 == 0)
{
pts++;
int_cmd_taupe2 = 1;
}
if (digitalRead(cpt_taupe3) == 1 && int_cmd_taupe3 == 0)
{
pts++;
int_cmd_taupe3 = 1;
}
}