Binome2019-3

De Wiki de bureau d'études PeiP
Révision datée du 19 mars 2020 à 17:16 par Cgielen (discussion | contributions) (Référencement des périphériques)


Définition du projet

Nous avons deux possibilités de taille de mémoires: une de 16Mo et une de 16Go, et nous allons réaliser notre clé avec la mémoire 16Go (128Gb). Ce choix va nous demander une programmation plus complète car la puce n'est pas pré-programmée pour la mémoire en question, mais nous pensons cette configuration d'une meilleure utilité.


Périphériques supplémentaires:

Afficheurs 7 segments permettant d'afficher la taille restante. Nous prévoyons entre deux et quatre afficheurs accolés permettant une meilleure précision. On aura donc besoin de 7 sorties pour l'afficheur (voire 8 si on utilise le point) plus 1 sortie par afficheur pour se placer sur celui voulu. Ainsi, si on choisi d'utiliser deux afficheurs accolés, on aura besoin de 7+2=9 sorties. Si on choisi d'en installer 4, on aura 7+4=11 sorties (+1 si point). Nous aurons donc probablement besoin de deux puces.


Périphériques optionnels:

Si le temps nous le permet, nous avons pour idée d'ajouter une petite batterie associée à un bouton permettant d'afficher la place restante même si la clé n'est pas branchée à un ordinateur.

Référencement des périphériques

Voici le choix favori pour les afficheurs: https://fr.farnell.com/multicomp/lt0565srwk/afficheur-sept-segments-rouge/dp/2627649

Cet afficheur contient 3 surfaces accolées et nécessiterait donc avec le point 8+3=11 sorties.

Photo de l'afficheur sélectionné

En ce qui concerne la mémoire, nous allons utiliser la mémoire MTF29F128G08, qui est la version 128Gb.

Puce mémoire MTF29F128G08 de 128Gb

Nous allons utiliser une puce ATMEGA8U2 en tant que puce principale pour le contrôle des principales fonctions de la clé ainsi qu'en tant que puce mère pour la seconde, une ATMEGA328P, qui servira au contrôle de l'afficheur.

Micro-contrôleur principal ATMEGA8U2
Micro-contrôleur secondaire ATMEGA328P

Projet intermédiaire: dé électronique

Contexte

Ce projet intermédiaire nous a permis de prendre en main le logiciel de conception électronique Fritzing ainsi que celui qui servira à la programmation: Arduino IDE.

Nous avons donc d'abord réalisé une carte qui servira de dé électronique et l'avons gravée, puis nous avons réalisé le programme correspondant et l'avons chargé sur cette carte. Nous avons également pu nous familiariser avec la tâche de soudure puisque nous avons soudé les différents composants nécessaires pour ce projet intermédiaire.

Voici une capture d'écran du schématique et de la carte électronique du dé en question:

Schemade.png
Circuitde.png

Notons que la conception de cette carte comporte une erreur qui a été corrigée directement sur la carte comme suit:


Cette erreur concernait le port 1 qui devait être relié à la masse. Nous avons donc coupé la liaison de cuivre entre le port 1 et la résistance, fait un pont d'étain pour relier la première portion au plan de masse et enfin soudé un fil reliant la résistance au port 3 de la puce (qui était non utilisé).

De plus cette erreur a amener un autre problème au niveau de la de la branche A7 qui étais de ce fait relier a la masse nous amenant un problème au niveau du randomseed() dans le programme nous avons pris une semaine a réaliser que le problème venait de là. On l'a découvert par hasard lors de la réalisation du bouton poussoir.

Apres ces erreur nous amenant pas mal de problème nous avons pu finir et peaufiner le programme suivant:


