Robot tiene funcionamiento erratico

Buenas a todos, soy nuevo por aqui y estoy empezando en el arduino, luego mis conocimientos son bastante limitados.

Os cuento mi problema, estoy haciendo un robot cortacesped, basandome en un proyecto que compré hace años, pero el robot no se comporta como deberia, tiene un modo de colision control que cuando gira a la derecha vá bien, pero cuando gira a la izquierda anda un poco, se detiene y gira a la derecha.

Sé que es un problema con la programacion porque si cambio el orden de los comandos y dejo el de turnright por debajo del turnleft, empieza a dar el mismo fallo para el otro lado.

Desde ya os doy las gracias a todos, os dejo el codigo seguido.

Un saludo

 //Collision control
  
  Drivesenseleft = analogRead(Drivepinleft); // Read left motor current
  Drivesenseright = analogRead(Drivepinright); // Read right motor current
  Serial.print("Motor current left = "); // Print
  Serial.println(Drivesenseleft);
  Serial.print("Motor current right = "); // Print
  Serial.println(Drivesenseright);
  
  if (Drivesenseright > Drivemaxright) { // Compare right motor current
    backward() ;
    Turnleft();
  }

  if (Drivesenseleft > Drivemaxleft) { // Compare left motor current
    backward() ;
    Turnright();
  }
  
   // Go forward 
  forward();
  delay(200);
}

Puede que el sensor de corriente izquierdo no esta reportando los valores como el derecho.
Has visto dichos valores en el Monitor Serie. Porque no los presentas.

Tambien pensé eso, y es cierto que hay diferencia entra izquierda y derecha, pero lo raro es que al cambiar el orden de los comandos, cambia tambien el lado para el que da el error. Mañana lo miro y pongo los datos aqui.
Gracias

Dices que cambias el orden de giro o sea
Asi falla a la izquierda

  if (Drivesenseright > Drivemaxright) { // Compare right motor current
    backward() ;
    Turnleft();
  }

  if (Drivesenseleft > Drivemaxleft) { // Compare left motor current
    backward() ;
    Turnright();
  }

y asi falla a la derecha?

  if (Drivesenseright > Drivemaxright) { // Compare right motor current
    backward() ;
    Turnright();
  }

  if (Drivesenseleft > Drivemaxleft) { // Compare left motor current
    backward() ;
    Turnleft();
  }

No, perdona, es cambiar el comando completo

