Jump to content

DCS-BIOS: Sending a Keypad Matrix' Output via RS485


Tekkx

Recommended Posts

Dear Community :)

 

The task is to read out a Keypad Matrix and send these data to DCS by RS-485-Bus.

 

The short way to ask my question is:

Can I still use the sendDcsBiosMessage-Command?

If "NO": Is there a workaround?

 

The whole story so far:

These days I'm on the last steps finalizing my actual project: CDU of the A-10C, connected to DCS without Monitor-Export by VGA.

The whole thing is linked by DCS-BIOS and RS-485.

 

As I work at DCS and DCS-BIOS intermittent, I never reach sth like routine and I forget something from time to time.

 

The Problem (maybe I need just a little poke):

In a previous project (MFD) I already used a Keypad-Matrix and it is advisable to use a Keypad Matrix at the CDU also.

But: Meanwhile has something changed. As I used sth like

sendDcsBiosMessage("CDU_A", "1");

if a Button was depressed, "sendDcsBiosMessage"-Command seems to be obsolete meanwhile (as I can't find it in the control-reference anymore).

There is instead this:

DcsBios::Switch2Pos cduA("CDU_A", PIN);

As I have a Matrix here, operating with a Pin # is not helpful.

Also: The MFD-Project was connected by DCSBIOS_IRQ_SERIAL. The CDU should use RS-485.

 

As the hardware isn't 100% ready made, I did not made (and can't make) any tests at the moment.

I ask just to be prepared and I want upload working code to the AVR at the first attempt as I'm not sure if my hardware is 100% operable :)

 

For your information have a look at this code fragment:

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

