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

De Wiki de Projets IMA
Ligne 59 : Ligne 59 :
 
----
 
----
  
#define LED (8)
+
#define LED (8)
#include <stdlib.h>
+
#include <stdlib.h>
#include <stdbool.h>
+
#include <stdbool.h>
#include <stdio.h>
+
#include <stdio.h>
#include <unistd.h>
+
#include <unistd.h>
#include <sys/types.h>
+
#include <sys/types.h>
#include <sys/socket.h>
+
#include <sys/socket.h>
#include <sys/un.h>
+
#include <sys/un.h>
  
 
// Init Serie
 
// Init Serie
Ligne 79 : Ligne 79 :
 
/* Creation d'un client socket famille Unix */
 
/* Creation d'un client socket famille Unix */
  
int connexionServeur(char *chemin){
+
int connexionServeur(char *chemin){
  
 
  int ds;                        /* Descripteur de SOCKET */
 
  int ds;                        /* Descripteur de SOCKET */
Ligne 86 : Ligne 86 :
  
 
  int statut;                    /* Stocke le statut des  
 
  int statut;                    /* Stocke le statut des  
commandes */
+
commandes */
  
 
/* Creation de la SOCKET du client */
 
/* Creation de la SOCKET du client */
  
ds=socket(AF_UNIX,SOCK_STREAM,0);
+
ds=socket(AF_UNIX,SOCK_STREAM,0);
  
if(ds<0) {perror("connexionServeur.socket"); exit(-1);}
+
if(ds<0) {perror("connexionServeur.socket");  
 +
 
 +
exit(-1);}
  
 
/* Preparation de la structure adresse du serveur */
 
/* Preparation de la structure adresse du serveur */
Ligne 101 : Ligne 103 :
  
 
/* Connexion au serveur */
 
/* Connexion au serveur */
  statut=connect(ds,(struct sockaddr *)&adresse,sizeof        adresse);
+
  statut=connect(ds,(struct sockaddr*)&adresse,sizeofdresse)
  if(statut<0) {perror("connexionServeur.bind"); exit(-1);}
+
  if(statut<0)
 +
 
 +
{perror("connexionServeur.bind");  
 +
 
 +
exit(-1);}
  
 
  printf("ds=%d\n",ds);
 
  printf("ds=%d\n",ds);
return ds;
+
 
}
+
return ds;
 +
}
  
 
// Structures
 
// Structures
 
//structure du snake.
 
//structure du snake.
 +
 
//On utilise un tableau qui memorise la coordonnee de chaque partie 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.
+
//Les valeurs des coordonnees se deplacent cicliquement dans le tableau pour n'avoir qu'a faire une unique affectation par deplacement.
typedef struct {
+
typedef struct {
     int t; //numéro de la queue (tail) dans le tableau
+
     int t; //numéro de la queue (tail) dans le tableau
 
     int l; //taille du snake  (length)
 
     int l; //taille du snake  (length)
 
     int T[LED*LED]; //tableau de position du corp
 
     int T[LED*LED]; //tableau de position du corp
   } snake;
+
   }  
 +
snake;
  
  
// fonction de lecture d'entrée \\
+
// 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  
+
//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é
// seulement si une touche est appuyé
+
 
