ENIB 2022 - groupe C : Snarkade

De Les Fabriques du Ponant
Aller à : navigation, rechercher
Boite snarkade.jpg

Que fait ce projet ?

Tentative de création d'une petite borne d'arcade avec le jeu Snake.

Étant donné que les matrices de LED utilisées pour le projet ne marche qu'à moitié, le projet n'a pas pu être terminé.

Liste des composants

  • 4 matrices de LED 8x8 1088AS
  • 6 boutons
  • 1 interrupteur
  • 1 Arduino Nano
  • Pleins de cables

Schéma électronique

Schéma électronique snarkade.jpg

Code

Programme principal


Nous allons utiliser le module vector afin de rassembler les éléments du serpent, le module snake que nous avons fait, et le module ledcontrol afin de gérer plus facilement les matrices de led.
#include <Vector.h>
#include "snake.h"
#include "LedControl.h"


snake::snake(int l = 1, char dir ='r' , Vector<int> initial_pos ={}):
lenght(l),direction(dir)
{
  initial_pos.push_back(8);
  initial_pos.push_back(8);
  body.push_back(initial_pos);
};
//pin 2 pour gauche, pin 3 pour bas, pin 4 pour haut et pin 5 pour droite
void snake::change_direction(){
  if(digitalRead(2) == true){
    direction = 'l';
  }else{if(digitalRead(3) == true){
    direction = 'd';
  }else{if(digitalRead(4) == true){
    direction = 'u';
  }else{if(digitalRead(5) == true){
    direction = 'r';}}}
  }
};


void snake::grow(){        //la fonction qui fait grandir le serpent
  lenght += 1;
  Vector<int> v;
  switch(direction)
  {
    case 'u':
    v.push_back(body[0][0]);
    v.push_back(body[0][1] + 1);
    body.push_back(v);
    break;

    case 'd':
    v.push_back(body[0][0]);
    v.push_back(body[0][1] - 1);
    body.push_back(v);
    break;

    case 'r':
    v.push_back(body[0][0] + 1);
    v.push_back(body[0][1]);
    body.push_back(v);
    break;

    case 'l':
    v.push_back(body[0][0] - 1);
    v.push_back(body[0][1]);
    body.push_back(v);
    break;
  }
  v.clear();
};

void snake::move(){              //déplacement du serpent
  Vector<int> v;
  Vector<Vector<int>> b;
  for(long unsigned int a = 1; a < body.size() - 1; a++){
    b.push_back(body[a]);
  }
  switch(direction)
  {
    case 'u':
    v.push_back(body[0][0]);
    v.push_back(body[0][1] + 1);
    b.push_back(v);
    break;

    case 'd':
    v.push_back(body[0][0]);
    v.push_back(body[0][1] - 1);
    b.push_back(v);
    break;

    case 'r':
    v.push_back(body[0][0] + 1);
    v.push_back(body[0][1]);
    b.push_back(v);
    break;

    case 'l':
    v.push_back(body[0][0] - 1);
    v.push_back(body[0][1]);
    b.push_back(v);
    break;
  }
  body.clear();
  body = b;
  v.clear();
};

void snake::death(){           
  alive = false;
};

bool snake::getAlive(){              les gets pour récupérer les informations du serpent.
  return alive;
}

char snake::getDirection(){
  return direction;
}

Vector<Vector<int>> snake::getBody(){
  return body;
}

void snake::setAlive(bool status){
  alive = status;
}

int snake::getLenght(){
  return body.size();
}

//Début de la partie d'affichage.

LedControl lc1=LedControl(12,11,10,2);     //Création des séries de matrices, 12 11 10 sont les pin pour Din, CLK, CS, et 2 pour le nombres de matrices branchées dans la série.
LedControl lc2=LedControl(9,8,7,2);        
int longueur;
int ligne;
int colonne;
int adresse;

void affichageSerpent(){                                //affichage du serpent, nous effaçons toute la grille, puis nous reparcouron tout le serpent pour en afficher les éléments.
  Vector<Vector<int>> corps = snake1.getBody();

  longueur = corps.size();

  //[0] = x
  //[1] = y
  int x,y;

  for(int i = 0; longueur; i++){
    while(corps[i][0]>15){                       //Pour chaque section, on récupère l'adresse, si elle dépasse 15 elle est en dehors, nous le faisons donc revenir de l'autre côté
      x = corps[i][0]-16;
    }

    while(corps[i][1]>7){                           
      y = corps[i][1]-16;
    }

    if(x>7){                                  //Selon la position il va s'afficher sur tel ou tel matrice
      adresse=1;
    }
    else {
      adresse=0;
    }

    if(y>7){
      y-=8;                                    //selon la hauteur, il va s'afficher sur sur la première ou la seconde série de led.
      lc2.setLed(adresse,y,x,1);
    }

    else{
      lc1.setLed(adresse,y,x,1);
    }
  }
}

////////////////////////////////////////////////////////////////
/*int boutons = {2,3,4,5};
bool buttons = {false,false,false,false};
snake snake1;

void traitement_bouton(){
for(int h=0,h<4,h++){
  int z = digitalRead(boutons[h]);
  if(z==1){buttons[h]=true;}
  else if(z==0){buttons[h]=false;}
}*/

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);

  lc1.shutdown(0,false);
  lc1.shutdown(1,false);
  lc1.setIntensity(0,8);
  lc1.setIntensity(1,8);
}

void loop() {
  lc1.setLed(1,5,5,1);
  delay(500);
  lc1.setLed(1,5,5,0);
  delay(500);

  if(digitalRead(5) == 1){
    Serial.print("yay");
  }

  //affichageSerpent(snake1);
  //snake1.move();
}

Module

#ifndef SNAKE_H
#define SNAKE_H
#include <Vector.h>

class snake{

  private:
  int lenght;
  char direction;
  Vector<Vector<int>> body;//de taille 1 à l'initialisation (c-a-d il n'y a qye la tete)
  bool alive;

  public:
  snake(int l = 1,char dir ='r', Vector<int> initial_pos = {});
  void change_direction();
  void grow();
  void move();
  void death();
  bool getAlive();
  char getDirection();
  Vector<Vector<int>> getBody();
  void setAlive(bool status);
  int getLenght();
};

#endif

Catégories