ENIB 2022 - groupe D : Tape-Taupe

De Les Fabriques du Ponant
Aller à : navigation, rechercher

Que fait ce projet ?

Tape-Taupe

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 OLED (affichage du score)
  • 7 Boutons poussoirs
  • Résistances de pull down et de protection pour les 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 :

Taupe origninale

La taupe est attachée au solénoïde par un support réalisé avec un stylo 3D.

Une taupe

Construction de la boite

Fichiers vectoriels du tracé de découpe de la boite :

Fichier:BoxPartie1.pdf

Fichier:BoxPartie2.pdf

Fichier:BoxPartie3.pdf

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.

Intérieur de la boite 2.jpg
Amélioration
  • Faire coulisser les taupes dans un tube pour éviter qu'elles ne se bloquent sur les rebords du trou.
  • Modéliser et imprimer en 3D un support pour le bouton.

Schéma électrique

Un Arduino mega é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

Relais

Un relais et un interrupteur commandé par un signal de commande électriques.

Il faut d'un côté brancher le relais à la masse de l'arduino, 5V de l'arduino et sur le pin de l'arduino qui servira à commander le relais.

De l'autre côté, il faut brancher le + et la masse de la tension utilisée par le composant commandé et le câble de sortie qui sortira soit du OV soit du 12V ici.

Ensuite quand on met le pin a 1 on active le relais et donc on sort du 12V et quand on a un 0 on sort du 0V.

Solénoïde

Il s'agit d'un électroaimant qui fait rentrer une tige montée sur ressort quand elle est alimenté et quand elle n'est pas alimenté la tige ressort grâce au ressort.

Pour l'alimenter il faut mettre une de ses bornes a la masse et l'autre à 12V.

Attention le solénoïde chauffe beaucoup, mais c'est prévu par le fonctionnement normal.

Bouton

Il faut mettre une borne aux 5V de l'Arduino via une résistance (100Ω) et une autre sur un pin de commande, et une résistance entre ce pin et la masse (10kΩ).

Schéma

Code

Tout d'abord il faut tester les composants pour s'assurer qu'ils fonctionnent tous bien.

Bouton

Ce code permet de vérifier 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 solénoïde 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 toutes les possibilités offertes par l'écran, nous vous conseillons le site electronique amateur[1].

Ici on ne fait qu'é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 câblé il ne reste plus qu'à 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;
  }
}