SE2a4 Projet système/réseau 2023/2024

De wiki-se.plil.fr
Aller à la navigation Aller à la recherche

Objectif

L'objectif est de concevoir un système permettant de gérer l'état des écrans d'une salle de travaux pratiques.

Le système est composé des éléments suivants :

  • des cartes USB fixées sur les écrans et connectées en USB sur la station la plus proche ;
  • des serveurs Web sur chaque station qui peuvent être accédés en utilisant un navigateur Web classique.

Le serveur Web d'une station, en plus de servir des pages Web, va gérer les cartes USB locales et écouter les requêtes UDP de gestion des écrans.

Il vous faut programmer à la fois le micro-contrôleur des cartes USB et le serveur Web.

Matériel

Généralité

Vous devez concevoir et réaliser une carte électronique pour gérer un écran. Cette carte être conçue mécaniquement pour se fixer dans l'angle du moniteur où se trouvent le bouton permettant d'allumer et d'éteindre le moniteur et la LED de statut de ce même moniteur.

Un servo-moteur doit pouvoir se clipser sur la carte pour appuyer sur le bouton et un photo-récepteur doit pouvoir contrôler si la LED du moniteur est allumée ou non.

La carte doit être architecturée autour d'un ATmega16u4 et comporter quelques LED commandées en plus de l'écosystème du microcontrôleur et de ce qui est nécessaire pour faire fonctionner servo-moteur et photo-récepteur.

La conception de la carte se fait en utilisant le logiciel KiCAD version 7.

Programmation initiale

Si vous avez un AVR sans chargeur DFU/USB vous allez devoir l'installer. Pour cela utilisez un programmateur AVR sous la forme d'un Arduino Uno avec quelques câbles et programmé avec ArduinoISP.

Commencez par modifier les fuses de l'AVR pour lui demander d'utiliser une horloge externe (à partir de 8Mhz) et permettre d'appeler le chargeur avec le bouton HWB :

avrdude -c stk500v1 -p atmega32u4 -P /dev/ttyACM0 -b 19200 -U lfuse:w:0xFF:m -U efuse:w:0xF7:m

Ensuite il faut télécharger le chargeur DFU/USB sur le site Microchip [1] (cherchez "Embedded Software"). Une fois le fichier ATMega32U4-usbdevice_dfu-1_0_0.hex sous la main, flashez le sur l'AVR :

avrdude -c stk500v1 -p atmega32u4 -P /dev/ttyACM0 -b 19200 -U flash:w:ATMega32U4-usbdevice_dfu-1_0_0.hex

Enfin connectez votre carte en USB et vérifiez qu'elle est bien en mode DFU/USB avec la commande lsusb.

Entrées/sorties et JTAG

Pour utiliser les E/S PFE4 et au delà, il faut désactiver la fonctionnalité JTAG de l'ATmega32u4 (système de deverminage). Pour cela ajouter les deux lignes suivantes au début de votre code :

MCUCR |= (1<<JTD)
MCUCR |= (1<<JTD)

Développement sur la carte

Il doit être possible de gérer les cartes par le protocole USB. Il est conseillé d'écrire un programme en utilisant la bibliothèque LUFA exposant une interface USB de classe spécifique liée à deux points d'accès par interruption : un entrant pour lire l'état du photo-récepteur et un sortant pour commander le servo-moteur et quelques LED.

Il est aussi demandé que l'état de la LED de statut soit répété sur une des LED commandées, le photo-récepteur pouvant masquer la LED du moniteur. Une autre LED doit servir à indiquer que la carte est prise en charge par une application, ce qui est facile à tester via la variables globale USB_DeviceState.

Pour le principal, appuyez-vous sur votre travail en tutorat USB. La principale différence avec le tutorat est que les capteurs et actionneurs sont directement connectés sur l'ATmega16u4 cette fois. Faites attention, les broches PWM du minuteur 0 ne sont pas les mêmes par rapport à l'ATmega328p. Consultez la documentation du micro-contrôleur pour identifier ces broches.

Projet KiCAD de base pour les contrôleurs : Fichier:2023-Controleur-ecran-SE2a4-KiCAD.zip

Développement système et réseau sur la station

Fonctionnalité serveur Web

Serveur HTTP

La première étape du projet consiste à réaliser un serveur web minimaliste qui s’appelera sioux.

