Jeux avec Arduino #1: Pile ou face

pile ou face 2 euro 1

Objectifs du projet :

Répondes aux interrogations suivantes :

  1. Comment ça marche la fonction random avec Arduino ?
  2. Comment manipuler les nombres aléatoires avec Arduino ?
  3. Comment générer une variable aléatoire avec Arduino ?
  4. C’est quoi le principe du simulateur pile ou face ?
  5. Comment implémenter le jeu pile ou face avec Arduino ?

Mots clés

Pile ou face, pièce pile ou face, pile face pièce, simulateur pile ou face, pile ou face jeu, pile ou face simulateur, pile ou face pièce, jeu pile ou face, pile face, pile au face, jeu de pile ou face, pile face, pile ou face en ligne, pile face en ligne, face ou pile, face pile, jeux de pile ou face, pile face jeu, jeux pile ou face, face et pile, pile pièce, piles ou face, pile ou face simulation, piles on face, jeu Arduino, pile ou face Arduino.

Principe de fonctionnement

Une décision à prendre :

  • Croissant ou pain au chocolat ?
  • Sandwitch ou pizza ?
  • Piscine ou vélo ?
  • Café ou thé ?

Une façon efficace de s’en sortir consiste à lancer une pièce de monnaie. En effet, la probabilité pour le pile ou face est identique est =1/2 (50% chacun), c’est un moyen équitable afin de trancher une décision douteuse.

C’est quoi la fonction random() ?

C’est une fonction qui permet de générer une variable pseudo-aléatoire. En effet, la prédiction de la valeur de retour est quasiment impossible (sauf si on connaît la séquence) d’où le surnom « pseudo ». Précisément, la séquence aléatoire est toujours la même pour chaque appel de la fonction, elle se répète à une fréquence prêt (en fonction de la taille du générateur des nombres aléatoires inclut dans la fonction random()). En résume, pour faire simple, la fonction random() peut être considérée comme générateur d’un nombre aléatoire pour chaque appel.

A quoi sert la fonction randomSeed () ?

