Jump to content

How To Program Arduino For Tactile Buttons Without Resistors?


Kenpilot

Recommended Posts

Hey guys. I'm fairly new to the arduino world and DCS Bios and I'm building a CDU for the A10C. Obviously the CDU panel uses a lot of tactile buttons for the panel and I know typically you are supposed to use an external resistor when wiring a button, but that would be A LOT of resistors for the panel. I've read where the arduino has sort of internal resistors where you can program the input pin to use these "internal" resistors so you don't have to wire a bunch of external resistors. Does anyone know how to include this program language in to the DCS BIOS program language for the CDU buttons? If anyone has built their own CDU panel using arduino, DCS BIOS and the internal resistor programming language for all of the buttons, could you please copy and paste your program so I can use it? Or at least see how to write it? I would greatly appreciate it. Obviously I might have to change the pin numbers depending on which arduinos you use, I know how to do that, I just don't know how to incorporate the arduino internal resistor program language with the DCS BIOS language. Thanks!! 


Edited by Kenpilot

Windows 10

ASRock Z370 Extreme4 LGA 1151 (300 Series) MOBO

intel i7-8700k (Not overclocked)

16 GB Ram

EVGA GeForce GTX 108ti SC Black Edition

SSD

Trackir

Link to comment
Share on other sites

  • Kenpilot changed the title to How To Program Arduino For Tactile Buttons Without Resistors?
  • 2 weeks later...

Hi Kenpilot, you still want code for a button matrix?

I adapted the code from that forum (credits within the source code below) to my needs.

Don't know if the internal pullup is already / still on by DCS-Bios, but that worked fine for me.

 

Regards, Vinc

 

Spoiler
// ******************************************************************************************
// A-10C CDU Keypad
// ******************************************************************************************
// Made 11-2017 by Tekkx, based on the amazing work (called DCS-BIOS) of jboecker [FSF]Ian.
// Also I want to give my gratitude to Hansolo HMA Hans.
// This sketch has been edited by Vinc_Vega Febr. 2020
// ****************************************************************************************** 

/*
#define DCSBIOS_RS485_SLAVE 100
// adopt ID to your actual bus architecture and don't forget to put it somewhere down on paper. :)
//The Arduino pin that is connected to the /RE and DE pins on the RS-485 transceiver.
#define TXENABLE_PIN 2 // hard coded on PCB of ICB-C-RJ-...
*/

#define DCSBIOS_IRQ_SERIAL

#include <Keypad.h>
//#include <Keypad2.h> // alternative version that consumes some less memory 
#include <DcsBios.h>
#include <Servo.h>

const byte ROWS = 8; // quantity of rows (later 8)
const byte COLS = 9; // quantity of columns (later 9)

char keys[ROWS][COLS] = {  
// Define the Keymap / upper and lower cases matter, don't use ä ö ü Ä Ö Ü
//  11, 12 ,13, A0, A1, A2, A3, A4, A5
  {'1','2','3','4','5','6','7','8','9'}, // D3
  {'0','q','w','e','r','t','z','u','i'}, // D4
  {'o','p','a','s','d','f','g','h','j'}, // 5
  {'k','l','(','%','#','<','y','x','c'}, // 6
  {'v','b','n','m','Q','W','E','R','T'}, // 7
  {'Z','U','I','O','P','A','S','D','F'}, // 8
  {'G','H','J','K','L','*',')','>','Y'}, // 9
  {'X','C','V','B','N','M',';',':','+'}  // 10
};
// Connect Matrix Rows and Columns to these Arduino pins. 
// Just valid to NANO: A6 and A7 are just analog INs. Don't use them for the Matrix.
byte rowPins[ROWS] = {3, 4, 5, 6, 7, 8, 9, 10};
byte colPins[COLS] = {11, 12, 13, A0, A1, A2, A3, A4, A5}; 

// Create the Keypad, initialize an instance of class CDUkeys
Keypad CDUkeys = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
// ---------------------------     keys: name of the Matrix
// -------
void setup() {
  DcsBios::setup();
  CDUkeys.addEventListener(keypadEvent);  // Add an event listener. ///THX hansolo
  CDUkeys.setHoldTime(100);               // Default is 1000mS ///THX hansolo
  CDUkeys.setDebounceTime(50);           // Default is 50mS ///THX hansolo
}

void loop() {
  DcsBios::loop();
  char key = CDUkeys.getKey(); 
}

