Arcade Shield v1

Suite au précédent article, j’ai eu envie d’aller un peu plus loin et de remplacer la carte USB Joystick (fournie avec le joystick et les boutons) par un Arduino. Pour commencer, j’ai testé mon idée sur une breadboard (avec une manette bleu-vert Arduino) et une fois que le prototype me convient, nous pouvons passer à la suite.

Manette d'arcade reliée à un Arduino

Voilà le schéma de branchement :

PCBWay, le sponsor de la vidéo

Pour être parfaitement transparent, je précise que ma vidéo est sponsorisée par PCBWay. Ils m’ont contacté pour me proposer une collaboration. Les PCB m’ont été envoyés gratuitement et en plus je touche une petite rémunération pour présenter leurs services. Toutefois, ce n’est pas une pub. Je vais tester honnêtement leurs services en conservant une entière liberté de parole. Je partagerai mon expérience et bien sûr, si je rencontre des problèmes je n’hésiterai pas à en parler.

Création du PCB

Je ne vous fait pas un tuto complet parce que je ne maitrise pas assez le sujet mais si vous souhaitez en savoir plus, je vous conseille de consulter la documentation de KiCAD et de regarder l’excellente vidéo de formation de Grégoire Lapert.

Le fichier Gerber regroupe toutes les informations nécessaire à la fabrication d’un circuit imprimé (qu’on appelle en anglais Printed Circuit Board ou PCB). Pour le créer, téléchargez et installez KiCAD. Lancez le, cliquez sur Nouveau Projet, indiquez son nom et à quel endroit vous souhaitez l’enregistrer.

Ecran d'accueil de KiCad

Cliquez sur Editeur de Schématique (et choisissez les paramètres par défaut).

Editeur de schématique de KiCAD

Après, il faut cliquer sur Ajouter symboles (j’ai choisi les paramètres par défaut) et taper le nom des composants que l’on veut utiliser dans la barre de recherche (l’Arduino Leonardo et les connecteurs 2 et 5 pins JST XH 2.54 mm)

Ajout des composants dans l'éditeur de schématique de KiCAD

Nous pouvons maintenant relier entre eux les composants en sélectionnant Ajouter fils. Au lieu de tracer les fils reliant la masse et l’alimentation +5V, il vaut mieux cliquer sur Ajouter symboles d’alimentation et sélectionner les symboles GND et +5V.

Réalisation du schéma de branchement dans l'éditeur de schématique de KiCAD

Une fois que c’est fait, sauvegardez et fermez l’Editeur de schématique et ouvrez l’Editeur de PCB depuis l’écran d’accueil de KiCad. Cliquez sur Mise à jour du PCB à partir du Schéma (et choisissez les paramètres par défaut). Tous les composants apparaissent en vrac (et l’Arduino est à l’envers).

L'éditeur de PCB de KiCad

Positionnez les composants en évitant au maximum que les petits fils blancs se croisent (cela facilite l’étape suivante).

Placement des composants dans l'éditeur de PCB de KiCad

Routez les pistes, c’est à dire reliez entre eux les composants. Comme le schéma est assez simple, j’ai utilisé seulement 2 couches de cuivre (en rouge et en bleu).

Routage des pistes dans l'éditeur de PCB de KiCad

Ensuite il faut faire un plan de masse (appuyez sur la touche B pour l’afficher). J’ai également ajouté le nom de la carte ainsi que le logo du blog.

La carte Arcade Shield v1.0 dessinée avec KiCad

Pour obtenir un aperçu de la carte, allez dans Affichage – Visu 3D.

Visu 3D de la carte Arcade Shield v1.0

Maintenant que tout semble correct, il faut créer un fichier Gerber (qui regroupe les caractéristiques de la carte) et le transmettre au fabricant de PCB.

Pour simplifier cette opération, vous pouvez installer le Plugin PCBWay. Pour cela fermez l’Editeur de PCB (n’oubliez pas de sauvegarder) et retournez dans l’écran d’accueil. Ouvrez le Gestionnaire de Plugin et de Contenu, sélectionnez PCBWay Plug-in for KiCad, faites défiler le texte de description à droite et cliquez sur Téléchargement. Cliquez ensuite sur le bouton Installer à partir d’un fichier… et sélectionnez le fichier téléchargé.
Il y a aussi un bouton Installer, logiquement ça devrait faire tout ça automatiquement mais chez moi ça n’a pas fonctionné (peut être que ça marchera chez vous).

Ajout du plugin PCBWay dans KiCad

Retournez dans l’Editeur de PCB et cliquez sur l’icone PCB Way.

Envoi du fichier Gerber avec le plugin PCBWay

Le fichier Gerber est créé et transmis automatiquement à PCBWay. Il ne reste plus qu’à choisir les options qui vous intéressent (couleur, quantité, délai, mode d’expédition, etc…) et à valider la commande.

Commande de la carte sur le site de PCBWay

Réception de la carte

Avec FedEx, la commande est arrivé très rapidement (5 jours plus tard).

Réception de de la carte Arcade Shield

Malheureusement, ils en ont profité pour me facturer des taxes « au Pifomètre » avec comme d’habitude des frais aussi obscures (5,00 € de taxes sur une commande à 6,50 € et 6,00 € de frais supplémentaire alors qu’ils ont déjà touché une vingtaine d’Euros de frais de port, ça pique un petit peu…).

Frais de douane de FedEx

Si cela vous intéresse vous pouvez aussi commander cette carte sur le site de PCBWay.

Installation de la carte dans la manette

J’ai soudé les connecteurs sur la carte

Soudure de la carte Arcade Shield v1.0

Je l’ai insérée sur un Arduino Leonardo et j’ai connecté les boutons (comme sur la carte d’origine).