Ce programme peut prendre des arguments optionnels : -p <port> ou –port <port> pour spécifier un numéro de port différent de celui utilisé par défaut (port 80). Pour traiter les arguments, utilisez la fonction getopt_long (voir la page de manuel correspondante). Si les arguments sont incorrects, le programme affichera un message qui précise la syntaxe. Pour plus de clarté, l’analyse des arguments et de l’affichage de la syntaxe seront écrits dans des fonctions séparées.

Vous devez décoder les requêtes HTTP. Vous pouvez vous limiter aux requêtes GET en HTTP version 1.1. Vous devez gérer les en-têtes de réponse Server, Date et Content-Type. Les différentes pages HTML seront réalisées en utilisant HTML5.

Pour structurer le développement, nous proposons d’utiliser l’arboresence suivante :

PSR-2023-20224_Nom-binome1_Nom-binome2
|_Sioux
|_Libs
  |_Reseau

Pour le développement des fonctions réseaux vous pouvez vous inspirer du code existant sur le cours de Monsieur Redon (https://rex.plil.fr/Enseignement/Reseau/Reseau.IMA4sc/reseau.html). Vous devez faire une bibliothéque réseau pour les fonctions génériques. Le code du serveur web devra être également séparé en plusieurs fichiers, a minima sioux.c, http.c et options.c.

Serveur HTTP multi-flux

Vous allez ajouter du multi-flux à votre serveur sioux, pour cela vous utiliserez la bibliothèque pthreads. Pour faire les choses proprement et sans aller jusqu'à une bibliothèque vous circonscrirez l'utilisation de cette bibliothèque à une seule source C dédiée dans le répertoire sioux (inclusion de pthreads.h uniquement dans ce fichier ou dans un fichier .h privé au fichier).

Pages spécifiques

Deux types de pages spécifiques doivent être implantés dans votre serveur Web sioux.

  • Un premier type de page est référencé par le chemin ecrans/liste.html, elle liste les périphériques USB trouvés sur le réseau et présente des liens pour connaître l'état des écrans et agir dessus. Ces liens se font vers les pages spécifiques du second type.
  • Un second type de page est référencé par le chemin ecrans/action.html et génére une action sur un périphérique de contrôle d'écran précis. L'identifiant du périphérique est passé par URL (méthode GET) avec un nom de la variable ID. L'action à réaliser est aussi passée par URL avec un nom de variable action.

Fonctionnalité gestion des cartes USB

A l'initialisation du serveur, les cartes USB de gestion d'écan doivent être détectées et mémorisées. Un identifiant unique sur un octet doit être programmé dans chaque carte. Cet identifiant doit pouvoir être récupéré par le point d'accès de contrôle. Il est conseillé de prévoir des détections régulières de cartes USB nouvellement insérées.

Quand cela lui est demandé le serveur doit pouvoir contacter une carte particulière, c'est à dire avec un identifiant précis, et lui demander l'état du moniteur, de changer l'état du moniteur, ou de changer l'état d'une LED commandée.

Pour toute cette partie, il est fortement conseillé de reprendre le travail effectué en tutorat USB.

Fonctionnalité serveur UDP

Votre serveur doit aussi écouter sur le port UDP 4242. Les requêtes reçues sont vérifiées pour s'assurer qu'elles sont bien légitimes, par exemple en utilisant un "nombre magique" sur lequel la promotion doit s'entendre. Les requêtes contiennent le numéro des cartes USB concernées, le numéro 255 indiquant que toutes les cartes du réseau sont concernées.

La requête peut être :

  • retourner les identifiants des périphériques USB détectés ;
  • connaitre l'état du moniteur ;
  • changer l'état du monitor en un état précis.

Productions des élèves pour 2023/2024

N° réseau Elève Page
1 Juliette Chevalier Page 1
2 Justine Morin Page 2
3 Titouan Gerber Page 3
4 Thibault Panckoucke Page 4
5 Hugo Donneger Page 5
6 Theophile Castelain Page 6
7 Romain Leleu Page 7
8 Theo Gallet Page 8
9 Gauthier Dumange Page 9
10 Sabrine Zerrad Page 10
11 Kenneth Tanfa Page 11
12 Noah Conrard Page 12
13 Amine Ismail Page 13
14 Elvis Peetermans Page 14
15 Yacin Merahi Page 15
16 Valentin Place Page 16