SHOW:
|
|
- or go back to the newest paste.
1 | - | /* Simple HSI Knobs Sketch for Falcon BMS / DCS / FSX |
1 | + | /* Modified HSI Knobs Sketch for Falcon BMS / DCS / FSX |
2 | * with additional 3rd Rotary Encoder (Z Axis) | |
3 | - | * by SemlerPDX June2019 |
3 | + | * *(coming next: a 3-way Toggle Switch add-on) |
4 | * for Arduino Micro/Leonardo / Sparkfun Pro Micro or equiv. clones | |
5 | - | * ( https://veterans-gaming.com/blogs/entry/32-diy-custom-game-controller-2-dial-hsi-course-and-heading-knobs/ ) |
5 | + | * by SemlerPDX Aug2019 |
6 | - | * |
6 | + | |
7 | * ( in response to reply at: | |
8 | * http://veterans-gaming.com/index.php?/blogs/entry/32-diy-custom-game-controller-2-dial-hsi-course-and-heading-knobs/ ) | |
9 | * | |
10 | - | * |
10 | + | |
11 | * Rotary Encoder 1 - (OUTA-OUTB-SW) = Arduino Pins (0,1,15) | |
12 | - | * https://www.pjrc.com/teensy/td_libs_Encoder.html |
12 | + | |
13 | - | * |
13 | + | * Rotary Encoder 3 - (OUTA-OUTB-SW) = Arduino Pins (9,10,7) |
14 | - | * Joystick Library |
14 | + | * |
15 | * Encoder Library | |
16 | * http://www.pjrc.com/teensy/td_libs_Encoder.html | |
17 | * | |
18 | * Joystick Library | |
19 | * by Matthew Heironimus | |
20 | * https://github.com/MHeironimus/ArduinoJoystickLibrary | |
21 | */ | |
22 | ||
23 | #define ENCODER_USE_INTERRUPTS | |
24 | - | // Tell the Encoder Library which pins have encoders |
24 | + | |
25 | #include <Encoder.h> | |
26 | #include <Joystick.h> | |
27 | ||
28 | - | // Rotary Encoder Push Button Pins |
28 | + | //Tell the Encoder Library which pins have encoders |
29 | - | int buttonArray[2] = {15, 6}; |
29 | + | |
30 | - | const int numButtons = sizeof(buttonArray) / sizeof(buttonArray[0]); |
30 | + | |
31 | Encoder axisZRotation(9, 10); | |
32 | - | // Rotary Encoder Interrupt Pins |
32 | + | |
33 | //Rotary Encoder Push Button Pins | |
34 | int buttonArray[3] = {15, 6, 7}; | |
35 | ||
36 | //Rotary Encoder Interrupt Pins | |
37 | int EncoderPin0 = 0; | |
38 | - | // Delay Time between loops |
38 | + | |
39 | int EncoderPin2 = 2; | |
40 | int EncoderPin3 = 3; | |
41 | - | // Variables to compare current to old values |
41 | + | int EncoderPin4 = 9; |
42 | int EncoderPin5 = 10; | |
43 | ||
44 | //Delay Time between loops | |
45 | int debounceDelay = 260; | |
46 | ||
47 | - | // Intervals for Jump/Warp Speed Rotations |
47 | + | //Variables to compare current to old values |
48 | int oldX = 0; | |
49 | int oldY = 0; | |
50 | int oldZ = 0; | |
51 | - | // Set generic joystick using id 42 with 2 buttons and 2 axes |
51 | + | |
52 | int RyAxis_Value = 1; | |
53 | - | 0x04, 2, 0, |
53 | + | int RzAxis_Value = 1; |
54 | - | false, false, false, true, true, false, |
54 | + | |
55 | //Intervals for Jump/Warp Speed Rotations | |
56 | int JumpSpeed = 18; | |
57 | int WarpSpeed = 30; | |
58 | ||
59 | //Set generic joystick with id 42 with 3 buttons and 3 axes | |
60 | - | // Set Encoder Pins as Pullups |
60 | + | |
61 | 0x04, 3, 0, | |
62 | false, false, false, true, true, true, | |
63 | false, false, false, false, false); | |
64 | ||
65 | ||
66 | - | // Loop through buttons and set them as Pullups |
66 | + | |
67 | - | for (int x = 0; x < numButtons; x++) { |
67 | + | |
68 | //Set Encoder Pins as Pullups | |
69 | pinMode(EncoderPin0, INPUT_PULLUP); | |
70 | pinMode(EncoderPin1, INPUT_PULLUP); | |
71 | - | // Set Range of custom Axes |
71 | + | |
72 | pinMode(EncoderPin3, INPUT_PULLUP); | |
73 | pinMode(EncoderPin4, INPUT_PULLUP); | |
74 | pinMode(EncoderPin5, INPUT_PULLUP); | |
75 | ||
76 | //Loop through buttons and set them as Pullups | |
77 | for(int x = 0; x < sizeof(buttonArray); x++) { | |
78 | pinMode(buttonArray[x], INPUT_PULLUP); | |
79 | } | |
80 | ||
81 | //Set Range of custom Axes | |
82 | Joystick.setRxAxisRange(0, 359); | |
83 | Joystick.setRyAxisRange(0, 359); | |
84 | - | for (int x = 0; x < numButtons; x++) { |
84 | + | Joystick.setRzAxisRange(0, 359); |
85 | ||
86 | // Initialize Joystick Library | |
87 | Joystick.begin(false); | |
88 | ||
89 | } | |
90 | ||
91 | - | if (newX != oldX) { |
91 | + | |
92 | - | RxAxis_Value = getAxisVal(newX, oldX, RxAxis_Value); |
92 | + | |
93 | ||
94 | // Loop through button pin values & set to Joystick | |
95 | for (int x = 0; x < sizeof(buttonArray); x++) { | |
96 | byte currentButtonState = !digitalRead(buttonArray[x]); | |
97 | Joystick.setButton(x, currentButtonState); | |
98 | } | |
99 | ||
100 | - | if (newY != oldY) { |
100 | + | |
101 | - | RyAxis_Value = getAxisVal(newY, oldY, RyAxis_Value); |
101 | + | |
102 | int newX = axisXRotation.read(); | |
103 | if (newX > oldX) { | |
104 | //Determine speed of increment & set output | |
105 | int difX = newX - oldX; | |
106 | RxAxis_Value = speedVal(difX, RxAxis_Value, 1); | |
107 | - | // Send Joystick info through USB |
107 | + | |
108 | axisXRotation.write(newX); | |
109 | oldX = newX; | |
110 | ||
111 | }else if (newX < oldX) { | |
112 | //Determine speed of decrement & set output | |
113 | - | // Function to return Rotation Value adjusted for the turning speed |
113 | + | int difX = oldX - newX; |
114 | - | int speedVal(int val) { |
114 | + | RxAxis_Value = speedVal(difX, RxAxis_Value, 0); |
115 | - | if (val >= WarpSpeed) { |
115 | + | |
116 | - | val = WarpSpeed; |
116 | + | |
117 | - | } else if (val >= JumpSpeed) { |
117 | + | |
118 | - | val = JumpSpeed; |
118 | + | |
119 | - | } else { |
119 | + | |
120 | - | val = 1; |
120 | + | |
121 | // Read "Course" Y Axis Rotation Encoder Knob | |
122 | int newY = axisYRotation.read(); | |
123 | if (newY > oldY) { | |
124 | //Determine speed of increment & set output | |
125 | int difY = newY - oldY; | |
126 | - | // Function to return modified Rotation Axis Value |
126 | + | RyAxis_Value = speedVal(difY, RyAxis_Value, 1); |
127 | - | int getAxisVal(int newVal, int oldVal, int val) { |
127 | + | |
128 | - | if (newVal > oldVal) { |
128 | + | |
129 | - | // Determine speed of increment & set output |
129 | + | |
130 | - | newVal = newVal - oldVal; |
130 | + | |
131 | - | val = val + speedVal(newVal); |
131 | + | }else if (newY < oldY) { |
132 | - | } else if (newVal < oldVal) { |
132 | + | //Determine speed of decrement & set output |
133 | - | // Determine speed of decrement & set output |
133 | + | int difY = oldY - newY; |
134 | - | newVal = oldVal - newVal; |
134 | + | RyAxis_Value = speedVal(difY, RyAxis_Value, 0); |
135 | - | val = val - speedVal(newVal); |
135 | + | |
136 | axisYRotation.write(newY); | |
137 | oldY = newY; | |
138 | - | // Correct Rotation Value within 360 degrees |
138 | + | |
139 | - | val = (val % 360 + 360) % 360; |
139 | + | |
140 | ||
141 | // Read "QNH" Z Axis Rotation Encoder Knob | |
142 | int newZ = axisZRotation.read(); | |
143 | if (newZ > oldZ) { | |
144 | //Determine speed of increment & set output | |
145 | int difZ = newZ - oldZ; | |
146 | RzAxis_Value = speedVal(difZ, RzAxis_Value, 1); | |
147 | Joystick.setRzAxis(RzAxis_Value); | |
148 | axisZRotation.write(newZ); | |
149 | oldZ = newZ; | |
150 | ||
151 | }else if (newZ < oldZ) { | |
152 | //Determine speed of decrement & set output | |
153 | int difZ = oldZ - newZ; | |
154 | RzAxis_Value = speedVal(difZ, RzAxis_Value, 0); | |
155 | Joystick.setRzAxis(RzAxis_Value); | |
156 | axisZRotation.write(newZ); | |
157 | oldZ = newZ; | |
158 | } | |
159 | ||
160 | ||
161 | //Send Joystick info through USB | |
162 | Joystick.sendState(); | |
163 | delay(debounceDelay); | |
164 | } | |
165 | ||
166 | ||
167 | //Function to set Rotation value adjusted for the turning speed | |
168 | int speedVal(int dif, int val, int dir){ | |
169 | if (dif >= WarpSpeed) { | |
170 | if (dir == 1) { | |
171 | val = val + WarpSpeed; | |
172 | }else{ | |
173 | val = val - WarpSpeed; | |
174 | } | |
175 | }else if (dif >= JumpSpeed) { | |
176 | if (dir == 1) { | |
177 | val = val + JumpSpeed; | |
178 | }else{ | |
179 | val = val - JumpSpeed; | |
180 | } | |
181 | }else{ | |
182 | if (dir == 1) { | |
183 | val = val + 1; | |
184 | }else{ | |
185 | val = val - 1; | |
186 | } | |
187 | } | |
188 | //Correct Rotation within 360 deg. | |
189 | if (val < 0) { | |
190 | val = val + 360; | |
191 | }else if (val >= 360) { | |
192 | val = val - 360; | |
193 | } | |
194 | return val; | |
195 | } |