IMA4 2016/2017 ECP3
Sommaire
Présentation du projet
Contexte
L'élève effectue son stage sur Lille 1 et peut donc passer à l'école pour récupérer du matériel.
Objectif
L'objectif du projet est la création d'un périphérique USB ludique du type catapulte ou lance-billes. La carte de contrôle est à réaliser à l'aide d'un micro-contrôleur.
Description du projet
Le but de ce projet est de réaliser un gadget USB constitué d'une partie mécanique et d'une carte électronique de contrôle. La carte de contrôle doit permettre au gadget d'être reconnu par l'ordinateur comme un périphérique USB (USB device) sur un bus USB géré par un contrôleur USB (USB Host).
Comme carte de contrôle vous utiliserez un Arduino UNO. Reprogrammez l'ATMega16u2 de cette carte. L'objectif est de le programmer pour le faire apparaître non pas comme un convertisseur USB/Série mais comme un périphérique de type USB-gadget.
Une fois l'ATMega16u2 reconnu ainsi par l'ordinateur, des fonctions doivent être ajoutées sur l'ATMega328p pour gérer des servo-moteurs par rapport aux commandes reçues de l'hôte USB. Le périphérique doit donc présenter des points d'accès en écriture, par exemple pour commander la rotation de l'objet, mais aussi des points d'accès en lecture, par exemple pour savoir si la rotation est bloquée en fin de course. Pour la version de production, il est demandé de programmer les ATMega avec avr-gcc
.
Pour finir, réalisez la structure du gadget en contre-plaqué usiné à la découpeuse laser.
Cahier des charges
L'idée générale de ce projet est de reprogrammer une carte Arduino UNO pour en faire un périphérique USB ludique de type catapulte ou lance-bille. Tout d'abord, il faut reprogrammer le micro-logiciel de communication USB (firmware) de l'ATMega16u2. L'ATMega16u2 fait le lien entre le port USB de l'ordinateur et le micro-contrôleur ATMega328p. Afin de reprogrammer l'ATMega16u2, il faut utiliser la bibliothèque LUFA. LUFA (Lightweight USB Framework for AVRs) est une librairie open-source pour les microcontrôleurs AVR conçu pour le développement de périphériques et hôtes USB. Elle est écrit spécifiquement pour le compilateur AVR-GCC.
Dès que l'ATMega16u2 sera reprogrammé et reconnu par l'ordinateur comme un périphérique de type USB-gadget, on pourra passer sur la programmation de l'ATMega328p afin d'y ajouter les fonctions nécessaires pour gérer les servo-moteurs. Le code sera intégralement codé en C avec le bibliothèque avr-gcc
.
Planning prévisionnel
Programmation USB
Utilisez la bibliothèque LUFA pour reprogrammer l'ATMega16u2.
Semaine 1
Prise en main de la bibliothèque LUFA
J'ai tout d'abord effecteur des recherches sur la bibliothèque LUFA afin d'étudier les différentes possibilités que nous offre cette bibliothèque. Elle permet de créer des périphériques de différentes classes : Android, Audio, Generic, Joystick, Clavier, Stockage, Souris, Imprimante ...Des exemples de projet OpenSource sont même inclus dans le package.
J'ai fait des recherches également sur l'ATMega16u2. Alors que l'ATMega328p prend le soin de réaliser toutes les taches de l'Arduino, l'ATMega16u2 s'occupe de la connexion USB. Elle convertit les signaux USB provenant de l'ordinateur vers le port série SAM3X. Le protocole USB nommée DFU (Device Firmware Update) permet de mettre à jour de le firmware de l'ATMega16u2.
Tout d'abord, j'ai télécharger la librairie LUFA. J'ai implanté une USB Class Device de type Mouse dans l'Arduino et j'ai modifié le Makefile en conséquence afin qu'il fonctionne avec l'Arduino et l'ATMega16u2. Sous Windows, on remarque que l'Arduino est bien repéré comme un périphérique et non comme une simple liaison série. Sous Linux, c'est aussi le cas.
Semaine 2
Recherches sur le protocole USB
J'ai effectué quelques recherche afin de me familiariser avec les périphériques USB et de comprendre leur fonctionnement.
Architecture
La norme USB permet le chaînage des périphériques, en utilisant une topologie en bus ou en étoile. L'architecture USB est composée d'un hôte (USB host) et de plusieurs périphériques (USB devices). Un hôte USB peut contenir plusieurs contôleurs hôte (host controllers) et chaque contrôleur hôte peut contrôler un ou plusieurs ports USB. Un périphérique USB peut être constitué de plusieurs sous-périphériques dans le cas d'un périphérique multi-fonctions tel qu'un webcam avec micro intégré. La communication USB est basée sur des canaux logiques appelés "pipes". Un pipe est une connexion entre le contrôleur hôte et une entité logique d'un périphérique qu'on appelle "endpoint". Il y a deux types de pipes :
- Les pipes de message qui sont bi-directionnels et permettent de commander le prériphérique (control transfert).
- Les pipes de stream qui sont uni-directionnels et permettent le transfert de données de façon assynchrone, par interruptions ou en mode bulk.
Classes USB
Il y a différentes classes de périphériques USB permettant à l'hôte de charger le bon driver pour chaque périphérique connecté. Un code est associé à chaque classe. Il est envoyé à l'hôte. Les principales classes sont les suivantes :
- Audio pour les enceintes, microphones ...
- Communications and CDC Control pour les convertisseurs USB-série, modems ...
- Human Interface Device (HID) pour les claviers, souris, joysticks, écrans tactiles ...
- Physical Interface Device (PID)
- Mass storage pour les clés USB, lecteurs de cartes SD ...
- Vidéo pour les webcam
- Vendor-specific ou Unspecified pour des périphériques nécessitant des drivers spcéfiques
Les classes peuvent être utilisées comme interface d'un périphérique pour un périphérique multi-fonctions.
Programmation du gadget
Semaine 1
Dès que l'Arduino est transformé en périphérique USB-Gadget après la reprogrammation de l'ATMega16u2, il est plus possible de programmer l'ATMmega328 via le port USB de l'Arduino. Il faut donc utiliser le port ISCP relier au l'ATMega328p pour programmer celui via le protocole SPI. On utilise pour cela un autre Arduino UNO. La seconde Arduino joue le rôle de programmeur AVR.
Arduino Programmeur | Arduino à programmer |
---|---|
Vcc/5V | Vcc |
GND | GND |
MOSI/D11 | D11 |
MISO/D12 | D12 |
SCK/D13 | D13 |
D10 | Reset |