void keypadEvent(KeypadEvent CDUbutton){  
  switch (CDUkeys.getState()) { // gives PRESSED, HOLD or RELEASED///*
  case PRESSED:
    //  If you change sth. here: Don't forget the RELEASED-division down under!!!
    switch(CDUbutton) { // CDUbutton // following commands are fired unique if PRESSED
      // Row 1 - Cols 1 2 3 4 5 6 7 8 *
    case '1': sendDcsBiosMessage("CDU_LSK_9L", "1"); break; // 
    case '2': sendDcsBiosMessage("CDU_LSK_7L", "1"); break; // 
    case '3': sendDcsBiosMessage("CDU_LSK_5L", "1"); break; // 
    case '4': sendDcsBiosMessage("CDU_LSK_3L", "1"); break; // 
    case '5': sendDcsBiosMessage("CDU_LSK_3R", "1"); break; // 
    case '6': sendDcsBiosMessage("CDU_LSK_5R", "1"); break; // 
    case '7': sendDcsBiosMessage("CDU_LSK_7R", "1"); break; // 
    case '8': sendDcsBiosMessage("CDU_LSK_9R", "1"); break; //
    // case '9': No Button, no Matrix Junction!
    // Row 2 - Cols 1 2 3 4 5 6 7 8 *
    case '0': sendDcsBiosMessage("CDU_SYS", "1"); break; // 
    case 'q': sendDcsBiosMessage("CDU_NAV", "1"); break; // 
    case 'w': sendDcsBiosMessage("CDU_WP", "1"); break; // 
    case 'e': sendDcsBiosMessage("CDU_OSET", "1"); break; //
    case 'r': sendDcsBiosMessage("CDU_FPM", "1"); break; // 
    case 't': sendDcsBiosMessage("CDU_PREV", "1"); break; //
    case 'z': sendDcsBiosMessage("CDU_BRT", "0"); break; // DIM/BRT left
    case 'u': sendDcsBiosMessage("CDU_BRT", "2"); break; // DIM/BRT right
    // case 'i': No Button, no Matrix Junction!
    // Row 3 - Cols 1 2 3 4 5 6 7 8 9
    case 'o': sendDcsBiosMessage("CDU_1", "1"); break; // 
    case 'p': sendDcsBiosMessage("CDU_2", "1"); break; //
    case 'a': sendDcsBiosMessage("CDU_3", "1"); break; //
    case 's': sendDcsBiosMessage("CDU_A", "1"); break; //
    case 'd': sendDcsBiosMessage("CDU_B", "1"); break; //
    case 'f': sendDcsBiosMessage("CDU_C", "1"); break; // 
    case 'g': sendDcsBiosMessage("CDU_D", "1"); break; // 
    case 'h': sendDcsBiosMessage("CDU_E", "1"); break; // 
    case 'j': sendDcsBiosMessage("CDU_F", "1"); break; //
    // Row 4 - Cols 1 2 3 4 5 6 7 8 9
    case 'k': sendDcsBiosMessage("CDU_4", "1"); break; // 
    case 'l': sendDcsBiosMessage("CDU_5", "1"); break; // 
    case '(': sendDcsBiosMessage("CDU_6", "1"); break; // 
    case '%': sendDcsBiosMessage("CDU_G", "1"); break; // 
    case '#': sendDcsBiosMessage("CDU_H", "1"); break; // 
    case '<': sendDcsBiosMessage("CDU_I", "1"); break; // 
    case 'y': sendDcsBiosMessage("CDU_J", "1"); break; // 
    case 'x': sendDcsBiosMessage("CDU_K", "1"); break; // 
    case 'c': sendDcsBiosMessage("CDU_L", "1"); break; // 
    // Row 5 - Cols 1 2 3 4 5 6 7 8 9
    case 'v': sendDcsBiosMessage("CDU_7", "1"); break; // 
    case 'b': sendDcsBiosMessage("CDU_8", "1"); break; // 
    case 'n': sendDcsBiosMessage("CDU_9", "1"); break; // 
    case 'm': sendDcsBiosMessage("CDU_M", "1"); break; // 
    case 'Q': sendDcsBiosMessage("CDU_N", "1"); break; // 
    case 'W': sendDcsBiosMessage("CDU_O", "1"); break; // 
    case 'E': sendDcsBiosMessage("CDU_P", "1"); break; // 
    case 'R': sendDcsBiosMessage("CDU_Q", "1"); break; // 
    case 'T': sendDcsBiosMessage("CDU_R", "1"); break; // 
    // Row 6 - Cols 1 2 3 4 5 6 7 8 9
    case 'Z': sendDcsBiosMessage("CDU_POINT", "1"); break; // 
    case 'U': sendDcsBiosMessage("CDU_0", "1"); break; // 
    case 'I': sendDcsBiosMessage("CDU_SLASH", "1"); break; // 
    case 'O': sendDcsBiosMessage("CDU_S", "1"); break; // 
    case 'P': sendDcsBiosMessage("CDU_T", "1"); break; // 
    case 'A': sendDcsBiosMessage("CDU_U", "1"); break; // 
    case 'S': sendDcsBiosMessage("CDU_V", "1"); break; // 
    case 'D': sendDcsBiosMessage("CDU_W", "1"); break; // 
    case 'F': sendDcsBiosMessage("CDU_X", "1"); break; // 
    // Row 7 - Cols * 2 3 4 5 6 7 8 9
    // case 'G': No Button, no Matrix Junction!
    case 'H': sendDcsBiosMessage("CDU_PG", "2"); break; // PG-Rocker up
    case 'J': sendDcsBiosMessage("CDU_NA1", "1"); break; // blank - No Function
    case 'K': sendDcsBiosMessage("CDU_NA2", "1"); break; // blank - No Function
    case 'L': sendDcsBiosMessage("CDU_BCK", "1"); break; // 
    case '*': sendDcsBiosMessage("CDU_SPC", "1"); break; // 
    case ')': sendDcsBiosMessage("CDU_Y", "1"); break; // 
    case '>': sendDcsBiosMessage("CDU_Z", "1"); break; // 
    case 'Y': sendDcsBiosMessage("CDU_DATA", "2"); break; // +/- Rocker up
    // Row 8 - Cols * 2 * 4 5 6 7 8 9
    //case 'X': No Button, no Matrix Junction!
    case 'C': sendDcsBiosMessage("CDU_PG", "0"); break; // PG-Rocker down
    //case 'V': No Button, no Matrix Junction!
    case 'B': sendDcsBiosMessage("CDU_MK", "1"); break; // 
    case 'N': sendDcsBiosMessage("CDU_SCROLL", "0"); break; // Scroll Waypoint-Names, Blank Rocker left
    case 'M': sendDcsBiosMessage("CDU_SCROLL", "2"); break; // Blank Rocker right
    case ';': sendDcsBiosMessage("CDU_CLR", "1"); break; // 
    case ':': sendDcsBiosMessage("CDU_FA", "1"); break; // 
    case '+': sendDcsBiosMessage("CDU_DATA", "0"); break; // +/- Rocker down
  }; break; // end case PRESSED // what break does here is a Mystery :)  
  // without break, "RELEASED"-Code is sent immediately after pushing a button
  case RELEASED:  
    switch(CDUbutton) { // following commands are fired unique if RELEASED
      // Row 1 - Cols 1 2 3 4 5 6 7 8
    case '1': sendDcsBiosMessage("CDU_LSK_3L", "0"); break; // 
    case '2': sendDcsBiosMessage("CDU_LSK_5L", "0"); break; // 
    case '3': sendDcsBiosMessage("CDU_LSK_7L", "0"); break; // 
    case '4': sendDcsBiosMessage("CDU_LSK_9L", "0"); break; // 
    case '5': sendDcsBiosMessage("CDU_LSK_3R", "0"); break; // 
    case '6': sendDcsBiosMessage("CDU_LSK_5R", "0"); break; // 
    case '7': sendDcsBiosMessage("CDU_LSK_7R", "0"); break; // 
    case '8': sendDcsBiosMessage("CDU_LSK_9R", "0"); break; //
    // case '9': No Button, no Matrix Junction!
    // Row 2 - Cols 1 2 3 4 5 6 7 8
    case '0': sendDcsBiosMessage("CDU_SYS", "0"); break; // 
    case 'q': sendDcsBiosMessage("CDU_NAV", "0"); break; // 
    case 'w': sendDcsBiosMessage("CDU_WP", "0"); break; // 
    case 'e': sendDcsBiosMessage("CDU_OSET", "0"); break; //
    case 'r': sendDcsBiosMessage("CDU_FPM", "0"); break; // 
    case 't': sendDcsBiosMessage("CDU_PREV", "0"); break; //
    case 'z': sendDcsBiosMessage("CDU_BRT", "1"); break; // DIM/BRT Rocker neutral
    case 'u': sendDcsBiosMessage("CDU_BRT", "1"); break; // DIM/BRT Rocker neutral
    // case 'i': No Button, no Matrix Junction!
    // Row 3 - Cols 1 2 3 4 5 6 7 8 9
    case 'o': sendDcsBiosMessage("CDU_1", "0"); break; // 
    case 'p': sendDcsBiosMessage("CDU_2", "0"); break; //
    case 'a': sendDcsBiosMessage("CDU_3", "0"); break; //
    case 's': sendDcsBiosMessage("CDU_A", "0"); break; //
    case 'd': sendDcsBiosMessage("CDU_B", "0"); break; //
    case 'f': sendDcsBiosMessage("CDU_C", "0"); break; // 
    case 'g': sendDcsBiosMessage("CDU_D", "0"); break; // 
    case 'h': sendDcsBiosMessage("CDU_E", "0"); break; // 
    case 'j': sendDcsBiosMessage("CDU_F", "0"); break; //
    // Row 4 - Cols 1 2 3 4 5 6 7 8 9
    case 'k': sendDcsBiosMessage("CDU_4", "0"); break; // 
    case 'l': sendDcsBiosMessage("CDU_5", "0"); break; // 
    case '(': sendDcsBiosMessage("CDU_6", "0"); break; // 
    case '%': sendDcsBiosMessage("CDU_G", "0"); break; // 
    case '#': sendDcsBiosMessage("CDU_H", "0"); break; // 
    case '<': sendDcsBiosMessage("CDU_I", "0"); break; // 
    case 'y': sendDcsBiosMessage("CDU_J", "0"); break; // 
    case 'x': sendDcsBiosMessage("CDU_K", "0"); break; // 
    case 'c': sendDcsBiosMessage("CDU_L", "0"); break; // 
    // Row 5 - Cols 1 2 3 4 5 6 7 8 9
    case 'v': sendDcsBiosMessage("CDU_7", "0"); break; // 
    case 'b': sendDcsBiosMessage("CDU_8", "0"); break; // 
    case 'n': sendDcsBiosMessage("CDU_9", "0"); break; // 
    case 'm': sendDcsBiosMessage("CDU_M", "0"); break; // 
    case 'Q': sendDcsBiosMessage("CDU_N", "0"); break; // 
    case 'W': sendDcsBiosMessage("CDU_O", "0"); break; // 
    case 'E': sendDcsBiosMessage("CDU_P", "0"); break; // 
    case 'R': sendDcsBiosMessage("CDU_Q", "0"); break; // 
    case 'T': sendDcsBiosMessage("CDU_R", "0"); break; // 
    // Row 6 - Cols 1 2 3 4 5 6 7 8 9
    case 'Z': sendDcsBiosMessage("CDU_POINT", "0"); break; // 
    case 'U': sendDcsBiosMessage("CDU_0", "0"); break; // 
    case 'I': sendDcsBiosMessage("CDU_SLASH", "0"); break; // 
    case 'O': sendDcsBiosMessage("CDU_S", "0"); break; // 
    case 'P': sendDcsBiosMessage("CDU_T", "0"); break; // 
    case 'A': sendDcsBiosMessage("CDU_U", "0"); break; // 
    case 'S': sendDcsBiosMessage("CDU_V", "0"); break; // 
    case 'D': sendDcsBiosMessage("CDU_W", "0"); break; // 
    case 'F': sendDcsBiosMessage("CDU_X", "0"); break; // 
    // Row 7 - Cols * 2 3 4 5 6 7 8 9
    // case 'G': No Button, no Matrix Junction!
    case 'H': sendDcsBiosMessage("CDU_PG", "1"); break; // PG-Rocker neutral
    case 'J': sendDcsBiosMessage("CDU_NA1", "0"); break; // blank - No Function
    case 'K': sendDcsBiosMessage("CDU_NA2", "0"); break; // blank - No Function
    case 'L': sendDcsBiosMessage("CDU_BCK", "0"); break; // 
    case '*': sendDcsBiosMessage("CDU_SPC", "0"); break; // 
    case ')': sendDcsBiosMessage("CDU_Y", "0"); break; // 
    case '>': sendDcsBiosMessage("CDU_Z", "0"); break; // 
    case 'Y': sendDcsBiosMessage("CDU_DATA", "1"); break; // +/- Rocker neutral
    // Row 8 - Cols * 2 * 4 5 6 7 8 9
    //case 'X': No Button, no Matrix Junction!
    case 'C': sendDcsBiosMessage("CDU_PG", "1"); break; // PG-Rocker neutral
    //case 'V': No Button, no Matrix Junction!
    case 'B': sendDcsBiosMessage("CDU_MK", "0"); break; // 
    case 'N': sendDcsBiosMessage("CDU_SCROLL", "1"); break; // Scroll Waypoint-Names, Blank Rocker neutral
    case 'M': sendDcsBiosMessage("CDU_SCROLL", "1"); break; // Blank Rocker neutral
    case ';': sendDcsBiosMessage("CDU_CLR", "0"); break; // 
    case ':': sendDcsBiosMessage("CDU_FA", "0"); break; // 
    case '+': sendDcsBiosMessage("CDU_DATA", "1"); break; // +/- Rocker neutral
    } // end case RELEASED
  } // end switch getState()
} // end void keypadEvent

 

 

Regards, Vinc

real life: Royal Bavarian Airforce

online: VJS-GermanKnights.de

[sIGPIC][/sIGPIC]

Link to comment
Share on other sites

I don't think I'm going to use a matrix but if I do, I'll definitely use this! Thanks! 

Windows 10

ASRock Z370 Extreme4 LGA 1151 (300 Series) MOBO

intel i7-8700k (Not overclocked)

16 GB Ram

EVGA GeForce GTX 108ti SC Black Edition

SSD

Trackir

Link to comment
Share on other sites

  • 3 weeks later...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...