Il est important qu’une séquence de valeurs aléatoires générées par la fonction random () diffère pour chaque exécution du programme. L’utilisation de la fonction randomSeed () pour initialiser le générateur des nombres aléatoires avec une entrée relativement aléatoire est important, telle que la fonction analogRead ()(randomSeed (analogRead ()) sur une broche non connectée.

Concrètement, l’appel de la fonction analogRead () permet d’obtenir une valeur qui peut variée entre 0 et 1024 (très peut probable) due au signal du bruit dans l’entrée analogique en air. Ci-dessous un exemple de programme et une séquence de lecture de l’entée A0 en air:

// Entrée analogique en air (A0)
int Val_A0=0;

void setup()
{
    // UART
    Serial.begin(9600);
}
void loop() {
    // Lecture
    Val_A0=analogRead(A0);

    // Affichage
    Serial.print(Val_A0);
    Serial.print("\n");

    // Délai +Init
    delay(100);
}

Contenu de A0 en air: 

409
407
406
404
403
401
399
398
397
398
401
404
407
410
414
417
420
423
426
429
430
430
429
428
427
427
426
425
424
423
422
420
418
416
414
412
411
409
407
406
404
403
401
400
398
397
396
395
393
392
388
384
378
373
367
361
356
350
344
339
335
333
331
330
330
329
328
327
326
325
324
324
324
324
324
325
325
325
325
325

Astuce: On peut utiliser une broche en air comme capteur de toucher

On constate que la valeur acquise variée lentement autour de ~384 et au voisinage de zéro (tension de bruit faible).

Par conséquent, pour chaque exécution du programme, on aura un début de séquence différent. Inversement, il peut parfois être utile d’utiliser des séquences pseudo-aléatoires qui se répètent exactement de la même façon. Cela peut être accompli en appelant randomSeed () avec une valeur fixe avant de commencer la séquence aléatoire. L’initialisation est effectuée comme suit :

randomSeed (Valeur_fixe)

Autres syntaxe de la fonction random():

ValAleat =Random(max_val)

Le paramètre max_val doit être choisi en fonction du type de données de la variable dans laquelle la valeur est stockée, d’une autre façon la valeur aléatoire obtenue peut variée entre 0 et max_val-1. La valeur de retour (ValAleat) est codée sur 32 bits (comprise entre 0 et 2^32-1).

Exemple : Random(10) : Génère des variables aléatoires comprises entre 0 et 9.

ValAleat =Random(min_val, max_val)

Permet de générer des variables aléatoires comprises entre min_val et max_val. Exemple : random(100,200).

Schéma électrique pile ou face

La carte est composée de :

  • Trois boutons poussoirs : Trois entrées numériques (0 ou 1). Le premier bouton indique le choix de face de la pièce, le suivant pile, le dernier valide notre choix.
  • Deux LED : Deux sorties numériques indique  le résultat obtenu : « Gagné » ou Perdu.

Etat gagné : Si notre choix confond avec le résultat obtenu par la fonction random (Face-Face ou Pile-Pile.

Etat Perdu : Si notre choix est l’opposé du résultat obtenu par la fonction random (Face-Pile ou Pile-Face)

Exemple : On appuie sur le premier bouton poussoir (choix de la face (F) ) puis on valide. On obtient Pile (P) comme résultat de la fonction random(), le résultat finale sera Perdu ! (Face-Pile).

Schéma pile ou face

Câblage de la carte

Câblage de la carte

Câblage de la carte 1

Câblage de la carte 2

Câblage de la carte 3

Câblage de la carte avec Arduino

Schéma arduino pile ou face 2

Code Arduino: Simulateur pile ou face automatique

// Sorties
unsigned char Perdu_out_val = 0;
unsigned char Gagne_out_val = 0;

unsigned char Perdu_out_pin = 5;
unsigned char Gagne_out_pin = 6;

// Paramètres de la fonction Rand
int Rand_val=0;
int Rand_max=100;
int Rand_min=0;
int Seuil_rand=50;
unsigned char Piece_val=0;


void setup()
{
    // UART
    Serial.begin(9600);

}
void loop() {

     // Lancement de la pièce
     Rand_val=random(Rand_max);
     if (Rand_val > Seuil_rand)
     {
       // LEDs
       digitalWrite(Perdu_out_pin, LOW);
       digitalWrite(Gagne_out_pin, HIGH);

       // Pile
       Serial.print(Rand_val);
       Serial.print("\n");
     }
     else
     {
       // LEDs
       digitalWrite(Perdu_out_pin, HIGH );
       digitalWrite(Gagne_out_pin, LOW);

       // Face
       Serial.print(Rand_val);
       Serial.print("\n");
     }

     // Délai +Init
     delay(100);

     // Délai +Init
     digitalWrite(Perdu_out_pin, LOW );
     digitalWrite(Gagne_out_pin, LOW);

     // Délai +Init
     delay(100);
}

Code Arduino: Simulateur pile ou face

// Entrées
unsigned char Pile_in_val = 0;
unsigned char Face_in_val = 0;
unsigned char Start_in_val = 0;

unsigned char Pile_in_pin = 2;
unsigned char Face_in_pin = 3;
unsigned char Start_in_pin = 4;

// Sorties
unsigned char Perdu_out_val = 0;
unsigned char Gagne_out_val = 0;

unsigned char Perdu_out_pin = 5;
unsigned char Gagne_out_pin = 6;

// Paramètres de la fonction Rand
int  Rand_val=0;
int Rand_max=100;
int Rand_min=0;
int Seuil_rand=50;
unsigned char Piece_val=0;


void setup()
{
    // Entrées
    pinMode(Pile_in_pin, INPUT);
    pinMode(Face_in_pin, INPUT);
    pinMode(Start_in_pin, INPUT);

    // Sortie
    pinMode(Perdu_out_pin, OUTPUT);
    pinMode(Gagne_out_pin, OUTPUT);

    // initalisation
    digitalWrite(Perdu_out_pin, LOW);
    digitalWrite(Gagne_out_pin, LOW);

    // UART
    Serial.begin(9600);

    // Initialisation Raand (entrée analogique A0
    randomSeed(analogRead(0));
}
void loop() {

     //Lecture des entrées pile/face
     while(1)
     {
       Pile_in_val=digitalRead(Pile_in_pin);
       Face_in_val=digitalRead(Face_in_val);
       if ((Pile_in_val==1) ||(Face_in_val==1))
       {
         break;
       }
     }

     // Lecture du bouton start
     while(1)
     {
       Start_in_val=digitalRead(Start_in_pin);
       if (Start_in_val==1)
       {
         break;
       }
       // Délai
       delay(200);
     }

     // Lancement de la pièce
     Rand_val=random(Rand_max);
     if (Rand_val > Seuil_rand)
     {
       // Pile
       Piece_val=1;
     }
     else
     {
       // Face
       Piece_val=2;
     }

     // Décision
     // Gagné - PP
     if ((Piece_val==1) && (Pile_in_val==1))
     {
       digitalWrite(Perdu_out_pin, LOW);
       digitalWrite(Gagne_out_pin, HIGH);
       Serial.print("Gagné\n");
       Serial.print(Rand_val);
       Serial.print("\n");
     }

     // Gagné - FF
     else if ((Piece_val==2) && (Face_in_val==1))
     {
       digitalWrite(Perdu_out_pin, LOW);
       digitalWrite(Gagne_out_pin, HIGH);
       Serial.print("Gagne\n");
       Serial.print(Rand_val);
       Serial.print("\n");
     }

     // Perdu - FP
     else if ((Piece_val==2) && (Pile_in_val==1))
     {
       digitalWrite(Perdu_out_pin, HIGH );
       digitalWrite(Gagne_out_pin, LOW);
       Serial.print("Perdu\n");
       Serial.print(Rand_val);
       Serial.print("\n");
     }
     // Perdu - PF
     else
     {
       digitalWrite(Perdu_out_pin, HIGH);
       digitalWrite(Gagne_out_pin, LOW);
       Serial.print("Perdu\n");
       Serial.print(Rand_val);
       Serial.print("\n");

     }
     // Délai + Init
     delay(2000);
     digitalWrite(Perdu_out_pin, LOW );
     digitalWrite(Gagne_out_pin, LOW);
     Piece_val=0;
     Pile_in_val=0;
     Face_in_val=0;
}

Photos du projet

Pile ou face arduino (29) Pile ou face arduino (29)
Pile ou face arduino (28) Pile ou face arduino (28)
Pile ou face arduino (27) Pile ou face arduino (27)
Pile ou face arduino (26) Pile ou face arduino (26)
Pile ou face arduino (24) Pile ou face arduino (24)
Pile ou face arduino (23) Pile ou face arduino (23)
Pile ou face arduino (22) Pile ou face arduino (22)
Pile ou face arduino (20) Pile ou face arduino (20)
Pile ou face arduino (18) Pile ou face arduino (18)
Pile ou face arduino (16) Pile ou face arduino (16)
Pile ou face arduino (11) Pile ou face arduino (11)
Pile ou face arduino (10) Pile ou face arduino (10)
Pile ou face arduino (9) Pile ou face arduino (9)
Pile ou face arduino (8) Pile ou face arduino (8)
Pile ou face arduino (7) Pile ou face arduino (7)
Pile ou face arduino (6) Pile ou face arduino (6)

************

Un petit commentaire de vous, un Grand encouragement pour nous 🙂

************

Téléchargement du projet

************

Articles

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Anti-Robot *