Hola, lo que me ocurre es lo siguiente:
Tengo un carrito con 2 motores DC, un servo motor, sensor ultrasónico, Driver L298N y un esp32. Anteriormente tenia código para controlar tranquilamente el auto con bluetooth, pero mi profesor me dijo que la siguiente evaluación seria mejorar el trabajo que ya tengo, pensé en hacer el auto que fuese autónomo, primero le coloque solo un sensor que viese hacia el frente y pues logre que el auto pudiese cruzar y avanzar a ambos lados tranquilamente dependiendo de la situación, pero era poco exacto e igual tendía a chocar mucho... Luego de eso fue que pensé en añadir una función para que redujera la velocidad mientras mas cerca marcara algún obstáculo pero bueno eso es otra historia.
Lo que ocurre ahora es esto, añadí un servo para poder "mirar" hacia ambos lados, lo pedí prestado en mi universidad y ellos me dieron dos ya que tienen una montaña de servos que no saben cuales sirven y cuales no, ambos parecían funcionar así que tome uno al azar, todo estaba listo, acomode el código y pues prendí para probar el auto, para mi sorpresa el servo se movía en trazos cortos hacia la derecha y se quedaba ahi pegado, no movía hacia ningún otro lado y a veces se quedaba como un tiempo trabado ademas que sonaba mucho, para después moverse rápidamente y quedarse viendo hacia la derecha nuevamente.
Se que no es un tema de energía, tengo dos celdas de litio 18650 dándole energía a todo, pero para probar conecte el servo directamente a una fuente de 5V y de nuevo, en solitario el servo funciona tranquilamente, el problema tal parece que es algo con el PWM blablabla, la verdad no se mucho, soy un noobie aún y pues he estado todo el día tratando de solucionar, vi por ahi que podría tener que ver con como la librería ESP32Servo selecciona que canales usar para el PWM pero no tengo ni idea como se cambia eso, de lo que si estoy seguro es que es algo entre el PWM, el ESP32 y los motores.
Aca les dejo el código que tengo, podrán ver que tengo gran parte del código en un comentario enorme, ese es el código que había escrito antes, pero tuve que reducirlo para ir probando con algo mas pequeño y ver que pasaba.
#include <BluetoothSerial.h>
#include <ESP32Servo.h>
BluetoothSerial ESP_BT;
Servo servo1;
#define servoPin 25
#define inp3 13
#define inp2 26
#define inp4 12
#define inp1 27
#define r_pwm 33
#define l_pwm 32
#define TrigP 19
#define EchoP 18
bool activo_mano = true;
long duration;
int distance;
int incoming;
int speed = 191;
int speed2 = 121;
const int distanciamin = 25;
void VelDistancia(){
sensorRead();
if(distance >= 80){
speed2 = 100;
}
else if(distance >= 60){
speed2 = 80;
}
else if(distance >= 50){
speed2 = 64;
}
else if(distance >= 40){
speed2 = 55;
}
}
void ServoFrente(){
servo1.write(75);
}
void stopC(){
digitalWrite(inp1, LOW);
digitalWrite(inp2, LOW);
digitalWrite(inp3, LOW);
digitalWrite(inp4, LOW);
}
void sensorRead () {
digitalWrite(TrigP, LOW);
delayMicroseconds(2);
digitalWrite(TrigP, HIGH);
delayMicroseconds(10);
digitalWrite(TrigP, LOW);
duration = pulseIn(EchoP, HIGH);
distance = duration * 0.034 / 2;
}
void Palante(){
digitalWrite(inp1,LOW);
digitalWrite(inp2,LOW);
digitalWrite(inp3,HIGH);
digitalWrite(inp4,LOW);
setMotorSpeed();
//Serial.println("aca andamo ruleta"); debug
}
void Patras(){
digitalWrite(inp1,LOW);
digitalWrite(inp2,LOW);
digitalWrite(inp3,LOW);
digitalWrite(inp4,HIGH);
analogWrite(r_pwm,speed);
analogWrite(l_pwm, 121);
//Serial.println("smn"); debug
}
void Izquierda(){
digitalWrite(inp1,HIGH);
digitalWrite(inp2,LOW);
digitalWrite(inp3,LOW);
digitalWrite(inp4,LOW);
setMotorSpeed();
//Serial.println("iz"); debug
}
void Derecha(){
digitalWrite(inp1,LOW);
digitalWrite(inp2,HIGH);
digitalWrite(inp3,LOW);
digitalWrite(inp4,LOW);
setMotorSpeed();
//Serial.println("de"); debug
}
void Palanteizquierda(){
digitalWrite(inp1,HIGH);
digitalWrite(inp2,LOW);
digitalWrite(inp3,HIGH);
digitalWrite(inp4,LOW);
setMotorTurnSpeed();
// Serial.println("izq");
}
void Palantederecha(){
digitalWrite(inp1,LOW);
digitalWrite(inp2,HIGH);
digitalWrite(inp3,HIGH);
digitalWrite(inp4,LOW);
setMotorTurnSpeed();
// Serial.println("der");
}
void Patrasderecha(){
digitalWrite(inp1,LOW);
digitalWrite(inp2,HIGH);
digitalWrite(inp3,LOW);
digitalWrite(inp4,HIGH);
setMotorTurnSpeed();
//Serial.println("Patder");
}
void Patrasizquierda(){
digitalWrite(inp1,HIGH);
digitalWrite(inp2,LOW);
digitalWrite(inp3,LOW);
digitalWrite(inp4,HIGH);
setMotorTurnSpeed();
//Serial.println("Patiz");
}
void setMotorSpeed() {
analogWrite(r_pwm, speed);
analogWrite(l_pwm, speed2);
}
void setMotorTurnSpeed(){
analogWrite(r_pwm,speed);
analogWrite(l_pwm, 130);
}
void VerifyDeath(){
incoming = ESP_BT.read();
sensorRead();
if(incoming == 'L'){
activo_mano = false;
stopC();
servo1.write(75);
}
}
void setup(){
Serial.begin(9600);
ESP_BT.begin("ESP32CAR");
pinMode(inp1, OUTPUT);
pinMode(inp2, OUTPUT);
pinMode(inp3, OUTPUT);
pinMode(inp4, OUTPUT);
pinMode(TrigP, OUTPUT);
pinMode(EchoP, INPUT);
servo1.attach(servoPin, 1000, 2000);
servo1.setPeriodHertz(50);
servo1.write(75);
}
void loop(){
if(ESP_BT.available()){
incoming = ESP_BT.read();
if(incoming == 'B'){
stopC();
delay(2000);
esp_deep_sleep_start();
}
if(incoming == 'F'){ //Start carrito run run
activo_mano = true;
//Serial.println(incoming); //(debugging flag humilde)
sensorRead();
while (activo_mano) {
if(distance > distanciamin){
VelDistancia();
Palante();
VerifyDeath();
Serial.println(distance);
}
else{
stopC();
delay(300);
servo1.write(5);
delay(1000);
sensorRead();
Serial.print("distancia derecha = ");
Serial.println(distance);
servo1.write(75);
delay(100);}
/*if(distance > distanciamin){
ServoFrente();
Patras();
delay(700);
Palantederecha();
delay(1400);
}
else if(distance <= distanciamin){
servo1.write(180);
sensorRead();
Serial.print("distancia izquierda = ");
Serial.println(distance);
if(distance > distanciamin){
ServoFrente();
Patras();
delay(700);
Palanteizquierda();
delay(1400);
}
else if(distance <= distanciamin){
ServoFrente();
Patras();
delay(200);
}
}
}
/*else{
stopC();
delay(400);
Patras();
delay(1400);
Palantederecha();
delay(1750);
Izquierda();
delay(20);
Serial.print("Distancia 1 = ");
sensorRead();
Serial.println(distance);
if(distance <= distanciamin){
Patrasderecha();
delay(1750);
Izquierda();
delay(20);
Palanteizquierda();
delay(1750);
Derecha();
delay(20);
Serial.print("Distancia 2 = ");
sensorRead();
Serial.println(distance);
if(distance <= distanciamin){
Patrasizquierda();
delay(1750);
Derecha();
delay(20);
Patras();
delay(1400);
Palantederecha();
delay(1700);
Izquierda();
delay(20);
Serial.print("Distancia 3 = ");
sensorRead();
Serial.println(distance);
}
}
}*/
VerifyDeath();
//Serial.println(incoming); //(debugging flag humilde)
}
}
}
}
Como les dije, no pienso que sea algo energetico, mas sin embargo podria mostrarles el diagrama de como tengo todo conectado, solo que se me haria algo complicado ya que no se usar mucho esos programas.