void lire (int * dir,int sl) {
+
void lire (int * dir,int sl) {
 
   printf("debut lecture\n");
 
   printf("debut lecture\n");
 
   int c;
 
   int c;
Ligne 132 : Ligne 141 :
 
   usleep(PING_Read); //attente pour eviter les conflits lecture/ecriture
 
   usleep(PING_Read); //attente pour eviter les conflits lecture/ecriture
  
   //cette boucle a pour but de faire un nombre de lecture eleve
+
   //cette boucle a pour but de faire un nombre de lecture eleveet de memoriser dans c les valeurs ssi elles ne sont pas =0
  //et de memoriser dans c les valeurs ssi elles ne sont pas =0
 
 
   for(k=0;k<30;k++) {  
 
   for(k=0;k<30;k++) {  
 
     read(sl,&d,1);
 
     read(sl,&d,1);
Ligne 145 : Ligne 153 :
 
   if (c==8 || c==136) *dir=-1; //gauche
 
   if (c==8 || c==136) *dir=-1; //gauche
 
   if (c==1 || c==129) *dir=1; //droite
 
   if (c==1 || c==129) *dir=1; //droite
}
+
}
  
  
 
//genere intelligemment  une nouvelle cible
 
//genere intelligemment  une nouvelle cible
void change(int * sou, int * pt, bool * Mat) {
+
 +
void change(int * sou, int * pt, bool * Mat) {
 
   int i;
 
   int i;
 
   if (*pt==1) {
 
   if (*pt==1) {
Ligne 160 : Ligne 169 :
 
   *sou=i;
 
   *sou=i;
 
   Mat[i]=true;
 
   Mat[i]=true;
}  
+
}  
  
  
 
// envoi la matrice a afficher
 
// envoi la matrice a afficher
void draw (bool * Mat, int se) {
+
 +
void draw (bool * Mat, int se) {
 
   int i,j,k;
 
   int i,j,k;
 
   int col=0;
 
   int col=0;
Ligne 189 : Ligne 199 :
  
 
//calcul de la valeur a envoyer
 
//calcul de la valeur a envoyer
 +
 
// remarque : la notation x^y ne compile pas
 
// remarque : la notation x^y ne compile pas
cur=2;
+
 
puiss=7-j;
+
cur=2;
for (k=0;k<puiss;k++) cur=cur*2;
+
puiss=7-j;
col = col + cur;
+
for (k=0;k<puiss;k++) cur=cur*2;
 +
col = col + cur;
 
       }
 
       }
 
     }
 
     }
Ligne 207 : Ligne 219 :
 
     for (j=0;j<LED;j++) {
 
     for (j=0;j<LED;j++) {
 
       if (Mat[(i/2)*LED+j]) {
 
       if (Mat[(i/2)*LED+j]) {
write(se,&LedOn,1);
+
write(se,&LedOn,1);
write(se,&LedOn,1);
+
write(se,&LedOn,1);
cpt = cpt +2;
+
cpt = cpt +2;
 
       }
 
       }
 
       else { write(se,&LedOff,1);
 
       else { write(se,&LedOff,1);
Ligne 223 : Ligne 235 :
  
  
// déplacement du serpent \\
+
// déplacement du serpent \\
// déplace le serpent d'un cran
+
 
void move (snake * kaa, bool * Mat, int  dir) {
+
// déplace le serpent d'un cran
 +
 
 +
void move (snake * kaa, bool * Mat, int  dir) {
 
   int tail = kaa->t;
 
   int tail = kaa->t;
 
   int length = kaa->l;
 
   int length = kaa->l;
Ligne 252 : Ligne 266 :
 
}
 
}
  
//vérifie les positions pour le coup prochain
+
//vérifie les positions pour le coup prochain
 +
 
 
//mort ; mange ; rien
 
//mort ; mange ; rien
void checkNext (snake *  kaa, bool * Mat, int * sou, int * sco, bool * vie, int dir, int * pt) {  
+
void checkNext (snake *  kaa, bool * Mat, int * sou, int * sco, bool * vie, int dir, int * pt) {  
 
   int i;
 
   int i;
 
   int head; //point où le serpent est
 
   int head; //point où le serpent est
 
   head=((kaa)->T[((kaa)->t+(kaa)->l-1)%(LED*LED)]);
 
   head=((kaa)->T[((kaa)->t+(kaa)->l-1)%(LED*LED)]);
 
    
 
    
  //Gestion des murs  
+
//Gestion des murs  
 +
 
 
   if ((head%LED==0) && (dir==-1)) { //mur gauche
 
   if ((head%LED==0) && (dir==-1)) { //mur gauche
 
     *vie=false;
 
     *vie=false;
Ligne 265 : Ligne 281 :
 
   else if ((head<LED) && (dir==-LED)) { //mur haut
 
   else if ((head<LED) && (dir==-LED)) { //mur haut
 
     *vie=false;printf("murh\n");}
 
     *vie=false;printf("murh\n");}
   else if ((head>=(LED*(LED-1))) && (dir==+LED)) { //mur bas
+
   else if ((head>=(LED*(LED-1))) && (dir==+LED)) {//mur bas
 
     *vie=false;printf("murb\n");}
 
     *vie=false;printf("murb\n");}
 
   else if ((head%LED==(LED-1)) && (dir==1)) { //mur droite
 
   else if ((head%LED==(LED-1)) && (dir==1)) { //mur droite
Ligne 276 : Ligne 292 :
 
       (kaa)->t--;
 
       (kaa)->t--;
 
       if ((kaa)->t==-1) {
 
       if ((kaa)->t==-1) {
  (kaa)->t=(LED*LED-1);
+
(kaa)->t=(LED*LED-1);
 
}
 
}
 
   }
 
   }
Ligne 287 : Ligne 303 :
 
     if (!*vie) printf("canibale ! \n");
 
     if (!*vie) printf("canibale ! \n");
 
   }
 
   }
}  
+
}  
  // action d'initialisation
+
// action d'initialisation
  // initialise l'affichage, le snake et la cible
+
 
void init (bool * Mat, snake * kaa, int * dir, int * tar, int sl, int * pt) {
+
// initialise l'affichage, le snake et la cible
 +
 
 +
void init (bool * Mat, snake * kaa, int * dir, int * tar, int sl, int * pt) {
 
   int i;
 
   int i;
 
   int c,e=1;
 
   int c,e=1;
Ligne 307 : Ligne 325 :
 
   Mat[22]=true;
 
   Mat[22]=true;
  
  //on attend que tout les bouttons renvoient 0
+
//on attend que tout les bouttons renvoient 0
  printf("ok, give me a 0 with the button\n");
+
 +
printf("ok, give me a 0 with the button\n");
 
   while (e!=0 && e!=128) {
 
   while (e!=0 && e!=128) {
 
     printf("0!=(%d)\n", e);
 
     printf("0!=(%d)\n", e);
Ligne 314 : Ligne 333 :
 
     read(sl,&e,1);}
 
     read(sl,&e,1);}
  
  //on attend que l'utilisateur appuie sur une touche
+
//on attend que l'utilisateur appuie sur une touche
   printf("nice, now push the right button\n");
+
    
 +
printf("nice, now push the right button\n");
 
   c=e;
 
   c=e;
 
   while (e==c) {
 
   while (e==c) {
Ligne 326 : Ligne 346 :
  
 
//affichage de fin du jeu
 
//affichage de fin du jeu
void TheEnd (int se) {
+
 
 +
void TheEnd (int se) {
 
   printf("fin du jeu\n");
 
   printf("fin du jeu\n");
 
   int smile;
 
   int smile;
Ligne 342 : Ligne 363 :
 
// Fonctions d'affichage
 
// Fonctions d'affichage
  
void clear(int se)
+
void clear(int se)
{
+
{
int i;
+
int i;
unsigned char c=0;
+
unsigned char c=0;
usleep(PING_Draw);
+
usleep(PING_Draw);
c=0x00;
+
c=0x00;
for (i=0;i<LED;i++)  
+
  for (i=0;i<LED;i++)  
{
+
{
  write(se,&c,1);
+
    write(se,&c,1);
 +
  }
 +
 
  }
 
  }
 
}
 
  
int main ( )
+
int main ( )
{
+
{
 
    
 
    
 
   bool Matrice[64]; //vecteur de représentation de la matrice de led
 
   bool Matrice[64]; //vecteur de représentation de la matrice de led
Ligne 366 : Ligne 387 :
 
   int score=0; //score du joueur
 
   int score=0; //score du joueur
 
    
 
    
  // Affichage matrice
+
// Affichage matrice
 +
 
 
   int se=connexionServeur(SOCKET_ECRITURE);
 
   int se=connexionServeur(SOCKET_ECRITURE);
 
   if(se<0){ fprintf(stderr,"Serveur serie (ecriture) absent\\n"); exit(-1); }
 
   if(se<0){ fprintf(stderr,"Serveur serie (ecriture) absent\\n"); exit(-1); }
Ligne 373 : Ligne 395 :
  
 
   init (Matrice,&kaa,&direction,&mouse, sl, &etat); //initialisation  
 
   init (Matrice,&kaa,&direction,&mouse, sl, &etat); //initialisation  
  direction=1;
+
 +
direction=1;
  
  
  //début de la boucle de jeu
+
//début de la boucle de jeu
   while (alive) {
+
    
 +
while (alive) {
 
     lire(&direction, sl); //lecture
 
     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
Ligne 387 : Ligne 411 :
 
   close(sl);   
 
   close(sl);   
 
   return 0;
 
   return 0;
}
+
}
  
 
----
 
----

Version du 24 mai 2012 à 15:34

Mise en place du jeu SNAKE sur une matrice de LEDs Chalaux,Rodriguez,Vincenti

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. 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
  • ......

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. 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, 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.

==>Prévision 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

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. 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






#define LED (8)
#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

/* Quelques constantes */

#define SOCKET_ECRITURE "/tmp/serial.send"
#define SOCKET_LECTURE "/tmp/serial.recv"
#define PING_Draw 300000
#define PING_Read 300000

/* Creation d'un client socket famille Unix */

int connexionServeur(char *chemin){
int ds;                         /* Descripteur de SOCKET */
struct sockaddr_un adresse;     /* Adresse du serveur */
int statut;                     /* Stocke le statut des 
commandes */

/* Creation de la SOCKET du client */

ds=socket(AF_UNIX,SOCK_STREAM,0);
if(ds<0) {perror("connexionServeur.socket"); 
exit(-1);}

/* 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

//mort ; mange ; rien

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
   *vie=false;
   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

void init (bool * Mat, snake * kaa, int * dir, int * tar, int sl, int * pt) {
 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

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

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);}

}


//affichage de fin du jeu

void TheEnd (int se) {
 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

void clear(int se)
{
int i;
unsigned char c=0;
usleep(PING_Draw);
c=0x00;
 for (i=0;i<LED;i++) 
{
   write(se,&c,1);
 }

}
int main ( )
{
 
 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);
 if(se<0){ fprintf(stderr,"Serveur serie (ecriture) absent\\n"); exit(-1); }
 int sl=connexionServeur(SOCKET_LECTURE);
 if(sl<0){ fprintf(stderr,"Serveur serie (electure) absent\\n"); exit(-1); }
 init (Matrice,&kaa,&direction,&mouse, sl, &etat); //initialisation 

direction=1;


//début de la boucle de jeu

while (alive) {
   lire(&direction, sl); //lecture
   checkNext (&kaa,Matrice,&mouse,&score,&alive,direction,&etat);    //analyse du coup suivant
   move (&kaa,Matrice,direction); //mouvement
   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:

SCHEMA here


Suite à cela , nous avion besoin de câbler la matrice de LEDs en suivant le schéma de cette dernière [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.

======>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.