#include <stdio.h>
#include <stdlib.h>
#define LED1 9
#define LED2 1
#define LED3 5
#define LED4 4
#define LED5 3
#define LED6 0
#define LED7 2
#define BTN 6
int Tableaupin[7]= {LED1,LED2,LED3,LED4,LED5,LED6,LED7};
long alea=0;
|
|
void setup() 
{
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);
pinMode(LED7, OUTPUT);
pinMode(BTN,INPUT_PULLUP);
//Serial.begin(9600);
//randomSeed(analogRead(A7)); 
}
|
void de1T()
{ 
 digitalWrite(Tableaupin[0],HIGH);
}
void de2T()
{
 digitalWrite(Tableaupin[0],HIGH);
 digitalWrite(Tableaupin[5],HIGH);
}
void de3T()
{
 digitalWrite(Tableaupin[0],HIGH);
 digitalWrite(Tableaupin[6],HIGH);
 digitalWrite(Tableaupin[3],HIGH);
}
void de4T()
{
 digitalWrite(Tableaupin[0],HIGH);
 digitalWrite(Tableaupin[2],HIGH);
 digitalWrite(Tableaupin[3],HIGH);
 digitalWrite(Tableaupin[5],HIGH);
}
void de5T()
{ 
 digitalWrite(Tableaupin[0],HIGH);
 digitalWrite(Tableaupin[2],HIGH);
 digitalWrite(Tableaupin[3],HIGH);
 digitalWrite(Tableaupin[5],HIGH);
 digitalWrite(Tableaupin[6],HIGH);
}
void de6T()
{ 
 digitalWrite(Tableaupin[0],HIGH);
 digitalWrite(Tableaupin[2],HIGH);
 digitalWrite(Tableaupin[3],HIGH);
 digitalWrite(Tableaupin[5],HIGH);
 digitalWrite(Tableaupin[4],HIGH);
 digitalWrite(Tableaupin[1],HIGH);
}
|
|
// fonct eteint lampe
|
void de1F()
{
 digitalWrite(Tableaupin[0],LOW);
}
void de2F()
{
 digitalWrite(Tableaupin[0],LOW);
 digitalWrite(Tableaupin[1],LOW);
}
void de3F()
{
 digitalWrite(Tableaupin[0],LOW);
 digitalWrite(Tableaupin[6],LOW);
 digitalWrite(Tableaupin[3],LOW);
}
void de4F()
{
 digitalWrite(Tableaupin[0],LOW);
 digitalWrite(Tableaupin[2],LOW);
 digitalWrite(Tableaupin[3],LOW);
 digitalWrite(Tableaupin[5],LOW);
}
void de5F()
{ 
 digitalWrite(Tableaupin[0],LOW);
 digitalWrite(Tableaupin[2],LOW);
 digitalWrite(Tableaupin[3],LOW);
 digitalWrite(Tableaupin[5],LOW);
 digitalWrite(Tableaupin[6],LOW);
}
void de6F()
{ 
 digitalWrite(Tableaupin[0],LOW);
 digitalWrite(Tableaupin[2],LOW);
 digitalWrite(Tableaupin[3],LOW);
 digitalWrite(Tableaupin[5],LOW);
 digitalWrite(Tableaupin[4],LOW);
 digitalWrite(Tableaupin[1],LOW);
}
|
void loop() 
|
{ 
 int cpt,tirage;
 long randnb,randnbf;
 tirage=digitalRead(BTN);
 alea++;
 if (tirage==0)
 {
  randomSeed(alea); 
  de6F(); 
  for (cpt=0;cpt<40;cpt++)
   { randnb=random(6);
     switch (randnb)
     {
       case 0:
         de1T();
         delay(100);
         de1F();
         break;
       case 1:
         de2T();
         delay(100);
         de2F();
         break;
       case 2:
         de3T();
         delay(100);
         de3F();
         break;
       case 3:
         de4T();
         delay(100);
         de4F();
         break;
       case 4:
         de5T();
         delay(100);
         de5F();
         break;
       case 5:
         de6T();
         delay(100);
         de6F();
         break;
  
     }
   }
    de6F(); 
    randnbf=random(0,6);
    switch (randnbf)
   {  
     case 0:
       de1T();
       break;
     case 1:
       de2T();
       break;
     case 2:
       de3T();
       break;
     case 3:
       de4T();
       break;
     case 4:
       de5T();
       break;
     case 5:
       de6T();
       break;
    // case 6:
    //   de7T();
    //   break;
   }
   if (alea>1000000)
   {
     alea=0;
   }
   }
 }

