Objectifs du projet :
Répondes aux interrogations suivantes :
- Comment ça marche la fonction random avec Arduino ?
- Comment manipuler les nombres aléatoires avec Arduino ?
- Comment générer une variable aléatoire avec Arduino ?
- C’est quoi le principe du simulateur pile ou face ?
- 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
…
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).
Câblage de la carte
Câblage de la carte avec Arduino
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
[masterslider id= »16″]
************
Un petit commentaire de vous, un Grand encouragement pour nous ?
************
Téléchargement du projet
************
4 réponses sur « Jeux avec Arduino #1: Pile ou face »
Je suis tombé par hasard sur cet article en cherchant des infos sur la génération de Pile ou Face sans passer par le bon vieux lancer de pièce.
Je dois dire que l’approche pour générer des lancers digitalisés m’impressionne, bravo ! 🙂
Merci 🙂
Super article très complet. Bravo !
Je débute tout juste sur arduino et ca m’apprend déjà beaucoup de chose même si j’ai quelques lacunes sur certains points…
Super! Lesquels ?