if (Drivesenseright > Drivemaxright) { // Compare right motor current
   backward() ;
   Turnleft();
 }

 if (Drivesenseleft > Drivemaxleft) { // Compare left motor current
   backward() ;
   Turnright();

Asi cuando gira a la izquierda vuelve atras i gira a la derecha.

if (Drivesenseleft > Drivemaxleft) { // Compare left motor current
   backward() ;
   Turnright();

if (Drivesenseright > Drivemaxright) { // Compare right motor current
   backward() ;
   Turnleft();
 }

Y asi, cuando gira a la derecha, vuelve a tras y gira a la izquierda.

Moderador:
Es código, de manera que aunque postees una linea va con etiqueta de código.
Edita por favor!!

Sigues sin mostrar los valores

Serial.print("Motor current left = "); // Print
  Serial.println(Drivesenseleft);
  Serial.print("Motor current right = "); // Print
  Serial.println(Drivesenseright);

Y ya que estamos indica tmb los máximos para entender.

A ver si lo entiendo. el robot va contra un obstáculo y choca, un motor hace mas fuerza que el otro y eso define de que lado esta el objeto.
Si choca de modo que la corriente es mayor en el motor izquierdo retroce y gira a derecha. O sea el sensor izquierdo esta funcionando bien aparentemente.

Si en cambio choca y la corriente en el motor derecho debiera aumentar pareciera que eso no lo registra y por eso retroce y gira a la izquierda.

Cuando inviertes se da al reves el fallo porque invertiste la secuencia.
El probelma es el sensor derecho y no como pensaba que era el izquierdo.
Revisa los valores

Motor current left = 108
Motor current right = 66
Left = 197
Right = 177
 
Motor current left = 104
Motor current right = 53
Left = 226
Right = 200
 
Motor current left = 150
Motor current right = 44
Left = 206
Right = 184
 
Motor current left = 100
Motor current right = 125
Left = 198
Right = 179
 
Motor current left = 102
Motor current right = 76
Left = 198
Right = 179
 
Motor current left = 52
Motor current right = 60
Left = 231
Right = 206
 
Motor current left = 132
Motor current right = 84
Left = 203
Right = 183

Estos son los valores que me estan dando, el codigo venia predefinido a 215 en el Drivemax, yo ya lo subi a 235, no se hasta donde me permite subir.

El robot despues de chocar gira a los dos lados, segun que rueda se esfuerze mas, pero cuando gira a la derecha deberia seguir en frente hasta chocar de nuevo y no lo hace, anda aproximadamente un segundo, y hace la sequencia de giro a la izquierda.

Corrigeme si me equivoco, pero si fuera un tema de corrientes lo haria siempre para el mismo lado, independientemente de cual comando esté primero, no?

Perdona si no me explico mejor, pero soy nuevo en arduino, intento ir por la logica, y me falta el vocabulario de programacion, esto es, yo se lo que está fallando, lo que no se es porqué, ni explicartelo de otra forma.

En resumen, me estoy volviendo loco, he reecho toda la eletronica que controla los motores 3 veces y el fallo sigue, incluso cambié los motores, y mas de lo mismo... por eso digo que sera el codigo.

Aqui esta el codigo completo

// FINAL_ MOWER_SKETCH


// Status LED

int Ledbat = 3; // Define PIN 3 for digital output red LED
int Ledstart = 4; // Define PIN 4 for digital output green LED
// Read Battery voltage
int Voltpin = 0; // Define PIN A0 for reading battery voltage
float Volt; // Define variable for voltage
float Voltvalue; // Define variable for avarage voltage calculation
float Voltlow = 10; // Define variable and setup for minimum operation voltage
int I; // Define variable for IF-LOOP counter
int I_bat = 20; // Define variable for battery status (low or high)


// Drive motors

int Driveleft = 9; // Define PIN 9 for left Motor PWM output
int IN3 = 6; // Define PIN 6 for left Motor IN3
int IN4 = 5; // Define PIN 5 for left Motor IN4
int Driveright = 10; // Define PIN 10 for right Motor PWM output
int IN1 = 8; // Define PIN 8 for right Motor IN1
int IN2 = 7; // Define PIN 7 for right Motor IN2
int Drivespeedleft = 250; // Define variable for left motor speed and set PWM value
int Drivespeedright = 255; // Define variable for right motor speed and set PWM value
int Turntime; // Define variable for the time the mower has to turn
int I_Ramp; // Define counter-variable for motor ramp


// Collision control

int Drivepinleft = 1; // Define PIN A1 for left motor current
int Drivepinright = 2; // Define PIN A2 for right motor current
int Drivesenseleft; // Define variable for left motor current
int Drivesenseright; // Define variable for right motor current

int Drivemaxleft = 235; // Define variable for max motor current left and set default
int Drivemaxright = 245; // Define variable for max motor current right and set default

// Cutter motor
int Cutterspeed = 0; // Define variable for Cutterspeed PWM value (must be "0" here!
int Cutter = 11; // Define PIN 11 for cutter motor PWM output
int I_Start = 0; // Define variable for entering "Start()" function


void setup() { // Setup
  // Print
  Serial.begin(9600); // Start the serial communication
  // Status LEDs
  pinMode(Ledbat, OUTPUT); // Define Ledbat PIN as OUTPUT
  pinMode(Ledstart, OUTPUT); // Define Ledstart PIN as OUTPUT
  // Drive motors
  pinMode(IN1, OUTPUT); // Define IN1 PIN as OUTPUT
  pinMode(IN2, OUTPUT); // Define IN2 PIN as OUTPUT
  pinMode(IN3, OUTPUT); // Define IN3 PIN as OUTPUT
  pinMode(IN4, OUTPUT); // Define IN4 PIN as OUTPUT
}

void loop() { // Start main programm
  // Read Voltpin for 10 times and calculate average voltvalue
  Voltvalue = 0;
  for (I = 0; I < 10; I++) {
    Volt = analogRead(Voltpin);
    Voltvalue = Voltvalue + Volt;
    delay(10);
  }
  
  Voltvalue = Voltvalue / 10;
  Voltvalue = Voltvalue * 0.02765; // 0.02765 is factor for voltagedevider 22K / 4,7K
  if (Voltvalue < Voltlow) { // Make dicission: Batteryvoltage O.K or low
    I_bat = 1; // If battery voltage is low set status 1
    Stop(); // If battery is low go to “Stop()” function
  }
  if (I_Start < 10) { // Go to "Start()" function
    Start();
  }

  
  //Collision control
  
  Drivesenseleft = analogRead(Drivepinleft); // Read left motor current
  Drivesenseright = analogRead(Drivepinright); // Read right motor current
  Serial.print("Motor current left = "); // Print
  Serial.println(Drivesenseleft);
  Serial.print("Motor current right = "); // Print
  Serial.println(Drivesenseright);

  if (Drivesenseleft > Drivemaxleft) { // Compare left motor current
    backward() ;
    Turnright();
  }
  
  if (Drivesenseright > Drivemaxright) { // Compare right motor current
    backward() ;
    Turnleft();
  }
  
   // Go forward 
  forward();
}


/////////FUNCTIONS///////////

void Start() {
  digitalWrite(Ledbat, LOW); // Switch red status-LED off
  digitalWrite(Ledstart, HIGH); // Switch green status-LED on
  delay(500);
  //Default Settings
  Drivemaxleft = 235; // Set max motor current left
  Drivemaxright = 245; // Set max motor current right
  Drivespeedleft = 250; // Set left motor speed (valid range 0....255)
  Drivespeedright = 255; // Set right motor speed (valid range 0....255)
  Voltlow = 10; // Set minimum operation voltage
  Cutterspeed = 100; // Set Cutter motor speed (50 should be maximum!)
  // Start cutter motor
  analogWrite(Cutter, Cutterspeed);
  delay(3000);
  I_Start = 20; // Set I_Start to a high value for not entering this function again
}
void Stop() { // Stop the mower if battery is low
  Cutterspeed = 0; // Switch off cutter motor
  analogWrite(Cutter, Cutterspeed);
  analogWrite(Driveleft, 0); // Switch off left drive motor
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  analogWrite(Driveright, 0); // Switch off right drive motor
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(Ledstart, LOW); // Switch green status LED OFF
  while (I_bat < 10) // As long as batterystatus is low, stay here
  {
    // flash red status LED
    digitalWrite(Ledbat, HIGH);
    delay(100);
    digitalWrite(Ledbat, LOW);
    delay(500);
    Serial.println("Low Battery"); // Print "Low battery" message
  }
}
void forward() { // Drive forward
  digitalWrite(IN3, LOW); // Switch PIN IN3 LOW
  digitalWrite(IN4, HIGH); // Switch PIN IN4 HIGH
  digitalWrite(IN1, LOW); // Switch PIN IN1 Low
  digitalWrite(IN2, HIGH); // Switch PIN IN2 HIGH
  analogWrite(Driveleft, Drivespeedleft); // Set PWM-value for left motor
  analogWrite(Driveright, Drivespeedright); // Set PWM-value for right motor
}
void backward() { // Drive backward
  // Switch IN-PINs for backward drive
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
  delay(1000); // The time the mower should go backwards
  analogWrite(Driveleft, 0); // Stop motor after going backwards
  analogWrite(Driveright, 0); // Stop motor after going backwards
  delay(250); // Give the mower some time to stop
}
void Turnleft() { // Turn left
  // Switch IN-PINs for turn left
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
  Turntime = random(100, 1500); // Random for turning time
  delay(Turntime);
  
  analogWrite(Driveleft, 0); // Stop motor after turning
  analogWrite(Driveright, 0); // Stop motor after turning
  delay(250);
  
  // Switch IN-PINs for driving forward
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
}
void Turnright() { // Turn right
  // Switch IN-PINs for turn right
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
  Turntime = random(100, 1500); // Random for turning time
  delay(Turntime);
  analogWrite(Driveleft, 0); // Stop motor after turning
  analogWrite(Driveright, 0); // Stop motor after turning
  delay(250);
  
  // Switch IN-PINs for driving forward
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
}

@ruipt, lo primero es tranquilizarse, se hacen estas cosas por hobby y por lo que se disfruta y no para estresarse, asi que cálmate con eso de que me estoy volviendo loco.

Lo que me parece es que una rueda esta mas trabada que la otra y no importa que hagas siempre dominará el giro final.
Por eso hace lo que hace.

Es raro que porcentualmente los valores izquierdos son mayores que los derechos cuando esta moviendose atras/adelante.
Como no tengo todo el código, cosa que te pedí oportunamente, no se de donde sale la presentación Left y Right con sus valores.
Coloca todo el código y te haré unos agregados que ayudarán a entender que pasa.

Perdona, pero es que llevo mas de un mes con esto y me frustra no dar con el error.

Aqui te dejo el codigo completo.

// FINAL_ MOWER_SKETCH


// Status LED

int Ledbat = 3; // Define PIN 3 for digital output red LED
int Ledstart = 4; // Define PIN 4 for digital output green LED
// Read Battery voltage
int Voltpin = 0; // Define PIN A0 for reading battery voltage
float Volt; // Define variable for voltage
float Voltvalue; // Define variable for avarage voltage calculation
float Voltlow = 10; // Define variable and setup for minimum operation voltage
int I; // Define variable for IF-LOOP counter
int I_bat = 20; // Define variable for battery status (low or high)


// Drive motors

int Driveleft = 9; // Define PIN 9 for left Motor PWM output
int IN3 = 6; // Define PIN 6 for left Motor IN3
int IN4 = 5; // Define PIN 5 for left Motor IN4
int Driveright = 10; // Define PIN 10 for right Motor PWM output
int IN1 = 8; // Define PIN 8 for right Motor IN1
int IN2 = 7; // Define PIN 7 for right Motor IN2
int Drivespeedleft = 250; // Define variable for left motor speed and set PWM value
int Drivespeedright = 255; // Define variable for right motor speed and set PWM value
int Turntime; // Define variable for the time the mower has to turn
int I_Ramp; // Define counter-variable for motor ramp


// Collision control

int Drivepinleft = 1; // Define PIN A1 for left motor current
int Drivepinright = 2; // Define PIN A2 for right motor current
int Drivesenseleft; // Define variable for left motor current
int Drivesenseright; // Define variable for right motor current

int Drivemaxleft = 235; // Define variable for max motor current left and set default
int Drivemaxright = 245; // Define variable for max motor current right and set default

// Cutter motor
int Cutterspeed = 0; // Define variable for Cutterspeed PWM value (must be "0" here!
int Cutter = 11; // Define PIN 11 for cutter motor PWM output
int I_Start = 0; // Define variable for entering "Start()" function


void setup() { // Setup
  // Print
  Serial.begin(9600); // Start the serial communication
  // Status LEDs
  pinMode(Ledbat, OUTPUT); // Define Ledbat PIN as OUTPUT
  pinMode(Ledstart, OUTPUT); // Define Ledstart PIN as OUTPUT
  // Drive motors
  pinMode(IN1, OUTPUT); // Define IN1 PIN as OUTPUT
  pinMode(IN2, OUTPUT); // Define IN2 PIN as OUTPUT
  pinMode(IN3, OUTPUT); // Define IN3 PIN as OUTPUT
  pinMode(IN4, OUTPUT); // Define IN4 PIN as OUTPUT
}

void loop() { // Start main programm
  // Read Voltpin for 10 times and calculate average voltvalue
  Voltvalue = 0;
  for (I = 0; I < 10; I++) {
    Volt = analogRead(Voltpin);
    Voltvalue = Voltvalue + Volt;
    delay(10);
  }
  
  Voltvalue = Voltvalue / 10;
  Voltvalue = Voltvalue * 0.02765; // 0.02765 is factor for voltagedevider 22K / 4,7K
  if (Voltvalue < Voltlow) { // Make dicission: Batteryvoltage O.K or low
    I_bat = 1; // If battery voltage is low set status 1
    Stop(); // If battery is low go to “Stop()” function
  }
  if (I_Start < 10) { // Go to "Start()" function
    Start();
  }

  
  //Collision control
  
  Drivesenseleft = analogRead(Drivepinleft); // Read left motor current
  Drivesenseright = analogRead(Drivepinright); // Read right motor current
  Serial.print("Motor current left = "); // Print
  Serial.println(Drivesenseleft);
  Serial.print("Motor current right = "); // Print
  Serial.println(Drivesenseright);

  if (Drivesenseleft > Drivemaxleft) { // Compare left motor current
    backward() ;
    Turnright();
  }
  
  if (Drivesenseright > Drivemaxright) { // Compare right motor current
    backward() ;
    Turnleft();
  }
  
   // Go forward 
  forward();
}


/////////FUNCTIONS///////////

void Start() {
  digitalWrite(Ledbat, LOW); // Switch red status-LED off
  digitalWrite(Ledstart, HIGH); // Switch green status-LED on
  delay(500);
  //Default Settings
  Drivemaxleft = 235; // Set max motor current left
  Drivemaxright = 245; // Set max motor current right
  Drivespeedleft = 250; // Set left motor speed (valid range 0....255)
  Drivespeedright = 255; // Set right motor speed (valid range 0....255)
  Voltlow = 10; // Set minimum operation voltage
  Cutterspeed = 100; // Set Cutter motor speed (50 should be maximum!)
  // Start cutter motor
  analogWrite(Cutter, Cutterspeed);
  delay(3000);
  I_Start = 20; // Set I_Start to a high value for not entering this function again
}
void Stop() { // Stop the mower if battery is low
  Cutterspeed = 0; // Switch off cutter motor
  analogWrite(Cutter, Cutterspeed);
  analogWrite(Driveleft, 0); // Switch off left drive motor
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  analogWrite(Driveright, 0); // Switch off right drive motor
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(Ledstart, LOW); // Switch green status LED OFF
  while (I_bat < 10) // As long as batterystatus is low, stay here
  {
    // flash red status LED
    digitalWrite(Ledbat, HIGH);
    delay(100);
    digitalWrite(Ledbat, LOW);
    delay(500);
    Serial.println("Low Battery"); // Print "Low battery" message
  }
}
void forward() { // Drive forward
  digitalWrite(IN3, LOW); // Switch PIN IN3 LOW
  digitalWrite(IN4, HIGH); // Switch PIN IN4 HIGH
  digitalWrite(IN1, LOW); // Switch PIN IN1 Low
  digitalWrite(IN2, HIGH); // Switch PIN IN2 HIGH
  analogWrite(Driveleft, Drivespeedleft); // Set PWM-value for left motor
  analogWrite(Driveright, Drivespeedright); // Set PWM-value for right motor
}
void backward() { // Drive backward
  // Switch IN-PINs for backward drive
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
  delay(1000); // The time the mower should go backwards
  analogWrite(Driveleft, 0); // Stop motor after going backwards
  analogWrite(Driveright, 0); // Stop motor after going backwards
  delay(250); // Give the mower some time to stop
}
void Turnleft() { // Turn left
  // Switch IN-PINs for turn left
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
  Turntime = random(100, 1500); // Random for turning time
  delay(Turntime);
  
  analogWrite(Driveleft, 0); // Stop motor after turning
  analogWrite(Driveright, 0); // Stop motor after turning
  delay(250);
  
  // Switch IN-PINs for driving forward
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
}
void Turnright() { // Turn right
  // Switch IN-PINs for turn right
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
  Turntime = random(100, 1500); // Random for turning time
  delay(Turntime);
  analogWrite(Driveleft, 0); // Stop motor after turning
  analogWrite(Driveright, 0); // Stop motor after turning
  delay(250);
  
  // Switch IN-PINs for driving forward
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  
  for (I_Ramp = 0; I_Ramp < 255; I_Ramp ++) { // Counter-loop for motor ramp
    analogWrite(Driveleft, I_Ramp);
    analogWrite(Driveright, I_Ramp);
    delay(5);
  }
  analogWrite(Driveleft, Drivespeedleft); // After motor ramp use default drivespeed-value
  analogWrite(Driveright, Drivespeedright); // After motor ramp use default drivespeed-value
}

Porque esto

 Drivemaxleft      = 235; // Set max motor current left
  Drivemaxright   = 245; // Set max motor current right
  Drivespeedleft  = 250; // Set left motor speed (valid range 0....255)
  Drivespeedright = 255; // Set right motor speed (valid range 0....255)

porque seteos de velocidad diferentes, eso genera giros y no avance/retroceso en linea recta
Lo mismo de losmáximo pq diferentes, tienes una explicación?

Edito: coloca por favor los valores parejos. 235 para Drivemaxleft y right y misma velocidad 255.

Probemos. Aunque falle

Reemplaza esto nada mas.

  if (Drivesenseleft > Drivemaxleft) { // Compare left motor current
      backward() ;
      Turnright();
      Serial.println("Colision: Giro a derecha");
  }
 
  if (Drivesenseright > Drivemaxright) { // Compare right motor current
      backward() ;
      Turnleft();
      Serial.println("Colisión: Giro a izquierda");
  }

surbyte:
Porque esto

 Drivemaxleft      = 235; // Set max motor current left

Drivemaxright  = 245; // Set max motor current right
  Drivespeedleft  = 250; // Set left motor speed (valid range 0....255)
  Drivespeedright = 255; // Set right motor speed (valid range 0....255)




porque seteos de velocidad diferentes, eso genera giros y no avance/retroceso en linea recta
Lo mismo de losmáximo pq diferentes, tienes una explicación?

Los de velocidad los ajusté asi, porque con los dos a 255 giraba un poco a la derecha.

Los Drivemax venian a 215 los dos, y los subi porque el robot pesa mas que el original, y a la izquierda cundo pillava un poco de cuesta se parava, pero era normal, el de la derecha lo subi mas para intentar corregir el fallo.

Entiendo que el arduino maneja las corrientes de 0 a 255, correcto? Al ser asi, la otra opcion es meter mas resistencias a la eletronica del control de colision.

Vale, voy a probar poner los valores como estaban, y anãdir este codigo tuyo a ver que pasa.

Gracias

Antes de mas darte las gracias por tu ayuda, ya probé el codigo y sigue con el error, lo que si noté ahora es que hace mas giros a la derecha, lo que me dice que la rueda izquierda detecta antes la subida de tension.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.