1. Do not share user accounts! Any account that is shared by another person will be blocked and closed. This means: we will close not only the account that is shared, but also the main account of the user who uses another person's account. We have the ability to detect account sharing, so please do not try to cheat the system. This action will take place on 04/18/2023. Read all forum rules.
    Dismiss Notice
  2. For downloading SimTools plugins you need a Download Package. Get it with virtual coins that you receive for forum activity or Buy Download Package - We have a zero Spam tolerance so read our forum rules first.

    Buy Now a Download Plan!
  3. Do not try to cheat our system and do not post an unnecessary amount of useless posts only to earn credits here. We have a zero spam tolerance policy and this will cause a ban of your user account. Otherwise we wish you a pleasant stay here! Read the forum rules
  4. We have a few rules which you need to read and accept before posting anything here! Following these rules will keep the forum clean and your stay pleasant. Do not follow these rules can lead to permanent exclusion from this website: Read the forum rules.
    Are you a company? Read our company rules

6 speed and reverse H Pattern Arduino sketch

Discussion in 'DIY peripherals' started by Delco, Sep 28, 2020.

  1. Delco

    Delco New Member

    Joined:
    Sep 28, 2020
    Messages:
    2
    Balance:
    49Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    Arduino
    Hi , I have a six speed H pattern shifter I would like to get working with a arduino Leonardo , I have played around with the sketch on the forum here but can only get 5 gears working .

    Does anyone have a sketch for a 7x7 matrix of buttons that works . I need a 7 matrix as all the switches are tied to the earth through the shifter . I would only need to use a a 1x7 matrix to get the shifter functional but I assume there are enough outputs to then use the other 6 matrix for a button box ?

    Is anyone able to help modify this sketch to get it to work as at least a 7x1 matrix ?




    #include <Keypad.h>
    #include <Joystick.h>

    #define ENABLE_PULLUPS

    #define NUMBUTTONS 48
    #define NUMROWS 7
    #define NUMCOLS 7


    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,24,25,26,27},
    {28,29,30,31,32,33,34},
    {35,36,37,38,39,40,41},
    {42,43,44,45,46,47,48},
    };








    byte rowPins[NUMROWS] = {21,20,19,18,15,14,16};
    byte colPins[NUMCOLS] = {9,8,7,6,5,4,3};

    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();
    }

    void loop() {


    CheckAllButtons();

    }

    void CheckAllButtons(void) {
    if (buttbx.getKeys())
    {
    for (int i=0; i<LIST_MAX; i++)
    {
    if ( buttbx.key.stateChanged )
    {
    switch (buttbx.key.kstate) {
    case PRESSED:
    case HOLD:
    Joystick.setButton(buttbx.key.kchar, 1);
    break;
    case RELEASED:
    case IDLE:
    Joystick.setButton(buttbx.key.kchar, 0);
    break;
    }
    }
    }
    }
    }
  2. Delco

    Delco New Member

    Joined:
    Sep 28, 2020
    Messages:
    2
    Balance:
    49Coins
    Ratings:
    +2 / 0 / -0
    My Motion Simulator:
    Arduino
    GOT IT WORKING ON A 7X2 MATRIX :)


    //BUTTON BOX 7x2 matrix

    //USE w ProMicro


    #include <Keypad.h>
    #include <Joystick.h>

    #define ENABLE_PULLUPS
    #define NUMROTARIES 4
    #define NUMBUTTONS 14
    #define NUMROWS 7
    #define NUMCOLS 2


    byte buttons[NUMCOLS][NUMROWS] = {
    {0,1,2,3,4,5,6},
    {7,8,9,10,11,12,13},

    };

    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,10,18,15,14,16};
    byte colPins[NUMCOLS] = {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.stateChanged )
    {
    switch (buttbx.key.kstate) {
    case PRESSED:
    case HOLD:
    Joystick.setButton(buttbx.key.kchar, 1);
    break;
    case RELEASED:
    case IDLE:
    Joystick.setButton(buttbx.key.kchar, 0);
    break;
    }
    }
    }
    }
    }


    void rotary_init() {
    for (int i=0;i<NUMROTARIES;i++) {
    pinMode(rotaries.pin1, INPUT);
    pinMode(rotaries.pin2, INPUT);
    #ifdef ENABLE_PULLUPS
    digitalWrite(rotaries.pin1, HIGH);
    digitalWrite(rotaries.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.ccwchar, 1); delay(50); Joystick.setButton(rotaries.ccwchar, 0);
    };
    if (result == DIR_CW) {
    Joystick.setButton(rotaries.cwchar, 1); delay(50); Joystick.setButton(rotaries.cwchar, 0);
    };
    }
    }
    • Like Like x 2