Arduino pro Micro pins A0-A3 pour des boutons

Bonjour,
j'ai modifié un Shifter Fanatec SQ 1.5 en enlevant les capteurs Hall et en les remplaçant par des microswitches, pilotés par une Arduino Pro Micro.
ça fonctionnait très bien.
J'ai voulu utiliser les pins restant pour commander des boutons, sans resistances, en utilisant PULLUP. Ca marche très bien pour les pins 14-16, pas du tout pour 18-21 (= A0-A3).
je ne comprends pas pourquoi. en les appelant par le pin 18 ou par A0, ça ne change rien...

testé pinMode(18, INPUT_PULLUP) et pinMode(A0, INPUT) et le code actuel... idem.

j'ai vu ce sujethttps://forum.arduino.cc/t/cant-manage-to-get-pro-micro-pins-a0-a2-to-act-as-digital-outputs/1239147 mais je n'ai pas accès à ce matériel.

Y a t il une solution autre ?

il n'y a pas de matrice, et je ne souhaite pas en faire. les boutons sont cablés directement chacun à la carte.
soudures et contacts vérifiés. boutons aussi. problème dans le code ou la manière de faire ...
Merci.

mon code

// Fanatec shifter mod

#include <Joystick.h>

Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD,
                   18, 0,                 // Button Count, Hat Switch Count
                   false, false, false,   // No X and Y 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() {

    // switch off RX TX leds
  pinMode(LED_BUILTIN_TX, INPUT);
  pinMode(LED_BUILTIN_RX, INPUT);

  // Initialize Joystick Library
  Joystick.begin();

  // Initialize Button Pins   for windows butons
    // Speed shifter position   R 1 2 3 4 5 6 7     Upshift DnShift  H/Seq                          // extra btns   1  2  3  4  5  6  7  
    // Arduino Btn              7 0 1 2 3 4 5 6       8       9       10                            //             14 15 16 18 19 20 21   not 11 12 13 17
    // Windows Btn              8 1 2 3 4 5 6 7       9      10       11                                           12 13 14 15 16 17 18
  // for arduino leonardo and micro only

  for (int i = 0; i <= 10; i++){
    pinMode(i, INPUT_PULLUP);
  }
  for (int i = 14; i <= 16; i++){
    pinMode(i, INPUT_PULLUP);
  }
  //for (int i = 18; i <= 21; i++){
    pinMode(A0, INPUT_PULLUP);
    pinMode(A1, INPUT_PULLUP);
    pinMode(A2, INPUT_PULLUP);
    pinMode(A3, INPUT_PULLUP);
  //}
          // test only **************
          //Serial.begin(9600);  //This pipes to the serial monitor
}

//***********
boolean ShifterMode;
boolean currentButtonState;
boolean lastButtonState[18] = { LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, LOW, LOW, LOW, LOW};      
// max btn inputs = 18

void UpdateButton(byte i) {
      currentButtonState = !digitalRead(i);
      if (currentButtonState != lastButtonState[i]) {
        Joystick.setButton(i, currentButtonState);
        lastButtonState[i] = currentButtonState;
        }
}

//***********
void loop() {
  // Read pin values

  for (byte i = 14; i <= 16; i++){
        UpdateButton(i);
      }
  //for (byte i = 18; i <= 21; i++){
        //UpdateButton(i);
      currentButtonState = !digitalRead(A0);
      if (currentButtonState != lastButtonState[18]) {
        Joystick.setButton(18, currentButtonState);
        lastButtonState[18] = currentButtonState;
      }
      currentButtonState = !digitalRead(A1);
      if (currentButtonState != lastButtonState[19]) {
        Joystick.setButton(19, currentButtonState);
        lastButtonState[19] = currentButtonState;
      }
      currentButtonState = !digitalRead(A2);
      if (currentButtonState != lastButtonState[20]) {
        Joystick.setButton(20, currentButtonState);
        lastButtonState[20] = currentButtonState;
      }
      currentButtonState = !digitalRead(A3);
      if (currentButtonState != lastButtonState[21]) {
        Joystick.setButton(21, currentButtonState);
        lastButtonState[21] = currentButtonState;
      }
  //}
  
  ShifterMode = digitalRead(10);  // read pin 10 if gnded H mode
  Joystick.setButton(10, ShifterMode);

  if (ShifterMode == 1) {
            //Serial.println("Mode SEQ");
    for (byte i = 8; i <= 9; i++){
    // seq mode, btn 8 and 9 for Upshift DnShift  Speed 3 and 4
        UpdateButton(i);
      }
  } else {
            //Serial.println("Mode H");
    for (byte i = 0; i <= 7; i++){
        //H mode btn 7 is Reverse and bnts 0 to 6 gears
        UpdateButton(i);
      }
  }
  delay(50);
}

