'
Resumen
Este texto estará oculto
Hola buenas, mi proyecto se trata de un coche que utiliza una esp32 con sensores (ultrasonico,servo), ademas de un boton, un l298n i una lcd en al que se proyecta la distancia. Necesito ayuda urgente ya que por separado los sensores funcionan i los motores tambien pero cuando subo a la placa el programa completo i lo acciono mediante el boton solo se mueve el servo, aunque el ultrasonico manda perfectamente la señal a la LCD, agradeceria ayuda.
Aqui adjunto mi código:
#include <ESP32Servo.h>
#include <Wire.h>
#include <NewPing.h>
#include <LiquidCrystal_I2C.h>
#include <Robojax_L298N_DC_motor.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
float distance, DURATION;
#define MAX_DISTANCE 200
#define IN1 18
#define IN2 5
#define IN3 17
#define IN4 16
#define ENA 19
#define ENB 4
int servoPin = 26;
int pushButton = 32;
#define echoPin 13
#define trigPin 23
Servo myServo;
bool isMoving = false; // Estado del servo (movimiento o detenido)
bool lastButtonState = HIGH; // Estado anterior del botón
bool currentButtonState = HIGH;
int pos = 0;
unsigned long startTime; // Tiempo de inicio
const unsigned long duration = 10000; // Duración del proceso (10 segundos)
unsigned long lastTimeButtonPressed = 0;
unsigned long debounceTime = 200; // Tiempo para evitar rebotes en el botón
const int freq = 30000;
const int pwmChannel = 0;
const int resolution = 8;
int dutyCycle = 225;
void setup() {
Serial.begin(115200);
// Configuración de pines del puente H
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
// Configuración de PWM
ledcSetup(0, 30000, 8);
ledcAttachPin(ENA, 0);
ledcWrite(0, 255); // Velocidad máxima
ledcSetup(1, 30000, 8); // Canal 1
ledcAttachPin(ENB, 1);
ledcWrite(1, 255); // Velocidad máxima
// Configuración del servo
myServo.attach(servoPin, 500, 2400);
pinMode(pushButton, INPUT_PULLUP);
myServo.write(pos); // Posición inicial
// Configuración de LCD
lcd.begin();
lcd.backlight();
// Configuración de sensor ultrasónico
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
// Leer estado del botón
currentButtonState = digitalRead(pushButton);
if (currentButtonState == LOW && lastButtonState == HIGH) {
isMoving = !isMoving; // Alterna el estado de movimiento
startTime = millis(); // Reinicia el temporizador
delay(50); // Evita rebotes
}
lastButtonState = currentButtonState;
// Lógica principal si está en movimiento
if (isMoving) {
// Genera un pulso para el sensor ultrasónico
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
DURATION = pulseIn(echoPin, HIGH);
distance = 0.017 * DURATION; // Calcula la distancia en cm
// Actualiza la pantalla LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Distance:");
lcd.print(distance);
delay(500);
// Movimiento del servo
for (pos = 0; pos <= 165; pos += 5) {
myServo.write(pos);
delay(20);
}
// Movimiento de motores basado en distancia
if (distance > 15) {
digitalWrite(IN1, HIGH);
digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH);
digitalWrite(IN4, LOW);
ledcWrite( 0, dutyCycle);
ledcWrite( 1, dutyCycle);
} else {
// Gira a la derecha si hay un obstáculo
digitalWrite(IN1, LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(1000); // Tiempo de giro
}
// Detiene el proceso después de 10 segundos
if (millis() - startTime >= duration) {
isMoving = false; // Finaliza el movimiento
}
} else {
// Detener motores y servo si no está activo
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
myServo.write(0); // Posición inicial
ledcWrite(0, 0); // Detenemos PWM del motor izquierdo
ledcWrite(1, 0); // Detenemos PWM del motor derecho
}
'