Exercice avec la manette Nintendo SNES en C/C++ avec Stm32duino

Description

La console Nintendo Super NES (ou SNES) se controle avec une manette disposant des caractéristiques suivantes :

  • Une croix directionnelle (haut, bas, droite, gauche)
  • Quatre boutons poussoirs à sa droite (A, B, X et Y)
  • Deux boutons poussoirs en son centre (START et SELECT)
  • Deux boutons poussoirs sur sa tranche avant (L et R)

Elle communique en protocole SPI avec la console. C’est un protocole de communication qui fonctionne sur le principe de maitre qui envoie les informations (ici la manette) et esclave qui les reçoit (ici la console remplacée par la carte Nucleo).

Le protocole de communication s’établit de cette façon :

  1. On envoie une pulsation sur la ligne LATCH pour capturer l’état des boutons de la manette.
  2. On récupère ensuite les 16 bits en SPI en utilisant les lignes DATA et CLOCK.
  3. On lit l’état des bits reçus.

Chaque bit correspond à un bouton. On obtient alors le tableau suivant :

Bit 15 Bit 14 Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
"1" "1" "1" "1" R L X A Droite Gauche Bas Haut Start Select Y B

Montage

Afin de connecter la manette à la carte Nucleo on utilise 5 fils et une résistance de 10kΩ. Nous pouvons très bien connecter la manette à la carte Nucleo sans utiliser de résistance. Cependant, dans notre cas, elle nous servira à detecter que la manette est deconnectée.

La connectique de la manette SNES s’organise de la manière suivante :

Schéma de montage manette SNES
Manette SNES ST Nucleo
5V 5V
CLOCK D3
LATCH D2
DATA D4
GND GND

Sans oublier la résistance que l’on vient placer entre GND et DATA.

Programme

Pour simplifier le code nous utilisons une bibliothèque externe. Pour récupérer cette bibliothèque veuillez suivre ce lien. Elle est contenue dans un fichier .zip qu’il faut dézipper et ensuite déplacer le dossier avec son contenu pour le mettre dans \Documents\Arduino\libraries. Le fichier du projet Arduino est quant à lui disponible en suivant ce lien.

Etape 1 : Pour faire fonctionner le programme nous devons dans un premier temps importer la bibliothèque téléchargée précédemment. Pour se faire, il faut l’importer au tout début de notre code de cette facon :

#include <Snes.h>

On vient également créer une variable snes qui récupéra les informations retournées par la bibliothèque.

Snes snes;

Etape 2 : Ensuite on vient initialiser la bibliothèque qui va alors se charger d’activer la communication série et initialiser la communication avec la manette.

void setup()
{
  snes.init();
}

Etape 3 : Enfin nous affichons les données acquises. La bibliothèque se charge d’acquérir les données et afficher directement le résultat.

void loop()
{
  //Pour récupérer les données et les afficher
  snes.print();
}

Etape 3 (bis) : Si nous souhaitons récupérer les données en affichant seulement la valeur brute recue :

void loop()
{
  //Pour ne récupérer que les données
  int donnee = snes.data();
  Serial.println(donnee);
  delay(250);
}

A noter que dans ce cas ci la valeur récupérée sera un multiple de 2 (binaire) et chaque valeur correspondra à un bouton poussoir précis.

Résultat

Il ne vous reste plus qu’à appuyer sur le bouton téléverser pour transférer le programme puis allez dans le menu Outils puis Moniteur Série pour observer le résultat !

Nous pouvons à présent observer les données extraites de la manette SNES sous cette forme :

Affichage des données de la manette SNES

Appuyez sur les différents boutons de la manette ainsi que sur la croix directionnelle et vous devriez voir le retour d’information sur votre écran.