Logbook entry

Gromet / 19 Oct 3305
Arduino Thumbstick Thrust Vector Controller added to T.16000m Joystick

Recently, i discovered online that a PS2 Joystick could be added to another Joystick via an Arduino board. Project complete and it works. Photos are in the Gallery.

I couldn't figure out how to code it myself because that stuff is just really confusing. So, after a little search on the internet, I found code that worked with just a few modifications. Posted below:

// ***************************************************************************************
// *
// * Core | Everything within this document is proprietary to Core Dynamics.
// * Dynamics | Any unauthorized duplication will be subject to prosecution.
// *
// * Department : (R+D)^2
// * Sub Dept: Programming
// * Location ID: 856-45B
// * (c) 2856 Core Dynamics
// ***************************************************************************************
// *
// * PROJECTID: (#UNDEFINED) Revision: 00000000.01A
// * TEST CODE: QACODE: A565 CENSORCODE: .,.8JFnEg_pnz6(*
// *
// ***************************************************************************************
// * Programmer Notes:
// *
// * Coder: Robert Lebowski
// * Support Coder: Thomas Whatshisname *need to look this up later
// * --- Apnd:
// * Other Sources: https://www.instructables.com/id/Arduino-LeonardoMicro-as-Game-ControllerJoystick/
// * Based on Comment by Goustoulos
// *
// * Purpose:
// * Microcontroller code for secondary thumb joystick to replace pilots tendencies
// * to control vertical and horizontal thrust with the HAT controls. Really, a HAT on
// * a joystick is pathetic. It really is nothing more than 4 buttons. We do not need
// * a HAT Control on a joystick. 1 HAT control on a joystick is 1 HAT control too
// * many. We need this thumb joystick instead and in its place.
// *
// * Note about behavior: The joystick has been designed for trust vectoring on a non
// * certified component. This code is designed to provide fine control of 0 to up to
// * 45 percent thrust in the joystick's 0 to 90 percent range from center. Exceed the
// * 90 percent range and thrust will be at 100 percent. These values are configurable.
// *
// * *** L. I was joking. I recieved the wedding invitation. I ***
// * *** I can't wait to attend the wedding and I really wish ***
// * *** the two of you the best. ***
// *
// * La de da, de da. Things have been getting slow in this department ever since the
// * AI programmers have been installed in the system. I want to get up and get a cup
// * of coffee and just sit back and browse the net, but the coding manager told us to
// * look busy during our inspection. The Lieutenant is litery 9 meters away so I'm just
// * sitting here typing stuff. La de da is a reference number.
// *
// * To be honest, I kinda like this code. It took a few hours to put up and, although
// * its dirty, it runs really well. It is also, cleaner, in respects to the AI generated
// * code. Much more compact and even has a hint of personality that ships for CD had before.
// * Not to mention, smaller and can be redundant on multiple systems.
// *
// ***************************************************************************************

#include "Joystick.h"
Joystick_ Joystick;

// Vars -----

// Enable Serial Monitor for testing
const boolean booTest = false;
// Testing Data Collection
// These two variables are kinda stupid. Why cant I conditionally scope local vaibles at compile time.
// Better to assign them here and not use them, than to create and destroy them with every cycle.
int tstxAxis = 0;
int tstyAxis = 0;


// give the system a break in miliseconds.
const int resttime = 8;

// Inverse Axis
const boolean booXInverse = false;
const boolean booYInverse = true;

// Dedzone -- nope, let the system handle it.
//const int intXdeadzone = 0;
//const int intYdeadzone = 0;

// Tuning -- instead.
// In futuer, auto tune this on controller start based on first
// first read position and distance from 512.
const int intXtune = 6;
const int intYtune = 7;

// Precision slope and Breakaway Point
// Slope is rep by 1/#. eg, Slope 2 = 1/2 = .5, 4 = .25, ...
// Break point . 9 represents 90%
const int intSlopeTune = 2;
const float intBreakTune = .98;

// HARDWARE HACK
// Voltage flow offset: 3.3V is 1.5151, 5V is 1
// w 3.3 v range is 0 = 675.84 and mid is 337.92 -note
// Calc XYMid = 338, XYMax 0 - 676 -note
const float floVOffset = 1.5151;

// Adjust joystick end to end limits value.
// doesnt work yet and never finished.
//const float floMag = .3;

void setup() {
// put your setup code here, to run once:

if (booTest == true)
{
Serial.begin(9600);
}

Joystick.begin();
Joystick.setXAxis(0);
Joystick.setYAxis(0);

pinMode(6, INPUT_PULLUP);

// Unused Pins
// I want more buttons. I really dont have enough buttons on the joystick.
// These are placeholders.
//pinMode(7, INPUT_PULLUP);
//pinMode(8, INPUT_PULLUP);
//pinMode(9, INPUT_PULLUP);
//pinMode(10, INPUT_PULLUP);
//pinMode(11, INPUT_PULLUP);
//pinMode(12, INPUT_PULLUP);
//pinMode(13, INPUT_PULLUP);

int lastButtonState = 0;
}

