Le 1er programme pour lequel on a bien galéré.

Nous étions partis sur l’idée de concevoir un jeux interactif avec comme interface une matrice de LED 8×8 que nous avions sous la main. Simplement, après un léger découragement, nous nous sommes rabattu sur l’idée de créer de l’interaction entre un joystick (qui dans le fond se rapproche d’une combinaison de deux potentiomètres que nous avions appris à commander) et quatre LED de couleurs différentes : à chaque LED devait correspondre une plage de position du joystick. La programmation pouvait commencer…

Partie A

En sachant que la position d’un potentiomètre se décrit avec une valeur comprise entre 0 et 1024, dans notre cas une seule position du joystick se décrit avec deux valeurs comprise entre ce même intervalle. Une pour l’axe X et l’autre pour l’axe Y.

l’étape suivante consiste à assigner chaque LED (rouge, verte, jaune, et bleu turquoise) à une plage de valeur correspondante à des positions bien distinct du joystick. Un intervalle de valeur nous permet de maximiser nos chances de faire correspondre une direction à une LED. Ici, 1024/4 = 256. Entre 768 et 1024 en X et entre 768 et 1024 en Y la LED qui sera allumée sera la bleu turquoise par exemple.

En testant le programme avec son matériel, nous nous somme rendu compte que le hardware était encore trop imprécis et qu’il risquait d’y avoir des erreurs de traduction. Pas de problème, notre dernière solution est plus radicale et efficace. elle consiste à convertir chaque plage de valeur à des plages bien plus grandes comprises entre -512 et 0 ou 0 et 512 . C’est aussi plus logique par rapport à la configuration en croix d’un joystick.

Pour cela la formule magique est la fonction « Map » à définir dans la partie « void loop() » comme ci-après :

joystickXPosition = map(analogRead(joystickX), 0, 1023, -512, 512);

joystickYPosition = map(analogRead(joystickY), 0, 1023, 512, -512);

Le reste n’est que simple logique et pour le comprendre prenons l’exemple de la LED jaune.

Si la position du joystick est supérieur à 0 et inférieur à 512 sur l’axe X, mais aussi inférieur à 0 et supérieur à -512 sur l’axe Y, alors la LED jaune doit s’allumer. Si non, QUENINI ! elle reste éteinte. Même logique pour les trois autres cas.

En langage arduino ça nous donne :

if(joystickXPosition >= 50 && joystickXPosition<=512 && joystickYPosition<=-50 && joystickYPosition>=-512){

digitalWrite(ledJaune, HIGH);

}else{

digitalWrite(ledJaune, LOW);

}

N’oubliez pas d’introduire chaque entrée et sortie par le type de donnée « int » puis de leurs assigner un pin en début de code, de bien sûr de déterminer quels éléments représentent les entrées (« INPOUT ») d’informations et lesquelles traduisent ces informations en sortie (« OUTPUT ») dans la partie « void setup() » avec un petit « serial.begin(9600) » pour suivre les valeurs du joystick dans le moniteur série et le tour est joué !

Intégralité du programme :

int joystickX = A1;
int joystickY = A2;
int joystickXPosition = 0;
int joystickYPosition = 0;
int ledVerte = 9;
int ledBlanche = 11;
int ledJaune = 8;
int ledRouge = 10; 

