Binome2020-10

De Wiki de bureau d'études PeiP
Révision datée du 8 mai 2021 à 21:08 par Egodard (discussion | contributions) (Première idée)

Introduction

Lors de ce BE nous allons devoir réaliser une clé USB avec une particularité en plus. Nous allons devoir réaliser un PCB (Printed Circuit Board) à l'aide du logiciel Fritzing, souder les composants que nous avons besoin sur une carte et faire un programme pour que notre fonctionnalité marche. Ensuite nous allons faire la clé USB dans les bonnes dimensions et lui fabriquer un boitier.


Idée de la Carte

Première idée

Notre idée principale a été de faire une Clé Minuteur composée de 2 afficheurs à LED 7 segments pour aller de 0 à 99 secondes (on peut aller jusqu'à 3 afficheurs pour couvrir le temps de 0 à 10 min) avec 2 boutons poussoirs, un pour les dizaines de secondes et un bouton pour les unités (nous devons réfléchir sur le fait de mettre en pause et lancer le minuteur et enfin une petite LED et un buzzer pour montrer la fin du minuteur.

Mise en commun & solution pour une carte

En discutant avec d'autres groupes qui utilisent des afficheurs et les professeurs, nous avons décidé d'utiliser 3 afficheurs 7 segments par soucis de stock d'afficheurs au sein de l'école.


M. Redon et M. Boé nous ont donc proposé de faire une carte externe qui contiendra les afficheurs, que nous pourrions connecter à chacune des cartes contenant le programme de la clé (dans notre cas : nous connecterons la carte d'afficheur sur notre carte "minuteur")

Idée finale

Par la suite, nous sommes donc partis pour une carte avec 3 afficheurs et 3 boutons: un pour les secondes, un pour les minutes et un autre pour démarrer, mettre en pause et arrêter le minuteur.

Nos recherches

Nous nous sommes documentés sur le fonctionnement de composants comme les afficheurs 7 segments que nous utilisons,

Afficheur 7 segments.jpg


référence

Celui-ci est composé de 5 connections de chaque côté, cet afficheur est un afficheur à anode commune (3 et 8)


La carte "afficheurs" va être composée 5 broches en haut (respectivement Afficheur 1 / Afficheur 2 / Afficheur 3 / +5V / GND) et de 8 broches en bas (respectivement A / B / C / D / E / F / G / DP) La distance entre les deux lignes de broche est de 12 broches

Les afficheurs auront 3 transistors (pour les Afficheurs) et 8 résistances (pour les lettres A,B,..,DP)


Au tout départ, nous voulions commencer le "Schematic" sur le logiciel Fritzing cependant, il fallait tout d'abord se renseigner sur les composants.

C'est pourquoi nous nous sommes renseignés sur le fonctionnement d'un transistor et nous avons remarqué qu'il en existait deux sortes ; les PNP et les NPN, la différence entre les deux correspond au fait que pour les PNP le courant va de l'émetteur vers la base et le collecteur est relié au GND tandis que pour un NPN le courant va de la base vers l'émetteur et le collecteur est relié à l'alimentation.


Lors de la conception de notre carte, nous avons utilisé le microprocesseur "ATTiny 84".


AtTiny84


Ce microprocesseur possède 14 broches, les broches 1 et 14 sont respectivement l'alimentation et la masse. Il faut donc utiliser les 12 autres broches pour contrôler nos composants électroniques. Cependant, nous avons besoin de 3 broches pour les transistors, 8 broches pour les LED des afficheurs (7 segments + le point) mais aussi 3 broches pour les boutons (et possiblement une supplémentaire pour rajouter un buzzer et/ou une LED pour indiquer la fin du minuteur). La solution : sacrifier l'affichage du point et l'utilisation de 2 boutons au lieu de 3.

Première carte

Frtizing

En commençant à faire notre dé électronique sur Fritzing, nous étions partis pour faire la carte avec les afficheurs, mais il nous suffisait de faire simplement notre Schematic avec notre fonction minuteur et à représenter les connecteurs présents sur la carte pour qu'on puisse l'emboiter avec la carte "afficheurs".


Notre problème était le manque de broche pour tous nos composants. On nous avait donc conseillé d'enlever un bouton de notre carte et de ne pas utiliser le point de l'afficheur, mais nous avons eu l'idée de faire un pont de résistance pour notre carte ce qui nous a permis de garder un troisième bouton et de mettre un buzzer pour marquer la fin du minuteur.

Voici à quoi ressemble notre Schematic et notre PCB:

Circuit imprime minuteur.pngSchematic minuteur.png


Après cela, nous avons pu imprimer notre carte :

Carte imprime .jpg

Soudure

Lors de la séance du 4 Février nous avons découvert la soudure et nous avons pu commencer à souder les composants. Il a fallu à plusieurs reprises ressouder certains composants, car nous nous sommes aperçus par la suite, quand nous commencions la programmation, que cela ne fonctionnait pas. Nous avons donc fait des tests avec un multimètre pour voir si le courant passait et nous avons vu qu'un bouton et une résistance n'avait pas assez d'étain pour que le courant puisse passer.

Voici donc notre carte soudée:

Carte soudee2.jpg

Code arduino

// si le minuteur se décompte alors l'état vaut 1, 0 sinon
char etatMinuteur = 0;
// nombre de 0 à 959, les centaines sont les minutes, les dizaines sont les dizaines de secondes et les unités sont les secondes
int affichage = 0;
// variable qui permet de stocker le temps depuis une action précédente
unsigned long ancienTemps = 0;
// intervalle entre chaque décompte (1000 ms)
long intervalle = 1000;
//variable qui stocke le fait d'avoir appuyer ou non sur un minuteur (permet de faire une unique incrémentaion de la variable affichage par appui)
char prevSwitchState=0;
//variable allant de 0 à 2 indiquant quel transistor prendre en charge
char transis =0;
//Chiffre à afficher
char chiffre;
// tableau regroupant sous format d'octet les led à allumer sur les afficheurs pour former chaque chiffre (ex : tab[4] donne le chiffre 4
unsigned char tab[] = {0x37, 0x06, 0x63, 0x67, 0x56, 0x75, 0x7D, 0x07, 0x7F, 0x77 };

void setup() {
  // put your setup code here, to run once:
  //Les pins 9 à 11 sont ceux reliés aux transistors
  for( char pin= 9; pin<12; pin++){
    pinMode(pin,OUTPUT);
    digitalWrite(pin,HIGH);
  }
  //Les pins 1 à 7 sont ceux reliés aux afficheurs
  for( char pin=1; pin<8; pin++){
    pinMode(pin,OUTPUT);
    digitalWrite(pin,HIGH);
  }

}

void loop() {
  // put your main code here, to run repeatedly:
  //On stocke la tension de notre pont
  int valeurPont = analogRead(0);
  //Instruction qui s'effectue si le minuteur n'est pas en marche et qui s'effectue une fois par appuis de boutons 
  if (etatMinuteur==0 && prevSwitchState==0){
    //interprétation de la valeur du pont pour savoir sur quel bouton on a appuyé
    // ici on gère les minutes
    if (valeurPont >= 700 && valeurPont<= 750){
      if(affichage<900){
        affichage+=100;
      }
      //retour à 0 après 9
      else{
        affichage-=900;
      }
      prevSwitchState=1;
    }
    //gestion des secondes
    if(valeurPont>=800 && valeurPont<=850){
      //retour à 0 après 59
      if (affichage%100 == 59){
        affichage-=59;
      }
      else{
        affichage+=1;
      }
      prevSwitchState=1;
    }
    //mise en marche du minuteur
    if (valeurPont>=500 && valeurPont<=550){
      etatMinuteur+=1;
      etatMinuteur=etatMinuteur%2;
      ancienTemps = millis();
      prevSwitchState=1;
    }
  }
  else if(etatMinuteur==1 && prevSwitchState==0){
    unsigned long tempsActuel=millis();
    //On compare le temps actuel avec l'ancien temps stocké pour voir si on a depassé 1 seconde et agir en conséquence
    if(tempsActuel - ancienTemps > intervalle){
      ancienTemps = tempsActuel;
      if(affichage%100 == 0){
        affichage-=41;
      }
      else{
        affichage-=1;
      }
    }
    //mise en pause du minuteur
    if (valeurPont>=500 && valeurPont<=550){
      etatMinuteur+=1;
      etatMinuteur=etatMinuteur%2;
      ancienTemps = millis();
      prevSwitchState=1;
    }
    //si le décompte est fini le buzzer se met à bipper pendant 5 secondes
    if(affichage==0){
      etatMinuteur=0;
      for(char x = 0; x<10; x++){
        tone(8,440,250);
        delay(250);
      }
    }
    
  }
  //chiffre à afficher en fonction du transistor actuel
  switch(transis){
    case 2:
    //chiffre des dizaines de secondes
    chiffre = (affichage%100)/10;
    break;
    case 0:
    //chiffre des secondes
    chiffre = affichage%10;
    break;
    case 1:
    //chiffre des minutes
    chiffre = affichage/100;
    break;
  }
  transis= (transis+1)%3;
  //si la tension du pont est maximal alors aucun bouton n'a été pressé
  if(valeurPont >1000){
    prevSwitchState=0;
  }
  // On refait passer tous les pins à l'état high
  
  for( char pin= 9; pin<12; pin++){
    pinMode(pin,OUTPUT);
    digitalWrite(pin,HIGH);
  }
  
  for( char pin=1; pin<8; pin++){
    pinMode(pin,OUTPUT);
    digitalWrite(pin,HIGH);
  }
  
  //gestion des pin à allumer pour afficher le chiffre
  unsigned char decal= 0x01;
  for( char i = 1; i<8; i++){
    if ((tab[chiffre] & decal )>0){
      digitalWrite(i,LOW);
      digitalWrite(9+transis,LOW);
    }
    decal <<= 1;
    
  }
}


Voici une vidéo qui montre que notre première carte fonctionne bien :

Fichier:Premiere carte binome10.mp4

Clé finale

Fritzing

Pour réaliser notre Fritzing, nous avons pris le PCB et le Schematic de base qui étaient sur le wiki et nous avons dû rajouter d'autres composants tel que les trois boutons, le buzzer et surtout les connecteurs qui permettent de raccorder le bouclier où se trouvent les afficheurs avec notre clé principale.

Schematic Clé finale PCB Clé finale

Soudure

Après avoir fini le PCB et reçu notre carte nous avons pris tous les composants qu'il nous fallait et nous avons commencé à souder. La clé comporte en plus un bouclier avec les afficheurs 7 segments.

Bouclier 7 segments
Carte













Test des mémoires

Après avoir soudé les composants sur notre carte et notamment les mémoires nous avons pu vérifier que ces dernières fonctionnaient correctement à l'aide des trois tests présents sur la page principale du wiki qui sont respectivement :

Média:ClefUSBTestMem.zip

Média:ClefUSBTestMemRW.zip

Média:ClefUSBTestMemRW2.zip

Nous avons pu voir que les deux premiers tests ne fonctionnaient pas vraiment, en effet on obtenait parfois 5 flashs rapides de la LED et des fois seulement 1, ce qui signifie à la fois un échec et une réussite. Cependant, le dernier des tests mémoires fonctionne correctement bien qu'il fut plus long à tester. Voici une vidéo qui montre bien les 5 flashs rapides la LED :

Fichier:Test memoire binome10.mp4

Fonction minuteur

Une fois que notre carte fut totalement soudée nous avons pu nous intéresser à créer un programme qui permettrait de réaliser notre minuteur sur le bouclier présent sur notre carte. Nous ne sommes pas partis de zéro puisque Mr Redon avait déjà créé une partie du programme et notamment toutes les fonctions s'occupant des I/O et de l'allumage des LEDs sur le bouclier en fonction du chiffre à afficher. Il ne nous restait plus qu'à réaliser un compteur qui s'incrémenterait de 1 lorsque qu'on appuie sur un bouton ici celui du bas, qui se décrémenterait environ toutes les secondes (c’est-à-dire après 267 boucles dans le main) si on appuie sur le bouton du haut et enfin qui arrêterait cette décrémentation si on appuie sur le bouton central. Et ainsi afficher chaque chiffre du compteur sur le bouclier à l'aide des fonctions déjà crées.

Voici le zip contenant tous les fichiers pour faire fonctionner la clé en mode minuteur :

Fichier:Bouclier7Seg fini.zip

Voici une vidéo qui montre bien l'utilisation des 3 boutons :

Fichier:Video-carte-minuteur-binome-10.mp4

Partie USB

Il ne nous reste plus qu'à nous occuper de la partie principale de ce bureau d'études : obtenir une clé USB fonctionnelle. Pour cela on a récupéré le fichier MassStoragePeiP dont on a modifié les fichiers DataFlashManager.h et DataFlashManager.c dans le dossier lib afin de gérer l'écriture et la lecture des deux mémoires de notre clé.

Voici le fichier global qu'il ne nous restait plus qu'à compiler sur la clé :

Fichier:MassStoragePeiPGodardGontier.zip

Avant de compiler il fallait aussi s'assurer que la clé était bien reconnue en mode DFU, pour cela il faut court-circuiter le reset et la masse de la carte et vérifier que c'est le cas à l'aide de l'utilitaire lsusb. Ici notre clé est reconnue comme at90usb162. Ensuite pour compiler il suffit d'écrire :

dfu-programmer at90usb162 erase

dfu-programmer at90usb162 flash MassStorage.hex

dfu-programmer at90usb162 reset

On peut voir ces différentes commandes sur la photo suivante :

Compilation.jpg

Finalement nous avons pu tester le programme TestBlock présent sur la page du wiki pour vérifier que notre clé écrit bien des valeurs dans les blocs mémoires et qu'on lit bien les bonnes valeurs une fois qu'elles sont stockées à l'intérieur.


Writing
Reading




























On a pu remarquer que la partie écriture est plus longue que la partie lecture grâce à ce test.



Conclusion

Durant ce bureau d'étude, nous avons pu concevoir depuis 0 un prototype de clé USB comportant une fonctionnalité supplémentaire, dans notre cas, elle peut agir comme un minuteur. Tout d'abord nous avons réalisé une première carte qui comportait uniquement la partie minuteur et qui fonctionnait très bien. Ensuite nous avons ajouté cette fonctionnalité sur un PCB classique de clé USB et nous avons programmé cette dernière pour pouvoir gérer les deux fonctionnalités séparées. En effet, nous n'avons pas eu le temps de rassembler les deux programmes ensembles et nous avons essayé depuis chez nous d'utiliser une machine virtuelle pour compiler les programmes sur la carte sous un environnement Linux. Cependant, nous avons rencontré des problèmes et on a donc pas pu aboutir. De plus par manque de temps nous avons dû aussi abandonner l'idée d'ajouter un buzzer pour envoyer une alarme lorsque le compteur est fini, nous avons préféré nous consacrer principalement à la gestion du compteur et la partie USB. Notre clé pourrait bien sûr être améliorée afin d'avoir une plus grande mémoire et d'écrire et lire plus rapidement les données dessus. Finalement ce BE nous a permis de consolider notre choix d'orientation vers les systèmes embarqués. Estelle a été plus intéressée par la partie électronique et Fritzing tandis que Lucas a bien aimé s'occuper de la partie informatique et programmation.


Chronologie

  • 18 Janvier

Idée principale: clé minuteur (2 afficheurs à led 7 segments, 2 boutons poussoirs, une led et un buzzer)

2 afficheurs pour aller de 0 à 99 secondes (à voir pour en rajouter un 3eme et couvrir le temps de 0 à 10 min)

1 bouton pour les dizaines de secondes et 1 bouton pour les unités

réfléchir pour mettre en pause et lancer le minuteur


  • 21 Janvier

Lors de cette séance, nous nous sommes documentés sur comment fonctionne un microprocsseur et un afficheur 7 segments. Nous voulions commencer le "Schematic" sur l'outil Fritzing mais nous ne savons pas qu'elle était la référence de l'afficheur. Après avoir vu le matériel dont disponait Polytech, nous avons convenu avec les professeurs et 2 autres groupes qui utilisent aussi l'afficheur 7 segments que nous partions sur 3 afficheurs 7 segments car ayant pas assez d'afficheurs pour tout le monde.

M. Redon et M. Boé nous ont donc proposé de faire une carte externe qui contiendra les afficheurs, que nous pourrions connecter à chacune des cartes contenant le programme de la clé ( dans notre cas: nous connecterons la carte d'afficheur sur notre carte "minuteur")

Ce "problème" nous a permis d'en savoir plus sur l'afficheur 7 segments:

Afficheur 7 segments.jpg


référence



Celui-ci est composé de 5 connections de chaque coté, cet afficheur est un afficheur à anode commune (3 et 8)


La carte "afficheurs" va être composée 5 broches en haut ( respectivement Afficheur 1 / Afficheur 2 / Afficheur 3 / +5V / GND ) et de 8 broches en bas (respectivement A / B / C / D / E / F / G / DP) La distance entre les deux lignes de broche est de 12 broches (voir capture écran Fritzing)

Les afficheurs auront 3 transistors (pour les Afficheurs) et 8 résistances (pour les lettres A,B,..,DP)

  • 25 Janvier

Suite de la réalisation du dé électronique sur Fritzing. Nous pensions qu'il fallait aussi incorporer les éléments qui seront présents sur la carte secondaire mais en fait il suffit juste de représenter les connecteurs présents sur cette dernière. Nous nous étions alors renseigné sur le fonctionnement d'un transistor et nous avons remarqué qu'il en existait 2 sortes, les PNP et les NPN, la différence entre les deux correspond au fait que pour les PNP le courant va de l'émetteur vers la base et le collecteur est relié au GND tandis que pour un NPN le courant va de la base vers l'émetteur et le collecteur est relié à l'alimentation.



AtTiny84

De plus pour ce premier dé électronique nous utiliserons l'ATTiny84 comme micro-controleur. Ce dernier possède 14 broches, les broches 1 et 14 sont respectivement l'alimentation et la masse. Il faut donc utiliser les 12 autres broches pour contrôler nos composants électroniques. Cependant nous avons besoin de 3 broches pour les transistors, 8 broches pour les led des afficheurs (7 segments + le point) mais aussi 3 broches pour les boutons ( et possiblement une supplémentaire pour rajouter un buzzer et/ou une led pour indiquer la fin du minuteur). la solution : sacrifier l'affichage du point et l'utilisation de 2 boutons au lieu de 3.










  • 28 Janvier

Nous avons opté pour un pont de résistance pour notre carte ce qui nous permet de garder un 3e bouton et un buzzer pour la fin du minuteur.

Nous avons également réalisé le Schematic et le PCB.

Circuit imprime minuteur.pngSchematic minuteur.png


  • 1er Février

Impression du circuit et début de recherche d'un programme.

Carte imprime .jpg

  • 4 Février

Découverte de la soudure sur la carte, nous avons commencé le programme


  • 8 Février

Nous avons finis de souder la carte et nous avons testé notre carte avec un Arduino UNO pour voir si notre carte fonctionnait.

Carte soudee2.jpg


  • 11 Février

Nous avons fait vérifier notre programme. Nous n'avons pas pour l'instant d'afficheurs donc nous allons créer un mini programme pour tester si nos boutons fonctionnent.

  • 15 Février

Nous avons commencé à faire le "Schematic" de la clé usb

  • 18 Février


  • 11 Mars

Lors de cette séance on a continuer le PCB de la clé usb final. Pour cela on a du déplacer certains éléments pour pouvoir faire passer le connexions de plus on manquera de place du coup on va devoir agrandir notre PCB . Sinon toutes les connexions ont été réalisées, il suffit juste de les rendre un peu plus belle et agrandir la surface du PCB

Média:Cle_binome10.zip


  • 15 Mars

Lors de cette séance nous avons réarranger les fils pour pas qu'ils se chevauchent, nous avons commencé a faire le nouveau PCB car notre carte dépasse par rapport aux PCB de base à cause des afficheurs.

  • 18 Mars

Pendant cette séance nous avons remarqué que des defauts de fils qui se chevauchent n'avaient pas été vu par le logiciel lundi dernier, nous avons donc fini de bien placer les fils dans le PCB et nous avons arrangés les noms des pièces pour que ces noms soient gravés sur la carte. De plus, nous nous sommes rendu compte que l'ICSP n'était pas conforme à celui que nous avions de base, un via était relié à la fois au GND et à la fois au RTN. Nous avons réussi a régler ce problème et a bien refaire apparaître le ICSP sur notre carte

Voici le PCB fini :

Média:cle_binome10_fini.zip


  • 22 Mars

Pendant cette séance, nous avons le socle pour la pile sur la nouvelle carte. Nous avons essayé de faire un programme pour savoir quel pin allume quel segment de l'afficheur.

  • 25 Mars

utiliser seulement la premiere memoire pour l'initalisation , recevoir des blocs de 512 octets mais on peut les stocker que dans des blocs de 256 adapter les programmes read et write 2bloxkadress+2i pour aller dans le 1er bloc

2blockadress +2i+1 pour aller dans le 2 eme bloc

  • Carte (re)commandée

La carte a été modifiée pour intégrer un connecteur ICSP classique plus facile à utiliser pour la programmation de l'ATMega16u2. Le nouveau fichier Fritzing : Fichier:2021ClefLucasEstelle.zip.

  • Carte et programmation

La carte a été testée sans mémoire mais avec un bouclier 7 segments.

Une erreur de conception : le bouclier est alimenté en 5V (USB) alors qu'il devait l'être en 3,3V (régulateur). Une piste a été coupée et un fil soudé sur les cartes de test.

Le bouclier fonctionne avec le projet C ci-joint : Fichier:2021EstelleLucas7Seg.zip.


  • 29 Mars

Nous avons fini le pcb de la carte et nous l'avons envoyé pour la conception

  • 1er Avril

Pendant cette séance, Nous avons reçu notre premier clé et nous avons commencé à souder les composants de celle ci

  • 8 Avril

Durant cette séance nous avons continué à souder les composants sur une des clés et nous avons continué la programmation des mémoires de la clé

  • 12 Avril

Durant cette séance nous avons soudé les deux mémoires sur une des clés et nous avons continué la programmation du minuteur et des memoires de la clé

  • 15 Avril
  • 19 Avril

On a enfin fini le code pour gérer la fonctionnalité minuteur de notre clé usb. Les différents fichier le composant sont disponible dans le zip ci joint.

Fichier:Bouclier7Seg fini.zip

On devait surement avoir une erreur de sauvegarde des fichiers ce qui empêchait leurs actualisations avant l'upload sur l'atmega. De plus on a aussi augmenté le TIMEOUT pour que la décrémentation du compteur se fasse bien pour chaque seconde et non plus rapidement. On a aussi empêché la décrémentation du compteur lorsque ce dernier arrive à 0, en effet il repassait auparavant à 999 après 0 et tournait donc en boucle tant que l'on n'appuyait pas sur le bouton pour l'arrêter.

Pour la prochaine séance il faut que l'on s'intéresse à l'aspect usb de notre clé et réussir à combiner cet aspect avec notre fonctionnalité minuteur.


  • 22 Avril

Pendant cette séance nous avons soudé 2 autres mémoires sur la 2ème carte et nous avons testé si les mémoires de la clé fonctionnent grâce aux codes situés dans le wiki du BE. On a aussi programmé une des cartes pour qu'elle puisse fonctionner en usb.