Contrôle de matrice leds, 2012/2013, TD2

De Wiki de Projets IMA
Révision datée du 17 juin 2013 à 14:02 par Fviolier (discussion | contributions) (Application du port série)

Evaluation informatique et électronique

Gestion de projet / rédaction Wiki

  • Informatique :
  • Electronique :

Note .

Test fonctionnels

  • Sous-système.
    • Sous-système informatique :
    • Sous-système électronique :

Qualité de la réalisation

  • Informatique : Note .
    • procédure de test :
    • pages HTML et Javascript :
    • scripts PHP ou programmes C :
    • installation sur FoxBoard :
  • Electronique : Note .
    • qualité de la réalisation :
    • tests autonomes :

Bilan

Note finale :

Rapports des élèves

Principe du projet

Le principe de ce projet est assez simple : il vise à contrôler l'affichage d'une image de 8x8 pixels sur une matrice de led. L'affichage est piloté par une interface web qui permet a l'utilisateur de dessiner de manière interactive sur la matrice par le biais de son navigateur favori.

Ce projet est réellement un projet de systèmes communiquant puisque les systèmes sont reliés comme il suit :

   Utilisateur <--> Navigateur <-- [Internet] --> Serveur <-- [Série] --> Matrice

Le matériel mis en jeu a été :

  • Une foxboard (mini ordinateur qui héberge le serveur web)
  • Une matrice de LEDs 8x8
  • Une nanoboard
  • Une platine avec matrice de leds 16x16 contrôlée par Arduino
  • Des câbles
  • 3 cerveaux (environ)

Le projet se découpe en deux grandes parties :

  • La partie informatique qui regroupe tout ce qui peut se passer entre l'utilisateur et la matrice qui a été gérée par Benoit et Thomas.
  • La partie électronique qui vise à exécuter les commandes envoyées par la partie informatique sur la matrice gérée par Fabien.

Mode d'emploi

Comment l'utiliser ?

Le projet est assez plug and play, dans la mesure où il suffit de lancer la foxboard et la nanoboard et de se connecter au site. Ceci dit, il vaut mieux que tout les éléments soient raccordés entre eux (notamment le port série raccordé à la foxboard) pour que les divers daemons de la foxboard soient actifs au démarrage, faute de quoi il faut rebooter la foxboard ou les relancer manuellement.

Une fois que tout est bien connecté et que la foxboard est allumée il suffit de se connecter sur 172.26.79.15 (depuis le réseau de polytech, évidemment), de sélectionner le mode matrice 8x8. Et de commencer à faire plein de jolis dessins :)

A quoi sert le mode 16x16 ?

Quand nous avons développé la partie informatique, nous nous sommes directement penchés sur la partie 16x16 de la matrice, nous l'avons ensuite adaptée pour que le projet fonctionne aussi en 8x8. Le mode 16x16 est parfaitement fonctionnel sur la platine contenant la matrice pilotée par Arduino, en mode 0x14. Pensez à faire en sorte que le démon serialdaemon soit lancé après avoir connecté la platine, faute de quoi, ça ne fonctionnera pas.

En cas de non fonctionnement

Si le projet ne fonctionne pas, il est très probable (à 90%) que le problème vienne de la partie informatique, et précisément de la requête AJAX du fichier index_8.php qui appelle le scipt CGI. Le problème doit venir du fait que le programme va envoyer les informations sur le port série /dev/ttyUSB0 par défaut. Si pour une raison où une autre le port n'est pas détecté sous ce nom, essayez de rebooter la foxboard, normalement si le port est énuméré au démarrage il sera labellisé ttyUSB0.

Séance 1

  • Création du programme d'interface entre un ordinateur et la matrice de LEDs.
  • Création du site de contrôle
  • Prise en main du FPGA

Partie contrôle de la matrice de LEDs

Dans un premier temps la matrice 8x8 monochrome a été utilisée pour les tests puis rapidement nous sommes passés à la matrice 16x16 en couleurs.

Le programme a un fonctionnement très simple, il prend en premier argument le périphérique série sur lequel envoyer les informations (ici /dev/ttyUSB0) et un nom de fichier 'map'. Ce fichier map est un fichier de 8 octets dans le cas d'une matrice 8x8 et de 256o dans le cas d'une matrice 16x16 en couleurs. Chaque octet correspond à l'état de chacune des leds. Les deux premiers bits correspondent au niveau de bleu, les 3 suivants au niveau de vert et les 3 derniers au niveau de rouge.