void setup() {
  // put your setup code here, to run once:
  pinMode(ledVerte, OUTPUT);
  pinMode(ledBlanche, OUTPUT);
  pinMode(ledJaune, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  pinMode(joystickX, INPUT);
  pinMode(joystickY, INPUT);

  Serial.begin(9600);

}

void loop() {


  joystickXPosition = map(analogRead(joystickX), 0, 1023, -512, 512);
  joystickYPosition = map(analogRead(joystickY), 0, 1023, 512, -512);


  Serial.print("X: ");
  Serial.print(joystickXPosition);
  Serial.print("  Y: ");
  Serial.println(joystickYPosition);


  if(joystickXPosition >= 50 && joystickXPosition<=512 && joystickYPosition<=-50 && joystickYPosition>=-512){
    digitalWrite(ledJaune, HIGH);
  }else{
    digitalWrite(ledJaune, LOW);
    }


   if(joystickXPosition >= 50 && joystickXPosition<=512 && joystickYPosition>=50 && joystickYPosition<=512){
    digitalWrite(ledBlanche, HIGH);
  }else{
    digitalWrite(ledBlanche, LOW);
    }

      if(joystickXPosition <= 50 && joystickXPosition>=-512 && joystickYPosition>=50 && joystickYPosition<=512){
    digitalWrite(ledRouge, HIGH);
  }else{
    digitalWrite(ledRouge, LOW);
    }

        if(joystickXPosition <= -50 && joystickXPosition>=-512 && joystickYPosition<=-50 && joystickYPosition>=-512){
    digitalWrite(ledVerte, HIGH);
  }else{
    digitalWrite(ledVerte, LOW);
    }
    }

Partie B

Maintenant, pour aller vers des notions de jeux, passons à l’étape suivante. Le but est désormais de créer une séquence d’allumage des quatre LED qui soit aléatoire pour, à therme, la mémoriser et essayer de la reproduire avec le joystick. Pour se faire nous avons l’idée de créer un dé virtuel à 4 possibilités qui enchaînerait des roulements en interne du code mais que nous pourrions bien sûr voir à l’action dans le moniteur série.

Pour dématérialiser ce dés que nous appellerons « randNumber » tout en s’assurant que la carte Arduino puisse l’appeler dans la partie « void loop()« , nous l’introduisons par la variable longue « long » qui peut garder en mémoire des suites de nombres. Dans la même partie nous déterminons une constante de probabilité « proba » ici de 4. Dans la partie « void setup » nous utilisons la fonction « randomSeed » qui génère nos suites qui varies. Nous capterons des valeurs d’entrées dans un pin qui n’est jamais branché ( « analogRead(0) » par exemple).

Nous n’avons plus qu’ à faire tourner dans la boucle de programmation notre dès de manière aléatoire avec la fonction « random« .

On a :

long randNumber;

int proba = 100;

void setup() {

randomSeed(analogRead(0));

Serial.begin(9600);

}

void loop() {

randNumber = random(proba);

}

Chaque chiffre donné du dés se voit être attribué d’une LED de couleur.

Nous allons utiliser la fonction « switch… case » qui est une version améliorée de la fonction « if » dans laquelle nous pouvons faire fonctionner des fonctions préalablement crées. Par éxemple dans le cas 0 où le dès est tombé sur le chiffre 0 nous pouvons demander à la LED jaune de s’allumer. Si non on « casse » cette potentialité :

switch (randNumber) {

case 0:

digitalWrite(ledJaune, HIGH);

delay(pause); //Une pause est donnée entre chaque cas

break;

}

La fin de cette instruction est donnée par un « default » dans le quelle nous allons demander d’arrêter toute action dans tout les autres cas que le programme analyse suivant la probabilité déterminé. Pour que le programme traite des cas vide nous augmentons le nombre de probabilité à 100. Ainsi il y a 4% de chances que le programme enchaîne une séquence. Par conséquent dans les 96 autres cas, l’éteignage des LED se fait par une fonction « OffAll » que nous créons nous-même dans un « voidOffAll() » inventé et qui demande d’éteindre toutes les LED. Nous réutiliserons cette fonction en toute fin de boucle pour s’assurer que tout s’éteigne.

void OffAll() {

digitalWrite(ledVerte, LOW);

digitalWrite(ledJaune, LOW);

digitalWrite(ledRouge, LOW);

digitalWrite(ledBlanche, LOW);

}

void loop() {

switch (randNumber) {

case 0:

case 1:

case 2:

case 3:

default:

OffAll();

delay(pause);

break;

}

OffAll();

}

Intégralité du programme :

int joystickX = A1;
int joystickY = A2;
int joystickXPosition = 0;
int joystickYPosition = 0;
int ledVerte = 9;
int ledBlanche = 11;
int ledJaune = 8;
int ledRouge = 10;
long randNumber;
int pause = 300; //Temps d'allumage en ms
int proba = 4;

int compteur = 0;

void setup() {
  // put your setup code here, to run once:
  pinMode(ledVerte, OUTPUT);
  pinMode(ledBlanche, OUTPUT);
  pinMode(ledJaune, OUTPUT);
  pinMode(ledRouge, OUTPUT);
  pinMode(joystickX, INPUT);
  pinMode(joystickY, INPUT);
  randomSeed(analogRead(0));

  Serial.begin(9600);

  OffAll();
}

void OffAll() {
  digitalWrite(ledVerte, LOW);
  digitalWrite(ledJaune, LOW);
  digitalWrite(ledRouge, LOW);
  digitalWrite(ledBlanche, LOW);
}


void loop() {

  randNumber = random(proba);


  joystickXPosition = map(analogRead(joystickX), 0, 1023, -512, 512);
  joystickYPosition = map(analogRead(joystickY), 0, 1023, 512, -512);


  Serial.print("X: ");
  Serial.print(joystickXPosition);
  Serial.print("  Y: ");
  Serial.print(joystickYPosition);
  Serial.print(" || Random: ");
  Serial.println(randNumber);

  switch (randNumber) {
    case 0:
      digitalWrite(ledJaune, HIGH);
      delay(pause);
      break;
    case 1:
      digitalWrite(ledVerte, HIGH);
      delay(pause);
      break;
    case 2:
      digitalWrite(ledRouge, HIGH);
      delay(pause);
      break;
    case 3:
      digitalWrite(ledBlanche, HIGH);
      delay(pause);
      break;
    default:
      OffAll();
      delay(pause);
      break;
  }
  OffAll();
}

A charge d’être finit, amélioré, changé…

CASANOVA Nina et COMOLLI Damien.