// Create the Keypad, initialize an instance of class NewKeypad
Keypad CDUkeypad = Keypad( makeKeymap(CDUbutton), rowPins, colPins, ROWS, COLS );
/// ---------------------------	
void keypadEvent(KeypadEvent CDUbutton){	
switch (CDUkeypad.getState()) {	// gives PRESSED, HOLD or RELEASED
case PRESSED:	
  switch(CDUbutton) { // following commands are fired unique if PRESSED
    // Row 1 - Cols 1 2 3 4 5 6 7 8
	case '1': sendDcsBiosMessage("LSK_3L", "1"); break; // 
	case '2': sendDcsBiosMessage("LSK_5L", "1"); break; // 
	case '3': sendDcsBiosMessage("LSK_7L", "1"); break; // 
	case '4': sendDcsBiosMessage("LSK_9L", "1"); break; // 
	case '5': sendDcsBiosMessage("LSK_3R", "1"); break; // 
	case '6': sendDcsBiosMessage("LSK_5R", "1"); break; // 
	case '7': sendDcsBiosMessage("LSK_7R", "1"); break; // 
	case '8': sendDcsBiosMessage("LSK_9R", "1"); break; //
...
void setup() {
 DcsBios::setup();
}

void loop() {
 DcsBios::loop();
}

 

 

If the thing is finally working, I upload complete paperwork (design- and code-files) here.

Meanwhile you can watch the progress here: https://forums.eagle.ru/album.php?albumid=1431

Stay tuned, I upload new Photos as I took new ones.

 

Thank you for your interest and your help also :)


Edited by Tekkx

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

Hi Tekkx,

 

That's odd. I used the same setup as yours (MFCD) for my CDU;

 

/*
/*
 The following #define tells DCS-BIOS that this is a RS-485 slave device.
 It also sets the address of this slave device. The slave address should be
 between 1 and 126 and must be unique among all devices on the same bus.
*/
#define DCSBIOS_RS485_SLAVE 15

/*
 The Arduino pin that is connected to the
 /RE and DE pins on the RS-485 transceiver.
*/
#define TXENABLE_PIN 2
#include <Keypad.h>
#include "DcsBios.h"

/* paste code snippets from the reference documentation here */
const byte ROWS = 8; //four rows
const byte COLS = 9; //three columns
char keys[ROWS][COLS] = {
 {'!','"','#','c','%','F','L','R','X'},
 {'&','E','K','Q','W','Z'},
 {'|','D','J','P','V','Y','('},
 {')','C','I','O','U','=','@','£','$'},
 {'{','A','B','G','H','M','N','S','T'},
 {':','3','6','9','[','>','/',',','*'},
 {';','2','5','8','0','-','<','}','½'},
 {'+',']','_','a','b','1','4','7','.'},

};
byte rowPins[ROWS] = {13, A0, A1, 12, A2, A3, A4, A5}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {11, 9, 7, 10, 8, 6, 5, 4, 3}; //connect to the column pinouts of the keypad

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



void setup() {
 DcsBios::setup();
 keypad.addEventListener(keypadEvent);  // Add an event listener.
 keypad.setHoldTime(100);               // Default is 1000mS
 keypad.setDebounceTime(50);           // Default is 50mS
}

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

void keypadEvent(KeypadEvent KEY){  
 switch (keypad.getState()) { // gives PRESSED, HOLD or RELEASED
 case PRESSED: 
   switch(KEY) { 
   //CDU
   case 'A': sendDcsBiosMessage("CDU_A", "1"); break; 
   case 'B': sendDcsBiosMessage("CDU_B", "1"); break; 
   case 'C': sendDcsBiosMessage("CDU_C", "1"); break;     
   case 'D': sendDcsBiosMessage("CDU_D", "1"); break; 
   case 'E': sendDcsBiosMessage("CDU_E", "1"); break; 
   case 'F': sendDcsBiosMessage("CDU_F", "1"); break; 
   case 'G': sendDcsBiosMessage("CDU_G", "1"); break; 
   case 'H': sendDcsBiosMessage("CDU_H", "1"); break; 
   case 'I': sendDcsBiosMessage("CDU_I", "1"); break; 
   case 'J': sendDcsBiosMessage("CDU_J", "1"); break; 
   case 'K': sendDcsBiosMessage("CDU_K", "1"); break; 
   case 'L': sendDcsBiosMessage("CDU_L", "1"); break; 
   case 'M': sendDcsBiosMessage("CDU_M", "1"); break; 
   case 'N': sendDcsBiosMessage("CDU_N", "1"); break; 
   case 'O': sendDcsBiosMessage("CDU_O", "1"); break;
   case 'P': sendDcsBiosMessage("CDU_P", "1"); break;
   case 'Q': sendDcsBiosMessage("CDU_Q", "1"); break; 
   case 'R': sendDcsBiosMessage("CDU_R", "1"); break;   
   case 'S': sendDcsBiosMessage("CDU_S", "1"); break;     
   case 'T': sendDcsBiosMessage("CDU_T", "1"); break; 
   case 'U': sendDcsBiosMessage("CDU_U", "1"); break;        
   case 'V': sendDcsBiosMessage("CDU_V", "1"); break; 
   case 'W': sendDcsBiosMessage("CDU_W", "1"); break; 
   case 'X': sendDcsBiosMessage("CDU_X", "1"); break; 
   case 'Y': sendDcsBiosMessage("CDU_Y", "1"); break; 
   case 'Z': sendDcsBiosMessage("CDU_Z", "1"); break; 


   case '0': sendDcsBiosMessage("CDU_0", "1"); break; 
   case '1': sendDcsBiosMessage("CDU_1", "1"); break; 
   case '2': sendDcsBiosMessage("CDU_2", "1"); break; 
   case '3': sendDcsBiosMessage("CDU_3", "1"); break; 
   case '4': sendDcsBiosMessage("CDU_4", "1"); break; 
   case '5': sendDcsBiosMessage("CDU_5", "1"); break; 
   case '6': sendDcsBiosMessage("CDU_6", "1"); break; 
   case '7': sendDcsBiosMessage("CDU_7", "1"); break; 
   case '8': sendDcsBiosMessage("CDU_8", "1"); break; 
   case '9': sendDcsBiosMessage("CDU_9", "1"); break;  
   case '.': sendDcsBiosMessage("CDU_POINT", "1"); break; 
   case '/': sendDcsBiosMessage("CDU_SLASH", "1"); break; 
       
   case '!': sendDcsBiosMessage("CDU_LSK_3R", "1"); break; 
   case '"': sendDcsBiosMessage("CDU_LSK_5R", "1"); break;
   case '#': sendDcsBiosMessage("CDU_LSK_7R", "1"); break;
   case 'c': sendDcsBiosMessage("CDU_LSK_9R", "1"); break;

   case '+': sendDcsBiosMessage("CDU_LSK_3L", "1"); break; 
   case ']': sendDcsBiosMessage("CDU_LSK_5L", "1"); break;
   case '_': sendDcsBiosMessage("CDU_LSK_7L", "1"); break;
   case 'a': sendDcsBiosMessage("CDU_LSK_9L", "1"); break;
   
   case '[': sendDcsBiosMessage("CDU_PG", "2"); break; 
   case '½': sendDcsBiosMessage("CDU_PG", "0"); break; 
   
   case 'b': sendDcsBiosMessage("CDU_SYS", "1"); break; 
   case '{': sendDcsBiosMessage("CDU_NAV", "1"); break; 
   case ')': sendDcsBiosMessage("CDU_WP", "1"); break; 
   case '|': sendDcsBiosMessage("CDU_OSET", "1"); break; 
   case '&': sendDcsBiosMessage("CDU_FPM", "1"); break; 
   case '%': sendDcsBiosMessage("CDU_PREV", "1"); break;  

   case '(': sendDcsBiosMessage("CDU_MK", "1"); break; 
   case '}': sendDcsBiosMessage("CDU_CLR", "1"); break; 
   case '=': sendDcsBiosMessage("CDU_BCK", "1"); break; 
   case '@': sendDcsBiosMessage("CDU_SPC", "1"); break; 
   case '$': sendDcsBiosMessage("CDU_FA", "1"); break; 

   
 }}

 
   switch (keypad.getState()){  // gives PRESSED, HOLD or RELEASED
 case RELEASED: // LMFD 
   switch(KEY) { // Released KEYs or Neutral Rockers signal is sent
   //CDU
   case 'A': sendDcsBiosMessage("CDU_A", "0"); break; 
   case 'B': sendDcsBiosMessage("CDU_B", "0"); break; 
   case 'C': sendDcsBiosMessage("CDU_C", "0"); break;     
   case 'D': sendDcsBiosMessage("CDU_D", "0"); break; 
   case 'E': sendDcsBiosMessage("CDU_E", "0"); break; 
   case 'F': sendDcsBiosMessage("CDU_F", "0"); break; 
   case 'G': sendDcsBiosMessage("CDU_G", "0"); break; 
   case 'H': sendDcsBiosMessage("CDU_H", "0"); break; 
   case 'I': sendDcsBiosMessage("CDU_I", "0"); break; 
   case 'J': sendDcsBiosMessage("CDU_J", "0"); break; 
   case 'K': sendDcsBiosMessage("CDU_K", "0"); break; 
   case 'L': sendDcsBiosMessage("CDU_L", "0"); break; 
   case 'M': sendDcsBiosMessage("CDU_M", "0"); break; 
   case 'N': sendDcsBiosMessage("CDU_N", "0"); break; 
   case 'O': sendDcsBiosMessage("CDU_O", "0"); break;
   case 'P': sendDcsBiosMessage("CDU_P", "0"); break;
   case 'Q': sendDcsBiosMessage("CDU_Q", "0"); break; 
   case 'R': sendDcsBiosMessage("CDU_R", "0"); break;   
   case 'S': sendDcsBiosMessage("CDU_S", "0"); break;     
   case 'T': sendDcsBiosMessage("CDU_T", "0"); break; 
   case 'U': sendDcsBiosMessage("CDU_U", "0"); break;        
   case 'V': sendDcsBiosMessage("CDU_V", "0"); break; 
   case 'W': sendDcsBiosMessage("CDU_W", "0"); break; 
   case 'X': sendDcsBiosMessage("CDU_X", "0"); break; 
   case 'Y': sendDcsBiosMessage("CDU_Y", "0"); break; 
   case 'Z': sendDcsBiosMessage("CDU_Z", "0"); break; 


   case '0': sendDcsBiosMessage("CDU_0", "0"); break; 
   case '1': sendDcsBiosMessage("CDU_1", "0"); break; 
   case '2': sendDcsBiosMessage("CDU_2", "0"); break; 
   case '3': sendDcsBiosMessage("CDU_3", "0"); break; 
   case '4': sendDcsBiosMessage("CDU_4", "0"); break; 
   case '5': sendDcsBiosMessage("CDU_5", "0"); break; 
   case '6': sendDcsBiosMessage("CDU_6", "0"); break; 
   case '7': sendDcsBiosMessage("CDU_7", "0"); break; 
   case '8': sendDcsBiosMessage("CDU_8", "0"); break; 
   case '9': sendDcsBiosMessage("CDU_9", "0"); break;  
   case '.': sendDcsBiosMessage("CDU_POINT", "0"); break; 
   case '/': sendDcsBiosMessage("CDU_SLASH", "0"); break; 
       
   case '!': sendDcsBiosMessage("CDU_LSK_3R", "0"); break; 
   case '"': sendDcsBiosMessage("CDU_LSK_5R", "0"); break;
   case '#': sendDcsBiosMessage("CDU_LSK_7R", "0"); break;
   case 'c': sendDcsBiosMessage("CDU_LSK_9R", "0"); break;

   case '+': sendDcsBiosMessage("CDU_LSK_3L", "0"); break; 
   case ']': sendDcsBiosMessage("CDU_LSK_5L", "0"); break;
   case '_': sendDcsBiosMessage("CDU_LSK_7L", "0"); break;
   case 'a': sendDcsBiosMessage("CDU_LSK_9L", "0"); break;
   
   case '[': sendDcsBiosMessage("CDU_PG", "1"); break; 
   case '½': sendDcsBiosMessage("CDU_PG", "1"); break; 
   
   case 'b': sendDcsBiosMessage("CDU_SYS", "0"); break; 
   case '{': sendDcsBiosMessage("CDU_NAV", "0"); break; 
   case ')': sendDcsBiosMessage("CDU_WP", "0"); break; 
   case '|': sendDcsBiosMessage("CDU_OSET", "0"); break; 
   case '&': sendDcsBiosMessage("CDU_FPM", "0"); break; 
   case '%': sendDcsBiosMessage("CDU_PREV", "0"); break;  

   case '(': sendDcsBiosMessage("CDU_MK", "0"); break; 
   case '}': sendDcsBiosMessage("CDU_CLR", "0"); break; 
   case '=': sendDcsBiosMessage("CDU_BCK", "0"); break; 
   case '@': sendDcsBiosMessage("CDU_SPC", "0"); break; 
   case '$': sendDcsBiosMessage("CDU_FA", "0"); break; 

 }}
} 

 

https://forums.eagle.ru/showpost.php?p=3236594&postcount=159

 

I think I removed something from your original code but can't remember what it was. Got both L/R MFCD and the CDU running with this setup. Which version of Arduino and DCS-BIOS are you running?

 

Cheers

Hans


Edited by Hansolo
Copied the wrong code.
Link to comment
Share on other sites

Hallo Hans (and all friends).

 

It's a strange feeling if your code is cited somewhere in the forum and you can't (the f...n hell) bring your own work into business...

(Joke ends here) :D

 

It makes me happy (and a little bit proud), that you got your CDU running. (I gazed your Thread here: https://forums.eagle.ru/showpost.php?p=3236594&postcount=159)

 

Mine - after solving some heavy hardware issues (some hard to find shorts on the PCB - see Photo) - spits just strange, unrelated code.

 

Could you be so kindly to risk a short view on my code? I went (staring on it for a few hours now) blind for any errors.

 

// ******************************************************************************************
// A-10C CDU Keypad
// adopt ID to your actual bus architecture.
#define DCSBIOS_RS485_SLAVE 100
// ****************************************************************************************** 
/*
 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

#include <Keypad2.h>
#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
// D3, D4 , 5,  6,  7,  11, 10, 9,  8
 {'1','2','3','4','5','6','7','8','9'}, // 12
 {'0','q','w','e','r','t','z','u','i'}, // 13
 {'o','p','a','s','d','f','g','h','j'}, // A0
 {'k','l','(','%','#','<','y','x','c'}, // A1
 {'v','b','n','m','Q','W','E','R','T'}, // A2 - R5
 {'Z','U','I','O','P','A','S','D','F'}, // A3
 {'G','H','J','K','L','Ö','Ä','>','Y'}, // A4
 {'X','C','V','B','N','M',';',':','+'}  // A5
};
// Connect Matrix Rows and Columns to these Arduino pins.
byte rowPins[ROWS] = { 12, 13, A0, A1, A2, A3, A4, A5 };
byte colPins[COLS] = {  3,  4 , 5,  6,  7, 11, 10,  9, 8 }; 

// Create the Keypad, initialize an instance of class NewKeypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
/// ---------------------------	

void setup() {
 DcsBios::setup();
 keypad.addEventListener(keypadEvent);  // Add an event listener. ///hansolo
 keypad.setHoldTime(1000);               // Default is 1000mS ///hansolo
 keypad.setDebounceTime(200);           // Default is 50mS ///hansolo
}

void loop() {
 DcsBios::loop();
 char key = keypad.getKey(); ///hansolo
}

void keypadEvent(KeypadEvent CDUbutton){	
switch (keypad.getState()) {	// gives PRESSED, HOLD or RELEASED///*
case PRESSED:	
  switch(CDUbutton) { // following commands are fired unique if PRESSED
    // Row 1 - Cols 1 2 3 4 5 6 7 8
	case '1': sendDcsBiosMessage("LSK_3L", "1"); break; // 
	case '2': sendDcsBiosMessage("LSK_5L", "1"); break; // 
	case '3': sendDcsBiosMessage("LSK_7L", "1"); break; // 
	case '4': sendDcsBiosMessage("LSK_9L", "1"); break; // 
	case '5': sendDcsBiosMessage("LSK_3R", "1"); break; // 
	case '6': sendDcsBiosMessage("LSK_5R", "1"); break; // 
	case '7': sendDcsBiosMessage("LSK_7R", "1"); break; // 
	case '8': sendDcsBiosMessage("LSK_9R", "1"); break; //
	// case '9': No Button / 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_DIM", "0"); break; // DIM/BRT left
	case 'u': sendDcsBiosMessage("CDU_BRT", "2"); break; // DIM/BRT right
	// case 'i': No Button / 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 / 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 / Matrix Junction!
	case 'C': sendDcsBiosMessage("CDU_PG", "0"); break; // PG-Rocker down
	//case 'V': No Button / 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
} // end case PRESSED (button)
case RELEASED:	
  switch(CDUbutton) { // following commands are fired unique if PRESSED
    // Row 1 - Cols 1 2 3 4 5 6 7 8
	case '1': sendDcsBiosMessage("LSK_3L", "0"); break; // 
	case '2': sendDcsBiosMessage("LSK_5L", "0"); break; // 
	case '3': sendDcsBiosMessage("LSK_7L", "0"); break; // 
	case '4': sendDcsBiosMessage("LSK_9L", "0"); break; // 
	case '5': sendDcsBiosMessage("LSK_3R", "0"); break; // 
	case '6': sendDcsBiosMessage("LSK_5R", "0"); break; // 
	case '7': sendDcsBiosMessage("LSK_7R", "0"); break; // 
	case '8': sendDcsBiosMessage("LSK_9R", "0"); break; //
	// case '9': No Button / 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_DIM", "1"); break; // DIM/BRT left
	case 'u': sendDcsBiosMessage("CDU_BRT", "1"); break; // DIM/BRT right
	// case 'i': No Button / 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 / Matrix Junction!
	case 'H': sendDcsBiosMessage("CDU_PG", "1"); break; // PG-Rocker up
	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 up
	// Row 8 - Cols * 2 * 4 5 6 7 8 9
	//case 'X': No Button / Matrix Junction!
	case 'C': sendDcsBiosMessage("CDU_PG", "1"); break; // PG-Rocker down
	//case 'V': No Button / Matrix Junction!
	case 'B': sendDcsBiosMessage("CDU_MK", "0"); break; // 
	case 'N': sendDcsBiosMessage("CDU_SCROLL", "1"); break; // Scroll Waypoint-Names, Blank Rocker left
	case 'M': sendDcsBiosMessage("CDU_SCROLL", "1"); break; // Blank Rocker right
	case ';': sendDcsBiosMessage("CDU_CLR", "0"); break; // 
	case ':': sendDcsBiosMessage("CDU_FA", "0"); break; // 
	case '+': sendDcsBiosMessage("CDU_DATA", "1"); break; // +/- Rocker down
	} // end case RELEASED
} // end switch getState()
//Serial.println(CDUbutton);
} // end void keypadEvent	

 

RS485-Bus is running fine. Other modules (AAP and SAS) and the second NANO onboard (as I ran out of Pins, I put a second NANO here just for 2x Backlight and CDU on/off) are doing what is intended.

 

Screenshot is done while DCS is paused. I press and release some different Buttons. It looks like they send different but irrelevant code.

Fotograph shows Boneyard of NANOs. They went there while I was searching a short on board inside the button-matrix. Finally I found it: 12 V (from Backlight) touched sometimes(! that's why so hard to find)) Row 5 and grilled this way the Atmega.

887430575_20171103sentByCDU2DCS.PNG.e373d4324fe6ec21196e693c1fe86e0a.PNG

20171104_174322.thumb.jpg.523cb64f432caae6c98befd2f5baf0bd.jpg


Edited by Tekkx

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

Hi Tekkx,

 

That is very strange indeed. I am currently not running the helo CDU as I miss a screen for it, but just plugged it in.

 

This is what I get when DCS is paused;

eHmEII1l.jpg

 

The only difference I noticed it that you are using a <Keypad2.h> and I am running a <Keypad.h>.

All the places both of us are Keypad. I have absolutely no idea but should you be calling Keypad2 in these places or is that completely irrelevant?

 

Cheers

Hans

Link to comment
Share on other sites

Thank you, Hans, for your effort.

 

Keypad2 is just a slightly different version of the Library (never did a deep view on it). I already changed that ... with no desired effect.

 

Looks like I have to go thru the code (again) line by line. Somewhere there must be some "Hickup".

Tomorrow I'll try another ICB (Interface- and Control-Board) and simulate the keypad with a wire bridge. Just to exclude a strange side-effect of my Switchboard.

Also I will open the Library's location and have a closer look at it. So I'll understand (maybe) the intention of Lib's Author. :) :book:

 

But now it's late. Too late. :sleep:

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

Next day's morning: My code is good,

Made the test with another ICB and simulated the Keypad-Matrix with a wire to link a Row with a Column...

 

See the Output: First (about) 10 Lines are CDU, all others are the alternative ICB.

 

Now I have to swallow that bitter Pill: My ICB - special made for CDU - doesn't work.... I could jump arround like Rumpelstiltskin :)

I set my hope on a bad MAX487... (Thank you, Hans, for this straw to clutch on) ;)

 

 

BTW: Did an "investigation" on keypad and keypad2: As I have both libraries "installed", I have just to write a "2" (or not).

I found no significant difference, instead keypad consumes some more Memory. Arduino-IDE gives a Warning: "Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten". (That's the Problem with localized software: It makes it close to impossible to communicate in the Forum)

Warning means: "Short on Memory. Stability is at risk, maybe." :)

 

First Photo: Left is the special ICB for the CDU with 2 RS-485-Transceivers and 2 Arduino NANOs. Right is a "common" ICB for general purposes like AAP or other such simple Modules.

20171105_103312.thumb.jpg.8ac91d830d8a67f2f0f50a575a0051cc.jpg

226206720_20171104sentByCDU2DCS.PNG.e5ad2205224f3c6a3460804cb717bd82.PNG

1892973251_20171104ArduinoWarning.thumb.PNG.8d390b1bb882fcc60053a7900400edaf.PNG


Edited by Tekkx

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

Another 30 Minutes later I found out: Roughly 80 % of my Software-Issues are based on faulty Hardware (own/house made or purchased). This is a bitter knowledge I have to live with. :(

 

Replaced the MAX487 by a DS36276 (was the first Transceiver tumbled in my hands, MAX487 is almost the same) and it works.

 

Now is there some fine tuning of hold- and debounce-Timing to do (as some keys do not exactly work as intended) but the Goal is in Sight. :)

 

Here some Photographs. Before and after. :)

Pay your Attention to the colored markings near of the Headers: This becomes essential, if you look for a needle in the hay-stack (shorts and gaps on the PCB) and you have to watch as one Arduino dies after his forerunner.

At the top-right-bottom of the ICB you can see a Switch and a LED (LED is errected and supported by a 0805-Resistor). These are just for Troubleshooting/Testing of the RS-485: Button sends "Lamp-Test", LED represents "Master Caution"-Light. I think about to add this feature to all ICBs in the Future (if there are Pins left unused).

1476350925_20171105ICB-CDUbefore.thumb.jpg.42103b53bf50efefa9d964a9ea2ab63f.jpg

1386059011_20171105ICB-CDUafterwithDS.thumb.jpg.27e43bfdb217832c7a0aebce86fe98ce.jpg

1266469752_20171105ICB-CDUbottom.thumb.jpg.f2f0eb67054cddecd0530909d9169088.jpg


Edited by Tekkx

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

Learned another thing: I have a german codepage here (maybe, there's a related problem on other codepages): Don't use ä ö ü Ä Ö Ü (deutsch: Umlaute - mutated vowels) for defining the keymap. They do not work!

 

And there is another issue:

If I push a Button, it sends the Code for "PRESSED" and at the "same time" the code for "RELEASED". The effect is already to be seen at the picture in Post #6. There I blamed it to a slacky joint as I connected the Pins just with a piece of wire.

I played some with debounce- and hold-timings: No difference at all.

 

Maybe someone outthere has a clue? (I take anything as I am despaired.)

(I could have solved this problem a long time ago if I ever managed to finish my MFD-Project) ;(

 

Solved. :)

 

I set a

break;

after the

case PRESSED:

Now it works as intended. With a little more of proficiency I could have solved this a while ago :music_whistling:

And so I have no idea why it works at Hans' project without this "break;"... Mystery.

...
	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 (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("LSK_3L", "0"); break; // 
	case '2': sendDcsBiosMessage("LSK_5L", "0"); break; // 
	case '3': sendDcsBiosMessage("LSK_7L", "0"); break; // 
	case '4': sendDcsBiosMessage("LSK_9L", "0"); break; // 
...

354145150_20171105CDUKeypadBounce.PNG.82dc40be5b90cd83098d4d802eeaac08.PNG


Edited by Tekkx

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

And here is the final Code. Copy and adopt it to your Requirements.

Have Fun!

 

// ******************************************************************************************
// 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 is made for the combination of the special 
// - ICB-C-RJ-... (Interface- and Control-Board) and the
// - CDU-SLB ... (CDU-Switch- and Light-Board)
// It should run on any related hardware after some Adaptations.
// There are also sketches for the Backlight and for the LCD available. 
//
// This is the final (pending further notice) and running Version of 2017-11-05.
// ****************************************************************************************** 

#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-...

#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 ä ö ü Ä Ö Ü
// D3, D4 , 5,  6,  7,  11, 10, 9,  8
 {'1','2','3','4','5','6','7','8','9'}, // 12
 {'0','q','w','e','r','t','z','u','i'}, // 13
 {'o','p','a','s','d','f','g','h','j'}, // A0
 {'k','l','(','%','#','<','y','x','c'}, // A1
 {'v','b','n','m','Q','W','E','R','T'}, // A2 - R5
 {'Z','U','I','O','P','A','S','D','F'}, // A3
 {'G','H','J','K','L','*',')','>','Y'}, // A4
 {'X','C','V','B','N','M',';',':','+'}  // A5
};
// 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] = { 12, 13, A0, A1, A2, A3, A4, A5 };
byte colPins[COLS] = {  3,  4 , 5,  6,  7, 11, 10,  9, 8 }; 

// 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_3L", "1"); break; // 
	case '2': sendDcsBiosMessage("CDU_LSK_5L", "1"); break; // 
	case '3': sendDcsBiosMessage("CDU_LSK_7L", "1"); break; // 
	case '4': sendDcsBiosMessage("CDU_LSK_9L", "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	

 

Here is a Dropbox-Link with some Gerbers and the Original Diptrace-Files of ICB and SLB.

https://www.dropbox.com/sh/g2mfkx97mz8igxl/AAADacYudCVqoEnOyYIhzsGya?dl=0

If you encounter any kind of problem: Tell me.

Diptrace-Files you can open with Diptrace Freeware Version (even the SLB exceeds the 300-Pin-Barrier) as long you do not add (or change?) anything.

 

And here is a Link to some Photographs: https://forums.eagle.ru/album.php?albumid=1431

(No BB-Code fpr Albums?)


Edited by Tekkx

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

First og all Tekkx I am very glad you got it solved despite hardware issues :cry:

 

And so I have no idea why it works at Hans' project without this "break;"... Mystery.

 

Can it be because my code has double '}' ??

void keypadEvent(KeypadEvent KEY){  
 switch (keypad.getState()) { // gives PRESSED, HOLD or RELEASED
 case PRESSED: 
   switch(KEY) { 
   //CDU
   case 'A': sendDcsBiosMessage("CDU_A", "1"); break; 
   ... 
 }}
 
   switch (keypad.getState()){  // gives PRESSED, HOLD or RELEASED
 case RELEASED: // LMFD 
   switch(KEY) { // Released KEYs or Neutral Rockers signal is sent
   //CDU
   case 'A': sendDcsBiosMessage("CDU_A", "0"); break; 
   ...
 }}
}

 

 

Anyway glad you got it solves :thumbup:

 

Cheers

Hans

Link to comment
Share on other sites

Dear Hans. There is no reason for crying... except for being choked up :)

 

Contrary to what I thought before, your double-brackets are NOT the same as mine.

Each "{" that has been opened has to be closed somewhere (best case: after the function).

 

You begin a new "switch ... getState()" after "case PRESSED:" is over for asking for which key is "RELEASED:".

void keypadEvent(KeypadEvent KEY){  
 switch (keypad.getState()) { // gives PRESSED, HOLD or RELEASED
 case PRESSED: 
   switch(KEY) { 
   //CDU
   case 'A': sendDcsBiosMessage("CDU_A", "1"); break; 
   case 'B': sendDcsBiosMessage("CDU_B", "1"); break; 
...
}}
   switch (keypad.getState()){  // gives PRESSED, HOLD or RELEASED //HERE IS THE DIFFERENCE
 case RELEASED: // LMFD 
   switch(KEY) { // Released KEYs or Neutral Rockers signal is sent
   //CDU
   case 'A': sendDcsBiosMessage("CDU_A", "0"); break; 
   case 'B': sendDcsBiosMessage("CDU_B", "0"); break; 
...

So you have to close two functions. Conveniently you solve this in just one line. :)

 

I made a nested construct, NOT closing "switch ... getState()".

void keypadEvent(...){  // opened keypadEvent	
switch (CDUkeys.getState()) { // opened outer "switch"
           case PRESSED:
       switch(CDUbutton) { // opened inner "switch"
                 case '1': sendDcsBiosMessage(...); break; // 
                 ....
                 } // closes inner "switch"
           }; // end switch case PRESSED
Tekkx   ->        break; // in place of Hans' second bracket 
Hansolo-> }  // this bracket closes "switch(... getState...)"  
Hansolo-> switch (CDUkeys.getState()) { // this starts a new one
           case RELEASED:
             switch() {
                case '1': ... ; break;
                .....
                } // end switch case RELEASED
            } // end switch getState(), in place of "break;"
} // closes keypadEvent

Hope, I met the matter.

 

So I have to write a "break;" (as we did after every inner "case" for leaving the switch-case-monster.

This does NOT mean, I understand this matter. :)

 

Hope, you get me. It isn't easy to explain even using my own language.

It took me almost half an hour to find that out.

 

Someday this is read by a real programmer. He or she will explain to all of us :)

 

PS: Will edit this post many times... maybe :)


Edited by Tekkx

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

The switch statement in C++ jumps to the first 'case' statement that matches and starts executing the code there. It then continues executing statements within the same switch...case construct until

(a) the end of the switch...case block,

(b) or any statement that causes the control flow to leave the current block of code, such as break, continue or return.

 

In general, it's always a good idea to add a break; after every case, even if it is the last case in the statement, just so you don't forget when you add another case later.

 

If you have a switch statement with a single case, you might as well use an if statement instead.

 

Technically, Tekkx's variant (one switch statement) and Hansolo's (two switch statements) are not interchangeable because one calls keypad.getState() once and the other calls it twice. But as that function just returns the result of the last matrix scan, the difference in execution time would be measured in nanoseconds.

Link to comment
Share on other sites

  • 2 weeks later...

Sorry mate, I am a complete Neanderthal to Arduino.

 

I hope I havnt picked a complex project to start with, Im no good with capacitors and the use of them.

 

Are there any diagrams of how I can make that matrix that turns approx 12 inputs into 60??

 

i get the basic idea, the software takes or sends into to DCS, some of the pins are digital others arent...

 

and a pin A + B and ground make 3 inputs instead of 2, and A+B+C makes 7 inputs not 3....

 

I can also solder.

 

and basically once i get the libraries loaded on the nano then I can get it to talk to DCS which shouldnt be too hard).

 

I would just like to see a schematic and if you use capcitors why and what do they so? So I can learn what they do, i learn by knowing why not ust do this and do that.....

 

Also, any links to great nano tutorials and hackerspace type projects will help, im a few months off the F/A-18 inspired pit.


Edited by Mr_Burns
Link to comment
Share on other sites

...

I hope I havnt picked a complex project to start with, Im no good with capacitors and the use of them.

...

 

Dear Mr_Burns: Don't fear! We do not need any Capacitors to connect Switches to an Arduino :)

 

First: It is not possible to turn 12 Inputs into 60.

Maybe, we have to clarify, what "Matrix" means:

 

Take a piece of paper and draw some (not too much!!!) horizontal, parallel (means: they mustn't touch each other) straight lines on it. Get it?

Now draw in similar way some vertical lines which cross these horizontal lines. Get it?

 

Now count your horizontal lines: This is value "A". Write it down!

Now count your vertical lines: This is value "B". Write it also!

Now count all Intersections between your vertical and horizontal lines: This is value "C".

 

Now multiply "A" by "B". The value of the result should be the same as the value of "C". Get it?

 

Imagine, each drawed line is a piece of wire and at each Intersection we could set a Button to connect 2 lines. Each vertical Line is linked to an Output, each horizontal Line is linked to an Input of our Arduino. So "C" is equal to the maximum amount of Buttons we can have in our Matrix.

 

What do this mean? With 12 Inputs you can make a Matrix with a Maximum of 36 Intersections (6 multiplied by 6 as we just have 6+6=12 Pins), where the amount of Intersections is the same as the number of different Output-Values.

(If 6x6 is the max Quantity you can easily test by tryout 6x6=36, 5x7=35, 4x8=32 aso.)

Maybe the feasible Maximum (in our example) is less than the calculated Maximum, cause we need 6 (half of 12) Pins that we can configure as Output. Analog Pins of the Arduino aren't available for setting them as Output. This is reserved just to the digital Pins D2 to D13.

 

I have attached a Schematic of a simple 3_by_3_Matrix. The diodes are just necessary, if you want to press more than one button at the same time. This will happen if you use not just momentary buttons (as for a keypad) but switches that stay where you switched them. You can follow the lines in the Schematic: If you want to connect a special Col with a special Row, there will be just ONE appropriate Switch (or Button) which is to close.

Here is an example (code):

char keys[3][3] = {  
// Define the Keymap / upper and lower cases matter
 {'1','2','3'}, 
 {'4','5','6'}, 
 {'7','8','9'}
};
// Connect Matrix Rows and Columns to these Arduino pins.
byte rowPins[ROWS] = { Input1, Input2, Input3 }; // any free Pin is useable, except A6 and A7
                                                                          // just present at NANO
byte colPins[COLS] = {  Output1, Output2, Output3 }; // just digital Pins

- If you want to get "5" as the result, you have to connect Col2 and Row2

- If you want to get "6" as the result, you have to connect Col3 and Row2

...

 

Important Note: No Ground (GND) is involved in such a Matrix!!! Buttons and Switches connect just Outputs to Inputs (which represents Cols and Rows)!

 

Drawing a Matrix on a paper is very easy. Problems will turn up if you start to wire these (worst case: different) switches.

To keep track, you (and me and most others also) HAVE TO make a good plan and appropriate markings on all wires. :)

 

And: To get a steep learning curve make sure, your first project do not become too complex. Every little fault can lead you down the meadow... (I know what I talk about :))

SimpleButtonMatrix2.PNG.e6d710ee14388eec4c9e86eea968c09b.PNG

SimpleButtonMatrix.thumb.PNG.e0cb7c5bcd635ac7b417e01014f9a676.PNG


Edited by Tekkx
replaced faulty schematics

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

Sorry to bump, I want to make a matrix this weekend,

 

Could you advise on any of these for ease of use/re-use etc, the press and peel seems easiest but not sure if there is an issue with an inkjet rather than a laser printer as it specifies:

 

https://www.jaycar.com.au/press-n-peel-pcb-film/p/HG9980

 

https://www.jaycar.com.au/pcb-etching-kit/p/HG9990

Link to comment
Share on other sites

Hallo Mr_Burns.

As I have no experiences with those materials I can't give any helpful information.

What kind of Matrix do you plan to make?

 

I forgot to answer (While I did some think-about your last question other matters came in front of that. Sorry.) your last question about "making a Matrix of Potentiometers...".

The short answer is: No!

The long answer is: No! Interpreting the Output of a Matrix by DCS-BIOS is just possible, if the "keypad function" sends explicit values. Visualize your Matrix as a Map (Countryside or City - no matter): If you have to describe a special point on this map you have to tell two explicit coordinates. Call them X and Y. If you say: "X is about ... and Y is about ... " you'll never find your target.

Matrixes made of Pots are sometimes used to mix different Audio-Signals to different Outputs. But even this is complicated as there are Op-Amps (Operation-Amplifiers) at each Pot to prevent unwanted Feedback, Crosstalking and other unwanted interfering behavior.

Type "Matrix Potentiometer" into the input mask of any search engine and you'll see.

 

Connecting more than 10 Pots to your Cockpit shouldn't generate an insoluble problem: Thanks to the Implementation of RS-485 to the DCS-BIOS-System in conjunction with the extreme low prices of Arduino (and Family) you can add an adequate amount of Arduinos to your system.

 

If you want to build a Matrix with generic Switches or Buttons, you'd rather create it of wires which are soldered from Switch to Switch.

It is just a question of planning (best with a piece of paper) and recording (also with pencil and paper).

 

I do not recommend etching of PCBs to beginners. More than ever double-sided ones (means PCBs, not Beginners). It is tricky, expensive, dirty, destructive (if you don't care enough) and toxic (to the user and to the environment).

 

Counterproposal:

Obtain a few pieces of different(!) colored thin wire (25 to 22 AWG, stranded or not doesn't matter - I started a few years ago with a stripped LAN-Patch-Cable), a good tool for dismantling and try it this way.

Example: (typed just "matrix switches wired" into Google Photos. First hit is linked here)

https://goo.gl/images/Retwes

 

Open a new Thread for this project. Maybe it is interesting to others too. Good Luck!


Edited by Tekkx

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

Hi Tekkx

I see you are having issues with shorts on you PCBs. I too went through a period of smoke arising from various circuits I built with my own PCBs. I did find a solution to the problem.

https://www.microscope.com/student-microscopes/middle-high-school-student-microscopes/motic-motic-sfc11-educational-dual-power-stereo-microscope.html

I use this after every board is cut. Tiny pieces of copper were getting stuck between traces. These pieces were not visible unless I used the scope. I haven't lost a single component since then. Other than my CNC mill, this is the second most used piece of equipment in my shop.

There are also digital high magnification USB pen style cameras that work well. I started using one but it died after 3 or 4 months. The microscope is far easier to spot shorts and that would be my first recommendation. I also believe there are less costly units available if you shop around.

 

Best of luck Tekkx.

Regards

John W

aka WarHog.

 

My Cockpit Build Pictures...



John Wall

 

My Arduino Sketches ... https://drive.google.com/drive/folders/1-Dc0Wd9C5l3uY-cPj1iQD3iAEHY6EuHg?usp=sharing

 

 

WIN 10 Pro, i8-8700k @ 5.0ghz, ASUS Maximus x Code, 16GB Corsair Dominator Platinum Ram,



AIO Water Cooler, M.2 512GB NVMe,

500gb SSD, EVGA GTX 1080 ti (11gb), Sony 65” 4K Display

VPC MongoosT-50, TM Warthog Throttle, TRK IR 5.0, Slaw Viper Pedals

Link to comment
Share on other sites

Hi Warhog. Pleased to see you. :)

 

Don't gras me up to the others: I have a similar Microscope here. :music_whistling:

It is just a question of patience (or better: the lack of it). It's an awful boring job to stare at each trace of a PCB with 65 buttons. It has been the first time, I encountered such a problem. All other PCBs I made are not at this size. So a close visual inspection isn't that problem. :)

 

I cleaned an etched PCB (few years ago, one of my first trials) with ultra fine steel wool: Never again!!!!!

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

As I wrote, you need for Rows and Cols DIFFERENT Pins. Means:

  • each Row has to connect to precise ONE Pin,
  • each Col has to connect to precise ONE Pin.

So the answer to your question is NO.

Your Pots will work.

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

 

hdtaBXx.jpg

 

Now you get it:

Look at your Table (BTW: well done):

You have just one mistake: Replace the names of the Heads of your Cols and Rows. You cant use a Pin twice!!!

Use (examplification!) D2 to D5 as Cols and all other D..s as Rows.

 

Examination Question 1: How many Buttons (Maximum) can you connect if you have 11 Inputs/Outputs (D2 to D13)?

 

Q2: How is a Pot to connect to an Arduino?

Manual for my version of RS485-Hardware, contact: tekkx@dresi.de

Please do not PM me with DCS-BIOS-related questions. If the answer might also be useful to someone else, it belongs in a public thread where it can be discovered by everyone using the search function. Thank You.

Link to comment
Share on other sites

  • Recently Browsing   0 members

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