Contrôle de matrice leds, 2011/2012, TD3 : Différence entre versions

De Wiki de Projets IMA
 
(35 révisions intermédiaires par 6 utilisateurs non affichées)
Ligne 2 : Ligne 2 :
  
 
=== Gestion de projet / rédaction Wiki ===
 
=== Gestion de projet / rédaction Wiki ===
 +
 +
Rédaction de la page Wiki correcte. Des éléments de gestion de projet donnés dans le Wiki. La gestion de projet en elle même est très satisfaisante puisque que le projet a abouti. Notons enfin l'excellente vidéo qui résume parfaitement le projet. Note 100%.
  
 
=== Test fonctionnels ===
 
=== Test fonctionnels ===
  
* Sous-système :  
+
* Sous-système informatique : Le système de gestion de matrice de LED est un succès (voir vidéo, un petit souci d'affichage via la NanoBoard), interconnexion FoxBoard / NanoBoard effectuée. Note 120%.
* Système :  
+
* Sous-système électronique : Le système demandé a été correctement réalisé et un deuxième sous-système a été intégré (lecture des boutons). Très bon travail. Note 120%.
 +
* Système : Un système a été réalisé en l'espèce d'un jeu de type "snake" (voir vidéo). Note 100%.
  
 
=== Qualité de la réalisation ===
 
=== Qualité de la réalisation ===
  
* Informatique :
+
* Informatique. Note 97%.
** procédure de test :
+
** procédure de test : Un README en anglais (ou presque). Test sur le banc d'essai par les élèves OK. Test par l'enseignant OK, quelques difficultés pour obtenir un contexte permettant le bon fonctionnement. Note en l'état 100%.
** pages HTML et Javascript :
+
** pages HTML et Javascript : Non applicable.
** scripts PHP ou programmes C :
+
** scripts PHP ou programmes C : Un vrai code C, structuré en fonctions, des commentaires. On note cependant du code mort et un formattage un peu limite. Note 90%.
** installation sur FoxBoard :  
+
** installation sur FoxBoard : Les exécutables y sont, tentative de démarrage automatique. Note 100%.
* Electronique :
+
* Electronique : Note 99%.
** qualité de la réalisation :
+
** qualité de la réalisation : la conception du schéma électrique est claire. les explications fournies dans le wiki sont globalement satisfaisantes. Note 98%.
** tests autonomes :
+
** tests autonomes : implémentation du circuit sur la nanoboard fonctionnelle. Note 100%.
  
 
=== Bilan ===
 
=== Bilan ===
  
Tous les points principaux ont un poids équivalent (sauf "système" qui est un bonus).
+
Note finale : 130% => 20/20.
 
 
Note finale :
 
  
 
== '''Mise en place du jeu SNAKE sur une matrice de LEDs'''==
 
== '''Mise en place du jeu SNAKE sur une matrice de LEDs'''==
==Introduction==
+
==Introduction==  
Dans l'optique du projet systèmes communicants, nous avons choisi de mettre en place l'antique (mais non dépassé) jeu ''SNAKE'' et de l'appliquer sur les matrices de LEDs fournis.
+
<include nopre noesc src="/home/pedago/pimasc/include/video-MatriceLed2011TD3-iframe.html" />
 +
Dans l'optique du projet systèmes communicants, nous avons choisi de mettre en place l'antique (mais non dépassé) jeu ''SNAKE'' et de l'appliquer sur les matrices de LEDs fournies.
 
Il est intéressant de rappeler que ce jeu a été vu pour la première fois en 1970 et est devenu populaire pour sa simplicité et sa disponibilité sur tout type de plate-formes.
 
Il est intéressant de rappeler que ce jeu a été vu pour la première fois en 1970 et est devenu populaire pour sa simplicité et sa disponibilité sur tout type de plate-formes.
 
Pour le projet, nous avons donc décidé de réaliser ce jeu entièrement grâce au langage informatique C et les outils électronique de base. Il est évident que deux parties se détachent dans la réalisation de ce projet. Dans ce compte rendu, nous allons vous montrer l'évolution en parallèle de la partie informatique et de la partie électronique. Enfin, nous mettrons en avant la réunion des deux parties pour former le jeu.
 
Pour le projet, nous avons donc décidé de réaliser ce jeu entièrement grâce au langage informatique C et les outils électronique de base. Il est évident que deux parties se détachent dans la réalisation de ce projet. Dans ce compte rendu, nous allons vous montrer l'évolution en parallèle de la partie informatique et de la partie électronique. Enfin, nous mettrons en avant la réunion des deux parties pour former le jeu.
 +
<br style="clear: both;">
  
 
== Développement par séances==
 
== Développement par séances==
Ligne 39 : Ligne 42 :
 
*deux afficheurs 7 segments présenteront le score.
 
*deux afficheurs 7 segments présenteront le score.
 
*pour la matrice de LEDs, 8 mots de 8 bits seront envoyés ainsi qu'un bit d'écriture
 
*pour la matrice de LEDs, 8 mots de 8 bits seront envoyés ainsi qu'un bit d'écriture
*......
+
*Un bouton reset sera mis en place pour rafraîchir la matrice avant le début du jeu.
 +
 
  
Ensuite,nous avons scindé notre trinôme en deux. Le premier groupe est parti sur le logiciel de conception assisté de circuit électronique afin de concevoir le contrôle de matrice LEDs.Le second groupe a pris en main la maquette de matrice LEDs et esquissé une interface web de contrôle d'allumage.
+
Ensuite,nous avons scindé notre trinôme en deux. Le premier groupe est parti sur le logiciel de conception assisté de circuit électronique afin de concevoir le contrôle de la matrice LEDs.
A la fin de la séance, le groupe s'est remis ensemble pour la mise en commun des idées
+
Le second groupe a pris en main la maquette de matrice LEDs et esquissé une interface web de contrôle d'allumage.
Au final, au niveau électronique un circuit basé sur nos expériences en microprocesseur a été édité et sera testé à la prochaine séance, quant au niveau informatique, la maquette de LEDs a été pleinement comprise et la programmation du jeu en langage C est prévue pour la séance prochaine.
+
A la fin de la séance, le groupe s'est remis ensemble pour la mise en commun des idées.
 +
Au final, au niveau électronique,un circuit basé sur nos expériences en microprocesseur a été édité et sera testé à la prochaine séance. Au niveau informatique, la maquette de LEDs a été pleinement comprise et la programmation du jeu en langage C est prévue pour la séance prochaine.
  
==>''Prévision pour la séance du 11/05/2012''
+
==>''Prévisions pour la séance du 11/05/2012''
 
*Programmation du jeu ''SNAKE''
 
*Programmation du jeu ''SNAKE''
 
*Test du circuit électronique
 
*Test du circuit électronique
Ligne 56 : Ligne 61 :
 
'''Séance 2 11/05/2012'''
 
'''Séance 2 11/05/2012'''
  
 +
Avant la séance, en travail personnel, l’algorithme du jeu Snake a été entièrement écrit et est fonctionnel pour jouer dans un terminal. L'objectif de la séance est donc d'adapter cet algorithme à notre projet.
 
Le groupe est tout d'abord resté en partie informatique pour mettre au point le jeu du point de vue strictement informatique.
 
Le groupe est tout d'abord resté en partie informatique pour mettre au point le jeu du point de vue strictement informatique.
Le programme a été conçu tout d'abord en utilisant la maquette arduino donnée par le professeur.
+
Nous avons adapté notre programme afin d'utiliser la maquette arduino donnée par le professeur.
 
Après avoir ébauché les grandes lignes du jeu, le trinôme s'est encore scindé pour pouvoir compléter la partie électronique.
 
Après avoir ébauché les grandes lignes du jeu, le trinôme s'est encore scindé pour pouvoir compléter la partie électronique.
 
Rappelons que le schéma altium avait été déjà testé avec l'oscilloscope et qu il fonctionnait. Il restait donc normalement qu'à câbler une matrice de LEDs.
 
Rappelons que le schéma altium avait été déjà testé avec l'oscilloscope et qu il fonctionnait. Il restait donc normalement qu'à câbler une matrice de LEDs.
Ligne 67 : Ligne 73 :
  
 
==> Partie Informatique
 
==> Partie Informatique
 
----
 
  
 
Le code du Jeu est enfin terminé.
 
Le code du Jeu est enfin terminé.
 
Dés l'or que l'on compile, un message apparait obligeant l'utilisateur à appuyer sur une touche pour démarrer.
 
Dés l'or que l'on compile, un message apparait obligeant l'utilisateur à appuyer sur une touche pour démarrer.
 
Ensuite,les touches directionnelles dirigent le serpent vers la direction choisi.
 
Ensuite,les touches directionnelles dirigent le serpent vers la direction choisi.
Le jeu se termine quand le serpent se mort la queue ou lorsque le serpent atteint les zones limites
+
Le jeu se termine quand le serpent se mort la queue ou lorsque le serpent atteint les zones limites.
  
----
+
[[Media:snake.c.txt]]
  
----
+
==> Partie Électronique
 +
La partie Informatique étant fini, nous sommes tous retournés sur altium pour terminer le schéma et le compiler sur la nanoBoard.
 +
A la fin de la séance, le schéma marchait, et ressemblait à ceci:
  
----
+
[[Media:sch.pdf]]
  
----
+
Nous avons donc fait quelques tests supplémentaires sur oscilloscope pour vérifier que les sorties répondait correctement à nos attentes.
  
----
+
Suite à cela , nous avions besoin de câbler la matrice de LEDs en suivant son schéma
  
#define LED (8)
+
[http://www.sparkfun.com/datasheets/Components/YSM-2388CRGBC.pdf]
#include <stdlib.h>
 
#include <stdbool.h>
 
#include <stdio.h>
 
#include <unistd.h>
 
#include <sys/types.h>
 
#include <sys/socket.h>
 
#include <sys/un.h>
 
  
// Init Serie
+
[[Fichier:Matrice-cablee.jpg]]
  
/* Quelques constantes */
 
  
#define SOCKET_ECRITURE "/tmp/serial.send"
+
==> Réunion des deux parties
#define SOCKET_LECTURE "/tmp/serial.recv"
 
#define PING_Draw 300000
 
#define PING_Read 300000
 
  
/* Creation d'un client socket famille Unix */
+
======>Configuration de la Foxboard
  
int connexionServeur(char *chemin){
+
Dans la Foxboard, il faut changer les paramêtres de l'interface afin de pouvoir se connecter et travailler en SSH.
  
int ds;                        /* Descripteur de SOCKET */
+
AVANT MODIFICATIONS
 +
                  auto eth0
 +
                    iface eth0 inet static
 +
                    address 172.26.79.X
 +
                    netmask 255.255.255.0
 +
                    gateway 172.26.79.254
 +
                    dns-nameservers 193.48.57.34
 +
APRES MODIFICATIONS
 +
                  auto eth0
 +
                    iface eth0 inet static
 +
                    address 172.26.79.07
 +
                    netmask 255.255.255.0
 +
                    gateway 172.26.79.254
 +
                    dns-nameservers 193.48.57.34
  
struct sockaddr_un adresse;    /* Adresse du serveur */
+
Par la suite, il faut donc se connecter en SSH sur la foxboard ( commande: ssh 172.26.79.07) et copier le programme dans la mémoire du petit appareil et compiler le programme(scp -r snake.c root@172.26.79.07:/root/rep/).
  
int statut;                    /* Stocke le statut des
+
======>Initialisation du port émission RS 232
commandes */
 
  
/* Creation de la SOCKET du client */
+
[[Fichier:Port-emission2.jpg]]
  
ds=socket(AF_UNIX,SOCK_STREAM,0);
+
A défaut de pouvoir mettre en place le protocole d'émission par nous même, nous avons utilisé un bloc fait par un des professeurs
 +
Ce bloc a pour but d'activié le port RS 232 de la NanoBoard afin de pouvoir brancher la Foxboard. En clair, ce bloc est le passage de la frontière entre le programme informatique C et la partie électronique active sur la NanoBoard.
  
if(ds<0) {perror("connexionServeur.socket");
+
==Explication de la partie Electronique==
  
exit(-1);}
+
[[Fichier:sch.pdf]]
 
 
/* Preparation de la structure adresse du serveur */
 
 
 
adresse.sun_family=AF_UNIX;
 
 
 
strcpy(adresse.sun_path,chemin);
 
 
 
/* Connexion au serveur */
 
statut=connect(ds,(struct sockaddr*)&adresse,sizeofdresse)
 
if(statut<0)
 
 
 
{perror("connexionServeur.bind");
 
 
 
exit(-1);}
 
 
 
printf("ds=%d\n",ds);
 
 
 
return ds;
 
}
 
 
 
// Structures
 
//structure du snake.
 
 
 
//On utilise un tableau qui memorise la coordonnee de chaque partie du snake
 
 
 
//Les valeurs des coordonnees se deplacent cicliquement dans le tableau pour n'avoir qu'a faire une unique affectation par deplacement.
 
typedef struct {
 
    int t; //numéro de la queue (tail) dans le tableau
 
    int l; //taille du snake  (length)
 
    int T[LED*LED]; //tableau de position du corp
 
  }
 
snake;
 
 
 
 
 
// fonction de lecture d'entrée \\
 
 
 
//l'objectif de cette fonction est de lire les entrées (touches) et de modifier la variable associé pour la direction du snake seulement si une touche est appuyé
 
 
 
void lire (int * dir,int sl) {
 
  printf("debut lecture\n");
 
  int c;
 
  int d=0;
 
  int k;
 
 
 
  usleep(PING_Read); //attente pour eviter les conflits lecture/ecriture
 
 
 
  //cette boucle a pour but de faire un nombre de lecture eleveet de memoriser dans c les valeurs ssi elles ne sont pas =0
 
  for(k=0;k<30;k++) {
 
    read(sl,&d,1);
 
    if (d!=0) c=d;
 
    printf("(%d:%d)", k, d);// affichage pour verification
 
  }
 
 
 
 
 
  if (c==2 || c==130) *dir=-8; //haut
 
  if (c==4 || c==132) *dir=8; //bas
 
  if (c==8 || c==136) *dir=-1; //gauche
 
  if (c==1 || c==129) *dir=1; //droite
 
}
 
 
 
 
 
//genere intelligemment  une nouvelle cible
 
 
void change(int * sou, int * pt, bool * Mat) {
 
  int i;
 
  if (*pt==1) {
 
    *pt=2;i=50;
 
  }
 
  else {
 
    *pt=1;i=22;
 
  }
 
  while (Mat[i]) i=(i+1)%(LED*LED);
 
  *sou=i;
 
  Mat[i]=true;
 
}
 
 
 
 
 
// envoi la matrice a afficher
 
 
void draw (bool * Mat, int se) {
 
  int i,j,k;
 
  int col=0;
 
  int puiss=0;
 
  int cur=0;
 
 
 
  usleep(PING_Draw);
 
  //affichage dans la console
 
  for (i=0;i<LED;i++) {
 
    for (j=0;j<LED;j++) {
 
      if (Mat[i*LED+j]) printf("1");
 
      else if (!(Mat[i*LED+j])) printf("0");
 
      else printf("Error !");
 
    }
 
    printf("\n");
 
  }//*/
 
 
 
//*********envoi sur le port serie*****************
 
 
 
  //*
 
  for (i=0;i<LED;i++) { //pour chaque ligne
 
    col=0;
 
    for (j=0;j<LED;j++) { //pour chaque colone
 
      if (Mat[i*LED+j]) {
 
 
 
//calcul de la valeur a envoyer
 
 
 
// remarque : la notation x^y ne compile pas
 
 
 
cur=2;
 
puiss=7-j;
 
for (k=0;k<puiss;k++) cur=cur*2;
 
col = col + cur;
 
      }
 
    }
 
    write(se,&col,1); // on envoi la valeur de la ligne
 
  }
 
  //*/
 
 
 
  /********pour le mode 14*********
 
  int LedOn = 1; //pour mode 14
 
  int LedOff = 0;
 
  int cpt=0; 
 
  for (i=0;i<LED*2;i++) {
 
    for (j=0;j<LED;j++) {
 
      if (Mat[(i/2)*LED+j]) {
 
write(se,&LedOn,1);
 
write(se,&LedOn,1);
 
cpt = cpt +2;
 
      }
 
      else { write(se,&LedOff,1);
 
write(se,&LedOff,1);
 
cpt = cpt + 2;}
 
    }
 
  }
 
  printf("J'ai fait %d write\n", cpt);
 
  //*/
 
}
 
 
 
 
 
 
 
 
 
// déplacement du serpent \\
 
 
 
// déplace le serpent d'un cran
 
 
 
void move (snake * kaa, bool * Mat, int  dir) {
 
  int tail = kaa->t;
 
  int length = kaa->l;
 
  int new;
 
  Mat[kaa->T[tail]]=false; //on efface le bout de la queue
 
  kaa->t=(kaa->t+1); //on incremente la position de la queue
 
  tail = (tail+1)%(LED*LED);
 
  if (kaa->t>=(LED*LED)) kaa->t=kaa->t-(LED*LED) ;
 
  new=tail+length-1;
 
  if (new>=(LED*LED)) {
 
    new=new-(LED*LED);
 
    kaa->T[new]=kaa->T[((new-1+LED*LED)%(LED*LED))]+dir;
 
  }
 
  else {
 
    if (new!=0) {
 
      kaa->T[new]=kaa->T[new-1]+dir;     
 
    }   
 
    else {
 
      kaa->T[new]=kaa->T[(LED*LED-1)]+dir; } }
 
   
 
  Mat[kaa->T[new]]=true;
 
 
 
 
 
 
 
 
 
}
 
  
//vérifie les positions pour le coup prochain
+
[[Fichier:SCH2.png]]
  
//mort ; mange ; rien
+
Dans cette partie nous allons détailler, la partie électronique compilé sur la NanoBoard.
void checkNext (snake *  kaa, bool * Mat, int * sou, int * sco, bool * vie, int dir, int * pt) {
 
  int i;
 
  int head; //point où le serpent est
 
  head=((kaa)->T[((kaa)->t+(kaa)->l-1)%(LED*LED)]);
 
 
 
//Gestion des murs
 
  
  if ((head%LED==0) && (dir==-1)) { //mur gauche
+
La partie électronique consiste en l'implantation d'un système alliant logique séquentielle et combinatoire sur un FPGA (carte "fille" de la Nanoboard).
    *vie=false;
+
Un FPGA est un ensemble de portes et de bascules logiques pouvant être connectée physiquement entres elles par programmation (ici nous avons utilisé le logiciel Altium Designer pour le schéma).
    printf("murg\n");}
 
  else if ((head<LED) && (dir==-LED)) { //mur haut
 
    *vie=false;printf("murh\n");}
 
  else if ((head>=(LED*(LED-1))) && (dir==+LED)) {//mur bas
 
    *vie=false;printf("murb\n");}
 
  else if ((head%LED==(LED-1)) && (dir==1)) { //mur droite
 
    *vie=false;printf("murd\n");}
 
  else if (head==*sou) { // gestion des kills
 
    printf("miam !\n");
 
    change(sou,pt, Mat);
 
      (*sco)++;
 
      (kaa)->l++;
 
      (kaa)->t--;
 
      if ((kaa)->t==-1) {
 
(kaa)->t=(LED*LED-1);
 
}
 
  }
 
  else {
 
    //se mange la queue
 
    head+=dir; //head = là ou le serpent va
 
    for (i=0;i<((kaa)->l);i++) {
 
      *vie= *vie && (head!=((kaa)->T[((kaa)->t+i)%(LED*LED)]));
 
    }
 
    if (!*vie) printf("canibale ! \n");
 
  }
 
}
 
// action d'initialisation
 
  
// initialise l'affichage, le snake et la cible
+
Afin de répondre au cahier des charges du Snake nous avons implanté 2 systèmes indépendants sur le même FPGA.
  
void init (bool * Mat, snake * kaa, int * dir, int * tar, int sl, int * pt) {
+
==> 1 – Réception et commande de la matrice
  int i;
 
  int c,e=1;
 
  printf("debut init\n");
 
  *dir = 1;
 
  *tar = 22;
 
  *pt = 1;
 
  (kaa)->l=1;
 
  (kaa)->t=0;
 
  (kaa)->T[0]=0;
 
  for (i=0;i<(LED*LED);i++) {
 
    Mat[i]=false;
 
   
 
  }
 
  Mat[0]=true;
 
  Mat[22]=true;
 
  
//on attend que tout les bouttons renvoient 0
+
le module de réception RS232 (fournit par les professeurs) stock dans un registre 8 bits parallèle le mot reçu par l’interface série et génère un bit de validation une fois l’octet entièrement reçu.
 
printf("ok, give me a 0 with the button\n");
 
  while (e!=0 && e!=128) {
 
    printf("0!=(%d)\n", e);
 
    usleep(PING_Draw);
 
    read(sl,&e,1);}
 
  
//on attend que l'utilisateur appuie sur une touche
+
Ce bit de validation permet d’incrémenter un compteur 3 bits qui va commander un démultiplexeur (3 vers 8 dont l’entrée est toujours à 1) afin de sélectionner (en écriture) tour à tour l’un des 8 registres correspondant aux 8 colonnes de la matrice et y stocké le mot courant. Ainsi le décalage se fait automatiquement et il n’y a pas de risque d’aller écrire au mauvais endroit.
 
 
printf("nice, now push the right button\n");
 
  c=e;
 
  while (e==c) {
 
    printf("0=(%d)\n", c);
 
    usleep(PING_Draw);
 
    read(sl,&c,1);}
 
}
 
  
 +
Pour l’affichage c’est le processus inverse. Pour aller relire les registres on utilise un compteur (3 bits toujours) qui commande un multiplexeur qui va venir récupérer l’octet enregistré dans l’un des 8 registres précédents. Ces données seront envoyées sur les lignes de la matrice de façon synchrone avec l’activation de la colonne correspondante. Pour l’activation des colonnes c’est encore une fois la combinaison d’un compteur et d’un démultiplexeur (dont l’entrée est toujours à 1) qui est utilisée. La combinaison des sorties des registres et l’activation des colonnes de façon synchrone constitue la commande de la matrice. Pour la partie synchrone on utilise une subdivision de l’horloge principale réglée à 500 Hz (minimum nécessaire pour jouer sur la persistance rétinienne)
  
 +
==> 2 – Emission du code des touches de la Nanoboard
  
//affichage de fin du jeu
+
On utilise ici un 2ème module fourni permettant  d’émettre sur le port RS232 dans la Nanoboard.
 +
Ce module a besoin qu’on lui précise le mot de 8 bits à envoyer, cette fonction est remplie par la combinaison des 4 premiers boutons sur le schéma correspondant aux codes « 1 », « 2 », « 4 » et « 8 ». Il a aussi besoin d’un bit pour valider l’envoi des donné, cette broche a donc été relié à une horloge réglée à 1Hz (par exemple) pour pouvoir envoyer le code « 0 » toute les secondes (cela permet  d’acquitter une phase de lecture dans la partie informatique).
  
void TheEnd (int se) {
+
Remarque : le 5ème bouton permet de remettre à zero en même temps tout les compteurs du montage.
  printf("fin du jeu\n");
 
  int smile;
 
  smile=255;write(se,&smile,1); //
 
  write(se,&smile,1);          //
 
  smile=102;write(se,&smile,1); // **  **
 
  write(se,&smile,1);          // **  ** 
 
  smile=0;write(se,&smile,1); //
 
  write(se,&smile,1);          //
 
  smile=60;write(se,&smile,1); //  **** 
 
  smile=0;write(se,&smile,1); //
 
}
 
  
  
// Fonctions d'affichage
+
==Explication de la partie Informatique.==
 +
La partie informatique s'articule autour de deux programmes en C. Un démon de gestion du port série et un programme principal : le jeu snake.
 +
Les deux programmes sont compilés sur la Foxboard qui est paramétré pour se lancer automatiquement à son démarrage.
  
void clear(int se)
+
==>1-Le démon de gestion du port série.
{
 
int i;
 
unsigned char c=0;
 
usleep(PING_Draw);
 
c=0x00;
 
  for (i=0;i<LED;i++)
 
{
 
    write(se,&c,1);
 
  }
 
 
}
 
  
int main ( )
+
Le démon est paramétré pour utiliser un port USB comme port série.
{
+
C'est lui gui gère l'envoi et la réception de donné de la Foxboard.
 
+
Les données transférées sont des caractères 8 bit.
  bool Matrice[64]; //vecteur de représentation de la matrice de led
 
  bool alive=true; // booleen de fin du jeu (mort du snake)
 
  snake  kaa; //kaa est le nom du serpent dans le livre de la jungle
 
  int direction; // +1 droite ; -1 gauche ; +8 bas ; -8 haut
 
  int mouse; //emplacement de la cible
 
  int etat; //etat de la cible
 
  int score=0; //score du joueur
 
 
 
// Affichage matrice
 
  
  int se=connexionServeur(SOCKET_ECRITURE);
+
En pratique ce démon est toujours lancé et il permet l'utilisation de fonction dans le programme principal qui a besoin de communiquer. Ils sont utilisé de la façon suivante :
  if(se<0){ fprintf(stderr,"Serveur serie (ecriture) absent\\n"); exit(-1); }
+
    #define SOCKET_ECRITURE "/tmp/serial.send"
  int sl=connexionServeur(SOCKET_LECTURE);
+
    #define SOCKET_LECTURE "/tmp/serial.recv"
  if(sl<0){ fprintf(stderr,"Serveur serie (electure) absent\\n"); exit(-1); }
+
    int se=connexionServeur(SOCKET_ECRITURE);
 +
    int sl=connexionServeur(SOCKET_LECTURE);
 +
    write(se,&col,1);
 +
    read(sl,&d,1);''
 +
En effet les fonctions read et write permettent d'envoyer et recevoir les données.
  
  init (Matrice,&kaa,&direction,&mouse, sl, &etat); //initialisation
+
==>2-Le programme principal : Snake.
 
direction=1;
 
  
 +
Ce programme s'occupe la gestion du jeu Snake. Il récupère la valeur des touches envoyée depuis la Nanoboard, puis il applique les modifications nécéssaires (mouvement du snake, mort du snake, apparition d'un objectif).
 +
Une fois les modifications effectuées il envoi à la Nanoboard les nouvelles valeurs des LEDs pour un rafraichissement de l'image.
 +
Nous avons accordé une attention particulière aux performances pour un jeu fluide.
  
//début de la boucle de jeu
+
Voici la boucle principale qui résume les actions effectué par ce programme :
 
+
    while (alive) {
while (alive) {
+
     lire(&direction, sl); //lecture des touches
     lire(&direction, sl); //lecture
+
     checkNext (&kaa,Matrice,&mouse,&score,&alive,direction,&etat); //analyse du coup suivant
     checkNext (&kaa,Matrice,&mouse,&score,&alive,direction,&etat);   //analyse du coup suivant
 
 
     move (&kaa,Matrice,direction); //mouvement
 
     move (&kaa,Matrice,direction); //mouvement
 
     draw(Matrice, se); //affichage
 
     draw(Matrice, se); //affichage
  }
+
    }
  TheEnd(se);
 
  close(se);
 
  close(sl); 
 
  return 0;
 
}
 
 
 
----
 
 
 
----
 
 
 
----
 
 
 
----
 
 
 
----
 
 
 
==> Partie Électronique
 
La partie Informatique étant fini, nous sommes tous retournés sur altium pour terminer le schéma et le compiler sur la nanoBoard
 
 
 
A la fin de la séance, le schéma marchait, et ressemblait à ceci:
 
 
 
[[Fichier:sch.pdf]]
 
 
 
 
 
Suite à cela , nous avions besoin de câbler la matrice de LEDs en suivant son schéma
 
[http://www.sparkfun.com/datasheets/Components/rgbmatrixbackpack_userguide.pdf]
 
 
 
[[Fichier:Matrice-cablee.jpg]]
 
 
 
 
 
==> Réunion des deux parties
 
 
 
======>Configuration de la Foxboard
 
 
 
Dans la Foxboard, il faut changer les paramêtres de l'interface afin de pouvoir se connecter et travailler en SSH.
 
 
 
AVANT MODIFICATIONS
 
                  auto eth0
 
                    iface eth0 inet static
 
                    address 172.26.79.X
 
                    netmask 255.255.255.0
 
                    gateway 172.26.79.254
 
                    dns-nameservers 193.48.57.34
 
APRES MODIFICATIONS
 
                  auto eth0
 
                    iface eth0 inet static
 
                    address 172.26.79.07
 
                    netmask 255.255.255.0
 
                    gateway 172.26.79.254
 
                    dns-nameservers 193.48.57.34
 
 
 
Par la suite, il faut donc se connecter en SSH sur la foxboard ( commande: ssh 172.26.79.07) et copier le programme dans la mémoire du petit appareil et compiler le programme.
 
 
 
======>Initialisation du port émission RS 232
 
  
[[Fichier:Port-emission2.jpg]]
+
Ainsi la Foxboard s'occupe de la gestion du jeu en communiquant avec la Nanoboard via le port série.
 
+
''Pour plus de détails se rapporter au programme en lui même qui comporte de nombreux commentaires.''
A défaut de pouvoir mettre en place le protocole d'émission par nous même, nous avons utilisé un bloc fait par un des professeurs
 
Ce bloc a pour but d'activié le port RS 232 de la NanoBoard afin de pouvoir brancher la Foxboard. En clair, ce bloc est le passage de la frontière entre le programme informatique C et la partie électronique active sur la NanoBoard.
 
  
 
==Conclusion==
 
==Conclusion==
Ligne 498 : Ligne 195 :
 
La partie électronique s'est axé autour du logiciel Altium et la Nanoboard.Après des essais théorique fructueux et des essais sur matrice encourageantes, nous avons décidé de reformer le trinôme afin de compléter la partie informatique.
 
La partie électronique s'est axé autour du logiciel Altium et la Nanoboard.Après des essais théorique fructueux et des essais sur matrice encourageantes, nous avons décidé de reformer le trinôme afin de compléter la partie informatique.
 
La partie informatique a été très rapide au niveau du codage du jeu. Après avoir réussi à configurer le daemon et la FoxBoard, nous avons pu voir le jeu fonctionner sous maquette Arduino.
 
La partie informatique a été très rapide au niveau du codage du jeu. Après avoir réussi à configurer le daemon et la FoxBoard, nous avons pu voir le jeu fonctionner sous maquette Arduino.
 +
Après quelques essais et grâce à beaucoup de détermination, nous avons finalement pu faire revivre cet ancien jeu sous FoxBoard et Nano Board.
 +
Voici la vidéo de notre projet:
 +
[http://www.youtube.com/watch?v=QqWzlZIqClw&feature=youtu.be]
 +
Et le lien de l'upload
 +
[http://ul.to/wg3i1oyu]

Version actuelle datée du 26 juin 2013 à 12:25

Evaluation informatique et électronique

Gestion de projet / rédaction Wiki

Rédaction de la page Wiki correcte. Des éléments de gestion de projet donnés dans le Wiki. La gestion de projet en elle même est très satisfaisante puisque que le projet a abouti. Notons enfin l'excellente vidéo qui résume parfaitement le projet. Note 100%.

Test fonctionnels

  • Sous-système informatique : Le système de gestion de matrice de LED est un succès (voir vidéo, un petit souci d'affichage via la NanoBoard), interconnexion FoxBoard / NanoBoard effectuée. Note 120%.
  • Sous-système électronique : Le système demandé a été correctement réalisé et un deuxième sous-système a été intégré (lecture des boutons). Très bon travail. Note 120%.
  • Système : Un système a été réalisé en l'espèce d'un jeu de type "snake" (voir vidéo). Note 100%.

Qualité de la réalisation

  • Informatique. Note 97%.
    • procédure de test : Un README en anglais (ou presque). Test sur le banc d'essai par les élèves OK. Test par l'enseignant OK, quelques difficultés pour obtenir un contexte permettant le bon fonctionnement. Note en l'état 100%.
    • pages HTML et Javascript : Non applicable.
    • scripts PHP ou programmes C : Un vrai code C, structuré en fonctions, des commentaires. On note cependant du code mort et un formattage un peu limite. Note 90%.
    • installation sur FoxBoard : Les exécutables y sont, tentative de démarrage automatique. Note 100%.
  • Electronique : Note 99%.
    • qualité de la réalisation : la conception du schéma électrique est claire. les explications fournies dans le wiki sont globalement satisfaisantes. Note 98%.
    • tests autonomes : implémentation du circuit sur la nanoboard fonctionnelle. Note 100%.

Bilan

Note finale : 130% => 20/20.

Mise en place du jeu SNAKE sur une matrice de LEDs

Introduction

Dans l'optique du projet systèmes communicants, nous avons choisi de mettre en place l'antique (mais non dépassé) jeu SNAKE et de l'appliquer sur les matrices de LEDs fournies. Il est intéressant de rappeler que ce jeu a été vu pour la première fois en 1970 et est devenu populaire pour sa simplicité et sa disponibilité sur tout type de plate-formes. Pour le projet, nous avons donc décidé de réaliser ce jeu entièrement grâce au langage informatique C et les outils électronique de base. Il est évident que deux parties se détachent dans la réalisation de ce projet. Dans ce compte rendu, nous allons vous montrer l'évolution en parallèle de la partie informatique et de la partie électronique. Enfin, nous mettrons en avant la réunion des deux parties pour former le jeu.

Développement par séances

Séance 1 20/04/2012

Après avoir choisi le sujet de notre projet, il a été clair qu'un cahier des charges devait être mis sur papier. Nous avons décidé que :

  • l'utilisateur aura 4 boutons pour diriger le serpent.
  • deux afficheurs 7 segments présenteront le score.
  • pour la matrice de LEDs, 8 mots de 8 bits seront envoyés ainsi qu'un bit d'écriture
  • Un bouton reset sera mis en place pour rafraîchir la matrice avant le début du jeu.


Ensuite,nous avons scindé notre trinôme en deux. Le premier groupe est parti sur le logiciel de conception assisté de circuit électronique afin de concevoir le contrôle de la matrice LEDs. Le second groupe a pris en main la maquette de matrice LEDs et esquissé une interface web de contrôle d'allumage. A la fin de la séance, le groupe s'est remis ensemble pour la mise en commun des idées. Au final, au niveau électronique,un circuit basé sur nos expériences en microprocesseur a été édité et sera testé à la prochaine séance. Au niveau informatique, la maquette de LEDs a été pleinement comprise et la programmation du jeu en langage C est prévue pour la séance prochaine.

==>Prévisions pour la séance du 11/05/2012

  • Programmation du jeu SNAKE
  • Test du circuit électronique
  • Recherche sur la transmission des données
  • Mise en place du tableau des scores du jeu
  • Ajouter des points au cahier des charges


Séance 2 11/05/2012

Avant la séance, en travail personnel, l’algorithme du jeu Snake a été entièrement écrit et est fonctionnel pour jouer dans un terminal. L'objectif de la séance est donc d'adapter cet algorithme à notre projet. Le groupe est tout d'abord resté en partie informatique pour mettre au point le jeu du point de vue strictement informatique. Nous avons adapté notre programme afin d'utiliser la maquette arduino donnée par le professeur. Après avoir ébauché les grandes lignes du jeu, le trinôme s'est encore scindé pour pouvoir compléter la partie électronique. Rappelons que le schéma altium avait été déjà testé avec l'oscilloscope et qu il fonctionnait. Il restait donc normalement qu'à câbler une matrice de LEDs. En pratique,le schéma se révéla incomplet.Nous dûmes donc l'améliorer pour qu'il prenne en compte l'affichage croissant des colonnes.


Séance 3 21/05/2012


==> Partie Informatique

Le code du Jeu est enfin terminé. Dés l'or que l'on compile, un message apparait obligeant l'utilisateur à appuyer sur une touche pour démarrer. Ensuite,les touches directionnelles dirigent le serpent vers la direction choisi. Le jeu se termine quand le serpent se mort la queue ou lorsque le serpent atteint les zones limites.

Media:snake.c.txt

==> Partie Électronique La partie Informatique étant fini, nous sommes tous retournés sur altium pour terminer le schéma et le compiler sur la nanoBoard. A la fin de la séance, le schéma marchait, et ressemblait à ceci:

Media:sch.pdf

Nous avons donc fait quelques tests supplémentaires sur oscilloscope pour vérifier que les sorties répondait correctement à nos attentes.

Suite à cela , nous avions besoin de câbler la matrice de LEDs en suivant son schéma

[1]

Matrice-cablee.jpg


==> Réunion des deux parties

======>Configuration de la Foxboard

Dans la Foxboard, il faut changer les paramêtres de l'interface afin de pouvoir se connecter et travailler en SSH.

AVANT MODIFICATIONS

                  auto eth0
                    iface eth0 inet static
                    address 172.26.79.X
                    netmask 255.255.255.0
                    gateway 172.26.79.254
                    dns-nameservers 193.48.57.34

APRES MODIFICATIONS

                  auto eth0
                    iface eth0 inet static
                    address 172.26.79.07
                    netmask 255.255.255.0
                    gateway 172.26.79.254
                    dns-nameservers 193.48.57.34

Par la suite, il faut donc se connecter en SSH sur la foxboard ( commande: ssh 172.26.79.07) et copier le programme dans la mémoire du petit appareil et compiler le programme(scp -r snake.c root@172.26.79.07:/root/rep/).

======>Initialisation du port émission RS 232

Port-emission2.jpg

A défaut de pouvoir mettre en place le protocole d'émission par nous même, nous avons utilisé un bloc fait par un des professeurs Ce bloc a pour but d'activié le port RS 232 de la NanoBoard afin de pouvoir brancher la Foxboard. En clair, ce bloc est le passage de la frontière entre le programme informatique C et la partie électronique active sur la NanoBoard.

Explication de la partie Electronique

Fichier:Sch.pdf

SCH2.png

Dans cette partie nous allons détailler, la partie électronique compilé sur la NanoBoard.

La partie électronique consiste en l'implantation d'un système alliant logique séquentielle et combinatoire sur un FPGA (carte "fille" de la Nanoboard). Un FPGA est un ensemble de portes et de bascules logiques pouvant être connectée physiquement entres elles par programmation (ici nous avons utilisé le logiciel Altium Designer pour le schéma).

Afin de répondre au cahier des charges du Snake nous avons implanté 2 systèmes indépendants sur le même FPGA.

==> 1 – Réception et commande de la matrice

le module de réception RS232 (fournit par les professeurs) stock dans un registre 8 bits parallèle le mot reçu par l’interface série et génère un bit de validation une fois l’octet entièrement reçu.

Ce bit de validation permet d’incrémenter un compteur 3 bits qui va commander un démultiplexeur (3 vers 8 dont l’entrée est toujours à 1) afin de sélectionner (en écriture) tour à tour l’un des 8 registres correspondant aux 8 colonnes de la matrice et y stocké le mot courant. Ainsi le décalage se fait automatiquement et il n’y a pas de risque d’aller écrire au mauvais endroit.

Pour l’affichage c’est le processus inverse. Pour aller relire les registres on utilise un compteur (3 bits toujours) qui commande un multiplexeur qui va venir récupérer l’octet enregistré dans l’un des 8 registres précédents. Ces données seront envoyées sur les lignes de la matrice de façon synchrone avec l’activation de la colonne correspondante. Pour l’activation des colonnes c’est encore une fois la combinaison d’un compteur et d’un démultiplexeur (dont l’entrée est toujours à 1) qui est utilisée. La combinaison des sorties des registres et l’activation des colonnes de façon synchrone constitue la commande de la matrice. Pour la partie synchrone on utilise une subdivision de l’horloge principale réglée à 500 Hz (minimum nécessaire pour jouer sur la persistance rétinienne)

==> 2 – Emission du code des touches de la Nanoboard

On utilise ici un 2ème module fourni permettant d’émettre sur le port RS232 dans la Nanoboard. Ce module a besoin qu’on lui précise le mot de 8 bits à envoyer, cette fonction est remplie par la combinaison des 4 premiers boutons sur le schéma correspondant aux codes « 1 », « 2 », « 4 » et « 8 ». Il a aussi besoin d’un bit pour valider l’envoi des donné, cette broche a donc été relié à une horloge réglée à 1Hz (par exemple) pour pouvoir envoyer le code « 0 » toute les secondes (cela permet d’acquitter une phase de lecture dans la partie informatique).

Remarque : le 5ème bouton permet de remettre à zero en même temps tout les compteurs du montage.


Explication de la partie Informatique.

La partie informatique s'articule autour de deux programmes en C. Un démon de gestion du port série et un programme principal : le jeu snake. Les deux programmes sont compilés sur la Foxboard qui est paramétré pour se lancer automatiquement à son démarrage.

==>1-Le démon de gestion du port série.

Le démon est paramétré pour utiliser un port USB comme port série. C'est lui gui gère l'envoi et la réception de donné de la Foxboard. Les données transférées sont des caractères 8 bit.

En pratique ce démon est toujours lancé et il permet l'utilisation de fonction dans le programme principal qui a besoin de communiquer. Ils sont utilisé de la façon suivante :

   #define SOCKET_ECRITURE "/tmp/serial.send"
   #define SOCKET_LECTURE "/tmp/serial.recv"
   int se=connexionServeur(SOCKET_ECRITURE);
   int sl=connexionServeur(SOCKET_LECTURE);
   write(se,&col,1);
   read(sl,&d,1);

En effet les fonctions read et write permettent d'envoyer et recevoir les données.

==>2-Le programme principal : Snake.

Ce programme s'occupe la gestion du jeu Snake. Il récupère la valeur des touches envoyée depuis la Nanoboard, puis il applique les modifications nécéssaires (mouvement du snake, mort du snake, apparition d'un objectif). Une fois les modifications effectuées il envoi à la Nanoboard les nouvelles valeurs des LEDs pour un rafraichissement de l'image. Nous avons accordé une attention particulière aux performances pour un jeu fluide.

Voici la boucle principale qui résume les actions effectué par ce programme :

   while (alive) {
   lire(&direction, sl); //lecture des touches
   checkNext (&kaa,Matrice,&mouse,&score,&alive,direction,&etat); //analyse du coup suivant
   move (&kaa,Matrice,direction); //mouvement
   draw(Matrice, se); //affichage
   }

Ainsi la Foxboard s'occupe de la gestion du jeu en communiquant avec la Nanoboard via le port série. Pour plus de détails se rapporter au programme en lui même qui comporte de nombreux commentaires.

Conclusion

Le système que nous avons choisi est le mythique jeu Snake.Nous avons spliter le sujet en deux parties, l'une informatique et l'autre électronique. La partie électronique s'est axé autour du logiciel Altium et la Nanoboard.Après des essais théorique fructueux et des essais sur matrice encourageantes, nous avons décidé de reformer le trinôme afin de compléter la partie informatique. La partie informatique a été très rapide au niveau du codage du jeu. Après avoir réussi à configurer le daemon et la FoxBoard, nous avons pu voir le jeu fonctionner sous maquette Arduino. Après quelques essais et grâce à beaucoup de détermination, nous avons finalement pu faire revivre cet ancien jeu sous FoxBoard et Nano Board. Voici la vidéo de notre projet: [2] Et le lien de l'upload [3]