Let's Make Robots!

The A.S.R.B.

Navigate via GPS, Compass, and avoids obstacles using 5 IR sensors
AttachmentSize
Main Components1.98 MB
GPS & Compass2.21 MB
Arduino Mega 2560 & Uno2.22 MB
Front shot with IR sensors1.89 MB
Full car shot1.93 MB
Main board separated from car2.03 MB
Duratrax Evader Ext-22.2 MB
Adhesive Velcro on car2.24 MB
Adhesive Velcro on bottom of board2.12 MB
close up of velcro on the board2.12 MB
Body separated from chassis2.26 MB
battery, esc, and reciever2.48 MB
esc & motor2.31 MB
Evader EXT-2, again1.88 MB
Missile switches flipped, lights on!2.69 MB
A.S.R.B._Gradual_Turns.txt7.01 KB
pitches.txt2.03 KB
Compass_Servo_Orientation.txt2.57 KB
A.S.R.B._Gradual_Turns_NOT_MAPPING.txt7.08 KB

Hi all, I'm Matt and currently a junior in high school. I built first robot called the "A.S.R.B." over the summer for the Authentic Science Reseach Program and I wanted to share it with all of you! *I'm going to apologize in advanced if my spelling/wording/grammar is terrible--It's been a long day and I'm in a rush to get this posted.* Using the chassis of the duratrax evader EXT-2, I built this robot from the ground up.  I swapped out the esc and dc motor for a traxxas 12t 550 that I had lying around, and the esc is now the traxxas xl-5.  The motor fits in quite snug and I needed to change the mount for the XL-5 a bit to align with previously drilled holes.

esc & motor

 

 

 

 

 

 

 

 

 

 

 

 

 

Velcro

On the body, I put some velcro on to match up with the to-be light weight plywood to hold all of the electronics. On the plywood that holds all of the electronics, I have an Arduino uno as well as an Arduino Mega 2560. The reason I have two microcontrollers on board is because I need the uno to program the esc before each run with a potentiometer to give it a boundary of what full reverse is and what full forward is.

Electronics

 

 

 

 

 

 

 

 

 

 

 

 

 

headlights on

 

 

 

 

 

 

 

 

 

 

 

 

 

 

