diff --git a/.gitignore b/.gitignore index e5d44bf..9ecf2dd 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,8 @@ # Do not ignore git files in the root of the repo. !/.git* +!/Arduino/** + # Do not ignore current project's `.uproject`. !/*.uproject diff --git a/Arduino/dinput/dinput.ino b/Arduino/dinput/dinput.ino new file mode 100644 index 0000000..5df5816 --- /dev/null +++ b/Arduino/dinput/dinput.ino @@ -0,0 +1,175 @@ +#include +#include + +//comment this line for debugging +#define HID +#ifdef HID +//https://github.com/MHeironimus/ArduinoJoystickLibrary +#include +Joystick_ Joystick(0x03, JOYSTICK_TYPE_GAMEPAD); +#endif + +#define BTN_PIN 12 +#define UP_PIN 8 +#define DOWN_PIN 9 +#define LEFT_PIN 11 +#define RIGHT_PIN 10 + +#define MULTIPLEXER 0x70 + +#define LASER_FLOOR 5 //increase to increate the minimum distance + +#define ABS(val) (val > 0 ? val : -val) + +//on sépare les instances de la librarie car je ne lui fais pas confiance pour opérer plusieurs lasers à la fois +Adafruit_VL6180X lasers[3]; +bool allLaserReady = true; + + +bool laser1State = true; +bool laser2State = true; +bool laser3State = true; + +void selectI2C(uint8_t i) { + if (i > 7) return; + + Wire.beginTransmission(MULTIPLEXER); + Wire.write(1 << i); + Wire.endTransmission(); +} + +void setup_laser(uint8_t laser) { + selectI2C(laser); + Wire.beginTransmission(0x29); + if(!Wire.endTransmission()) { + lasers[laser] = Adafruit_VL6180X(); + lasers[laser].begin(); + } + else { + allLaserReady = false; + #ifndef HID + Serial.print("Laser "); + Serial.print(laser); + Serial.println(" not found"); + #endif + } +} + +void setup() { + pinMode(UP_PIN, INPUT_PULLUP); + pinMode(DOWN_PIN, INPUT_PULLUP); + pinMode(LEFT_PIN, INPUT_PULLUP); + pinMode(RIGHT_PIN, INPUT_PULLUP); + pinMode(BTN_PIN, INPUT_PULLUP); + + Wire.begin(); + + #ifndef HID + Serial.begin(9600); + #else + Joystick.begin(); + Joystick.setXAxisRange(-1, 1); + Joystick.setYAxisRange(-1, 1); + Joystick.setRxAxisRange(-1,1); + #endif + + + setup_laser(0); + setup_laser(1); + setup_laser(2); + + // si les laser ne sont pas detecter on bloque le systeme en clignotant + if(!allLaserReady) { + pinMode(LED_BUILTIN, OUTPUT); + while(1) { + digitalWrite(LED_BUILTIN, true); + delay(1000); + digitalWrite(LED_BUILTIN, false); + delay(1000); + } + } else { + digitalWrite(LED_BUILTIN, true); + } +} + +bool lastBtnState = false; +unsigned int lastRead = 0; +int lastxaxis = 0; +int lastyaxis = 0; +void loop() { + // put your main code here, to run repeatedly: + const bool button = digitalRead(BTN_PIN); + + #ifdef HID + if(button != lastBtnState) { + Joystick.setButton(0, !button); + lastBtnState = button; + } + + int xaxis = !digitalRead(LEFT_PIN) - !digitalRead(RIGHT_PIN); + if(xaxis != lastxaxis) { + Joystick.setXAxis(xaxis); + lastxaxis = xaxis; + } + + int yaxis = !digitalRead(UP_PIN) - !digitalRead(DOWN_PIN); + if(yaxis != lastyaxis) { + Joystick.setYAxis(yaxis); + lastyaxis = yaxis; + } + + + //set the up / down to the right stick + unsigned int slider = analogRead(A0); + if(ABS(slider - lastRead) > 8) + Joystick.setRyAxis(slider); + + + selectI2C(0); + bool newState = lasers[0].readRange() < LASER_FLOOR; + if(newState != laser1State) { + Joystick.setButton(1, newState); + laser1State = newState; + } + + selectI2C(1); + newState = lasers[1].readRange() - 15 < LASER_FLOOR; + if(newState != laser2State) { + //2 & 4 car 2 est censé être le bouton X mais est cable sur 4 + Joystick.setButton(2, newState); + Joystick.setButton(4, newState); + laser2State = newState; + } + + selectI2C(2); + newState = lasers[2].readRange() - 17 < LASER_FLOOR; + if(newState != laser3State) { + Joystick.setButton(3, newState); + laser3State = newState; + } + + #else + float slider = analogRead(A0) / 1023.0 * 100; + Serial.print("Slider: "); + Serial.println(slider); + Serial.print("btn: "); + Serial.println(button); + + // o- 13 20 30 + // c- 0 15 16 + + selectI2C(0); + Serial.println("Laser Bas"); + Serial.println(lasers[0].readRange()); + Serial.println(lasers[0].readRange() < LASER_FLOOR); + selectI2C(1); + Serial.println("Laser Mid"); + Serial.println(lasers[1].readRange()); + Serial.println(lasers[1].readRange() - 15 < LASER_FLOOR); + selectI2C(2); + Serial.println("Laser Haut"); + Serial.println(lasers[2].readRange()); + Serial.println(lasers[2].readRange() - 17 < LASER_FLOOR); + delay(1000); + #endif +} diff --git a/Arduino/xbox/xbox.ino b/Arduino/xbox/xbox.ino new file mode 100644 index 0000000..f8ab9d7 --- /dev/null +++ b/Arduino/xbox/xbox.ino @@ -0,0 +1,175 @@ +#include +#include + +//comment this line for debugging +#define HID +#ifdef HID +// /!\ You need Both and be care full reading the install instruction of the ArduinoXInput_AVR repository +//https://github.com/dmadison/ArduinoXInput_AVR +//https://github.com/dmadison/ArduinoXInput +#include +#endif + +#define BTN_PIN 12 +#define UP_PIN 8 +#define DOWN_PIN 9 +#define LEFT_PIN 11 +#define RIGHT_PIN 10 + +#define MULTIPLEXER 0x70 + +#define LASER_FLOOR 5 //increase to increate the minimum distance + +#define ABS(val) (val > 0 ? val : -val) + +//Constante a ne pas changer +#define JOYSTICK_MAX_VALUE 32767 + +//on sépare les instances de la librarie car je ne lui fais pas confiance pour opérer plusieurs lasers à la fois +Adafruit_VL6180X lasers[3]; +bool allLaserReady = true; + + +bool laser1State = true; +bool laser2State = true; +bool laser3State = true; + +void selectI2C(uint8_t i) { + if (i > 7) return; + + Wire.beginTransmission(MULTIPLEXER); + Wire.write(1 << i); + Wire.endTransmission(); +} + +void setup_laser(uint8_t laser) { + selectI2C(laser); + Wire.beginTransmission(0x29); + if(!Wire.endTransmission()) { + lasers[laser] = Adafruit_VL6180X(); + lasers[laser].begin(); + } + else { + allLaserReady = false; + #ifndef HID + Serial.print("Laser "); + Serial.print(laser); + Serial.println(" not found"); + #endif + } +} + +void setup() { + pinMode(UP_PIN, INPUT_PULLUP); + pinMode(DOWN_PIN, INPUT_PULLUP); + pinMode(LEFT_PIN, INPUT_PULLUP); + pinMode(RIGHT_PIN, INPUT_PULLUP); + pinMode(BTN_PIN, INPUT_PULLUP); + + Wire.begin(); + + #ifndef HID + Serial.begin(9600); + #else + XInput.setAutoSend(true); // Wait for all controls before sending + XInput.begin(); + #endif + + + setup_laser(0); + setup_laser(1); + setup_laser(2); + + // si les laser ne sont pas detecter on bloque le systeme en clignotant + if(!allLaserReady) { + pinMode(LED_BUILTIN, OUTPUT); + while(1) { + digitalWrite(LED_BUILTIN, true); + delay(1000); + digitalWrite(LED_BUILTIN, false); + delay(1000); + } + } else { + digitalWrite(LED_BUILTIN, true); + } +} + +bool lastBtnState = false; +unsigned int lastRead = 0; +int lastxaxis = 0; +int lastyaxis = 0; +void loop() { + const bool button = digitalRead(BTN_PIN); + + #ifdef HID + if(button != lastBtnState) { + XInput.setButton(BUTTON_A, !button); + lastBtnState = button; + } + + //get the position from -1 to 1 + int xaxis = !digitalRead(LEFT_PIN) - !digitalRead(RIGHT_PIN); + if(xaxis != lastxaxis) { + XInput.setJoystickX(JOY_LEFT, xaxis * JOYSTICK_MAX_VALUE); + lastxaxis = xaxis; + } + + //get the position from -1 to 1 + int yaxis = !digitalRead(UP_PIN) - !digitalRead(DOWN_PIN); + if(yaxis != lastyaxis) { + XInput.setJoystickY(JOY_LEFT, yaxis * JOYSTICK_MAX_VALUE); + lastyaxis = yaxis; + } + + //set the up / down to the right stick + unsigned int slider = analogRead(A0) / 1023.0 * JOYSTICK_MAX_VALUE; + if(ABS(slider - lastRead) > 8) + XInput.setJoystickY(JOY_RIGHT, slider); + + + selectI2C(0); + bool newState = lasers[0].readRange() < LASER_FLOOR; + if(newState != laser1State) { + XInput.setButton(BUTTON_B, newState); + laser1State = newState; + } + + selectI2C(1); + newState = lasers[1].readRange() - 15 < LASER_FLOOR; + if(newState != laser2State) { + XInput.setButton(BUTTON_Y, newState); + laser2State = newState; + } + + selectI2C(2); + newState = lasers[2].readRange() - 17 < LASER_FLOOR; + if(newState != laser3State) { + XInput.setButton(BUTTON_X, newState); + laser3State = newState; + } + + #else + float slider = analogRead(A0) / 1023.0 * 100; + Serial.print("Slider: "); + Serial.println(slider); + Serial.print("btn: "); + Serial.println(button); + + // o- 13 20 30 + // c- 0 15 16 + + selectI2C(0); + Serial.println("Laser Bas"); + Serial.println(lasers[0].readRange()); + Serial.println(lasers[0].readRange() < LASER_FLOOR); + selectI2C(1); + Serial.println("Laser Mid"); + Serial.println(lasers[1].readRange()); + Serial.println(lasers[1].readRange() - 15 < LASER_FLOOR); + selectI2C(2); + Serial.println("Laser Haut"); + Serial.println(lasers[2].readRange()); + Serial.println(lasers[2].readRange() - 17 < LASER_FLOOR); + delay(1000); + #endif +}