Added arduino code

This commit is contained in:
marc barbier
2023-04-06 22:31:48 +02:00
parent 452aba9d43
commit 59d91e68d9
3 changed files with 352 additions and 0 deletions
+175
View File
@@ -0,0 +1,175 @@
#include <Wire.h>
#include <Adafruit_VL6180X.h>
//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 <XInput.h>
#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
}