Kenpilot Posted February 19, 2022 Posted February 19, 2022 (edited) 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 February 19, 2022 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
No1sonuk Posted February 19, 2022 Posted February 19, 2022 DCS-BIOS automatically applies the INPUT_PULLUP mode for button inputs when you use the applicable control reference code. For a CDU, though, you'll probably want to use some kind of matrix, which requires more coding.
Kenpilot Posted February 19, 2022 Author Posted February 19, 2022 Awesome, thanks No1sonuk!! 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
Vinc_Vega Posted February 28, 2022 Posted February 28, 2022 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]
Kenpilot Posted March 4, 2022 Author Posted March 4, 2022 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
Rapti Posted March 6, 2022 Posted March 6, 2022 I have done the CDU without any resistor for the buttons. Just for the LED's
byteman59 Posted March 26, 2022 Posted March 26, 2022 Am i to understand that i am to use NO pullup resisitor for switches. Use resistors only for LED?
Vinc_Vega Posted March 26, 2022 Posted March 26, 2022 Yes, if using the DCS-Bios library the pullups should already be activ for standard inputs. Regards, Vinc Regards, Vinc real life: Royal Bavarian Airforce online: VJS-GermanKnights.de [sIGPIC][/sIGPIC]
Recommended Posts