Linux compatibility #1

Merged
jarno merged 2 commits from linux into master 2020-01-06 07:35:17 +02:00
1 changed files with 114 additions and 62 deletions

View File

@ -1,6 +1,6 @@
/************************************************************************************ /************************************************************************************
* Throttle Quadrant using Arduino Micro & slide potentiometers * Throttle Quadrant using Arduino Micro & slide potentiometers
* version 1.0 * version 1.11
* *
* https://github.com/jarnorankinen/ThrottleQuadrant * https://github.com/jarnorankinen/ThrottleQuadrant
* *
@ -14,17 +14,26 @@
* Shows up as three joysticks, all named "Arduino Micro", use simulators own interface to bind the controls to correct axis. * Shows up as three joysticks, all named "Arduino Micro", use simulators own interface to bind the controls to correct axis.
* It may be necessary to invert some axis. * It may be necessary to invert some axis.
* *
* Calibration: (for xa-axis in this example) * Calibration: (for throttle_l-axis in this example, you only need to do this once or after hardware modifications)
* - Set calib = true * - Set calib = true
* - Upload to Arduino * - Upload to Arduino
* - Open the serial monitor * - Open the serial monitor
* - Move the slilder corresponding to xa-axis to its min & max positions * - Move the slider corresponding to throttle_l-axis to its min & max positions
* - Note the min & max values of xa * - Note the min & max values of throttle_l
* - Input the values to xamin & xamax * - Input the values to throttle_lmin & throttle_lmax
* - Upload to Arduino * - Upload to Arduino
* - Repeat for each axis * - Repeat for each axis
* - Afterwards set calib == false & Upload to Arduino
* - Remember to calibrate controller in the simulator
* *
* Future features: input averaging to filter the slight movements of levers in simulator * Changelog:
*
* v1.0 Initial release
*
* v1.1 Switched to Joystick.h (single joystick library) for hassle-free Linux support. Changed behavior to update joystick axis output value
* only if raw value changes more than +/-3, to filter input and allow simultaneous keyboard control.
*
* v1.11 Added rule to ignore spike values outside min-max range
* *
**********************************************************************************/ **********************************************************************************/
@ -32,35 +41,48 @@
#include "Joystick3.h" #include "Joystick.h"
uint16_t xa = 0; // raw data from the slider uint16_t throttle_l = 0; // raw data from the slider
uint16_t xamin = 14, xamax = 236; //min & max values for calibration uint16_t throttle_lmin = 14, throttle_lmax = 236; //min & max values for calibration
int xa_axis = 0; // the value to give to the Joystick axis int throttle_l_axis = -128; // the value to give to the Joystick axis
int tl_old = -128;
uint16_t ya = 0; uint16_t throttle_r = 0;
uint16_t yamin = 14, yamax = 234; uint16_t throttle_rmin = 14, throttle_rmax = 234;
int ya_axis = 0; int throttle_r_axis = -128;
int tr_old = -128;
uint16_t xb = 0; uint16_t prop_l = 0;
uint16_t xbmin = 14, xbmax = 226; uint16_t prop_lmin = 14, prop_lmax = 226;
int xb_axis = 0; int prop_l_axis = 127;
int pl_old = 127;
uint16_t yb = 0; uint16_t prop_r = 0;
uint16_t ybmin = 14, ybmax = 232; uint16_t prop_rmin = 14, prop_rmax = 232;
int yb_axis = 0; int prop_r_axis = 359;
int pr_old = 359;
uint16_t xc = 0; uint16_t mix_l = 0;
uint16_t xcmin = 15, xcmax = 231; uint16_t mix_lmin = 15, mix_lmax = 231;
int xc_axis = 0; int mix_l_axis = 0;
int ml_old = 0;
uint16_t yc = 0; uint16_t mix_r = 0;
uint16_t ycmin = 15, ycmax = 235; uint16_t mix_rmin = 15, mix_rmax = 235;
int yc_axis = 0; int mix_r_axis = 0;
int mr_old = 0;
double rotation_multip = 1.591;
/************* SET THIS AS true TO TURN CALIBRATION ON********************/ /************* SET THIS AS true TO TURN CALIBRATION ON********************/
bool calib = false; //Serial monitor on/off bool calib = false; //Serial monitor on/off
unsigned int delta(uint16_t a, uint16_t b) {
int x = a - b;
return abs(x);
}
void setup() { void setup() {
//Check that these are correct for your build //Check that these are correct for your build
@ -72,60 +94,90 @@ void setup() {
pinMode(A5, INPUT_PULLUP); //yc pinMode(A5, INPUT_PULLUP); //yc
Serial.begin(9600); Serial.begin(9600);
Joystick[0].begin(); Joystick.begin(false);
Joystick[1].begin();
Joystick[2].begin(); tl_old = throttle_l = analogRead(A0);
tr_old = throttle_r = analogRead(A1);
pl_old = prop_l = analogRead(A2);
pr_old = prop_r = analogRead(A3);
ml_old = mix_l = analogRead(A4);
mr_old = mix_r = analogRead(A5);
} }
void loop() { void loop() {
xa = analogRead(A0);
xa_axis = 256*xa/(xamax-xamin+5) - 128 - xamin; //convert raw values -> -128 - 128 (roughly, joystick calibration is still recommended via e.g. Windows joystick interface)
ya = analogRead(A1); throttle_l = analogRead(A0);
ya_axis = 256*ya/(yamax-yamin+5) - 128 - yamin; if (calib == false && (throttle_l > throttle_lmax)) throttle_l = throttle_lmax;
if (calib == false && (throttle_l < throttle_lmin)) throttle_l = throttle_lmin;
throttle_l_axis = 256*throttle_l/(throttle_lmax-throttle_lmin+5) - 128 - throttle_lmin; //convert raw values -> -128 - 128 (roughly, joystick calibration is still recommended via e.g. Windows joystick interface)
xb = analogRead(A2); throttle_r = analogRead(A1);
xb_axis = 256*xb/(xbmax-xbmin+5) - 128 - xbmin; if (calib == false && (throttle_r > throttle_rmax)) throttle_r = throttle_rmax;
if (calib == false && (throttle_r < throttle_rmin)) throttle_r = throttle_rmin;
throttle_r_axis = 256*throttle_r/(throttle_rmax-throttle_rmin+5) - 128 - throttle_rmin;
yb = analogRead(A3); prop_l = analogRead(A2);
yb_axis = 256*yb/(ybmax-ybmin+5) - 128 - ybmin; if (calib == false && (prop_l > prop_lmax)) prop_l = prop_lmax;
if (calib == false && (prop_l < prop_lmin)) prop_l = prop_lmin;
prop_l_axis = 256*prop_l/(prop_lmax-prop_lmin+5) - 128 - prop_lmin;
xc = analogRead(A4); prop_r = analogRead(A3);
xc_axis = 256*xc/(xcmax-xcmin+5) - 128 - xcmin; if (calib == false && (prop_r > prop_rmax)) prop_r = prop_rmax;
if (calib == false && (prop_r < prop_rmin)) prop_r = prop_rmin;
prop_r_axis = prop_r * rotation_multip - (prop_rmin + 5);
yc = analogRead(A5); mix_l = analogRead(A4);
yc_axis = 256*yc/(ycmax-ycmin+5) - 128 - ycmin; if (calib == false && (mix_l > mix_lmax)) mix_l = mix_lmax;
if (calib == false && (mix_l < mix_lmin)) mix_l = mix_lmin;
mix_l_axis = mix_l * rotation_multip - (mix_lmin + 5);
mix_r = analogRead(A5);
if (calib == false && (mix_r > mix_rmax)) mix_r = mix_rmax;
if (calib == false && (mix_r < mix_rmin)) mix_r = mix_rmin;
mix_r_axis = 254*(mix_r - mix_rmin)/(mix_rmax - mix_rmin);
if(calib==true) { //Serial monitor for calibration if(calib==true) { //Serial monitor for calibration
Serial.println(); Serial.println();
Serial.print("xa=");Serial.print(xa); Serial.print("throttle_l=");Serial.print(throttle_l);
Serial.print(" -> "); Serial.print(" -> ");
Serial.print("xa_axis=");Serial.println(xa_axis); Serial.print("throttle_l_axis=");Serial.println(throttle_l_axis);
Serial.print("ya=");Serial.print(ya); Serial.print("throttle_r=");Serial.print(throttle_r);
Serial.print(" -> "); Serial.print(" -> ");
Serial.print("ya_axis=");Serial.println(ya_axis); Serial.print("throttle_r_axis=");Serial.println(throttle_r_axis);
Serial.print("xb=");Serial.print(xb); Serial.print("prop_l=");Serial.print(prop_l);
Serial.print(" -> "); Serial.print(" -> ");
Serial.print("xb_axis=");Serial.println(xb_axis); Serial.print("prop_l_axis=");Serial.println(prop_l_axis);
Serial.print("yb=");Serial.print(yb); Serial.print("prop_r=");Serial.print(prop_r);
Serial.print(" -> "); Serial.print(" -> ");
Serial.print("yb_axis=");Serial.println(yb_axis); Serial.print("prop_r_axis=");Serial.println(prop_r_axis);
Serial.print("xc=");Serial.print(xc); Serial.print("mix_l=");Serial.print(mix_l);
Serial.print(" -> "); Serial.print(" -> ");
Serial.print("xc_axis=");Serial.println(xc_axis); Serial.print("mix_l_axis=");Serial.println(mix_l_axis);
Serial.print("yc=");Serial.print(yc); Serial.print("mix_r=");Serial.print(mix_r);
Serial.print(" -> "); Serial.print(" -> ");
Serial.print("yc_axis=");Serial.println(yc_axis); Serial.print("mix_r_axis=");Serial.println(mix_r_axis);
}
Serial.println(mix_l);
//Serial.println(mix_l_axis);
if (delta(throttle_l_axis, tl_old)>3 || delta(throttle_r_axis, tr_old)>3 || delta(prop_l_axis, pl_old)>3 || delta(prop_r_axis, pr_old)>3 || delta(mix_l_axis, ml_old)>3 || delta(mix_r_axis, mr_old)>3){
if (delta(throttle_l_axis, tl_old)<200 || delta(throttle_r_axis, tr_old)<200 || delta(prop_l_axis, pl_old)<200 || delta(prop_r_axis, pr_old)<200 || delta(mix_l_axis, ml_old)<200 || delta(mix_r_axis, mr_old)<200){
tl_old = throttle_l_axis;
tr_old = throttle_r_axis;
pl_old = prop_l_axis;
pr_old = prop_r_axis;
ml_old = mix_l_axis;
mr_old = mix_r_axis;
Joystick.setXAxis(throttle_l_axis);
Joystick.setYAxis(throttle_r_axis);
Joystick.setZAxis(prop_l_axis);
Joystick.setXAxisRotation(prop_r_axis);
Joystick.setYAxisRotation(mix_l_axis);
Joystick.setRudder(mix_r_axis);
Joystick.sendState();
}
} }
delay(20);
//Set the axis values using Joystick library
Joystick[0].setXAxis(xa_axis);
Joystick[0].setYAxis(ya_axis);
Joystick[1].setXAxis(xb_axis);
Joystick[1].setYAxis(yb_axis);
Joystick[2].setXAxis(xc_axis);
Joystick[2].setYAxis(yc_axis);
} }