jeux de suivi de câble

Bonjour la communauté française,

En préambule je suis un néophyte de l’Arduino de la programmation et de l’électronique...
Il y a quelque temps j'étais plus "à l'aise" avec tout ça et je m'y remet doucement... à mon rythme :slight_smile:

Du coup comme il fait froid et que j'aime faire des activités avec mes enfants je me suis dit que cela serait opportun de réaliser un projet (que j'espère facile) en Arduino.

Mon projet est un suiveur de câble, tout simple mais que j'aime à compliquer...

Voici une schématique (en fichier attaché) qui sera plus explicite qu'un long discours...

le fonctionnement:

  • la manette touche le contacteur de base à droite ou à gauche cela d’éclanche un décompte sur l'afficheur 2 lignes: 3... 2... 1... 0!
  • à chaque décompte du compteur un bip du buzzer retenti 1/4 de sec et permanent de 1 à 0
  • de 3 à 0 il y à un dégradé progressif sans acoup de rouge à vert au niveau des led
  • à 0 les leds sont vertes le buzzer est éteint et un décompte min:sec est déclenché et s'affiche
  • le joueur à 2 secondes pour quitter le contacteur de base avec la manette sinon un nouveau décompte est déclenché
  • le joueur doit toucher le contacteur de base opposé en un minimum de temps et en moins de touche entre la manette et le fil
  • lorsque la manette touche le fil, le buzzer se déclanche les leds deviennent rouges (tout le temps du contact) et cela comptabilise et additionne une touche sur des afficheurs (2 digits)
  • si le contact est continue entre la manette et le fil pendant 0,5 sec cela compte pour 3 touches et ainsi de suites toutes les 0,5 sec
  • une fois arrivé, le score (temps et nombre de touche) est enregistré et supplante l’ancien si il est meilleur (nombre de touche en priorité et temps en 2nd)
  • le score est affiché sur l'afficheur 2 lignes
  • un toggle switch permet de sélectionner joueur 1 ou joueur 2
  • en plus du score l'afficheur indique quel joueur gagne

voila en gros mes specs qui sont certainement à préciser et à compléter.

je souhaite être progressif dans ma démarche et peut être pas mener tout de front:
par exemple:

  • dans un premier temps, afficher en rouge une dizaine de leds (rgb) dés que je provoque un contact (attention au rebond)
  • afficher le nombre de touche (penser à la remise à zero)
  • ...