Manette d'arcade reliée à la carte Arcade Shield v1.0

Attention : L’Arduino Uno R3 n’est pas considéré comme un périphérique USB (manette, clavier souris…) par l’ordinateur. L’Arduino Uno R4 pourrait éventuellement convenir mais il n’est pas (encore) compatible avec la bibliothèque Joystick. J’ai donc utilisé un clone d’Arduino Leonardo.

Clone d'Arduino Leonardo

Programmation de l’Arduino

Téléchargez la bibliothèque Joystick (au format zip) et installez là en allant dans Croquis – Importer un bibliothèque – Ajouter la bibliothèque ZIP…

Installation d'une bibliothèque au format ZIP dans l'IDE Arduino

Sélectionnez le fichier téléchargé et cliquez sur Ouvrir.

Sélection de la bibliothèque Joystick dans l'IDE Arduino

J’ai simplement modifié le fichier ArcadeStickExample pour qu’il s’adapte au branchements.

Le fichier d'exemple ArcadeStickExample de la bibliothèque Joystick

Voilà le code complet :

// Arcade_Shield_v1

#include <Joystick.h>

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,JOYSTICK_TYPE_GAMEPAD,
  10, 0,                  // Button Count, Hat Switch Count
  true, true, false,     // X and Y, but no Z Axis
  false, false, false,   // No Rx, Ry, or Rz
  false, false,          // No rudder or throttle
  false, false, false);  // No accelerator, brake, or steering

void setup() {
  // Initialize Button Pins
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
  pinMode(12, INPUT_PULLUP);
  // D18 pour l'Arduino Leonardo et D14 pour l'Arduino Uno
  pinMode(18, INPUT_PULLUP);
  // D19 pour l'Arduino Leonardo et D15 pour l'Arduino Uno
  pinMode(19, INPUT_PULLUP);
  // D20 pour l'Arduino Leonardo et D16 pour l'Arduino Uno
  pinMode(20, INPUT_PULLUP);
  
  // Si bouton Start appuyé au démarrage, pause de 30 secondes
  if (digitalRead(6) == 0) {
    delay(30000);
  }

  // Initialize Joystick Library
  Joystick.begin();
  Joystick.setXAxisRange(-1, 1);
  Joystick.setYAxisRange(-1, 1);
}

// Last state of the buttons
int lastButtonState[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};

// Leonardo
int buttonMap[14] = {2,3,4,5,6,7,8,9,10,11,12,18,19,20};
// Uno
// int buttonMap[14] = {2,3,4,5,6,7,8,9,10,11,12,14,15,16};

// ButtonMap = 0, Pin 2 = UP
// ButtonMap = 1, Pin 3 = RIGHT
// ButtonMap = 2, Pin 4 = DOWN
// ButtonMap = 3, Pin 5 = LEFT

// ButtonMap = 4, Pin 6 = Start
// ButtonMap = 5, Pin 7 = Select
// ButtonMap = 6, Pin 8 = Button 1
// ButtonMap = 7, Pin 9 = Button 2
// ButtonMap = 8, Pin 10 = Button 3
// ButtonMap = 9, Pin 11 = Button 4
// ButtonMap = 10, Pin 12 = Button 5
// ButtonMap = 11, Pin A0 (18 ou 14) = Button 6
// ButtonMap = 12, Pin A1 (19 ou 15) = Button 7
// ButtonMap = 13, Pin A2 (20 ou 16) = Button 8


void loop() {

  // Read pin values
  for (int index = 0; index < 14; index++)
  {
    int currentButtonState = !digitalRead(buttonMap[index]);
    if (currentButtonState != lastButtonState[index])
    {
      switch (index) {
        case 0: // UP
          if (currentButtonState == 1) {
            Joystick.setYAxis(-1);
          } else {
            Joystick.setYAxis(0);
          }
          break;
        case 1: // RIGHT
          if (currentButtonState == 1) {
            Joystick.setXAxis(1);
          } else {
            Joystick.setXAxis(0);
          }
          break;
        case 2: // DOWN
          if (currentButtonState == 1) {
            Joystick.setYAxis(1);
          } else {
            Joystick.setYAxis(0);
          }
          break;
        case 3: // LEFT
          if (currentButtonState == 1) {
            Joystick.setXAxis(-1);
          } else {
            Joystick.setXAxis(0);
          }
          break;
        case 4: // Start Button
          Joystick.setButton(0, currentButtonState);
          break;
        case 5: // Select Button
          Joystick.setButton(1, currentButtonState);
          break;
        case 6: // Button 1
          Joystick.setButton(2, currentButtonState);
          break;
        case 7: // Button 2
          Joystick.setButton(3, currentButtonState);
          break;
        case 8: // Button 3
          Joystick.setButton(4, currentButtonState);
          break;
        case 9: // Button 4
          Joystick.setButton(5, currentButtonState);
          break;
        case 10: // Button 5
          Joystick.setButton(6, currentButtonState);
          break;
        case 11: // Button 6
          Joystick.setButton(7, currentButtonState);
          break;
        case 12: // Button 7
          Joystick.setButton(8, currentButtonState);
          break;
        case 13: // Button 8
          Joystick.setButton(9, currentButtonState);
          break;
      }
      lastButtonState[index] = currentButtonState;
    }
  }
  delay(10);
}

Test de la manette

Avec ce programme de base, la manette fonctionne aussi bien qu’avec le contrôleur USB (fourni avec le kit de joystick et boutons). Mais, il est possible de reprogrammer l’Arduino pour ajouter de nouvelles fonctions (turbo, tir en continu…).

Le jeu "Classic Kong Complete" un homebrews pour l'émulateur NES

Sources et liens utiles


2 réflexions sur “Arcade Shield v1

Laisser un commentaire