R2 y L2 en los mandos de Ps4 son gatillos analógicos
Este es el codigo:
int PinMotorA;
int PinMotorB;
int Valor_R2 = map(PS4.R2(), 0, 255, 0, 100); // Mapea de 0-255 a 0-100
int Valor_L2 = map(PS4.L2(), 0, 255, 0, 100); // Mapea de 0-255 a 0-100
int Velocidad = Valor_R2 - Valor_L2; // Resta mapeada
// Variables para intermitentes
unsigned long previousMillisLeft = 0;
unsigned long previousMillisRight = 0;
const long interval = 500; // Intervalo de 500 ms para el parpadeo
bool leftState = false;
bool rightState = false;
void setup() {
// Iniciar comunicación con el controlador PS4
PS4.begin(); // Dirección MAC del ESP32
myServo.attach(servoPin);
myServo.write(servoPos);
pinMode (motorPin, OUTPUT);
pinMode (pinMotorA, OUTPUT);
pinMode (pinMotorB, OUTPUT);
pinMode(Luces_freno, OUTPUT);
pinMode(ZumbadorPin, OUTPUT);
pinMode(LED_INTERMITENTE_L_Pin, OUTPUT);
pinMode(LED_INTERMITENTE_R_Pin, OUTPUT);
pinMode(LED_LUCES_Pin, OUTPUT);
Serial.begin(115200);
}
void loop() {
if (PS4.isConnected()) {
Serial.print("Valor_R2: ");
Serial.print(PS4.R2());
Serial.print(PS4.L2());
Serial.println(Valor_R2);
Serial.print("Valor_L2: ");
Serial.println(Valor_L2);
Serial.print("Velocidad: ");
Serial.println(Velocidad);
if (Velocidad < 0) {
digitalWrite(Luces_freno, HIGH); // Encender LED si está frenando (Velocidad negativa)
} else {
digitalWrite(Luces_freno, LOW); // Apagar LED si no está frenando
}
// Control del motor
if (Velocidad > 0) {
PS4.setRumble(Valor_L2, Valor_R2);
digitalWrite(pinMotorA, LOW);
digitalWrite(pinMotorB, HIGH);
analogWrite(motorPin, Velocidad);
}
else if (Velocidad < 0) {
PS4.setRumble(Valor_L2, Valor_R2);
digitalWrite(pinMotorA, HIGH);
digitalWrite(pinMotorB, LOW);
analogWrite(motorPin, -Velocidad);
}
else {
digitalWrite(pinMotorA, LOW);
digitalWrite(pinMotorB, LOW);
analogWrite(motorPin, 0);
}
// Control del servo motor con el eje Y del joystick izquierdo
int servoY = PS4.LStickY();
servoPos = map(servoY, -128, 127, 0, 180);
myServo.write(servoPos);
// Alternar luces al presionar el botón "Up"
bool lucesState = PS4.Up();
if (lucesState && !lucesPreviousState) {
lucesPressed = !lucesPressed; // Alternar el estado de las luces
Serial.println("Luces alternadas");
}
lucesPreviousState = lucesState;
if (lucesPressed) {
digitalWrite(LED_LUCES_Pin, HIGH); // Encender luces
} else {
digitalWrite(LED_LUCES_Pin, LOW); // Apagar luces
}
// Intermitente izquierdo (Left)
bool leftStatePS4 = PS4.Left();
if (leftStatePS4 && !leftPreviousState) {
leftPressed = !leftPressed; // Alternar el estado del intermitente izquierdo
Serial.println("Intermitente izquierdo alternado");
}
leftPreviousState = leftStatePS4;
// Intermitente derecho (Right)
bool rightStatePS4 = PS4.Right();
if (rightStatePS4 && !rightPreviousState) {
rightPressed = !rightPressed; // Alternar el estado del intermitente derecho
Serial.println("Intermitente derecho alternado");
}
rightPreviousState = rightStatePS4;
// Control del parpadeo de los intermitentes y el sonido del zumbador
unsigned long currentMillis = millis();
// Intermitente izquierdo con sonido
if (leftPressed) {
if (currentMillis - previousMillisLeft >= interval) {
previousMillisLeft = currentMillis;
leftState = !leftState; // Cambiar el estado del LED
digitalWrite(ZumbadorPin, HIGH); // Hacer un sonido mientras parpadea
digitalWrite(LED_INTERMITENTE_L_Pin, leftState ? HIGH : LOW);
}
} else {
digitalWrite(LED_INTERMITENTE_L_Pin, LOW); // Apagar el LED izquierdo
}
// Intermitente derecho con sonido
if (rightPressed) {
if (currentMillis - previousMillisRight >= interval) {
previousMillisRight = currentMillis;
rightState = !rightState; // Cambiar el estado del LED
digitalWrite(LED_INTERMITENTE_R_Pin, rightState ? HIGH : LOW);
digitalWrite(ZumbadorPin, HIGH);
}
} else {
digitalWrite(LED_INTERMITENTE_R_Pin, LOW); // Apagar el LED derecho
}
}
}
Y este el cableado:
Muchas gracias por contestarme.