dans mon "bordel électronique" (que je n'arrive jamais à correctement ranger) j'ai retrouvé des arduino nano...
Question: croyez vous que le nano soit suffisant? ou faut il que je passe sur un uno?

au niveau du code
je m’emmêle dans mes boucles et je me pause des questions:

  • est il mieux de détecter le contact (du fil avec la manette) dans une boucle de code(ça je sais faire) ou vaut il mieux gérer une interruption? (je ne n'arrive pas à comprendre comment ça marche)
  • comment arriver à déterminer si sur 0,5 sec ou sur 3 secondes on reste en contact et qu'il n'y ait pas de "sous-contact" intermédiaires?

merci de votre aide

Votre schéma pour ceux qui ont la flemme de cliquer

Bonjour et bienvenue

Beau projet sympa

  • un Nano est aussi performant que un uno donc ça devrait le faire (en fait la nano deux entrées suplémentaires purement analogiques sont disponibles (pas des sorties, et uniquement analogiques).

  • remettez éventuellement vos connaissances à jour avec les tutos d’eskimons

  • il ne faut pas de delais dans le code donc vous familiariser avec l’exemple « blink without delay »

C’est typiquement une définition de programme qui se prête bien à la programmation par machine à états - cf mon tuto éventuellement - Si vous réussissez à exprimer votre cahier des charges sous forme d’un graphe comme je l’ai fait alors vous verrrez que ce n’est pas trop difficile

bonjour,

voici des petite nouvelle de mon projet...

un grand merci à J-M-L pour son accueil, l'affichage du schéma, et pour m'avoir permis de débuter dans de bons rails.

prochainement je vais essayer par moi même de mettre les photos venant de Google photo sur ce forum... me connaissant, ça va pas marcher... mais qu ne tante rien...

j'avoue avoir eut un peut peur de la programmation machine pour l'engagement que cela me prendrait... mes excuse à toi J-M-L car/donc je ne m'y suis pas mis.

je vous donne ici l'avancé de mon code qui est basé sur:

  • un arduino nano
  • un bouton temporaire (sur pin 2) simulant le contact entre la manette et le fil avec résistance et condo pour l'effet rebond
  • une led (sur pin 3) avec sa petite résistance qui va bien
// this constant won't change:
const int contactPin = 2;       //pin de contact entre la manette et le fil
const int ledPin = 3;           //pin de led en cas de contact entre la manette et le fil

// Variables will change:
unsigned int contactCounter = 0;//comteur de contact int > 32,767 entre la manette et le fil
unsigned long suiveurTime = 0;  //temps de suivi du fil 

void setup() {
  pinMode(contactPin, INPUT);   //initialise le pin de contact en tant que input:
  pinMode(ledPin, OUTPUT);      //initialise le pin de LED en tant que output:
  
  Serial.begin(9600);           //initialize serial communication:
}

void loop() {
  funCompteur (-1);             //initialise le compteur
  suiveurTime = millis();       //début du chrono
  funSuiveur();
  Serial.println(millis() - suiveurTime); //affichage du compteur
}


//fonction gérant le mode suiveur
void funSuiveur() {
  boolean boucle = true;              //boucle tant que c'est = true
  int contactState;                   //état du contact entre la manette et le fil
  int contactLastState = LOW;         //dernier état du contact entre la manette et le fil
  unsigned long contactLastTime = 0;  //temps depuis la dernière lecture d'état
  unsigned long contactContinu = 500; //temps de contact en continu (en mili-seconde)
  unsigned long rebondLastTime = 0;   //temps depuis le dernier changement (en mili-seconde)
  unsigned long rebondTime = 50;      //temps de rebond "technique" (en mili-seconde)

  do {
    contactState = digitalRead(contactPin);   //lecture du contact entre la manette et le fil

    if (rebondLastTime == 0) {                //on est PAS dans un rebond
      if (contactLastState != contactState) { //s'il y a un changement d'état
        rebondLastTime = millis();            //affecte la date de changement d'état
        
        if (contactState == LOW) {            //s'il N'y à PLUS de contact (cas le plus fréquent)
          digitalWrite(ledPin, LOW);          //led éteinte
          contactLastState = LOW;             //enregistre le dernier état du contact 
          contactLastTime = 0;                //réinitialise la date du dernier contact
        }
        else {                                //s'il y à un nouveau contact
          contactLastTime = millis();         //enregistre la date du contact
          digitalWrite(ledPin, HIGH);         //allume les led
          contactLastState = HIGH;            //enregistre le dernier état du contact       
          funCompteur (1);                    //incrémentation du nombre de contact
        }
      }
      else {                                  //s'il N'y a PAS un changement d'état
        if (contactLastTime != 0) {           //si un dernier contact est en cours
          if ((millis() - contactLastTime) > contactContinu) { //si le contact se fait en continu
            contactLastTime = millis();       //réinitialise la date du dernier contact
            funCompteur (3);                  //ajoute 3 points au compteur
          }
        }
      }
    }
    else { //on est dans la période de rebond
      if ((millis() - rebondLastTime) > rebondTime) { //si la durée du rebond est dépassé
        rebondLastTime = 0;                   //réinitialise la date de rebond
      }
    }
  } while(boucle); // ...
}

//fonction gérant l'affichage du compteur
void funCompteur (int increment) {
  if (increment < 0) {            //le param est negatif
    contactCounter = 0;           //reset du compteur
  }
  else if (increment > 0) {       //le param est positif
    contactCounter += increment;  //incrément le compteur
  }
  Serial.println(contactCounter); //affichage du compteur
}

n'hésitez pas à critiquer, c'est comme cela que je m’améliorerais...

je sais que pour l'instant ça boucle sans échappatoire... la sortie de la boucle se sera dans un 2nd temps... j'avance par étape...

merci pour vos commentaire...

alors je m'essaye a ajouter une image...
d'avance mes excuses si ça ne fonctionne pas...

c'est une image qui vient de Google photo:
Google Photos