Jeu de mémoire : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
({{Vert|Fabrication de la carte}})
({{Vert|Fabrication de la carte}})
Ligne 220 : Ligne 220 :
 
[[Fichier:Board.png|400px|thumb|right|Board de la carte]]
 
[[Fichier:Board.png|400px|thumb|right|Board de la carte]]
 
[[Fichier:Connecteur.png|400px|thumb|right|Schémas du connecteur]]
 
[[Fichier:Connecteur.png|400px|thumb|right|Schémas du connecteur]]
 +
 +
  
  

Version du 14 janvier 2015 à 11:52


Cahier des charges

  • Présentation du projet


L'objectif du projet est de réaliser un jeu de mémoire en quantité industrielle (une centaine). Ce jeu est simple : une série de leds s'allume dans un ordre particulier, le joueur doit reproduire parfaitement cette séquence.


  • Objectifs

Bête à cornes.png

  • Public ciblé

- Dimension des cartes : le plus compact possible
- Disposition des leds, boutons et microcontrôleur : leds et boutons organisés en 4 (comme un dé), position du microcontrôleur à définir
- Différents niveaux possibles : la difficulté des niveaux augmente avec des séries à reproduire qui deviennent de plus en plus longues et rapides
- Alimentation de la carte : le jeu de mémoire sera alimenté par une pile plate du type pile de montre


  • Description du fonctionnement

Les leds de ce jeu sont contrôlées par un microcontrôleur AT Tiny qui permet de faire allumer aléatoirement les leds dans un ordre précis.

Etude préalable des leds

Tests sur carte Arduino Uno

On fait d'abord clignoter une led sans bouton :

void setup()
{
  pinMode(13,OUTPUT); // on précise ici que la patte 13 est une sortie
}

void loop()
{
  digitalWrite(13,0); // extinction de la led 13 de la carte Arduino
  delay(100);
  digitalWrite(13,1); // éclairement de la led 13 de la carte Arduino
  delay(100);
}

On fait ensuite clignoter la led avec un bouton sur le principe suivant : si le bouton est appuyé, la led est allumée, sinon elle est éteinte. On code le programme suivant :

unsigned char ledPin = 13; // on positionne la led
unsigned char bpPin = 2;   // le bouton est sur la patte 2
unsigned char etatBp;      // on récupère l'état du bouton

void setup()
{
  pinMode(bpPin,INPUT);
  pinMode(ledPin,OUTPUT); // on configure les e/s
}

void loop()
{
  etatBp = digitalRead(bpPin); // on "lit" l'état de l'entrée
  if (etatBp==1)
       digitalWrite(ledPin,0); // on "écrit" l'état de la sortie 
  else
       digitalWrite(ledPin,1);
}

On veut savoir s'il est possible d'avoir un signal d'entrée et un signal de sortie sur la même patte du microcontrôleur. L'objectif est simple : si le bouton est appuyé, on allume la led sur la carte Arduino et la led externe, sinon on les éteint. Nous allons faire 2 programmes distincts pour observer d'une part l'état du bouton avec la liaison série, et d'autre part faire clignoter la led.

Liaison série

unsigned char bpPin = 13; // le bouton est sur la patte 13
unsigned char etatBp;    // on récupère l'état du bouton 

void setup()
{
  pinMode(bpPin,INPUT);  // on configure les e/s
  Serial.begin(9600);    // on communique avec la liaison série
}

void loop()
{
  etatBp = digitalRead(bpPin); // on "lit" l'état de l'entrée

  Serial.print("Etat du bouton : ");
  Serial.println(etatBp);      // on observe l'état du bouton avec la liaison série

  delay(500);
}

On réutilise le programme qui fait clignoter une led sans bouton vu ci-dessus. On constate que la led externe clignote, ce qui montre qu'il est possible de commander 2 opérations différentes sur une même patte de microcontrôleur.

Remarque : nous avons fait les tests sur une carte Arduino Uno alimentée en 5V. En réalité, le microcontrôleur AT Tiny que nous allons utiliser sera alimenté en 3V avec une pile CR2032. Par conséquent, nous allons faire de nouveaux tests avec une carte Arduino Due qui permet de fournir 3V.