Bonjour shiftermodarduino

Quel modèle as tu?
De 14 - 16 c'est un mini (sans port USB)

C'est un Micro.

Dans ton cas, le mieux est de ne pas t'adresser directement ainsi aux pin analogiques, mais de conserver la terminologie Arduino, avec A0, A1,A2... et ainsi rendre transparent le numéro des pin quelque soit le modèle.
Pour ce faire de façon pratique, il faut mettre les pin en tableau:

enum {bouton1, bouton2, bouton3, bouton4};
const int btnPin[] = {A0, A1, A2, A3}; // Pin des boutons
const int btnNombre = sizeof(btnPin) / sizeof(btnPin[0]); // Nombre de boutons

Pour les initialiser dans Setup();

  for (int b = 0; b < btnNombre; b ++) {
    pinMode(btnPin[b], INPUT_PULLUP);
  }

Pour lire les boutons:

	if (digitalRead(btnPin[bouton2]) == LOW)
	{
		Serial.println("Bouton 2 pressé");
	}

Cordialement
jpbbricole

Pas tout a fait, même pas du tout avec certaines cartes.
Ce que tu écris est valable pour des micro d’architecture avr, ce qui est le cas des micros des cartes micro, mini, uno, nano,mega.
Pas sûr que ce le soit pour une carte avec micro espressif, rasp ou stm32 qui sont aussi gérées par l’IDE.

Le juge de paix est le fichier pinarduino.h de la carte utilisée, il se trouve dans le repertoire ”variant” de l’IDE.

Il est tout a fait officiellement prévu par Arduino d’utiliser A0 ou 14 avec un atmega 328, pour l’atmega de la carte leonardo/micro je ne connais pas le contenu de son fichier pinarduino.h

A mon avis, c’est même mieux car en faisant ainsi on sépare bien les usages numériques des usages analogiques, sans compter tout ceux qui ignorent que ces pins sont avant tout numériques.

Si ce n’est pas plus répandu c’est par habitude parce que sur les cartes on trouve A0 et non pas 14.

(post deleted by author)

c'est une AVR, donc ça devrait marcher.
je teste ça.
Merci beaucoup , parce que c'est pas intuitif...

Bonjour shiftermodarduino

En effet :wink:

Un autre avantage de cette "technique" est que si tu a un nombre conséquent de boutons, tu n'a pas besoin que tes ports se suivent, ainsi tu pourrais avoir:
const int btnPin[] = {A0, 7, 5, A1}; // Pin des boutons

Bonne journée
jpbbricole

Je parle bien de terminologie Arduino, donc de cartes Arduino, quelque soit leur processeur, ainsi si l'on prends la Nano ESP32, on a bien des pin A0 à A7.
Donc rien à voir avec l'architecture du proceseur, mais uniquement avec la terminologie Arduino.

bon ben ça marche pas...

// Fanatec shifter mod

#include <Joystick.h>

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

 //***********
  // for A0 to A3 input, specific way to adress on AVR boards
  enum {butonA0, butonA1, butonA2, butonA3};
  const int btnPin[] = {A0, A1, A2, A3}; // Pins used
  const int btnNumber = sizeof(btnPin) / sizeof(btnPin[0]); // Number of btns

  boolean ShifterMode;
  boolean currentButtonState;
  boolean lastButtonState[18] = { LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, LOW, LOW, LOW, LOW};      
  // max btn inputs = 18

//************
void setup() {

    // switch off RX TX leds
  pinMode(LED_BUILTIN_TX, INPUT);
  pinMode(LED_BUILTIN_RX, INPUT);

  // Initialize Joystick Library
  Joystick.begin();

  // Initialize Button Pins   for windows butons
    // Speed shifter position   R 1 2 3 4 5 6 7     Upshift DnShift  H/Seq                          // extra btns   1  2  3  4  5  6  7  
    // Arduino Btn              7 0 1 2 3 4 5 6       8       9       10                            //             14 15 16 18 19 20 21   not 11 12 13 17
    // Windows Btn              8 1 2 3 4 5 6 7       9      10       11                                           12 13 14 15 16 17 18
  // for arduino leonardo and micro only

  for (int i = 0; i <= 10; i++){
    pinMode(i, INPUT_PULLUP);
    }
  for (int i = 14; i <= 16; i++){
    pinMode(i, INPUT_PULLUP);
    }
  for (int b = 0; b < btnNumber; b ++) {
      pinMode(btnPin[b], INPUT_PULLUP);
    }
          // test only **************
          //Serial.begin(9600);  //This pipes to the serial monitor
}

