SemlerPDX

Modified HSI+QNH+3xToggle Arduino Sketch for Falcon BMS / DCS / FSX

Sep 23rd, 2019 (edited)
543
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Modified HSI Knobs Sketch for Falcon BMS / DCS / FSX
  2.  *  with additional 3rd Rotary Encoder (Z Axis)
  3.  *    also with a 3-way Toggle Switch as buttons
  4.  *  for Arduino Leonardo or equiv. clones
  5.  * by SemlerPDX Sep2019
  6.  * VETERANS-GAMING.COM
  7.  * ( in response to reply at:
  8.  *    https://veterans-gaming.com/index.php?/blogs/entry/32-diy-custom-game-controller-2-dial-hsi-course-and-heading-knobs/ )
  9.  *  
  10.  *  Rotary Encoders need 2 Intterupt Pins Each - Choose a board that has enough like Arduino Leonardo (or clones)
  11.  *    info on Interrupts: https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
  12.  *  
  13.  *  Pins:
  14.  *  Rotary Encoder 1 - (OUTA-OUTB-SW) = Arduino Pins (0,1,15)
  15.  *  Rotary Encoder 2 - (OUTA-OUTB-SW) = Arduino Pins (2,3,6)
  16.  *  Rotary Encoder 3 - (OUTA-OUTB-SW) = Arduino Pins (9,10,7)
  17.  *  
  18.  *  Three-Way Toggle - (Center Post)  = Analog Input (A1)
  19.  *  
  20.  *  Three-Way Toggle Switch Wiring Example:
  21.  * https://veterans-gaming.com/uploads/monthly_2019_09/three_way_toggle_wiring_arduino.png.1524289e8f56690c7ff6d9f321904de9.png
  22.  *  
  23.  *  Encoder Library
  24.  * https://www.pjrc.com/teensy/td_libs_Encoder.html
  25.  *
  26.  *  Joystick Library
  27.  * by Matthew Heironimus
  28.  * https://github.com/MHeironimus/ArduinoJoystickLibrary
  29.  */
  30. #define ENCODER_USE_INTERRUPTS
  31. #define ENCODER_OPTIMIZE_INTERRUPTS
  32. #include <Encoder.h>
  33. #include <Joystick.h>
  34.  
  35. //Three Way Toggle Init
  36. #define TOGGLE_PIN A1
  37. int previousState;
  38. bool aToggled;
  39.  
  40. //Rotary Encoder Push Button Pins
  41. //  *further buttons added must increment after these (these are 0,1,2) (buttons 1,2 and 3 on controller)
  42. int buttonArray[3] = {15, 6, 7};
  43.  
  44. //Set Toggle Positions as Buttons* (buttons start at 0,1,2,3,4,5 for 6 buttons)
  45. int ToggleButton1 = 3; //button 4 on controller
  46. int ToggleButton2 = 4; //button 5 on controller
  47. int ToggleButton3 = 5; //button 6 on controller
  48.  
  49. //Rotary Encoder Interrupt Pins
  50. int EncoderPin0 = 0;
  51. int EncoderPin1 = 1;
  52. int EncoderPin2 = 2;
  53. int EncoderPin3 = 3;
  54. int EncoderPin4 = 9;   //*Must have board with 6 total interrupt pins
  55. int EncoderPin5 = 10;  //*Must have board with 6 total interrupt pins
  56.  
  57. //Tell the Encoder Library which pins have encoders
  58. Encoder axisXRotation(EncoderPin0, EncoderPin1);
  59. Encoder axisYRotation(EncoderPin2, EncoderPin3);
  60. Encoder axisZRotation(EncoderPin4, EncoderPin5);
  61.  
  62. //Delay Time between loops
  63. int debounceDelay = 260;
  64.  
  65. //Delay Time before button release
  66. int toggleDebounce = 10;
  67.  
  68. //Intervals for Jump/Warp Speed Rotations
  69. int JumpSpeed = 18;
  70. int WarpSpeed = 30;
  71.  
  72. //Set generic joystick with id 42 with 6 buttons and 3 axes
  73. Joystick_ Joystick(0x42,
  74.   0x04, 6, 0,
  75.   false, false, false, true, true, true,
  76.   false, false, false, false, false);  
  77.  
  78. //Variables to compare current to old values
  79. int oldX = 0;
  80. int oldY = 0;
  81. int oldZ = 0;
  82. int RxAxis_Value = 1;
  83. int RyAxis_Value = 1;
  84. int RzAxis_Value = 1;
  85.  
  86.  
  87. //Function to translate Three-way Toggle Analog Value
  88. int getToggleState(int aVal) {
  89.   if (aVal < 100) {
  90.     aVal = ToggleButton1;
  91.   }else if (aVal < 900) {
  92.     aVal = ToggleButton3;
  93.   }else{
  94.     aVal = ToggleButton2;
  95.   }
  96.   return aVal;
  97. }
  98.  
  99. //Function to set Rotation value adjusted for the turning speed
  100. int speedVal(int dif, int val, int dir) {
  101.   int increment = 1;
  102.   if (dif >= WarpSpeed) {
  103.     increment = WarpSpeed;
  104.   }else if (dif >= JumpSpeed) {
  105.     increment = JumpSpeed;
  106.   }
  107.   if (dir == 1) {
  108.     val = val + increment;
  109.   }else{
  110.     val = val - increment;
  111.   }
  112.   //Correct Rotation within 360 deg.
  113.   if (val < 0) {
  114.     val = val + 360;
  115.   }else if (val >= 360) {        
  116.     val = val - 360;
  117.   }
  118.   return val;
  119. }
  120.  
  121.  
  122. void setup() {
  123.  
  124.   //Toggle Switch Setup
  125.   previousState = 1000;
  126.   aToggled = false;
  127.  
  128.   //Loop through Encoder Pins and set them as Pullups
  129.   for (int x = 0; x < 6; x++) {
  130.     pinMode(EncoderPin[x], INPUT_PULLUP);
  131.   }
  132.  
  133.   //Loop through buttons and set them as Pullups
  134.   for (int x = 0; x < sizeof(buttonArray); x++) {
  135.     pinMode(buttonArray[x], INPUT_PULLUP);
  136.   }
  137.  
  138.   //Set Range of custom Axes
  139.   Joystick.setRxAxisRange(0, 359);
  140.   Joystick.setRyAxisRange(0, 359);
  141.   Joystick.setRzAxisRange(0, 359);
  142.  
  143.   // Initialize Joystick Library
  144.   Joystick.begin(false);
  145.  
  146. }
  147.  
  148.  
  149. void loop() {
  150.  
  151.   // Loop through button pin values & set to Joystick
  152.   for (int x = 0; x < sizeof(buttonArray); x++) {
  153.     byte currentButtonState = !digitalRead(buttonArray[x]);
  154.     Joystick.setButton(x, currentButtonState);
  155.   }
  156.  
  157.  
  158.   //Read Three Way Toggle
  159.   int analogValue = analogRead(TOGGLE_PIN);
  160.   int actualState = getToggleState(analogValue);
  161.   if (previousState != actualState) {
  162.     //Set Toggle Switch input as Button Press
  163.     Joystick.setButton(actualState, 1);
  164.     previousState = actualState;
  165.     aToggled = true;
  166.    
  167.   }else{
  168.     //Reset button(s) to unpressed state
  169.     if (aToggled) {
  170.       aToggled = false;
  171.       delay (toggleDebounce);
  172.       for (int a = 3; a < 6; a++) {
  173.         Joystick.setButton(a, 0);
  174.       }
  175.     }
  176.   }
  177.  
  178.  
  179.   // Read "Heading" X Axis Rotation Encoder Knob
  180.   int newX = axisXRotation.read();
  181.   if (newX > oldX) {
  182.     //Determine speed of increment & set output
  183.     int difX = newX - oldX;
  184.     RxAxis_Value = speedVal(difX, RxAxis_Value, 1);
  185.     Joystick.setRxAxis(RxAxis_Value);
  186.     axisXRotation.write(newX);
  187.     oldX = newX;
  188.  
  189.   }else if (newX < oldX) {
  190.     //Determine speed of decrement & set output
  191.     int difX = oldX - newX;
  192.     RxAxis_Value = speedVal(difX, RxAxis_Value, 0);
  193.     Joystick.setRxAxis(RxAxis_Value);
  194.     axisXRotation.write(newX);
  195.     oldX = newX;
  196.   }
  197.  
  198.  
  199.   // Read "Course" Y Axis Rotation Encoder Knob
  200.   int newY = axisYRotation.read();
  201.   if (newY > oldY) {
  202.     //Determine speed of increment & set output
  203.     int difY = newY - oldY;
  204.     RyAxis_Value = speedVal(difY, RyAxis_Value, 1);
  205.     Joystick.setRyAxis(RyAxis_Value);
  206.     axisYRotation.write(newY);
  207.     oldY = newY;
  208.  
  209.   }else if (newY < oldY) {
  210.     //Determine speed of decrement & set output
  211.     int difY = oldY - newY;
  212.     RyAxis_Value = speedVal(difY, RyAxis_Value, 0);
  213.     Joystick.setRyAxis(RyAxis_Value);
  214.     axisYRotation.write(newY);
  215.     oldY = newY;
  216.   }
  217.  
  218.  
  219.   // Read "QNH" Z Axis Rotation Encoder Knob
  220.   int newZ = axisZRotation.read();
  221.   if (newZ > oldZ) {
  222.     //Determine speed of increment & set output
  223.     int difZ = newZ - oldZ;
  224.     RzAxis_Value = speedVal(difZ, RzAxis_Value, 1);
  225.     Joystick.setRzAxis(RzAxis_Value);
  226.     axisZRotation.write(newZ);
  227.     oldZ = newZ;
  228.  
  229.   }else if (newZ < oldZ) {
  230.     //Determine speed of decrement & set output
  231.     int difZ = oldZ - newZ;
  232.     RzAxis_Value = speedVal(difZ, RzAxis_Value, 0);
  233.     Joystick.setRzAxis(RzAxis_Value);
  234.     axisZRotation.write(newZ);
  235.     oldZ = newZ;
  236.   }
  237.  
  238.  
  239.   //Send Joystick info through USB
  240.   Joystick.sendState();
  241.   delay(debounceDelay);
  242. }
Add Comment
Please, Sign In to add comment