Conception électronique

L'architecture électronique globale, qui ne concerne uniquement les fonctionnalités premières (micro-contrôleur maître et puce mémoire) peut être reprise ici:

Schéma global de l'architecture prédéfinie

Les trois sorties disponibles en haut du micro-contrôleur seront utilisées pour une communication SPI avec le second.

Voici un premier jet de l'architecture de la communication entre les deux micro-contrôleurs:

84761300 592941544886510 8092059543506255872 n.jpg

Notons que ce bus servira aussi à la programmation des puces.

On note que l'entrée Vcc représente l'entrée d'un interrupteur qui actionnera l'afficheur. On voit également les trois sorties SPI utilisées, dont la MOSI (Master Output Slave Input) et MISO (Master Input Slave Output) servent respectivement à la communication de la puce mère vers la puce fille et de la puce fille vers la puce mère, comme le montre le schéma ci-dessous (la sortie et l'entrée SS ne seront pas utilisées):

Schéma d'une communication SPI

Ici, un premier jet de l'architecture de l'interface entre le deuxième micro-contrôleur et l'afficheur:

85086760 193860828361852 6188573258174955520 n (1).jpg

Les éléments COM12 ,COM9 et COM8 sont les trois cellules de notre afficheur. Les tensions entrantes (5V ou 3.3V) ne correspondant par à la tension préconisée pour l'afficheur (1.85=1.9V typ; 2,5V max), des résistances de 75 Ohm avec une tension de 1,4V à leurs bornes sont donc représentées. Notons que ce schéma est obsolète car le jeu de résistances et de diodes en entrée sont placées en réalité en 1*8 et non pas 3*8, en entrée de l'afficheur et non de chacune des cellules, ce qui ne pose pas de problème car c'est une tension qui est régulée.

Enfin, voici un schéma de l'architecture de l'afficheur en question:

Afficheur7seg.jpg

Esquisse du schéma de notre nouveau circuit grâce au logiciel EasyEDA:

Esquisse1.jpg
]


Ce nouveau schéma comporte bien le jeu de diodes et de résistances une fois en entrée de l'afficheur. On précise que COM8, COM9 et COM12 correspondent en fait aux sorties des cellules de l'afficheur. Ce sont ces sorties, retournées en entrée sur la puce (s1,s2,s3) qui serviront à sélectionner la cellule souhaitée (potentiel au maximum nul pour les cellules non voulues, potentiel positif pour la cellule sélectionnée).

Programmation

Chronologie

27/01 Définition des principaux axes pour notre projet: choix de la carte mémoire, choix des périphériques spécifiques à notre clé et mise en place de notre Wiki.

10/02 Choix de l'afficheur 7-segments. Réflexions sur les liens entre les deux puces et entre la puce 328P et l'afficheur. Réalisation des premiers schémas de l'architecture électronique associée à ces parties et détermination de quelques caractéristiques (quelques valeurs des résistances nécessaires...)

17/02 Séance consacrée à la prise en main de Fritzing à travers la conception d'un dé électronique qui donnera à une réalisation par gravure de la carte en question. Découverte de différents éléments pour la conception électronique (règles pour le routage, erreurs à éviter...). Réalisation du premier jet de notre schéma électronique (les deux PCB et l'afficheur) grâce au logiciel easyEDA.

02/03 La conception de la carte est terminée et nous avons reçu cette carte gravée. Nous avons alors commencé la programmation du dé électronique grâce au logiciel Arduino IDE et avons commencé les tests directement sur le programmateur Arduino UNO.

05/03 Nous avons commencé la soudure des composants sur la carte du dé électronique, et continué la programmation correspondant à la carte Arduino UNO.

09/03 Nous avons remarqué un problème de conception de la carte et avons corrigé le problème directement grâce à la soudure. Nous avons également soudé les câbles permettant la programmation de la puce (bus SPI) et avons ré-adapté le programme construit à la nouvelle carte, et avons commencé les tests qui se sont montrés concluants. A la prochaine séance, nous finaliserons la soudure des composants et donc de ce projet intermédiaire.