Le programme seriallink a été écrit en C++ en utilisant les bibliothèques serial.c et .h fournis sur le site du projet, la compilation étant gérée par CMake (plus court que d'écrire un Makefile...). Pour compiler le programme on se place dans le répertoire racine des sources puis :

   mkdir build
   cd build
   cmake ..
   make

Bonus track le programme est valgrind compliant. \o/

Une jolie image aléatoire

On peut le lancer avec la commande suivante :

   ./seriallink /dev/ttyUSB0 fichier_map

Bonus Pour afficher une jolie image aléatoire sur la matrice 16x16:

   dd if=/dev/urandom of=random bs=1 count=256 && ./seriallink /dev/ttyUSB0 random

La même en 8x8:

   dd if=/dev/urandom of=random bs=1 count=8 && ./seriallink /dev/ttyUSB0 random

Enjoy.

Partie développement PHP/HTML/Javascript

La visualisation et la commande de l'allumage des LED se fait à partir d'une interface Web implantée dans une Foxboard. Pour cela, nous avons dû coder les pages permettant d'afficher les 256 LED (16x16), de représenter l'état de chacune, de modifier cet état en cliquant sur la LED et de renvoyer l'état de toutes les LED.

Cette interface de décompose en plusieurs fichiers:

  • un fichier index.php qui affiche la matrice de 256 LED et qui transmet l'état des LED grâce au Javascript.
  • un fichier cercle.php qui permet de dessiner les cercles des LED et de gérer la couleur des LED suivant leur état.
  • un fichier map.php qui récupère l'état de toute les LED via le Javascript précédent et qui concatène ces états sous forme hexadécimale dans un fichier lisible par le programme gérant l'envoie sur l'Arduino.


Le fichier index.php : Il a deux objectifs:

  • Le premier est de dessiner la matrice de LED (via le fichier "cercle.php") suivant l'état de chaque LED.
  • Le second est de faire appel au Javascript (pour changer l'état des LED et ainsi avoir la modification visuelle instantanément) et à l'AJAX pour envoyer ces états au fichier map.php.


Le fichier cercle.php: Il se charge de créer des cercles de couleur (par défaut vert quand l'état est "On" et noir quand l'état est "Off") et ce pour chaque LED (soit 256 cercles).


Le fichier map.php : Il récupère les informations des états des LED envoyé par index.php sous forme de tableau pour les mettre sous forme hexadécimale dans un fichier lisible par le programme. Pour cela, on utilise la méthode POST qui récupère le résultat envoyé par AJAX, la fonction explode et enfin la fonction fwrite.


La première séance a permis de construire l'architecture des pages et de voir comment gérer l'envoi et la gestion des informations liées aux LEDS. Nosu avons dû nous renseigner sur le PHP, le Javascript et l'AJAX. A son terme, les fichiers "index.php" et "cercle.php" était opérationnels, il ne nous manquait plus que le fichier "map.php". On pouvait donc changer l'état et la couleur des LED sur la page Web mais cela n'avait aucune incidence sur la plaquette.

Prise en main de la NanoBord et développement du programme de gestion de la NanoBoard

Cette séance a permis de prendre en main la NanoBoard et sa configuration sur Altium. Le développement du programme de gestion de la matrice de LEDs par la NanoBoard a commencé. A la fin de cette séance, le programme enregistre des paramètres d'entrés(valeur des LEDs) puis envoie les mots de chaque colonnes selon la fréquence d'une horloge paramétrable, sur l'affichage LEDs de la NanoBoard. Le mot de 8bits servant de sélection de la colonne à afficher est envoyé sur le port HEADER A en sortie.

état du programme à la fin de la première séance


Séance 2

Finition de l'architecture Web

Cette séance a permis de rendre opérationnel le fichier "map.php", les modifications effectuées sur l'interface Web étaient donc prise en compte sur la plaquette.

Finition du programme de gestion de la NanoBoard

Cette séance a permis de pouvoir terminer la partie électronique du projet.

Notre programme gère donc l'enregistrement dans des registres de 4 mots de 8 bits paramétrables. Puis les restitue l'un après l'autre sur le port HeaderB. Un mot de 8 bits est envoyé sur le port HeaderA, afin de sélectionner la colonne où l'on va afficher le mot.

On obtient donc le graphique suivant pour la sélection des colonnes, on affiche la colonne i quand le signal Di est à 0.

graphique du mot de sélection en fonction du temps, mesure à l'oscilloscope


Nous avons mis en place la matrice de leds 8x8, et branché celle-ci à la NanoBoard. L'affichage fonctionne correctement. nous avons utilisé des résistances de 820ohm pour limiter le courant à 4mA dans les LEDs.

Configuration de la foxboard

La Foxboard a été configurée correctement via la liaison série afin de la connecter au réseau, d'installer les paquets nécessaires à la compilation du logiciel de contrôle de la matrice de LEDs ainsi nous n'avons plus besoin de la liaison série pour la piloter. Le réseau a été configuré comme il suit (/etc/network/interfaces) :

 auto eth0
 allow-hotplug eth0
 iface eth0 inet static
   address 172.26.79.15
   netmask 255.255.240.0
   gateway 172.26.79.254
   dns-nameservers 193.48.57.34

De même, la Foxboard a été mise à jour et les paquets cmake, g++, make ont été installés pour permettre la compilation du logiciel de pilotage de la matrice.

Un script de daemon a été créé dans le /etc/init.d à partir du seketon pour permettre le lancement automatique du daemon de handle du port série. Le programme a finalement été testé avec succès à la fin de la scéance.

Modification du script PHP et JavaScript

Matrice 8x8 commandée depuis le navigateur

Les fichiers PHP et le programme d'envoi sur la liaison série ont été modifiés de manière à gérer les matrices 8x8 monochromes. La foxboard est maintenant capable de gérer les deux modes d'affichages, 16x16 ou 8x8 depuis la page d'accueil.

Séance 3

Transformation du binaire en script CGI

Le challenge de cette séance a été de transformer le programme seriallink qui était appelé par un exec() en PHP (de manière un peu crade, c'est vrai (mais je maintiens que ça marchait quand même !)) par un vrai script CGI tout propre.

Le programme a donc été adapté pour récupérer toutes les informations (typiquement le port série USB à utiliser et le fichier de map à envoyer sur la matrice) via des POSTDATAs. Ceci n'a pas été fait en CGI comme avec les exemples de la page rex.plil.net mais avec la bibliothèque libcgicc, une bibliothèque CGI pour C++, de manière a garder le code du programme bien homogène à du C++ pour qu'il reste agréable à lire (et aussi parce que c'est plus agréable de programmer en orienté objet).

La partie la plus compliquée de cette tâche a été de réussir à reconfigurer lighttpd pour qu'il daigne enfin lancer les scripts CGI, mais une fois que ce fut chose faite, les tests sur la matrice pilotée par Arduino ainsi que sur la matrice réalisée en électronique étaient concluants.

Notons que le programme seriallink a été laissé dans la liste de cibles du CMakeLists.txt de manière à pouvoir faire des tests en appelant directement ce programme depuis la ligne de commande sans avoir besoin de passer systématiquement par l'interface web ce qui accélère le processus de debug.

Application du port série

Cette séance a eu pour but de simuler le port série. C'est à dire :

  • Une entrée d'un mot de 8 bits
  • Un signal numérique, à l'état 1 quand le mots de 8 bits peut être lu.

Une fois ce port série en place dans le programme, nous avons vérifié que l'affichage sur la matrice de LEDs était correct.

Il nous a fallu ensuite installer un vrai port série sur notre montage. Un sous système de gestion du port série nous a été fourni. Grâce à ce système nous avons pu brancher la sortie de ce sous système à l'entrée de notre programme. Le système complet se présente comme ci:

système complet

Et voici le programme de gestion de la matrice :

programme de gestion de la matrice

La console ,permettant d'envoyer les mots de 8 bits, envoie la valeur du code ASCII correspondant au caractère donné.

Une fois ce port série en place la partie électronique du projet est terminé.

Test de l'ensemble partie informatique + partie électronique

Une fois que les parties électroniques et informatiques étaient opérationnelles chacune de leurs côtés il a fallu les mettre en commun, cela a été fait en salle d'électronique ou l'absence de réseau filaire pour des raisons assez mystérieuses nous a imposé l'utilisation d'EEEPC pour faire le lien entre l'utilisateur et la foxboard. Tout s'est bien passé et les tests ont été concluants à l'exception d'un petit problème :

   La matrice recevait les octets comme des colonnes alors que nous les envoyions afin qu'ils codent pour des lignes.

De ce fait, l'image affichée sur la matrice était la transposée de celle qui était affichée depuis l'interface web. Heureusement, une petite modification du code PHP qui générait la map a permis de corriger le problème et tout fonctionnait au final parfaitement.