DIY - Button box arduino micro pro

  • Bonjour à tous

    j'ai voulu faire une button box en suivant cette vidéo

    External Content youtu.be
    Content embedded from external sources will not be displayed without your consent.
    Through the activation of external content, you agree that personal data may be transferred to third party platforms. We have provided more information on this in our privacy policy.
    le projet me plaisait et je voulais me pencher un peu sur une arduino.

    edit RacingMat : voici les liens remontés dans le 1er post !

    https://www.instructables.com/id/Sim-Racing-Button-Box/

    code AM-studio (qui corrige les manques du code ci-dessus)

    https://github.com/AM-STUDIO/32-F…UTTON_BOXV2.ino

    nécessite l'installation des bibliothèques <Keypad.h> <Joystick.h>

    code de zbth pour gérer le son de Windows avec un encodeur rotatif :

    https://github.com/cazeaux/buttonbox

    nécessite l'installation des bibliothèques <Keypad.h> <Arduino.h> et <HID-Project.h>

    pour approvisionner des boîtiers :

    https://www.gotronic.fr/cat-boitiers-b…isserie-679.htm

    https://www.ebay.fr/itm/302173593390 "ABS project box" 11€

    https://www.amazon.fr/gp/product/B07NVK538F/ 19€

    https://www.aliexpress.com/wholesale?Sear…abs+project+box

    //////////////////////////////////////////////////////////

    question câblage pas de problème mais je pèche un peu en programmation et le code fournit avec la vidéo indique une erreur avant de l'envoyer dans la carte.

    un message plus ancien sur le site traite du sujet mais cela n'a pas résolu le problème.

    si vous avez des idées merci (je vous mais le code et la ligne qui pose problème).


    #include <Keypad.h>

    #include <Joystick.h>

    #define ENABLE_PULLUPS

    #define NUMROTARIES 4

    #define NUMBUTTONS 24

    #define NUMROWS 5

    #define NUMCOLS 5


    byte buttons[NUMROWS][NUMCOLS] = {

    {0,1,2,3,4},

    {5,6,7,8,9},

    {10,11,12,13,14},

    {15,16,17,18,19},

    {20,21,22,23},

    };

    struct rotariesdef {

    byte pin1;

    byte pin2;

    int ccwchar;

    int cwchar;

    volatile unsigned char state;

    };

    rotariesdef rotaries[NUMROTARIES] {

    {0,1,24,25,0},

    {2,3,26,27,0},

    {4,5,28,29,0},

    {6,7,30,31,0},

    };

    #define DIR_CCW 0x10

    #define DIR_CW 0x20

    #define R_START 0x0

    #ifdef HALF_STEP

    #define R_CCW_BEGIN 0x1

    #define R_CW_BEGIN 0x2

    #define R_START_M 0x3

    #define R_CW_BEGIN_M 0x4

    #define R_CCW_BEGIN_M 0x5

    const unsigned char ttable[6][4] = {

    // R_START (00)

    {R_START_M, R_CW_BEGIN, R_CCW_BEGIN, R_START},

    // R_CCW_BEGIN

    {R_START_M | DIR_CCW, R_START, R_CCW_BEGIN, R_START},

    // R_CW_BEGIN

    {R_START_M | DIR_CW, R_CW_BEGIN, R_START, R_START},

    // R_START_M (11)

    {R_START_M, R_CCW_BEGIN_M, R_CW_BEGIN_M, R_START},

    // R_CW_BEGIN_M

    {R_START_M, R_START_M, R_CW_BEGIN_M, R_START | DIR_CW},

    // R_CCW_BEGIN_M

    {R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW},

    };

    #else

    #define R_CW_FINAL 0x1

    #define R_CW_BEGIN 0x2

    #define R_CW_NEXT 0x3

    #define R_CCW_BEGIN 0x4

    #define R_CCW_FINAL 0x5

    #define R_CCW_NEXT 0x6

    const unsigned char ttable[7][4] = {

    // R_START

    {R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START},

    // R_CW_FINAL

    {R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW},

    // R_CW_BEGIN

    {R_CW_NEXT, R_CW_BEGIN, R_START, R_START},

    // R_CW_NEXT

    {R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START},

    // R_CCW_BEGIN

    {R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START},

    // R_CCW_FINAL

    {R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW},

    // R_CCW_NEXT

    {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START},

    };

    #endif

    byte rowPins[NUMROWS] = {21,20,19,18,15};

    byte colPins[NUMCOLS] = {14,16,10,9,8};

    Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS);

    Joystick_Joystick(JOYSTICK_DEFAULT_REPORT_ID,

    JOYSTICK_TYPE_JOYSTICK, 32, 0,

    false, false, false, false, false, false,

    false, false, false, false, false);

    void setup() {

    Joystick.begin();

    rotary_init();}

    void loop() {

    CheckAllEncoders();

    CheckAllButtons();

    }

    void CheckAllButtons(void) {

    if (buttbx.getKeys())

    {

    for (int i=0; i<LIST_MAX; i++)

    {

    if ( buttbx.key[i].stateChanged )

    {

    switch (buttbx.key[i].kstate) {

    case PRESSED:

    case HOLD:

    Joystick.setButton(buttbx.key[i].kchar, 1);

    break;

    case RELEASED:

    case IDLE:

    Joystick.setButton(buttbx.key[i].kchar, 0);

    break;

    }

    }

    }

    }

    }


    void rotary_init() {

    for (int i=0;i<NUMROTARIES;i++) {

    pinMode(rotaries[i].pin1, INPUT);

    pinMode(rotaries[i].pin2, INPUT);

    #ifdef ENABLE_PULLUPS

    digitalWrite(rotaries[i].pin1, HIGH);

    digitalWrite(rotaries[i].pin2, HIGH);

    #endif

    }

    }


    unsigned char rotary_process(int _i) {

    unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1);

    rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate];

    return (rotaries[_i].state & 0x30);

    }

    void CheckAllEncoders(void) {

    for (int i=0;i<NUMROTARIES;i++) {

    unsigned char result = rotary_process(i);

    if (result == DIR_CCW) {

    Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0);

    };

    if (result == DIR_CW) {

    Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0);

    };

    }

    Message modifié 5 fois, dernière modification par RacingMat (29 janvier 2021 à 12:22).

  • J'ai installé 3 ou 4 librairie joystick différentes ça a pas fonctionné, du coup j'avais abandonné et essayé de me faire un code avec simhub mais j'ai un soucis avec les encodeurs

  • bon j'ai désinstallé ide et tout suprimer les ficher dans mes document et reinstaller la dernière version et j'ai enfin pu teléversé le code :yes:

    par contre petite question est il obligé de mettre les 4 encodeurs ou ça fonctionne si j'en met que 2 ?

  • Ça va fonctionner normalement. Si c’est pas le cas je pourrai t’aider.

    J’ai fait une button box aussi en partant de ce projet, mais j’ai refait le programme pour qu’il dédie un des encodeurs au réglage du volume sous Windows. Si ça t’intéresse je peux t’envoyer cette version.

  • Hello

    Je viens tout juste de finir la mienne .Et je confirme que le code d'AMSTUDIO fonctionne très bien en suivant le TUTO à la lettre. Par contre Zbth je suis preneur pour ton code pour le volume windows (l'idéal serait celui tout à gauche)

  • J'ai mis mon sketch ici : https://github.com/cazeaux/buttonbox

    Pour changer le rotary à utiliser, il faut configurer la partie du code indiquée :

    - Remplacer "3" par l'index du rotary souhaité (0 c'est celui de gauche, 3 c'est celui de droite)

    - Remplacer l'index du bouton pour le son on/off (qui correspond au clic). La config par défaut est le rotary de droite, pour un autre faut regarder ...

    Message modifié 1 fois, dernière modification par zbth (10 juin 2020 à 08:07).

  • Ça marche au poil. Merci :yep::yep::yep:

    Par contre ma boite est cablée dans l'autre sens car le volume était directement sur le bon potar sans toucher le code.

    Message modifié 1 fois, dernière modification par Lamaug (10 juin 2020 à 08:05).

  • fiofio88 as tu lu tes MP?

    n oubliez pas qu un con qui marche ira toujours plus loin qu 'un intellectuel assis

    AMD 5800X3D W10 RTX4070Super 3X27pouces et Pico 4 MMOS2014 Ionicube

    :aspi:

  • Bonjour Zbth

    dans ton code il y une référence a "#include <HID-Project.h>"

    as tu cette bibliothèque ou doit on la trouver sur le net.

    Message modifié 1 fois, dernière modification par Droufloyd (13 juin 2020 à 14:30).

  • Bonjour,

    Je n'ouvre pas de nouveau post pour ça, je me permet de mettre ma réalisation ici

    Je dois la terminer pour qu'elle ressemble à ça (mon actuelle, la nouvelle étant pour un collègue)