The mega controls all of the sensors, GPS, compass, lights, etc. starting with the front of the car, I have a custom bumper which I stripped from an old rc car, drilled some holes into, put some LEDs in, and thus gave my robot some headlights. Behind that is an arch (parallel with the plywood) where I mounted the 5 SHARP IR sensors. I am using the sensors with the range of 10-80 cm (if i'm not mistaken) and I plan on upgrading those to the longer ranged ones soon. Those 5 sensors trace back to a bread board that has 5 capacitors on a bus strip to balance the power going to the sensors. Each capacitor is 1000uF at 25V. Probably over kill, but hey, why not? The IR sensors trace back to the Mega to analog pins 0-4.

Mega & Uno

 

 

 

 

 

 

 

 

 

 

 

 

 

I have a second breadboard near by that holds 4 of my LEDs. Each one has it's own job. from left to right, the first one is connected to pin 13 so it will alert me if somethings happening with the arduino (mainly if code is uploading). the next three tell when the IR sensors see an object, if the car is backing up, and if the code has completed running or not. On the same breadboard I broke out three pins for the servo (which controls the steering in the front of the car). I also have a capacitor (same specifications as above) to balance out the current being drawn by by the servo. The last of the things on the breadboard are three buttons, which will be used for storing waypoints later, but they currently have no use.

It looks like a girrafe...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Behind the breadboard and the arduinos are most of the batteries I use to power the car. I have two 7.4v 1000mAh LiPo batteries in parallel as back up batteries in case my main battery dies. The main battery for the mega 2560 is a 7.4v 2200mAh LiPo battery. I also have an 11.1v 1500mAh battery that powers the uno. The last battery I use is a 8.2v 4000mAh NiMh to power the esc and the dc motor. I have two missile switches in the rear, one powering the mega and the other powering the headlights. I have another basic switch to turn on the uno. (the uno doesn't have that amazing of a task, so why waist an amazing button? :-P )

Lastly on the plywood, I have a piezo speaker to alert someone if the car is about to back up, and then makes a "backing up" sound when it's going in reverse. I think it suits the cause.

Towards the rear of the plywood, I have an 18 inch wood pole sticking up out of the plywood. It is support by a 3 1/2" decking screw. On top of the pole, I have my GPS and compass on another breadboard. The wires trace down the pole and to the mega. I'm using the Compass Module - HMC6352, and the 66 Channel LS20031 GPS 5Hz Receiver. They work quite well.

GPS and Compass

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I ordered most (if not all) the electronics from SparkFun (they are a godsent) and I ordered the rc car from a hobby distributor, not sure which one.

The code is not 100% finished, but I have an algorithm for obstacle avoidance which works well in hallways as well as outdoors. All that's left for me to do is incorporate the GPS and compass into the working code, and set it off to run! I've used these both before, but I haven't created the distance formulas or anything similar.

If you have any questions, please feel free to ask me!

 

__________________________________________________________________________________________________________

edit on December 24th, 2012

 

Hi all, I'm trying to get my robot to go to waypoints, and I'm not really sure how to accomplish that task.  Can anyone give me some sort of direction to start at?  I don't really want the code done for me, but I need to know what needs to be accomplished in order for the robot to be able to go to one(or mutiple) waypoint(s)

 

____________________________________________________________________________________________________________

Last edit on January 9th, 2013

 

Hey guys, happy late new year!

Just thought I'd do a quick update on my progress with new pictures to follow.  Over christmas break, I received gift cards to various places (including sparkfun) and I ordered some Xbees (series one, 1 mile range).  I'm going to try to do an easy xbee started guide here on lmr, just not sure when that will be.  I also decided to buy a wireless camera to transmit data (with about a 150' range) to a tv, which I'm going to mount on the robot this weekend.  Hopefully I'll be able to improve the range on that somehow, but I'm looking forward to being able to drive an rc car from my living room or bedroom!!  I'm also planning on cutting a few inches off of the tower because it's starting to sway a bit and I need it to be a little more secure.  Another thing that I've been wanting to do for a while (and hopefully will finally become a reality) is to create my own website!  I've wanted to share my stuff somewhere, and now I'll finally have a place to put everything!!!  anyone have any tips on where to go to make an easy website with an already purchased domain?

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.

Cool project, and quite ambitious!.

Waypoint task is kind of a bit complicated project. I'm working on the same project but with my fonera quadrocopter. I'm afraid that you will need a minimum of a 3 axis accelerometer into your set of sensors, and ideally a complete IMU (gyroscope, accel, and magnetometer). Why? because GPS is a noise pain!!. While your rover stays quiet, your GPS will report a random set of positions, around 10m more or less, depending of your receiver, and will make your rover to move erratic without sense.

You will need a sensor that takes into account small changes of acceleration, integrate them to obtain speed, and integrate them again to obtain distance. Then, you use the compass to know in which course is this distance travelled. Google about personal pedometers and IMU sensing (there is A WORLD around this, so continue posting your doubts and questions here).

Once you have this, you will need to combine those reads to GPS to correct the small errors generated by IMU drift, and you will have a smoot information about rover position.

Maybe if you don't want to deal with those complex calculations and if you have some money you could try http://store.diydrones.com/ArduIMU_V3_p/kt-arduimu-30.htm

 

At this point you have almost real position of your rover, then you need some of the PID control theory.

Haha glad you like it!!  The GPS I am using is accurate to 2-3 meters, and the data is quite accurate.  I'm thinking of getting an encoder, and I have an 3 axis accelerometer (on hand, just not on the robot).  There is also a compass (not sure if you saw that or not).   I'm not looking for centimeter accuracy, just something to get me to be within 2-3 meters of some set coordinates.  If I really wanted super precision, I think i'd look into GPS differential and set up a second GPS and communicate with the first using two Xbee's 

 

I just recieved my Xbee's by the way, so stand by for either a tutorial soon or and update on the robot!

I get your point.
But regardless of your accuracy requeriments, (that is true that you don't need too much accuracy), there is a problem about noise.


You turn on your rover, and without setting any new waypoint, the rover will move to the next GPS reported position. In the best case, asuming your GPS has a very good signal and WAAS activated, the error will be 2 to 3m, and that will be the diameter where your rover will move crazy.


Maybe you don't need a complete imu if your average A LOT your GPS readings in order to filter the noise, and you tune your PID control to react accordingly to the slow response of your readings.

EDIT:

MMM your encoders can be very useful if you assume that wheels will not drift. Maybe you can calculate distance and course travelled with encoders and compass, and filter them with gps to cancel signal drift. Could work, if you take the most important part of the signal from encoders and only gps to correct drift with a complementary filter.

EDIT2:

Notice that without complete imu, that solution only will work on flat surfaces. Any unleveled terrain will mess up your compass readings.

Don't forget to add or subtract the magnetic declination of your zone from the reported compass angle too, in order to obtain angle to geographical north instead of magnetic north

I'm not sure what we're referring to here with GPS "Noise", but there are a few things about GPS that I do know and that are applicable here:

1) GPS Accuracy to 2-3 meters: This is really based on the time of day and the position of sattelites in orbit.  So if you have a point on the earth that you absolutely know the coordinates to (have a surveyor come and mark it perhaps), then you may be off that location by up to 2-3 meters.  However, the distance and direction that you are off this location stays set, it doesn't move around, so if your GPS thinks the location is actually 1 meter to the left of your survey point, that is where it thinks it precisely is, and this doesn't change (except very slightly as satellites move through orbit).

2) GPS Accuracy error is the same for all GPS devices in the same area.  So trying to use two GPS receivers and splitting the difference between the two will not work.  If a GPS thinks a point is a meter or two off of where it actually should be, then any other nearby GPS receivers will be talking to the same satellites and have the same data.

3) Regardless of the method of position location, you can remove the "moving around like crazy" part through the way you program your robot.  You should just code it so that when the robot "arrives" at a location it stops its "navigate to" function.  If we're afraid that it will never get to exactly the point that its trying to reach, then make it "arrive" when it gets within a certain distance of its target.

Do you have exactly the same gps values for a single position over and over again?

With noise I mean that if you stay motionless, your GPS will not report exactly the same position. Those error is called "noise". This can be a problem specially when you are near of your target, but not arrived yet. You can receive a "in-target-position" reading, and "not-in-target-position" gps read, even if you are in the right course. This is a problem, because your rover will turn crazy

What about GPS differential?  I plan on using GPS differential on my next revision (whenever that may be) but isn't that using two GPS systems?  one stationary and one moving?  Or am I wrong?  And an easy way to get rid of the noise is indeed to take in a lot of data and get rid of all of the outliers, but the GPS won't be giving me the course direction--that's what the digital compass is for--therefore, shouldn't its movements be less erratic?

I like it. Looking at the 5 IR sensors, the GPS and compass, plus the other additions. Cool.

I did wonder a wee bit about using two Arduino boards.

 

For some reason, the ESC didn't want to work immediately after being turned on, so I loaded the "knob" sketch in the servo library to the uno.  I set the ESC by giving it parameters to work with.  When I turned the potentiometer to the right, it would measure its max speed.  When I turned it to the left, that would give it the brake/reverse limits.  Then I just take the wire out of the uno, still connected to the esc, then put it in the appropriate pin on the mega.  Then it's all set to go!

For some reason, the ESC didn't want to work immediately after being turned on, so I loaded the "knob" sketch in the servo library to the uno.  I set the ESC by giving it parameters to work with.  When I turned the potentiometer to the right, it would measure its max speed.  When I turned it to the left, that would give it the brake/reverse limits.  Then I just take the wire out of the uno, still connected to the esc, then put it in the appropriate pin on the mega.  Then it's all set to go!

I have had the same problem with an ESC and found that writing the neutral value to the ESC for one seconds before the rest of the program starts will activate the ESC. You can do that by just using the servo library functions as it uses the same data input as a servo. The time of the delay will depend on what brand etc. the ESC is but if it doesn't work first shot, try a delay of two seconds instead. I added the delay of three seconds before this just to make sure. Here is an example:

 

#include <Servo.h>
Servo throttle;
void setup() {
throttle.attach(yourpin);
delay(3000);
throttle.write(90);
delay(1000);
}