Hello all
I have ventured off into autonomous robot territory. Figured I would start off with a project that seemed pretty standard intro to robotics kind of stuff. I grabbed a small RC car, stripped it down to frame and motors, and hooked it up to an arduino through the Arduino Motor Shield R3.
I found a pretty basic sketch to run it, and haven't really even taken the time to modify it, though I do plan to add some bells and whistles, and see if I can't make it a little smarter
Here is the sketch I am using now.
/*
RC Car to Robot Conversion
by Randy Sarafan
Used to convert an RC car into a robot that uses a PING sensor to avoid obstacles,
and an Arduino motor shield for motor control.
For more information see:
http://www.instructables.com/id/RC-Car-to-Robot/
Built atop Ping example code by Tom Igoe
*/
// this constant won't change. It's the pin number
// of the sensor's output:
const int pingPin = 7;
void setup() {
//establish motor direction toggle pins
pinMode(12, OUTPUT); //drive motor -- HIGH = forwards and LOW = backwards
pinMode(13, OUTPUT); //turn motor -- HIGH = left and LOW = right
//establish motor brake pins
pinMode(9, OUTPUT); //brake (disable) the drive motor
pinMode(8, OUTPUT); //brake (disable) the turn motor
//Turns brake off for drive motor
digitalWrite(9, LOW);
//Turns brake on for turn motor
digitalWrite(8, HIGH);
//Sets initial speed of drive motor
analogWrite(3, 200);
//Sets initial direction of drive motor
digitalWrite(12, HIGH);
}
void loop()
{
// establish variables for duration of the ping,
// and the distance result in inches and centimeters:
long duration, inches, cm;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
// The same pin is used to read the signal from the PING))): a HIGH
// pulse whose duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
// convert the time into a distance
inches = microsecondsToInches(duration);
//
//if objects are less than 12 inches away
//the robot reverses and turns to the right
//for 2 seconds
//
if (inches < 12){
//brake drive motor and pause 1/10 second
digitalWrite(9, HIGH);
delay(100);
//
//setting turn motor
//
//turn off brake for turn motor
digitalWrite(8, LOW);
//set turn motor direction
digitalWrite(13, HIGH);
//activate turn motor
analogWrite(11, 255);
//
//setting drive motor
//
//turn off brake of drive motor
digitalWrite(9, LOW);
//set drive motor backwards direction
digitalWrite(12, LOW);
//activate the drive motor
analogWrite(3, 200);
//backup for 2 seconds
delay(2000);
//
//stopping
//
//brake both motors
digitalWrite(8, HIGH);
digitalWrite(9, HIGH);
}
//
//when nothing is within 12"
//the robot simply drives forwards
//
else{
//
//Setting drive motor
//
//set drive motor forward direction
digitalWrite(12, HIGH);
//turn off brake of drive motor
digitalWrite(9, LOW);
//activate drive motor
analogWrite(3, 200);
}
delay(100);
}
long microsecondsToInches(long microseconds)
{
// According to Parallax's datasheet for the PING))), there are
// 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
// second). This gives the distance travelled by the ping, outbound
// and return, so we divide by 2 to get the distance of the obstacle.
// See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
return microseconds / 74 / 2;
}
I haven't really even looked through the code yet, but I don't think my problem is in the code, I just posted it in case there was anything in there that might help.
My issue is, the code works perfectly, as long as the car isn't on the ground. I can hold it up in the air, and the drive motor does what it is supposed to, and the turn motor works when it is supposed to. But when I put it down, it works on a nice flat surface for a few minutes, then it seems to run out of power. It wont move much at all on carpet.
The car originally ran on 3 AA batteries, though I never even turned it on before I tore it apart. It was pretty light weight, and with all the Arduino gear on top, it does have a bit more load to move, but I would think the difference would be negligible.
The car uses one DC motor to drive the rear wheels, and one DC motor to turn the front wheels. When the car needs to back up and turn, it has noticeably less power, and is usually the first direction to stop working. I have tried 3 AA's and 4AA's to drive the motors. I tried using a 9V to power the arduino, and the motors through the shield, which is how it is set up to work. No matter how I configure the power in, I don't get enough drive, and it dies after only a few minutes.
Does anyone have any idea how I might fix this? The inscrutable where I got the code worked on just the 9V supplying the arduino, and used the Vin pin to supply power to the shield. His seemed to work just fine, and I have a nearly identical RC car, the same motor shield and PING sensor. Not sure where I am loosing so much energy, and it has me stumped.
Any suggestions would be greatly appreciated!
Thanks
N8