void loop()
{
// Grabbing Data ---

int button0Val =digitalRead(6);

//int button1Val =digitalRead(7);
//int button2Val =digitalRead(8);
//int button3Val =digitalRead(9);
//int button4Val =digitalRead(10);
//int button5Val =digitalRead(11);
//int button6Val =digitalRead(12);
//int button7Val =digitalRead(13);

int xAxis = analogRead(A0);
int yAxis = analogRead(A1);

// Testing Data Collection
if (booTest == true)
{
tstxAxis = xAxis;
tstyAxis = yAxis;
}

// Calculations ---
// should I float these? Yeah, why not.
float joyxVal = int(floVOffset * xAxis);
float joyyVal = int(floVOffset * yAxis);

// Inversion with Tuning
if (booXInverse == true)
{
joyxVal = 1024 - joyxVal + intXtune;
}
else
{
joyxVal = joyxVal + intXtune;
}

if (booYInverse == true)
{
joyyVal = 1024 - joyyVal + intYtune;
}
else
{
joyyVal = joyyVal + intYtune;
}

// Deadzone -- not using. Tuning instead.
// X
//if (joyxVal <= (512 - intXdeadzone)
//{
// joyxVal = joyxVal + intXdeadzon;
//}

// Post Processing
// Precision and Breakaway. !!!Yes, I can use functions but im lazy.

// X ***********
if (joyxVal > 512)
{
if (joyxVal < (1024 * intBreakTune))
{
joyxVal = (((joyxVal - 512) / intSlopeTune) + 512);
}
else
{
joyxVal = 1024;
}
}
else //if (joyxVal < 512)
{
if (joyxVal > (1024 - (1024 * intBreakTune)))
{
joyxVal = (((joyxVal - 512) / intSlopeTune) + 512);
}
else
{
joyxVal = 0;
}
}

// Y *********
if (joyyVal > 512)
{
if (joyyVal < (1024 * intBreakTune))
{
joyyVal = (((joyyVal - 512) / intSlopeTune) + 512);
}
else
{
joyyVal = 1024;
}
}
else //if (joyyVal < 512)
{
if (joyyVal > (1024 - (1024 * intBreakTune)))
{
joyyVal = (((joyyVal - 512) / intSlopeTune) + 512);
}
else
{
joyyVal = 0;
}
}
// Really, I stole this code from Tom, down the hall. I peeked at how he was
// handling the Scarab's, servy system thing, steering mechanism. Makes sence.
// If a pilot is pushing the stick to its limit, he wants full power.
// Also, this eliminates 2 problems. I dont need to be check for values exceeding
// limits being passed. And, I dont' have to worry about that dang x^3 curve. Oh,
// the AI thinks its so smart by programming its cool curves and all. I think
// <REDACTED>

// Execution ---
Joystick.setXAxis(int(joyxVal));
Joystick.setYAxis(int(joyyVal));
Joystick.setButton(0, !button0Val);

//Joystick.setButton(1, !button1Val);
//Joystick.setButton(2, !button2Val);
//Joystick.setButton(3, !button3Val);
//Joystick.setButton(4, !button4Val);
//Joystick.setButton(5, !button5Val);
//Joystick.setButton(6, !button6Val);
//Joystick.setButton(7, !button7Val);

// Testing Output
if (booTest == true)
{
Serial.print(" X = ";
Serial.print(tstxAxis);
Serial.print(" Y = ";
Serial.print(tstyAxis);
Serial.println();
Serial.print("Joy X = ";
Serial.print(joyxVal);
Serial.print(" Joy Y = ";
Serial.print(joyyVal);
Serial.println();
Serial.println();

// Serial.print(27,BYTE); // clear screen - Not sure how to print escape sequences.
}

// Slow delay if in testing mode.
if (booTest == true)
{
delay(250);
}
else
{
delay(resttime);
}

}

// Closing Notes: Codes a mess but it works. I got another idea while writing it. I
// am going to issue a request to the AI Programer System to see if it can read data
// from the ship global sensor array system and convert that data into environmental sound.
// Its a win win. If it can't, It will prove the AI system as a sham. If it can, I will
// impress that cute little test pilot I see from time to time. She is the best.
Do you like it?
2
Shiny!

CMDR's logbook

CMDR Gromet
Freelancer / Mercenary
10 Nov 3302
Sightseeing
Gromet
06 Oct 3302
Questioning
Gromet
15 Sep 3302
The Tip Off
Gromet
19 Aug 3302
New Beginnings
Gromet
26 Jun 3302
A Loss
Gromet
25 May 3302
Staying Low Key
Gromet
03 May 3302
A Few Details For Memory
Gromet
Show CMDR's logbook

Other logbooks

today
My first run
TAGau
yesterday
Pegasus Run 3305 - Day 55
Flemish Jack
yesterday
The Factory
EvilWasper
yesterday
Pegasus Run 3305 - Colonia
Vel Eshti
yesterday
Hello from Colonia
Palps
yesterday
Reminiscing
Corbzy Snr