BE 2022-2023 : Différence entre versions
(→Réalisations des binômes) |
(→Réalisations des binômes) |
||
(21 révisions intermédiaires par 7 utilisateurs non affichées) | |||
Ligne 89 : | Ligne 89 : | ||
Pour les élèves n'ayant jamais conçu de carte électronique il est conseillé de concevoir une première carte ne comportant que la partie spécifique de leur clef USB. | Pour les élèves n'ayant jamais conçu de carte électronique il est conseillé de concevoir une première carte ne comportant que la partie spécifique de leur clef USB. | ||
− | + | Les cartes intermédiaires utilisent un microcontrôleur plus facile à souder : un ATtiny84. | |
+ | |||
+ | Les cartes intermédiaires se programment en utilisant un Arduino Uno et les connecteurs ISP (In-System Programming). Voir la section [[#ISP_SPI|Programmation par SPI]] pour savoir comment connecter l'Arduino UNO et la carte intermédiaire. | ||
+ | |||
+ | Vous utiliserez l'IDE Arduino (commande <code>arduino</code>) pour la programmation : | ||
+ | * l'IDE Arduino est déjà installé sur les machines <code>zabeth</code> ; | ||
+ | * commencez par télécharger le module permettant de programmer des ATtiny84 : | ||
+ | ** lancez une fenêtre de commandes ; | ||
+ | ** tapez <code>export http_proxy=http://proxy.polytech-lille.fr:3128</code> ; | ||
+ | ** lancez l'IDE via la fenêtre de commande en tapant <code>arduino</code> ; | ||
+ | ** naviguez via <code>file</code> puis <code>preferences</code> ; | ||
+ | ** remplissez la zone <code>Additional Boards Manager URLs</code> avec l'adresse <code>http://drazzy.com/package_drazzy.com_index.json</code> ; | ||
+ | ** naviguez via <code>Tools</code> puis <code>Board</code> et <code>Boards Manager ...</code> ; | ||
+ | ** dans la fenêtre qui s'affiche indiquez comme filtre <code>attiny84</code> et installez <code>ATTinyCore</code>. | ||
+ | |||
+ | Si l'Arduino Uno n'a pas déjà été programmé comme programmateur : | ||
+ | * sélectionnez <code>Arduino Uno</code> comme carte (Board) dans l'item <code>Tools</code> ; | ||
+ | * sélectionnez le port série dans le même item ; | ||
+ | * prenez l'exemple <code>ArduinoISP</code> dans l'item <code>File</code> ; | ||
+ | * chargez le dans l'Arduino Uno avec l'icône <code>Upload</code> (flèche vers la droite). | ||
+ | |||
+ | Maintenant vous pouvez programmer votre carte : | ||
+ | * sélectionnez <code>ATtiny 24/44/84(a) (No bootloader)</code> comme carte (Board) dans l'item <code>Tools</code> ; | ||
+ | * vérifiez, dans le même item, que l'horloge est définie comme <code>8Mhz (internal)</code> ; | ||
+ | * sélectionnez, dans le même item pour le sous-item <code>programmer</code>, l'option "Arduino as ISP" ; | ||
+ | * sélectionnez le port série dans le même item (celui de l'Arduino Uno) ; | ||
+ | * vous pouvez alors envoyer votre programme à l'ATtiny84 par l'item <code>Sketch</code>, sous item <code>Upload Using Programmer</code>. | ||
+ | |||
+ | Pour tester votre carte voici un petit programme pour faire clignoter les LED (pensez à mettre à jour la liste des E/S de vos LED dans le tableau <code>leds</code>) : | ||
+ | |||
+ | int leds[]={7,8,9,10, -1}; | ||
+ | |||
+ | void setup() { | ||
+ | int i=0; | ||
+ | while(leds[i]>=0) pinMode(leds[i++], OUTPUT); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | int i; | ||
+ | i=0; | ||
+ | while(leds[i]>=0) digitalWrite(leds[i++], LOW); | ||
+ | delay(1000); | ||
+ | i=0; | ||
+ | while(leds[i]>=0) digitalWrite(leds[i++], HIGH); | ||
+ | delay(1000); | ||
+ | } | ||
= Les composants électroniques = | = Les composants électroniques = | ||
Ligne 221 : | Ligne 266 : | ||
= Programmation de micro-contrôleur par SPI = | = Programmation de micro-contrôleur par SPI = | ||
− | + | <span id="ISP_SPI"></span> | |
Nativement les micro-contrôleurs AVR peuvent être programmés via le bus SPI. Généralement un amorceur (bootloader) est installé sur ces micro-contrôleurs pour qu'ils puissent être programmés plus facilement par une connexion série pure (cas de l'ATMega328p par exemple) ou par une connexion USB (cas de l'ATMega16u2). Malheureusement les amorceurs peuvent être effacés par une mauvaise manoeuvre ou ne permettent pas de configurer tous les aspects du micro-contrôleur. | Nativement les micro-contrôleurs AVR peuvent être programmés via le bus SPI. Généralement un amorceur (bootloader) est installé sur ces micro-contrôleurs pour qu'ils puissent être programmés plus facilement par une connexion série pure (cas de l'ATMega328p par exemple) ou par une connexion USB (cas de l'ATMega16u2). Malheureusement les amorceurs peuvent être effacés par une mauvaise manoeuvre ou ne permettent pas de configurer tous les aspects du micro-contrôleur. | ||
Ligne 386 : | Ligne 431 : | ||
{| class="wikitable" | {| class="wikitable" | ||
− | ! Numéro !! Elèves !! Fonctionnalité supplémentaire !! Page | + | ! Numéro !! Elèves !! Fonctionnalité supplémentaire !! Page |
|- | |- | ||
| Binôme 1 | | Binôme 1 | ||
| Manel BENDAHI & Nisrine AILANE | | Manel BENDAHI & Nisrine AILANE | ||
− | | | + | | Clavier musical et espion |
| [[Binome2022-1|Binôme 1 2022/2023]] | | [[Binome2022-1|Binôme 1 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 2 | | Binôme 2 | ||
Ligne 398 : | Ligne 442 : | ||
| | | | ||
| [[Binome2022-2|Binôme 2 2022/2023]] | | [[Binome2022-2|Binôme 2 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 3 | | Binôme 3 | ||
Ligne 404 : | Ligne 447 : | ||
| | | | ||
| [[Binome2022-3|Binôme 3 2022/2023]] | | [[Binome2022-3|Binôme 3 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 4 | | Binôme 4 | ||
− | | Dennis | + | | Dennis WASHINGTON SARAZIN & Valentin GIROT |
| | | | ||
| [[Binome2022-4|Binôme 4 2022/2023]] | | [[Binome2022-4|Binôme 4 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 5 | | Binôme 5 | ||
| Martin CALCOEN & Fabio CAMACHO | | Martin CALCOEN & Fabio CAMACHO | ||
− | | | + | | Clavier USB 20 touches avec écran led 10x10 qui affiche la touche appuyée |
| [[Binome2022-5|Binôme 5 2022/2023]] | | [[Binome2022-5|Binôme 5 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 6 | | Binôme 6 | ||
− | | Maxime | + | | Maxime BARRET & Nathan LEMOINE |
− | | | + | | Clé USB Lampe torche |
| [[Binome2022-6|Binôme 6 2022/2023]] | | [[Binome2022-6|Binôme 6 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 7 | | Binôme 7 | ||
− | | Fabio | + | | Fabio DA SILVA & Corentin BRANLY |
− | | | + | | clavier haut parleur et binaire |
| [[Binome2022-7|Binôme 7 2022/2023]] | | [[Binome2022-7|Binôme 7 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 8 | | Binôme 8 | ||
Ligne 434 : | Ligne 472 : | ||
| clavier mécanique TKL ou 75%. Réaliser un PCB hotswap. Touche pour lancer une application et macro pour touches multimedias | | clavier mécanique TKL ou 75%. Réaliser un PCB hotswap. Touche pour lancer une application et macro pour touches multimedias | ||
| [[Binome2022-8|Binôme 8 2022/2023]] | | [[Binome2022-8|Binôme 8 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 9 | | Binôme 9 | ||
− | | | + | | Matthis FONTAINE & Rémi DECALONNE |
− | | | + | | Clavier qui calcule la vitesse de frappe et l'affiche via un vu-mètre |
| [[Binome2022-9|Binôme 9 2022/2023]] | | [[Binome2022-9|Binôme 9 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 10 | | Binôme 10 | ||
Ligne 446 : | Ligne 482 : | ||
| | | | ||
| [[Binome2022-10|Binôme 10 2022/2023]] | | [[Binome2022-10|Binôme 10 2022/2023]] | ||
− | |||
|- | |- | ||
| Binôme 11 | | Binôme 11 | ||
− | | Nicolas | + | | Nicolas BERRIER & Clément LEBRUN |
− | | | + | | Clé USB avec led + web cam intégrée |
| [[Binome2022-11|Binôme 11 2022/2023]] | | [[Binome2022-11|Binôme 11 2022/2023]] | ||
− | |||
|- | |- | ||
|} | |} |
Version actuelle datée du 17 mai 2023 à 15:32
Sommaire
- 1 Présentation du bureau d'étude
- 2 Survol d'USB
- 3 Logiciels
- 4 Cartes intermédiaires
- 5 Les composants électroniques
- 6 Test des cartes
- 7 Programmation de micro-contrôleur par SPI
- 8 Bibliothèque LUFA
- 9 Test du programme avec la bibliothèque LUFA
- 10 Calcul de l'espace occupée sur une clef USB
- 11 Réalisations des binômes
Présentation du bureau d'étude
Nous vous proposons de découvrir ce qu'est réellement cet objet devenu banal appelé clé USB (Universal Serial Bus).
Le bureau d'étude consiste à construire de A à Z une clé USB ou un clavier USB :
- en créant un circuit électronique ou PCB (Printed Circuit Board) à l’aide d’un logiciel de CAO ;
- en soudant les composants électroniques (micro-contrôleur, mémoire FLASH, boutons, ...) ;
- en programmant le micro-contrôleur pour gérer la communication USB en utilisant la bibliothèque LUFA (Lightweight USB Framework for AVRs) ;
- en programmant le micro-contrôleur pour accéder à la mémoire ou scanner les touches ;
- en fabriquant un beau boitier pour votre clef ou de jolies touches pour votre clavier.
Pour personnaliser votre clé n'hésitez pas à ajouter des fonctionnalités :
- LED qui clignotent lors des accès en lecture ou écriture ;
- vumètre qui indique le remplissage de la clé ;
- micro-interrupteurs pour verrouiller la clé ;
- vibreur parce que c'est possible, vous trouverez bien une justification ;
- microphone permettant d’espionner les conversations ;
- toute autre fonction plus ou moins utile mais qui vous inspire ...
Pour personnaliser votre clavier n'hésistez pas à ajouter des fonctionnalités :
- LED pour refléter l'état du clavier ou pour l'esthétique ;
- mémoire pour envoyer des suites de touches ou pour enregistrer ;
- toute autre fonction plus ou moins utile mais qui vous inspire ...
Vous allez d'abord réaliser une carte gérant uniquement une des fonctionnalités annexes de votre carte. Cette carte comportera un micro-contrôleur facile à souder : un ATTiny84. Ainsi cette première carte sera un minimum autonome. Par la suite, vous vous attacherez à concevoir la carte complète avec un micro-contrôleur plus puissant possédant des capacités USB matérielle comme l'ATMega16u2. Pour la première carte n'hésitez pas à consulter les pages Wiki de vos prédécesseurs.
Les supports de la présentation de ce bureau d'études : Media:BE_clef_USB.pdf.
Survol d'USB
Evolution des connexions USB
L'acronyme USB signifie "Universal Serial Bus" et effectivement l'USB peut être défini comme un bus USB très verbeux. L'USB est géré par un consortium autonome "USB Implementers Forum".
Jusqu'à la version 2, l'acronyme est fidèle à la réalité. Pour ces périphériques, 3 vitesses de transfert sont possibles sur la paire différentielle :- basse vitesse : 1,5 Mb/s ;
- pleine vitesse : 12 Mb/s ;
- haute vitesse : 480 Mb/s.
Un protocole verbeux
L'initialisation d'un périphérique USB se fait comme suit :
- détection électrique de la connexion du périphérique ;
- alimentation électrique du périphérique ;
- utilisation de l'adresse temporaire 0 sur le bus ;
- récupération de la taille des messages pour le point d'accès 0 ;
- envoi de l'adresse au périphérique sur le point d'accès 0 ;
- envoi des descripteurs du périphérique au contrôleur USB via le point d'accès 0.
Pour un périphérique simple :
- souris : environ 100 octets pour le descripteur de configuration ;
- clavier : environ 150 octets pour le descripteur de configuration.
Les points d'accès (terminaison sur le schéma) :
- des identifiants sur 8 bits (numéro sur 4 bits) ;
- un point d'accès de contrôle de numéro 0 bidirectionnel ;
- les communications se font de ou vers les points d'accès ;
- un sens de communication (bit de poid fort) :
- IN => du périphérique vers le contrôleur ;
- OUT => du contrôleur vers le périphérique.
- la direction est IN ou OUT vis à vis de l’hôte.
Plusieurs types de points d'accès :
- isodromique (isochronous) : débit réservé (e.g. vidéo en temps réel) ;
- par interruption (interrupt) : latence garantie (e.g. souris) ;
- de volume (bulk) : débit maximal sans garantie (e.g. clef mémoire).
Logiciels
Pour la conception de circuits imprimés nous vous recommandons le logiciel fritzing.
Pour la découpe laser de nombreux utilisateurs utilisent inkscape.
Pour la conception 3D vous pouvez tenter freeCAD. Une solution en ligne existe : onshape.
Pour la programmation du micro-contrôleur vous utiliserez le compilateur C avr-gcc et le logiciel de téléversement dfu-programmer.
Cartes intermédiaires
Pour les élèves n'ayant jamais conçu de carte électronique il est conseillé de concevoir une première carte ne comportant que la partie spécifique de leur clef USB.
Les cartes intermédiaires utilisent un microcontrôleur plus facile à souder : un ATtiny84.
Les cartes intermédiaires se programment en utilisant un Arduino Uno et les connecteurs ISP (In-System Programming). Voir la section Programmation par SPI pour savoir comment connecter l'Arduino UNO et la carte intermédiaire.
Vous utiliserez l'IDE Arduino (commande arduino
) pour la programmation :
- l'IDE Arduino est déjà installé sur les machines
zabeth
; - commencez par télécharger le module permettant de programmer des ATtiny84 :
- lancez une fenêtre de commandes ;
- tapez
export http_proxy=http://proxy.polytech-lille.fr:3128
; - lancez l'IDE via la fenêtre de commande en tapant
arduino
; - naviguez via
file
puispreferences
; - remplissez la zone
Additional Boards Manager URLs
avec l'adressehttp://drazzy.com/package_drazzy.com_index.json
; - naviguez via
Tools
puisBoard
etBoards Manager ...
; - dans la fenêtre qui s'affiche indiquez comme filtre
attiny84
et installezATTinyCore
.
Si l'Arduino Uno n'a pas déjà été programmé comme programmateur :
- sélectionnez
Arduino Uno
comme carte (Board) dans l'itemTools
; - sélectionnez le port série dans le même item ;
- prenez l'exemple
ArduinoISP
dans l'itemFile
; - chargez le dans l'Arduino Uno avec l'icône
Upload
(flèche vers la droite).
Maintenant vous pouvez programmer votre carte :
- sélectionnez
ATtiny 24/44/84(a) (No bootloader)
comme carte (Board) dans l'itemTools
; - vérifiez, dans le même item, que l'horloge est définie comme
8Mhz (internal)
; - sélectionnez, dans le même item pour le sous-item
programmer
, l'option "Arduino as ISP" ; - sélectionnez le port série dans le même item (celui de l'Arduino Uno) ;
- vous pouvez alors envoyer votre programme à l'ATtiny84 par l'item
Sketch
, sous itemUpload Using Programmer
.
Pour tester votre carte voici un petit programme pour faire clignoter les LED (pensez à mettre à jour la liste des E/S de vos LED dans le tableau leds
) :
int leds[]={7,8,9,10, -1}; void setup() { int i=0; while(leds[i]>=0) pinMode(leds[i++], OUTPUT); } void loop() { int i; i=0; while(leds[i]>=0) digitalWrite(leds[i++], LOW); delay(1000); i=0; while(leds[i]>=0) digitalWrite(leds[i++], HIGH); delay(1000); }
Les composants électroniques
Le coeur de votre clé va être un micro-contrôleur AVR plus exactement l'ATMega16u2. Ce micro-contrôleur possède l'électronique nécessaire pour la gestion d'un bus USB 2.0. Un document très important pour comprendre le fonctionnement de ce micro-contrôleur est le document technique (datasheet en patoi) : [1].
Sans mémoire une clé n'est pas une clé.
Vous pouvez utiliser des mémoires AT45DB641E faciles à gérer avec un ATMega16u2. Ces mémoires sont accessibles par un bus série SPI et facile à souder. Par contre elles sont de faible capacité (64Mb). Le document technique [2] de ces mémoires permet de connaître les commandes pour les configurer et y accéder en lecture et en écriture.
Si vous êtes téméraire, vous pouvez utiliser une mémoire MT29F128G8 accessible par un bus de 8 bits, plus difficile à souder, plus difficile à programmer mais d'une capacité intéressante (128Gb). La documentation technique est plus difficile à trouver, il faut aller sur le site du fabricant (micron) et montrer patte blanche. Vous trouverez le document dans le répertoire éponyme des machines de projet.
Il vous faudra aussi quelques autres composants comme un quartz, des résistances, des condensateurs, des diodes, des régulateurs de tension et bien sur des LED pour ajouter un peu de lumière. La carte de base peut être décrite comme suit.
- Le micro-contrôleur peut être accompagné d'un quartz à 8Mhz et de ses condensateurs et résistance.
- Le micro-contrôleur peut être alimenté par le connecteur USB en 5v (broche UVCC) mais avec ses lignes VCC et AVCC bouclées sur la sortie UCAP du régulateur 3.3v interne.
- Un convertisseur 5v vers 3.3v est nécessaire pour l'alimentation des mémoires.
- Le micro-contrôleur dialogue avec les mémoires par le bus SPI, une ligne de sélection est nécessaire par mémoire.
Pour la conception de votre clé vous pouvez vous appuyer sur un prototype de clef réalisé pour ce bureau d'études. Pour vous faciliter la vie il est cependant recommandé :
- de prévoir un vrai connecteur ISP (connecteur 2x3 broches) pour la programmation initiale du micro-contrôleur ;
- de prévoir un connecteur FTDI (comportant principalement la liaison série) pour la facilité de déverminage.
Cartes version beta
Une piste parasite entre masse et 3,3v a été supprimée, le reset est en 3,3v et un mini-connecteur ICSP a été ajouté.
Le fichier source Fritzing est disponible : Media:cle_usbv2.zip (renommer en .fzz).
Le reset est en 3,3v et un mini-connecteur ICSP a été ajouté.
Le fichier source Fritzing est disponible : Media:cle_usb_bisv2.zip (renommer en .fzz).
Il peut y avoir des problèmes lors du chargement des fichiers, des composants peuvent être déclarés absents. Essayez d'importer les composants suivants :
- mémoire MT29F128G8 : Fichier:MT29F128G08.zip
- mémoire AT45DB641E : Fichier:SO08-EIAJ.zip
- quartz FA238 : Fichier:FA238.zip
Renommez les fichiers de .zip en .fzpz avant de les importer dans Fritzing.
Test des cartes
Premier test, faire clignoter une LED par programmation DFU
Vision recto et verso des deux circuits décrit dans la section précédente (ancienne version à gauche). A noter que dans l'ancienne version seule les deux puces mémoire se trouvent au recto. Pour la nouvelle version la carte a du être agrandie et le micro-contrôleur rejoint la mémoire au verso.
La première étape de test consiste à insérer les PCB dans un port USB. Remarquez la sur-épaisseur réalisée à l'aide d'un papier un peu épais pour assurer le contact. Si l'ATMega16u2 est fonctionne correctement, en lançant l'utilitaire lsusb vous devez voir apparaître un périphérique labellé Atmel DFU device.
Pour tester plus en avant, il est proposé d'envoyer sur le micro-contrôleur un programme permettant de faire clignoter la LED connectée au micro-contrôleur (la LED est contrôlée par PB6 sur l'ancienne version et sur PB0 sur la nouvelle).
Vous pouvez trouver les programmes de test dans cette archive : Media:ClefUSB.zip. Pour compiler les programmes, il suffit de se placer dans le répertoire correspondant à la version de la clef et lancer le makefile avec la commande make. Pour télécharger le programme un simple make upload suffit. Pour remettre les micro-contrôleur en mode DFU pour les reprogrammer, il faut court-circuiter les broches reset et de la masse (connecteur à deux broches sur les deux cartes).
Premier problème, correction par programmation SPI
Voila le résultat de l'exécution du programme de test du micro-contrôleur sur la nouvelle version : Media:ClefUSBTestLed.mp4.
Force est de constater un problème, la LED clignote bien trop lentement. Quelques recherches apprennent que les ATMega16u2 sont vendus configurés avec un diviseur d'horloge par 8 activé. Le micro-contrôleur fonctionne donc à 1MHz et pas à 8Mhz comme souhaité. Ce type de configuration passe par une reconfiguration des fuses du micro-contrôleur. Manque de chance ces fuses ne peuvent être changées que par programmation SPI : impossible de les modifier en mode DFU. Voir le paragraphe ci-après pour comprendre comment se fait une programmation par SPI.
Les premières version de PCB n'étaient pas prévues pour ce type de programmation. Le mode DFU semblait suffisant. Pour faciliter cette programmation, des via ont été placées de façon à implanter un mini connecteur ICSP. Une erreur a été corrigée en passant : la ligne reset du micro-contrôleur était alimentée en 5v, elle a été passée à 3,3v. En attendant les nouvelles cartes, des fils ont été soudés sur les cartes pour avoir un accès au bus SPI et au reset. D'ailleurs, une malheureuse tentative de programmation en 5v ayant grillé les micro-contrôleur, d'autres cartes version alpha ont du être soudées.
Une fois le dispositif de programmation SPI adéquat mis au point, une configuration est tentée pour désactiver la division de l'horloge (modification de la valeur de l'octet de configuration appelé lfuse) :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xFF:m
Cette configuration échoue : le micro-contrôleur est passé, en usine, en état verrouillé. Vous pouvez vérifier cela avec la commande ci-dessous et en utilisant l'outil de calcul des fuses en ligne [3].
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -U lock:r:-:h
Il faut donc totalement réinitialiser le micro-contrôleur :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -t avrdude> erase avrdude> quit
Il est alors possible de modifier l'octet de configuration lfuse comme indiqué ci-dessus. Sauf que maintenant le micro-contrôleur ne contient même plus l'amorçeur. Il n'est plus possible de le programmer en mode DFU. Il ne semble pas possible de mettre la main sur l'amorceur du fondeur pour ATMega16u2. Heureusement l'amorceur pour une précédente version de la puce est disponible : media:at90usb162-bl-usb-1_0_5.zip. Il est assez simple d'installer l'amorceur par programmation SPI :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -U flash:w:at90usb162-bl-usb-1_0_5.hex
Après la modification de l'octet de configuration lfuse, la LED clignote normalement : media:ClefUSBTestLedBis.mp4. A noter qu'il faut maintenant télécharger le programme en utilisant at90usb162 comme cible au lieu de atmega16u2 à cause de la différence d'amorceur.
Second test, accès aux mémoires
Il faut maintenant souder le régulateur 3,3v pour alimenter les mémoires et aussi souder les-dites mémoires.
Ensuite il faut tester si l'accès aux mémoires fonctionne. Les programmes sont différents suivant les types de mémoire.
Test des mémoires AT45DB641E
Pour tester une des deux mémoires, il faut déjà sélectionner la mémoire sur le bus SPI. La première mémoire se sélectionne en passant la ligne PD0 à l'état bas. Pour la seconde mémoire, il faut utiliser la ligne PB4. La broche reset des deux mémoires est reliée à la ligne PB5 du micro-contrôleur. Il faut donc passer PB5 en sortie et la mettre à l'état haut.
Pour tester une mémoire, il est possible de demander ses identifiants. Pour cela, il faut envoyer sur le bus SPI, une fois la mémoire sélectionnée, l'octet 0x9F. Ensuite, il faut lire les cinq octets des identifiants (ID fabricant, ID de la mémoire, ...) puis il faut remonter la ligne de sélection à l'état haut.
Un programme de détection est disponible Media:ClefUSBTestMem.zip. Le test commence par 10 flashes rapides sur la LED de test. Pour simplifier la lecture du résultat, un test validé donne lieu à 5 flashes et un test en échec à un seul flash. Les deux mémoires sont testées tour à tour. Le prototype de clef USB avec des mémoires AT45DB641E passe avec succès ce test.
Pour aller plus loin, il faut écrire dans les mémoires et vérifier, par une lecture, que les écritures ont été bien effectuées.
Un premier programme de test des mémoires est disponible Media:ClefUSBTestMemRW.zip. Ce programme écrit cinq octets dans le premier bloc de la première mémoire, les lit, les multiplie par 2 et écrit les résultats dans le premier bloc de la seconde mémoire. Le test commence encore par 10 flashes rapides. Un test effectué avec succès donne lieu à 5 flashes, en cas d'échec un seul flash. Le prototype de clef USB avec des mémoires AT45DB641E passe avec succès ce test.
Un second programme de test de la première mémoire est disponible Media:ClefUSBTestMemRW2.zip. Ce programme écrit des valeurs séquentielles dans tous les blocs puis vérifie par des lectures que les écritures étaient bien effectuées. Le test commence encore par 10 flashes rapides. Ensuite un flash de contrôle est effectué tous les 256 blocs en écriture comme en lecture. C'est l'occasion de voir que les écritures sont plus lentes que les lectures. Après test des 8M de la première mémoire le résultat est donné en boucle. Toujours 5 flashes pour un succès et 1 pour un échec. Le résultat est répété toutes les 5 minutes histoire de pouvoir laisser le test se dérouler tout seul (test assez long).
Test de la mémoire MT29F128G8
L'accès à cette mémoire se fait par un bus de 8 bits. Le bus est utilisé à la fois pour envoyer des commandes et des données vers la mémoire mais aussi pour récupérer les données stockées en mémoire.
Les mémoires MT29F peut comporter plusieurs puces adressables séparémement, chaque puce pouvant comporter plusieurs unités logiques (LUN). La programmation commence par une réinitialisation des puces. Pour cela il suffit d'envoyer la commande 0xff
à chaque puce et d'attendre que la ligne d'activité repasse au niveau "libre".
Ensuite pour tester la mémoire, il est possible de lui demander divers identifiants. Pour cela, il faut envoyer la commande 0x90
suivie des adresses 0x00
, 0x20
ou 0x40
suivant l'identifiant souhaité. Les octets d'identification peuvent alors être récupérés, un par un, sur le bus 8 bits.
Le programme de récupération de l'identification est disponible Media:ClefUSBGoIDBasique.zip. Le test commence par 10 flashes rapides sur la LED de test. Les octets de l'identification sont ensuite "affichés" sur la LED de test. Cet affichage se fait bit par bit : un flashe pour un 0 et deux flashes pour un 1. Le programme se termine par 5 flashes rapides. Vérifiez avec la documentation de la mémoire que les octets donnés par le programme de test sont ceux attendus.
Programmation de micro-contrôleur par SPI
Nativement les micro-contrôleurs AVR peuvent être programmés via le bus SPI. Généralement un amorceur (bootloader) est installé sur ces micro-contrôleurs pour qu'ils puissent être programmés plus facilement par une connexion série pure (cas de l'ATMega328p par exemple) ou par une connexion USB (cas de l'ATMega16u2). Malheureusement les amorceurs peuvent être effacés par une mauvaise manoeuvre ou ne permettent pas de configurer tous les aspects du micro-contrôleur.
Généralement pour une programmation de micro-contrôleur par bus SPI, un connecteur ICSP est utilisé. Ce connecteur regroupe les lignes du bus SPI, la masse, l'alimentation et le reset. Un simple Arduino UNO peut-être utilisé comme programmateur par bus SPI. Les lignes MISO, MOSI, SCK, GND, VCC du programmateur sont connectées sur les mêmes lignes de la cible. La ligne 10 du programmateur est connectée sur le reset de la cible. Le programme ArduinoISP doit être téléversé sur le UNO jouant le rôle de programmateur. Ce programme fait partie des exemples fournis avec l'IDE Arduino.
Un exemple d'utilisation d'un programmateur par bus SPI pour obtenir les fuses d'un ATMega16u2 (les fuses sont des octets de configuration bas niveau du micro-contrôleur) :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -v
Un exemple pour télécharger un programme par SPI sur un ATMega16u2 :
avrdude -c arduino -p atmega16u2 -P /dev/ttyACM0 -b 19200 -U flash:w:programme.hex
Dans ces exemples, il est supposé que le port série associé à l'UNO est /dev/ttyACMO.
Si le micro-contrôleur est alimenté en 3,3v utiliser un Arduino Uno comme programmateur est une mauvaise idée : un UNO fonctionne à 5v et la communication SPI entre une plateforme à 5v et une autre à 3,3v ne fonctionne pas. Il existe assez peu de plateformes Arduino en 3,3v. Vous pouvez utiliser un Arduino Mini Pro 3,3v en conjonction avec un FTDI (convertisseur USB/série) lui aussi en 3,3v. Le Mini Pro ne dispose pas d'un connecteur ICSP. Il faut utiliser la ligne 11 pour connecter la ligne MOSI de la cible, la ligne 12 pour MISO et la ligne 13 pour SCK.
L'utilitaire avrdude peut être utilisé pour programmer la cible comme avec le programmateur à base d'UNO. Attention le port série sera probablement /dev/ttyUSBO cette fois.
Bibliothèque LUFA
Pour la gestion du bus USB par le micro-contrôleur nous allons nous appuyer au maximum sur la bibliothèque USB LUFA. Cette bibliothèque permet d'exploiter plus facilement les aspects USB des micro-contrôleurs AVR comme l'ATMega16u2.
Vous pouvez télécharger la dernière version de la bibliothèque [4]. Il est ensuite conseillé d'effectuer quelques manipulations pour pouvoir développer dans de bonnes conditions.
- Créez un répertoire PolytechLille au même niveau que les répertoires Demos et Projects.
- Dans ce répertoire copiez la démonstration de périphérique USB bas niveau MassStorage. Au niveau du makefile indiquez atmega16u2 comme micro-contrôleur, NONE comme platine et restez à 8Mhz.
- Il faut ensuite modifier la configuration de la mémoire et les fonctions d'accès à cette mémoire dans le sous-répertoire Lib du répertoire PolytechLille/MassStorage. Pour vous aider une version modifiée de la démonstration MassStorage est disponible media:MassStoragePeiP.zip. Dans cette version, vous n'avez à modifier que les fichiers Lib/DataflashManager.h et Lib/DataflashManager.c en vous appuyant sur les programmes de test des mémoires.
Une tendance naturelle est de créer un tableau pour stocker une page mémoire mais avec un ATMega16u2 il vaut mieux éviter : ce micro-contrôleur ne possède que 512 octets de mémoire vive. Même allouer un tableau pour une page de 256 octets n'est pas une évidence sachant que la bibliothèque LUFA consomme déjà de la mémoire. Vous écrirez donc les octets un à un dans le tampon d'écriture des mémoires et vous lirez les octets d'une page mémoire un à un.
Pour téléverser votre programme sur l’ATMega16u2, le paquetage Debian dfu-programmer est nécessaire. Installez-le au besoin. La procédure à suivre pour charger votre programme sur l’ATMega16u2 est la suivante :
- court-circuitez momentanément les lignes reset et masse de l’ATMega16u2, l'utilitaire lsusb doit lister la carte comme étant en mode DFU, vous pouvez alors exécuter les commandes suivantes :
- dfu-programmer at90usb162 erase
- dfu-programmer at90usb162 flash MassStorage.hex
- dfu-programmer at90usb162 reset
- débranchez et rebranchez votre carte, votre programme doit être actif sur le micro-contrôleur.
Test du programme avec la bibliothèque LUFA
Un premier test très simple à réaliser consiste à compiler le programme MassStoragePeiP sans ajouter les accès à la mémoire puis à le télécharger sur le micro-contrôleur. Vous devriez déjà vous apercevoir que votre carte est reconnue comme une clef USB. Sur un système Linux, les deux utilitaires dmesg et lsblk vous en convaincront.
# dmesg | tail [21942.134207] usb 1-1: new full-speed USB device number 4 using xhci_hcd [21942.333156] usb 1-1: New USB device found, idVendor=03eb, idProduct=2045, bcdDevice= 0.01 [21942.333161] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=220 [21942.333163] usb 1-1: Product: LUFA Mass Storage Demo [21942.333166] usb 1-1: Manufacturer: Dean Camera [21942.333168] usb 1-1: SerialNumber: 758303337383514140C1 [21942.339211] usb-storage 1-1:1.0: USB Mass Storage device detected [21942.339407] scsi host6: usb-storage 1-1:1.0 [21943.358141] scsi 6:0:0:0: Direct-Access LUFA Dataflash Disk 0.00 PQ: 0 ANSI: 0 [21943.358778] sd 6:0:0:0: Attached scsi generic sg2 type 0 [21943.359523] sd 6:0:0:0: [sdb] 2048 512-byte logical blocks: (1.05 MB/1.00 MiB) [21943.359910] sd 6:0:0:0: [sdb] Write Protect is off [21943.359915] sd 6:0:0:0: [sdb] Mode Sense: 00 00 00 00 [21943.360221] sd 6:0:0:0: [sdb] Asking for cache data failed [21943.360241] sd 6:0:0:0: [sdb] Assuming drive cache: write through [21943.404925] sd 6:0:0:0: [sdb] Attached SCSI removable disk
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 119,2G 0 disk ├─sda1 8:1 0 114,4G 0 part / ├─sda2 8:2 0 1K 0 part └─sda5 8:5 0 4,9G 0 part [SWAP] sdb 8:16 1 1M 0 disk sr0 11:0 1 1024M 0 rom
Pour vous familiariser avec le code, vous pouvez tenter de changer les noms du produit, du fabricant, le numéro de série et même la taille de la clef.
Avant de faire un test de votre clef avec un système de fichier, vous pouvez tester si elle gère correctement ses blocs mémoires. Le programme media:TestBlock.zip permet d'effectuer une écriture dans les blocs et, dans un second temps, de vérifier que ces blocs contiennent bien les bonnes valeurs. Pour l'utiliser, insérez votre clef, trouvez le nom du périphérique avec la commande lsblk et lancez la commande ci-dessous (ici il est supposé que le nom du périphérique est /dev/sdb) :
./testblock /dev/sdb W
Une fois le programme terminé, enlevez la clef pour s'assurer que la lecture ne se fera pas dans les tampons, remettez la et envoyez la commande :
./testblock /dev/sdb R
Si le programme ne vous affiche pas de différence d'octet, c'est que votre clef fonctionne correctement.
Vous pouvez alors formater votre clef :
mkfs -t vfat /dev/sdb
La monter :
mount /dev/sdb /mnt
Mettre quelques fichiers dessus, la démonter (avec la commande umount) et vérifier que vos fichiers sont encore là quand vous reconnectez la clef.
Calcul de l'espace occupée sur une clef USB
Certains binômes cherchent à afficher le pourcentage d'espace libre sur leur clef USB. C'est possible à réaliser avec quelques hypothèses. Dans un premier temps nous allons supposer que la clef n'est pas partionnée et que le système de fichiers est de type FAT.
Cas du système de fichiers FAT32
Le système de fichier FAT32 peut être utilisé à partir d'environ 260Mo disponible.
Pour ce type de système de fichiers il est possible d'avoir une évalution de l'espace libre en utilisant deux champs de la structure "informations". Cette structure se trouve généralement dans le second bloc du système de fichier et comporte deux champs pour donner le nombre de groupes alloués et de groupes libres. Ces champs ne sont qu'approximatifs et malheureusement pas toujours mis à jour par les systèmes d'exploitation. Cela dit Linux fait correctement le travail. Un fichier C de démonstration est disponible : Fichier:Fat32disp.zip.
Cas du système de fichiers FAT12
Pour les très petites clef (en dessous de 260Mo), seul le système de fichiers FAT12 peut fonctionner dans la famille des systèmes de fichiers FAT.
Pour ce système de fichiers la seule solution pour connaître la taille libre de la clef est de parcourir la table d'allocation des groupes de secteurs et de compter les groupes alloués.
D'un coté c'est assez simple car les groupes sont listés exhaustivement dans la table d'allocation et d'un autre coté en FAT12 un groupe est géré sur 12 bits, il faut donc regarder les groupes par deux (3 octets utilisés pour deux groupes).
Un programme C de démonstration est fourni : Fichier:Fatdisp.zip.
Le principe du programme est assez simple :
- le premier bloc est lu et quelques champs sont récupérés :
- taille, en nombre de blocs, des groupes ;
- nombre de blocs réservés ;
- taille, en nombre de blocs, des tables d'allocation ;
- nombre total de blocs.
- ensuite les blocs reservés sont passés ;
- enfin les chaînages des groupes sont lus deux par deux (en lisant 3 octets).
La partie de lecture des chaînages est un peu complexe en deux points :
- un calcul doit être effectué pour séparer les trois octets en deux chaînages ;
- l'énumération se fait sur les octets et pas sur les blocs.
Le dernier point fait que le programme de démonstration peut être assez facile à adapter sur la clef : au lieu de lire des blocs de 512 octets avec la primitive read
il faut juste la fonction de lecture des pages avec la fonction AT45DB641E_read_page
présentée plus haut.
Implantation dans la clef
Il ne faut surtout pas lancer le calcul de l'espace libre à chaque accès à la clef par le bus USB. Une façon efficace de faire est la suivante :
- lire les informations sur le premier bloc à l'initialisation et stocker les informations pertinentes en mémoire ;
- noter quand un bloc de la table d'allocation est modifié ;
- quand un bloc de données est accédé et que la table d'allocation a été modifiée lancer la fonction d'analyse de la table d'allocation.
Réalisations des binômes
Liste des élèves :
Nisrine AILANE OK Maxime BARRET OK Manel BENDAHI OK Nicolas BERRIER OK Theo BOSSELET OK Corentin BRANLY OK Martin CALCOEN OK Fabio CAMACHO OK Fabio DA-SILVA OK Rémi DECALONNE OK Juliette DELCROIX Augustin DJADJA-AVONYO OK Alexandre FAVEEUW OK Matthis FONTAINE OK Valentin GIROT OK Clément LEBRUN OK Nathan LEMOINE OK Alice MAILLET OK Bilal MOUSSA OK Gaspard TELLIER OK Kévan TOURON OK Dennis WASHINGTON-SARAZIN OK
Numéro | Elèves | Fonctionnalité supplémentaire | Page |
---|---|---|---|
Binôme 1 | Manel BENDAHI & Nisrine AILANE | Clavier musical et espion | Binôme 1 2022/2023 |
Binôme 2 | Bilal MOUSSA & Kévan TOURON | Binôme 2 2022/2023 | |
Binôme 3 | Theo BOSSELET & Alice MAILLET | Binôme 3 2022/2023 | |
Binôme 4 | Dennis WASHINGTON SARAZIN & Valentin GIROT | Binôme 4 2022/2023 | |
Binôme 5 | Martin CALCOEN & Fabio CAMACHO | Clavier USB 20 touches avec écran led 10x10 qui affiche la touche appuyée | Binôme 5 2022/2023 |
Binôme 6 | Maxime BARRET & Nathan LEMOINE | Clé USB Lampe torche | Binôme 6 2022/2023 |
Binôme 7 | Fabio DA SILVA & Corentin BRANLY | clavier haut parleur et binaire | Binôme 7 2022/2023 |
Binôme 8 | Augustin DJADJA-AVONYO & Juliette DELCROIX RICARD | clavier mécanique TKL ou 75%. Réaliser un PCB hotswap. Touche pour lancer une application et macro pour touches multimedias | Binôme 8 2022/2023 |
Binôme 9 | Matthis FONTAINE & Rémi DECALONNE | Clavier qui calcule la vitesse de frappe et l'affiche via un vu-mètre | Binôme 9 2022/2023 |
Binôme 10 | Alexandre FAVEEUW & Gaspard TELLIER | Binôme 10 2022/2023 | |
Binôme 11 | Nicolas BERRIER & Clément LEBRUN | Clé USB avec led + web cam intégrée | Binôme 11 2022/2023 |