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
}