Tests sur Arduino Due

On vérifie si les programmes testés précédemment fonctionnent avec la carte Adruino Due.

On fait clignoter la led sans bouton :

void setup()
{
  pinMode(13,OUTPUT); // on précise ici que la patte 13 est une sortie
}

void loop()
{
  digitalWrite(13,0); // extinction de la led 13 de la carte Arduino
  delay(100);
  digitalWrite(13,1); // éclairement de la led 13 de la carte Arduino
  delay(100);
}

Utilisation de la liaison série :

unsigned char bpPin = 13; // le bouton est sur la patte 13
unsigned char etatBp;    // on récupère l'état du bouton 

void setup()
{
  pinMode(bpPin,INPUT);  // on configure les e/s
  Serial.begin(9600);    // on communique avec la liaison série
}

void loop()
{
  etatBp = digitalRead(bpPin); // on "lit" l'état de l'entrée

  Serial.print("Etat du bouton : ");
  Serial.println(etatBp);      // on observe l'état du bouton avec la liaison série

  delay(500);
}

On obtient les mêmes résultats qu'avec la carte Arduino Uno : on peut interragir sur une seule patte en envoyant un signal en entrée et en en récupérant un autre en sortie.

Nous avons câblé les composants de la manière suivante pour réaliser les tests sur Arduino Uno et Due.

Test carte.png

Fabrication d'une première carte

Routage de la carte

Choix du microcontrôleur

Nous allons fabriquer une carte avec 4 leds et 4 boutons. Comme nous pouvons les contrôler sur une même patte, le microcontrôleur que nous utiliserons aura besoin de 4 ports e/s, un GND et un VCC.

Nous avons choisit le microcontrôleur AT Tiny 10 car il est idéal pour les applications de petites tailles et surtout il permet de convertir un signal d'entrée AA en un signal stable 3V en sortie.

AT Tiny.png

Documentation complète du microcontrôleur

Dimensionnement des composants

Détermination de la taille de la carte

Choix de la taille de la carte
Choix n°1 Choix n°2 Choix n°3 Choix n°4
Dimensions 85x38 mm 65x30 mm 55x35 mm 50x30 mm
Prix pour 100 cartes 281,88 € 211,49 € 210,09 € 186,97 €
Prix pour 1 carte 2,82 € 2,11 € 2,10 € 1.87 €

Nous avons abandonné le choix n°1 : la carte est trop grande, la place des composants n'est pas optimisée. C'est également la carte la plus chère. Nous avons aussi mis de côté le choix n°4 : la carte est de trop petite taille, ce qui ne permet pas une prise en main idéale pour jouer avec. Notre choix s'est donc porté sur les options n°2 et n°3. Nous avons choisi le n°2 car il n'y a pas de différence de prix entre les deux et nous opté pour une carte un peu plus longue que large, pour une meilleure ergonomie.

Création d'un composant et saisie des schéma et board

Nous devons créer un composant qui permet de récupérer les signaux pour programmer le microcontrôleur de notre carte. Il comporte les signaux GND, CLK, DATA, RESET et VCC.

Nous avons plusieurs contraintes pour router la carte :

- la carte doit avoir une taille précise pour une bonne utilisation
- la carte doit être la plus compacte possible dans le respect des dimensions définies précedemment
- les boutons doivent être sur les côtés de la carte, les leds disposées à côté des boutons
- les pistes doivent être les plus larges possibles et les plus courtes
- les composants doivent être de type CMS
- il ne doit pas avoir de vias autour de la zone du support de la pile
- prévoir une encoche pour le connecteur dans le but d'imprimer plusieurs cartes à la fois, en optimisant la place

Création d'un composant sur Eagle

Schéma de la carte
Board de la carte
Schémas du connecteur





















Fabrication de la carte

Détourage de la carte

Test de continuité

Soudure des vias

"Collage" des composants

Chiffrage pour une fabrication de 100 cartes