Projet cible pour airsoft -> besoin de vos lumière

salut

Je suis sur un projet de stand de tir pour l'airsoft, mode de jeu pensé :

  • Entrainement
  • Rapidité
  • Reflex

Pour commencer, je dispose pour ce projet :

  • 1 ARDUINO Mega 2560
  • 2 écrans LCD 1602 1 écran LCD 2004
  • Disques piezoélèctriques, leds, résistances, diodes zener, boutons poussoirs .....
    (je rajoute que j'ai de quoi créer mes propres circuits imprimés)

Pour résumer :

Il y aura 10 cibles cylindriques de taille différentes (entre 7cm et 20cm), chaque cible sera relié a un capteur piezoélèctrique et une LED .
Ce que je souhaiterai faire :

  • Un mode entrainement : chaque cible touché fait allumer la LED associé a la cible pendant 2sec et comptabilise le nombre de cible touchée sur un compteur affiché sur un LCD (nombre de tir infini) .

  • Un mode rapidité : Les LEDs des 10 cibles clignotent trois fois, un compteur de temps commence sur le LCD 1602 puis toutes les LEDs restent allumées . Dès qu'une cible est touchée, la LED associé a la cible s'éteint et le capteur piezoélèctrique est désactivé . Une fois toutes les cibles touchées le compteur s'arrête et reste affiché sur le temps mis a toucher les 10 cibles .

  • Un mode reflex : Les LEDs des 10 cibles clignotent trois fois, un compteur de temps commence sur le LCD puis un capteur piezoélectrique et sa led sont activé au hasard, une fois touché la LED s'éteint et le capteur piezoélèctrque est désactivé, le programme choisi une autre cible a activer et rebelote jusqu’à ce que le nombre de cibles touchées soit atteint (le nombre de cible sera défini avant de lancer le mode dans un menu) . Une fois toutes les cibles touchées le compteur s'arrête et reste affiché sur le temps mis a toucher le nombre de cibles choisi .

Pour accéder au 3 mode de jeu je souhaiterai y accéder par un menu :

-> Accueil
-> Entrainement
-> Début de jeu

-> Rapidité
-> Début du jeu

-> Reflex
-> 10 cibles (choix du nombre de cible a toucher)
-> 20 cibles (choix du nombre de cible a toucher)
-> 30 cibles (choix du nombre de cible a toucher)
-> 40 cibles (choix du nombre de cible a toucher)
-> 50 cibles (choix du nombre de cible a toucher)
-> Début du jeu

Pour la programmation du menu et du mode "entrainement"t j'ai pratiquement fini mais je sèche vraiment sur les deux autres programme "mode rapidité" et "mode reflex" .
J'ai commencé a regarder le programme du jeu SIMON mais j'arrive pas trop a décrypter ....
Comme dis dans ma présentation je suis noob dans le langage C ou C++, donc si quelqu'un pourrais me mettre sur la voie ça serait vraiment sympa .

Double post car je dépasse les 9000 caractères ....

J'ai cherché un peu de nom coté, et j'ai trouvé un programme que j'ai un peu modifié .

J'aimerai savoir si il est possible de remplacer la fermeture des boutons poussoir par des capteur de vibration/choc (piezo) ? quand le capteur détecte un choc il simule la fermeture du BP .

voici le code :

// Ce programme sert à faire le chasse-led
int led[10]={35,37,39,41,43,45,47,49,51,53};              //Déclaration des pattes des leds
int bp[10]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9};                 //Déclaration des pattes des boutons poussoirs

//Déclaration et initialisation des variables globales servant pour la suite du code

int initLed = 0;         
int i;
int randnumber ;
int tirage = 0;
int compteur;
int score;


void setup(){                         //Fonction permettant d'initialiser le matériel (leds et boutons poussoir)
  
  Serial.begin(9600);                //Indique que Arduino se situe sur le port usb 9600
  for(i=0;i<10;i++){                  //Boucle parcourant toutes les variables de 0 à 9
       pinMode(bp[i], INPUT);        //Indique que le bouton poussoir est une entrée
       pinMode(led[i],OUTPUT);       //Indique que les leds sont des sorties
       digitalWrite(led[i],LOW);     //On met les leds au niveau bas (elles sont eteintes au depart)
       digitalWrite(bp[i],HIGH);     //On met les boutons poussoirs au niveau haut
  }
  compteur=0;                        //Initialisation du compteur à 0
}