void UpdateButton(int i) {
      currentButtonState = !digitalRead(i);
      if (currentButtonState != lastButtonState[i]) {
        Joystick.setButton(i, currentButtonState);
        lastButtonState[i] = currentButtonState;
        }
}

void UpdateButtonAnalog(int j) {
      int k;
      k = j+18; 
      currentButtonState = !digitalRead(btnPin[j]);
      if (currentButtonState != lastButtonState[k]) {
        Joystick.setButton(k, currentButtonState);
        lastButtonState[k] = currentButtonState;
        }
}
//***********
void loop() {      // Read pin values

  for (int i = 14; i <= 16; i++){
        UpdateButton(i);
    }
  //for (byte i = 18; i <= 21; i++){          //UpdateButton(i);        //}
  for (int b = 0; b < btnNumber; b ++) {
      UpdateButtonAnalog(b);
    }
  
  ShifterMode = digitalRead(10);  // read pin 10 if gnded H mode
  Joystick.setButton(10, ShifterMode);

  if (ShifterMode == 1) {         //Serial.println("Mode SEQ");
    for (int i = 8; i <= 9; i++){              // seq mode, btn 8 and 9 for Upshift DnShift  Speed 3 and 4
        UpdateButton(i);
      }
    for (int i = 0; i <= 7; i++){
        Joystick.setButton(i, 0);  
    }
  } else {                        //Serial.println("Mode H");
    for (int i = 0; i <= 7; i++){             //H mode btn 7 is Reverse and bnts 0 to 6 gears
        UpdateButton(i);
      }
    for (int i = 8; i <= 9; i++){
        Joystick.setButton(i, 0);  
      }
  }
  delay(50);
}

Bonjour shiftermodarduino

Qu'est ce qui ne marche pas, quel est ton modèle d'Arduino?
Tu as bien un côté des boutons à GND?

Cordialement
jpbbricole

Petite correction dans ton programme:

Tu fais:

