Go Down

Topic: Tirage au sort sur 25 ou 30 led Possible? (Read 168 times) previous topic - next topic

Leeleen

Bonjour à tous

J'ai déjà réalisé de petits montages à base d'arduino Uno dont un qui se trouve sur ce forum.

Il faudrait que je réalise un système de tirage au sort ayant 25 à 30 possibilités de choix.

La sortie serait simplement une des 25 (ou +) led (5mm rouge) qui s'allumerait sur une fonction RANDOM.  (Chaque led en face d'un nom)

Hélas pas assez de sortie pour 25 led, il faut multiplexer ?
Là je bloque un peu. Chaque sortie étant en ov ou 5v, va-t-il falloir encoder TOUTES les possibilités?

ex si je pars sur une matrice 5x5
        (5 premières sorties)  (5 sorties suivantes)
LED 1     10000                       01111
Led 2      01000                       01111
Led 3      00100                       01111   etc?


Merci pour votre aide


_pepe_

#1
Aug 11, 2017, 12:54 am Last Edit: Aug 11, 2017, 01:17 am by _pepe_
Bonsoir

Pour allumer une seule led parmi 25, il suffit de 6 sorties.

Pour allumer la led souhaitée, il faut configurer les deux broches qui y sont reliées en sorties, appliquer un niveau haut sur la broche reliée à son anode et un niveau bas sur la broche reliée à sa cathode, et configurer les quatre autres broches en entrées.



Ce circuit peut piloter jusqu'à 30 leds sans nécessiter de broche supplémentaire.

Si le courant nominal des leds est IF et provoque une tension directe VF, alors la valeur des résistances doit être :

 R = (5V-VF)/(2·IF)

Par exemple, pour des leds 2V@20mA, on trouve R=75Ω (on pourra choisir la valeur normalisée R=82Ω).

_pepe_

#2
Aug 11, 2017, 01:45 am Last Edit: Aug 11, 2017, 10:28 am by _pepe_
Voici un exemple de fonction permettant d'allumer une led d'après son numéro, compris entre 0 et 24 (ou entre 0 et 29 si l'on câble 30 leds), ou NONE pour aucune :

Code: [Select]
const byte pinsLeds[] = {2, 3, 4, 5, 6, 7};

#define NONE 255

void lightLed(byte n) {
  byte i;
  for (i=0; i<6; i++) {
    pinMode(pinsLeds[i], INPUT);
    digitalWrite(pinsLeds[i], LOW);
  }
  if (n==NONE)
    return;
  byte a = n/5;
  byte b = n-5*a;
  if (b>=a)
    b++;
  pinMode(pinsLeds[a], OUTPUT);
  digitalWrite(pinsLeds[a], HIGH);
  pinMode(pinsLeds[b], OUTPUT);
  digitalWrite(pinsLeds[b], LOW);
}

Leeleen

WOW génial merci

Je vais sûrement câbler en 30 led (c'est pour ma classe, afin de répartir les tâches quotidiennes les élèves sans mon intervention)

Il me reste à comprendre le code :D


La boucle FOR passe les 6 broches en INPUT  correct?  Ça évite de taper 12 lignes de code pour les 6 broches?



Ensuite, je peux générer un RANDOM entre 1 et 6  pour les valeurs [a] et  
avec un IF (b==a) b = random (1,6) pour ne pas passer une broche en HIGH et en LOW en même temps



avec un bouton poussoir en entrée, je peux créer une boucle qui se termine à l'ouverture du bouton, non?
ça créera un joli effet de mélange d'allumage et d'extinction de led au hasard.
la dernière led restera allumée pour le tirage au sort en relâchant le bouton.

Pour les led je vais rester sur du 5mm soit bleues ou rouges/bleues flash  ça tourne dans les 3v 20ma

(Je débute soyez indulgents)

_pepe_

#4
Aug 12, 2017, 12:04 pm Last Edit: Aug 12, 2017, 12:58 pm by _pepe_
La boucle FOR passe les 6 broches en INPUT  correct?  Ça évite de taper 12 lignes de code pour les 6 broches?
Oui, c'est ça.

Ensuite, je peux générer un RANDOM entre 1 et 6  pour les valeurs [a] et  
La fonction que j'ai donnée permettant de gérer totalement l'allumage d'une led parmi 30, il vaudrait mieux générer un seul nombre aléatoire compris entre 0 et 29 et appeler cette fonction.

avec un bouton poussoir en entrée, je peux créer une boucle qui se termine à l'ouverture du bouton, non?
ça créera un joli effet de mélange d'allumage et d'extinction de led au hasard.
la dernière led restera allumée pour le tirage au sort en relâchant le bouton.
L'idée est bonne.

Toutefois, pour obtenir un résultat final réellement aléatoire, capter l'instant du relâchement du bouton est très certainement une bien meilleure solution que de faire calculer un nombre pseudo-aléatoire (la séquence étant toujours la même).

Tu pourrais par exemple utiliser la séquence pseudo-aléatoire pour allumer les leds pendant l'appui sur le bouton, et tirer le résultat en utilisant le nombre de microsecondes écoulées depuis l'allumage de l'Arduino :

Code: [Select]
numLed = micros()%30;
L'opération doit être asynchrone (i.e. non cadencée par des delay()). Par exemple :

Code: [Select]
// LOW si button avec résistance de pull-up
// HIGH si button avec résistance de pull-down
#define APPUI LOW

...

  uint32_t t = millis();
  // tant que le bouton reste appuyé
  while( digitalRead(pinBouton)==APPUI ) {
    // toutes les 100 ms
    if( millis()-t > 100 ) {
      // allume une nouvelle led choisie (pseudo-)aléatoirement
      lightLed( random(30) );
      t = millis();
    }
  }
  // quand le bouton est relâché, allume une led aléatoirement
  lightLed( micros()%30 );

Leeleen

Un random n'est pas réellement aléatoire?

Je vais commencer par bricoler ma série de led.
Il faut que je trouve comment les disposer avec la liste en face...
J'ai retrouvé une vingtaine de led 5mm vertes et des boutons de borne d'arcade. Il me reste un arduino Uno.
Il me manque une alimentation, je vais fouiller !

bricofoy

non, la fonction random renvoi un nombre pseudo-aléatoire, en fait un nombre pris dans une séquence qui se répète, à chaque allumage de l'arduino la séquence sera la même

sinon il faut initialiser la fonction random avec un nombre différent à chaque fois, comme expliqué dans la doc de random():

https://www.arduino.cc/en/Reference/Random
-tu savais que si tu passe le CD de windows à l'envers, tu entends une chanson satanique ?
-non, mais il y a pire : à l'endroit, ça l'installe !

Go Up