jeudi 31 juillet 2014

Deux dés Arduino / Conception / Page 2

Tutoriel pour deux dés

retour conception page 1

Organisation des leds :

Avec 2 dés, il faut gérer l'affichage de 14 leds avec seulement 7 sorties Arduino.
Le dispositif est similaire avec une double connexion des 7 pins sur les leds symétriques des deux dés.

Nous utilisons deux transistors NPN(Explication composant pnp) avec 3 pattes, qui laissent passer le courant aux extrémités lorsque nous envoyons du courant sur la patte centrale. Nous raccordons aux sorties 10 et 11 chacun des transistors. toutes les cathodes (-) d'un dés sont rattachées à une patte extérieur du composant NPN. la patte libre est connectée au GND (-).

Pour afficher un chiffre différent, on éteint un dés et on allume l'autre ensuite on alterne. Ce fonctionnement impose un affichage, continu en alternance de chaque dés.




le script de fonctionnement pour les deux dés est le suivant : 


//organisation des dès avec sorties : 
//     6     4
//     7  5  3
//     8     2
int butPin = 9;    // bouton
int transi1 = 10;  // transistor 1
int transi2 = 11;  // transistor 2

byte dede[8][7] ={
 //2 3 4 5 6 7 8
  {0,0,0,0,0,0,0}, // 0 rien
  {0,0,0,1,0,0,0}, // 1
  {1,0,0,0,1,0,0}, // 2
  {0,0,1,1,0,0,1}, // 3
  {1,0,1,0,1,0,1}, // 4
  {1,0,1,1,1,0,1}, // 5
  {1,1,1,0,1,1,1}, // 6
  {1,1,1,1,1,1,1}, // 7 tout
};

byte resultatloto[2][30]; // remplissage du résultat des deux dès lancés
int resultdesun=0; 
int resultdesdeux=0;
int attenteboucle = 5; //10 en standard = calcul la vitesse de changement

void setup()
{
  int i;
  for (i=2; i<9; i++) pinMode(i,OUTPUT);   // led pins
  pinMode(transi1,OUTPUT);
  pinMode(transi2,OUTPUT);
  pinMode(butPin,INPUT); 
  digitalWrite(butPin, HIGH); // indispensable pour la lecture du switch proto
  
  //  start/stop button
  turnOnNumber(0);
  randomSeed(analogRead(0));               // initialise le random
  Serial.begin(9600);
}

void loop() 
{
  Lancedes();
}

void Lancedes() 
{
  
 int n,i; 
 int loto1; 
 int loto2; 
 int maxi =15;
 int delay1;
 int resultat = 10;
 int ancienresultat = 10; // empeche deux fois le meme nombre

  // test bouton  si actionné
  if (digitalRead(butPin) == HIGH)
  {
    // Calcul et chargement du résultat dans resultatloto (tableau des resultats)
    randomSeed(analogRead(0));               // initialise le random
    loto1 = random(5,maxi);
    randomSeed(analogRead(1));               // initialise le random
    loto2 = random(5,maxi);

     for (n=0; n < maxi;n++)
      {
        while (resultat == ancienresultat)  resultat=random(1,7);
        ancienresultat=resultat;
        if (n<loto1) resultatloto[0][n]=resultat;
        else resultatloto[0][n]=0;
       }
      // resultat final sur premier dés
       resultdesun = resultatloto[0][loto1-1];

     for (n=0; n < maxi ;n++)
      {
        while (resultat == ancienresultat)  resultat=random(1,7);
        ancienresultat=resultat;
        if (n<loto2) resultatloto[1][n]=resultat;
        else resultatloto[1][n]=0;
      }
      // resultat final sur deuxième dés
       resultdesdeux = resultatloto[1][loto2-1];


     // affichage des résultats
     if (loto1<loto2) maxi = loto2;    // determine la boucle max pour les deux dès
     else maxi = loto1;

    // boucle avec affichage de plus en plus lent
     for (n=0; n<maxi; n++)
     {
         delay1=(n+1) * 2;
         for (i=0;i<delay1;i++)
         {
           if (resultatloto[0][n] != 0) 
           {
             resultdesun = resultatloto[0][n];
            }
           else 
           {
             resultdesun = resultatloto[0][loto1-1];
           }

          if (resultatloto[1][n]!=0) 
          {
            resultdesdeux = resultatloto[1][n];      
          }
          else 
          {
            resultdesdeux = resultatloto[1][loto2-1];
          }
          
//          Serial.println(resultdesun);
 //         Serial.println(resultdesdeux);
          
          digitalWrite(transi1,HIGH);
          digitalWrite(transi2,LOW);
          turnOnNumber(resultdesun);
          delay(attenteboucle);
          digitalWrite(transi2,HIGH);
          digitalWrite(transi1,LOW);
          turnOnNumber(resultdesdeux);
          delay(attenteboucle);
         }
     }
  }
 digitalWrite(transi1,HIGH);
 digitalWrite(transi2,LOW);
 turnOnNumber(resultdesun);
 delay(attenteboucle);
 digitalWrite(transi2,HIGH);
 digitalWrite(transi1,LOW);
 turnOnNumber(resultdesdeux);
 delay(attenteboucle);
}