void UpdateButtonAnalog(int j) {
      int k;
      k = j+18;

j va de 0 à 3.

Ton tableau a une dimension:
lastButtonState[18]
de 0 à 17.
Donc tu est en dehorsdu tableau.

Arduino Pro Micro AtMega32U4
Dans l'IDE j'ai Tools/Boards/Arduino Micro/Arduino AVR boards/Arduino Micro
et dans boards manager Arduino AVR boards 1.8.6 installé
Ce sont de simples BP à 2 poles, un relié au pin de la carte, l'autre au GND.
Avec la dernière version du script postée ci-dessus, pas d'erreur de compil ni d'exécution, les microswitches de du shifter fonctionnent, ainsi que les BP reliés aux pins 15 à17, mais pas les BP reliés à A0-A3.

    // Arduino Btn              7 0 1 2 3 4 5 6       8       9       10                            //             14 15 16 18 19 20 21   not 11 12 13 17
    // Windows Btn              8 1 2 3 4 5 6 7       9      10       11                                           12 13 14 15 16 17 18

zut !
confusion entre les boutons du joystick sous windows et les pins de la carte....

puis-je fire qqch comme ça ?

const int btnPin[] = {SwH1, SwH2, SwH3, SwH4, SwH5, SwH6, SwH7, SwHR, SwSeqUp, SwSeqDn, SwMode, Btn1, Btn2, Btn3, Btn4_A0 = "A0", Btn5_A1="A1", Btn6_A2="A2", Btn7_A3="A3"}; // Pins used

ou

const int btnPin[] = {SwH1, SwH2, SwH3, SwH4, SwH5, SwH6, SwH7, SwHR, SwSeqUp, SwSeqDn, SwMode, Btn1=15, Btn2=16, Btn3=17, Btn4_A0=18, Btn5_A1=19, Btn6_A2=20, Btn7_A3=21}; // Pins used
  const int btnPin[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, A0, A1, A2, A3}; // Pins used

?

Bonjour

Si la carte est une Pro Micro, c'est une carte Sparkfun , pas la carte Micro d'Arduino.

Pour la trouver dans l'IDE ajouter l'extension Sparkfun AVR dans le gestionnaire de cartes

l'IDE pourra alors utiliser un fichier de définition pinarduino.h totalement adapté à cette carte qui présente quelques différences avec la carte Micro d'Arduino

script simplifié

// Fanatec shifter mod
//compile and uplaod with Sparkfun/Sparkfun Pro Micro in card manager in Arduino IDE

#include <Joystick.h>

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

//***********
// for A0 to A3 input, specific way to adress on AVR boards
enum { SwH1, SwH2, SwH3, SwH4, SwH5, SwH6, SwH7, SwHR, SwSeqUp, SwSeqDn, SwMode, Btn1, Btn2, Btn3, Btn4_A0, Btn5_A1, Btn6_A2, Btn7_A3};
const int btnPin[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 16, 17, A0, A1, A2, A3 };  // Pins used
// Initialize Button Pins   for windows butons
// Speed shifter position   R 1 2 3 4 5 6 7     Upshift DnShift  H/Seq                          // extra btns   1  2  3  4  5  6  7
// Arduino Btn              7 0 1 2 3 4 5 6       8       9       10                            //             14 15 16 18 19 20 21   not 11 12 13 17
// Windows Btn              8 1 2 3 4 5 6 7       9      10       11                                           12 13 14 15 16 17 18
// for arduino leonardo and micro only

const int btnNumber = sizeof(btnPin) / sizeof(btnPin[0]);  // Number of btns

boolean ShifterMode;
boolean currentButtonState;
boolean lastButtonState[18] = { LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW, HIGH, LOW, LOW, LOW, LOW, LOW, LOW, LOW };
// max btn inputs = 18

//************
void setup() {

  // switch off RX TX leds
  pinMode(LED_BUILTIN_TX, INPUT);
  pinMode(LED_BUILTIN_RX, INPUT);

  // Initialize Joystick Library
  Joystick.begin();

  for (int b = 0; b < btnNumber; b++) {
    pinMode(btnPin[b], INPUT_PULLUP);
  }
  // test only **************
  //Serial.begin(9600);  //This pipes to the serial monitor
}

void UpdateButton(int i) {
  currentButtonState = !digitalRead(btnPin[i]);
  if (currentButtonState != lastButtonState[i]) {
    Joystick.setButton(i, currentButtonState);
    lastButtonState[i] = currentButtonState;
  }
}

//***********
void loop() {  // Read pin values

  for (int i = 0; i < btnNumber; i++) {
    UpdateButton(i);
  }

  delay(50);
}

mais j'ai perdu la carte en passant à sparkfun... pourtant l'upload a marché.
elle n'apparait plus dans windows /joystick.cpl
j'ai relancé l'IDE, débranché, rebranché, je n'ai plus que le port COM1, elle était sur COM6 avant...

peripherique USB inconnu dans le gestionnaire de periph windows... echec de demande de descripteur
j'ai desinstallé le periph, debranché, rebooté, rien n'y fait...Mis à jour driver sparkfun, win10. pas mieux....

j'ai plus accès à la carte, pourtant sa diode s'allume.

je fais quoi maintenant ????

un REset de la carte ? puis quel bootloader dois je utiliser ?
et au dos il y a 3.5 V et 5.5 V mais aucun n'est barré. Elle peut utiliser les deux modes ?

??????

j'ai raccordé un BP entre gnd et reset
en dble press j'arrive à selectionner le port com 11 arduino leonardo
windows deconnecte et reconnecte la carte, elle reste non reconnue ds le gestionnaire de periphs windows
qd je recommence, pas moyen de faire Ctl R + Ctl U (compile et upload) avant que la carte ne se deconnecte ...

avrdude: ser_open(): can't open device "\\.\COM11": Le fichier sp�cifi� est introuvable.


Failed uploading: uploading error: exit status 1

j'ai essayé avec carte AVR arduino micro comme c'etait avant, ou avec carte sparkfun pro micro, ça change rien.

je ne sais pas aller plus loin...
je fais quoi maintenant ?

Est ce que ta carte "monte" et "descend" continuellement?

Carte Pro Micro 3V ou 5V ?

les fabricants de clones de cartes Sparkfun Pro Micro ne prennent pas toujours le temps de faire le marquage distinctif

un indice : présence d'un Quartz 8MHz (version 3,3V) ou 16MHZ (version 5V)
image

qd je double press RESET, elle est detectée COMM11 ds l'IDE, puis se deconnecte avant qu'un upload n'ait le tps de se faire.

j'ai sur le COM11
VID x2341
PID x0036
SN null

vu que j'ai mis une carte perforée dessus pour raccorder mes fils, je ne voie plus le dessus de la carte...