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.

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.

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

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)

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.

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).

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

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).

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.

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

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).

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

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.

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

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…).

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

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

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.

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…

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

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

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…).

2 réflexions sur “Arcade Shield v1”