void loop(){
    if (initLed == 0)  {                     //Premier passage dans la fonction loop
       randnumber=random(0,10);               //Déclaration d'un premier nombre aléatoire de 0 à 9
       digitalWrite(led[randnumber],HIGH);   //Met la led correspondant au numéro aléatoire au niveau haut
       Serial.println("valeur aleatoire:");  //Affiche "valeur aléatoire :" dans le terminal
       Serial.println(randnumber,DEC);       //Affiche dans le terminal le numéro aleatoire
       compteur = compteur + 1;              //incrémentation du compteur
       initLed =1;                           //Indique que le programme est déjà lancé pour ne plus aller dans ce test
       tirage = 1;                           //Permet d'aller au test suivant
       delay(500);                           //Attente d'une demi seconde (500 = 500ms)
   }
      
  if (tirage == 1 ){                             //Deuxième test valide si on a passé le premier test
      if(digitalRead(bp[randnumber])==LOW){      //Regarde si le bouton poussoir associé a la led est active
          Serial.println("valeur du compteur:"); //Affiche "valeur du compteur :" dans le terminal
          Serial.println(compteur,DEC);          //Affiche la valeur du compteur dans le terminal
          digitalWrite(led[randnumber],LOW);     //Éteint la led quand on a appuyé sur le bp (bp=bouton poussoir)
          randnumber=random(10);                  //Cherche un autre nombre aléatoire
          digitalWrite(led[randnumber],HIGH);    //Allume la led correspondant a ce nouveau nombre
          compteur = compteur + 1;               //Incrémente le compteur
          Serial.println("valeur aleatoire:");   //Affiche "valeur aléatoire :" dans le terminal
          Serial.println(randnumber,DEC);        //Affiche dans le terminal le numero aleatoire
          delay(500);                            //Attente d'une demi seconde
      }
      else { if ( digitalRead(bp[(randnumber+1)%10])==LOW ||       //Si le bouton poussoir correspondant à la led n'est pas activé, on regarde si l'utilisateur ne s'est pas trompé et a activé un autre bp
                digitalRead(bp[(randnumber+2)%10])==LOW ||         //Test des bp
                digitalRead(bp[(randnumber+3)%10])==LOW ||         //Test des bp
                digitalRead(bp[(randnumber+4)%10])==LOW ||         //Test des bp
                digitalRead(bp[(randnumber+5)%10])==LOW ||         //Test des bp
                digitalRead(bp[(randnumber+6)%10])==LOW ||         //Test des bp
                digitalRead(bp[(randnumber+7)%10])==LOW ||         //Test des bp
                digitalRead(bp[(randnumber+8)%10])==LOW ||         //Test des bp
                digitalRead(bp[(randnumber+9)%10])==LOW){          //Test des bp
                digitalWrite(led[randnumber],LOW);                //Si l'un des autres bp est activé on éteint la led
                Serial.println(" ");                              //On écrit un espace dahs le terminal
                Serial.println("Valeur finale du compteur : ");   //On écrit "Valeur finale du compteur : " dans le terminal
                Serial.println(compteur,DEC);                     //Affiche dans le terminal la valeur du compteur
                tirage = 0;                                       //Fait en sorte que l'on allume le score à la fin
                }
      } 
  }

  score=compteur-1;                              //Calcul du score
  if (tirage ==0) {                              //On teste si la variable tirage est à 0
  allumer(score);                                //Va dans la fonction allumer
  }
}


void allumer(int score){                         //Fonction alliumer qui prend en variable le score et qui ne retourne rien
  digitalWrite(led[0],LOW);                      //Éteint toutes les leds
digitalWrite(led[1],LOW);                        //Éteint toutes les leds
digitalWrite(led[2],LOW);                        //Éteint toutes les leds
digitalWrite(led[3],LOW);                        //Éteint toutes les leds
digitalWrite(led[4],LOW);                        //Éteint toutes les leds
digitalWrite(led[5],LOW);                        //Éteint toutes les leds
digitalWrite(led[6],LOW);                        //Éteint toutes les leds
digitalWrite(led[7],LOW);                        //Éteint toutes les leds
digitalWrite(led[8],LOW);                        //Éteint toutes les leds
digitalWrite(led[9],LOW);                        //Éteint toutes les leds
  delay(1000);                                   //Attend une seconde
  
for(int j=score; j>0;j--){                       //Boucle décrementant le score jusqu'à ce qu'il soit égal à 1
  digitalWrite(led[j%10],HIGH);                   //Allume la led modulo 10 (Un nombre entre 0 et 9)
  delay(150);                                   //Attend 150ms
  digitalWrite(led[j%10],LOW);                    //Éteint la led modulo 10 (Un nombre entre 0 et 9)
  delay(150);                                   //Attend 150ms
}
digitalWrite(led[0],HIGH);                       //Allume la led 0
digitalWrite(led[1],HIGH);                       //Allume la led 1
digitalWrite(led[2],HIGH);                       //Allume la led 2
digitalWrite(led[3],HIGH);                       //Allume la led 3
digitalWrite(led[4],HIGH);                       //Allume la led 3
digitalWrite(led[5],HIGH);                       //Allume la led 3
digitalWrite(led[6],HIGH);                       //Allume la led 3
digitalWrite(led[7],HIGH);                       //Allume la led 3
digitalWrite(led[8],HIGH);                       //Allume la led 3
digitalWrite(led[9],HIGH);                       //Allume la led 3

delay(1000);                                     //Attend une seconde
}

PoLoMoD:
...
J'aimerai savoir si il est possible de remplacer la fermeture des boutons poussoir par des capteur de vibration/choc (piezo) ? quand le capteur détecte un choc il simule la fermeture du BP .

bonjour
oui c'est possible , c'est ce qui est utilisé dans les applications "drums" (batterie electronique)
il faut lire les "piezos" avec analogread

regarde le principe sur ce projet

Bonjour

Merci Artouste, je vais regarder de ce coté alors .

Salut :slight_smile:

Je remonte un vieux topic je sais mais j'ai un projet presque quasiment identique.
Donc j'aimerais bien savoir où en est le tiens PoLoMoD
...
En espérant que tu sois encore sur le forum sinon je devrais ouvrir un nouveau sujet ^^