// ***** set up leds corresponding the number *****
void turnOnNumber(int n)
{
    int i;
    
    for(i=0;i<7;i++) //n en décalage de 1 lié à la gestion tableau qui commence à0 
    {
      if (dede[n][i]==0) digitalWrite(i+2, LOW);     
     else digitalWrite(i+2, HIGH);
   }
}







lundi 28 juillet 2014

Deux dés Arduino / Conception / Page 1

DEUX DES ARDUINO / CONCEPTION


Tutorial pour un dés seul

Organisation des leds :

Un dé est composé de 7 leds. Chaque led est reliée à une sortie Arduino.
Voila à quoi ça ressemble :

Ce dispositif permet d'afficher un dé. Voici l'exemple image et script qui fonctionne avec ce dispositif: 

Dispositif Arduino 1 dé

Sketch Arduino Uno 1 dé

/****************************************************************************************
------------------------------------- Programme 1 dés ---------------------------------------------- 
Déclaration des variables
  ButPin pour le bouton
  etat pour le resultat du bouton
  dede est un tableau contenant les positions 
  des 7 leds pour toutes les combinaisons d'un dés

organisation des dès avec sorties : 
  led-pin relationships:     6     4
                                    7  5  3
                                    8     2
*****************************************************************************************/

int butPin = 9;
int etat =0;
byte dede[8][7] ={
 //2 3 4 5 6 7 8 numéro des pins associés aux leds
  {0,0,0,0,0,0,0}, // 0 rien
  {0,0,0,1,0,0,0}, // 1
  {1,0,0,0,1,0,0}, // 2
  {0,0,1,1,0,0,1}, // 3
  {1,0,1,0,1,0,1}, // 4
  {1,0,1,1,1,0,1}, // 5
  {1,1,1,0,1,1,1}, // 6
  {1,1,1,1,1,1,1}, // 7 tout
};

// initialisation partie du programme qui s'execute une fois
void setup()
{

  int i; // utilisé pour la boucle qui suit

  // initialisation des pins 2 à 8 pour les leds
  for (i=2; i<9; i++) pinMode(i,OUTPUT);   // led pins
  pinMode(butPin,INPUT);                   //  initialisation du bouton switch

  turnOnNumber(0);                         // extinction des leds
  randomSeed(analogRead(0));               // initialise le random astuce pour avoir un vrai random
  Serial.begin(9600);
}

void loop() 
{
  
 int n; 
 int loto; 
 int resultat = 10;
 int ancienresultat = 10; // empeche deux fois le meme nombre

// lecture du bouton
 etat= digitalRead(butPin);

  if ( etat == HIGH)
  {
    turnOnNumber(7);
    delay(500);
    turnOnNumber(0);
    delay(500);
    
      loto = random(5,30);

      for (n=2; n <loto;n++)
      {
        while (resultat == ancienresultat)  resultat=random(1,7);
        turnOnNumber(resultat);
        ancienresultat=resultat;
        delay(500-((loto-n)*20));
      }
  }
}

// ***** set up leds corresponding the number *****
void turnOnNumber(int n)
{
    int i;
  
    for(i=0;i<7;i++) //n en décalage de 1 lié à la gestion tableau qui commence à0 
    {
      if (dede[n][i]==0) digitalWrite(i+2, LOW);
      else digitalWrite(i+2, HIGH);
    }
} //******************************************* FIN DU PROGRAMME ********************************



La suite affichage de deux dés