Home Depot Special
Home depot special is a 'bot Brian Wagner built for the fall 2010 LVL1 Sumobot competition.
Components
I will get pictures up soon, but until then here are the components I used...
Motor and wheels http://www.solarbotics.com/products/gmpw_deal/
Casters to maintain balance http://www.pololu.com/catalog/product/950
Motor Driver http://www.pololu.com/catalog/product/110 (discontinued)
Bare Bones Board Arduino clone http://shop.moderndevice.com/products/bbb-kit
New work Box - makes a nice chassis. I cut holes in this and hot-melt glued the motors in it. http://www.homedepot.com/h_d1/N-5yc1v/R-100404058/h_d2/ProductDisplay?langId=-1&storeId=10051&catalogId=10053
digital line sensor http://www.pololu.com/catalog/product/959
distance sensor http://www.pololu.com/catalog/product/1136
battery Holder for Arduino power https://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_2111329_-1
battery holder for motor power (9v) https://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_109154_-1
Misc switches and other stuff
Code
This is the code I used. It worked OK, but not great. I need to tweak it more.
//#include <AFMotor.h> #include <PololuQTRSensors.h> //we're using the pololuQTR sensor library so we must attach it. PololuQTRSensorsRC qtr((unsigned char[]) {18,19}, 2, 2000, 255); //declares two line sensors on pins 18 and 19 //this corresponds to analog pins 4 and 5 unsigned int sensors[2]; const int motor1Pin = 3; // right motor (directional pin 1) const int motor2Pin = 2; // right motor (directional pin 2) const int motor1Pin2 = 4; //left motor (directional pin 1) const int motor2Pin2 = 5; //left motor (directional pin 2) const int enablePin1 = 9; //right speed control const int enablePin2 = 10; //left speed control const int linethreshold = 300; const int rangethreshold = 30; int rangepin = 0; //distance sensor 1 void setup() { Serial.begin(9600); // set up Serial library at 9600 bps for debugging // set all the other pins you're using as outputs: pinMode(motor1Pin, OUTPUT); pinMode(motor2Pin, OUTPUT); pinMode(motor1Pin2, OUTPUT); pinMode(motor2Pin2, OUTPUT); pinMode(enablePin1, OUTPUT); pinMode(enablePin2, OUTPUT); pinMode(13, OUTPUT); // set enablePin high so that motor can turn on: analogWrite(enablePin1, 255); //255 is full speed, 0 is stopped analogWrite(enablePin2, 255); //255 is full speed, 0 is stopped } void loop() { //THE MAIN PROGRAM LOOP qtr.read(sensors); delay(20); //a possibly redundant delay //DEBUG STATEMENTS //if things aren't working right try uncommenting the lines below and checking the serial monitor //Serial.println(read_gp2d12_range(rangepin)); Serial.print(sensors[0]); Serial.print(" "); Serial.println(sensors[1]); //********** MOTOR TEST CODDE ******************** //******************************************* //left motor forward (turn right) //digitalWrite(motor1Pin2, LOW); // set leg 1 of the H-bridge low **left motor forward //digitalWrite(motor2Pin2, HIGH); // set leg 2 of the H-bridge high //delay(1000); //right motor forward (turn left) //digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low **right motor forward //digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high //delay(1000); //both forward //digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low **right motor forward //digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high //digitalWrite(motor1Pin2, LOW); // set leg 1 of the H-bridge low **left motor forward //digitalWrite(motor2Pin2, HIGH); // set leg 2 of the H-bridge high //delay(1000); //digitalWrite(motor1Pin, HIGH); // set leg 1 of the H-bridge low **right motor reverse //digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge high //digitalWrite(motor1Pin2, HIGH); // set leg 1 of the H-bridge low **left motor reverse //digitalWrite(motor2Pin2, LOW); // set leg 2 of the H-bridge high //delay(1000); //********** MAIN CODE ********************* //********************************************* //CHECK THE LINE SENSORS if (sensors[0] < linethreshold && sensors[1] < linethreshold) { //UH-OH... BOTH SENSORS DETECT THE BORDER, LET'S BACKUP AND SPIN digitalWrite(13, HIGH); //turn on light to indicate it senses the border digitalWrite(motor1Pin, HIGH); // set leg 1 of the H-bridge low **right motor reverse digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge high digitalWrite(motor1Pin2, HIGH); // set leg 1 of the H-bridge low **left motor reverse digitalWrite(motor2Pin2, LOW); // set leg 2 of the H-bridge high delay(500); //do this for half of a second digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low **right motor stopped digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge high digitalWrite(motor1Pin2, HIGH); // set leg 1 of the H-bridge low **left motor reverse digitalWrite(motor2Pin2, LOW); // set leg 2 of the H-bridge high delay(500); //do this for half of a second } else if (sensors[0] < linethreshold && sensors[1] > linethreshold) { //RIGHT SENSOR DETECTS BORDER, TURN LEFT digitalWrite(13, HIGH); //turn on light to indicate it senses the border digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low **right motor forward digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high digitalWrite(motor1Pin2, LOW); // set leg 1 of the H-bridge low **left motor stopped digitalWrite(motor2Pin2, LOW); // set leg 2 of the H-bridge high delay(10); //slight delay to keep the program running smoothly } else if (sensors[0] > linethreshold && sensors[1] < linethreshold) { //LEFT SENSOR DETECTS BORDER, TURN RIGHT digitalWrite(13, HIGH); //turn on light to indicate it senses the border digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low **right motor stopped digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge high digitalWrite(motor1Pin2, LOW); // set leg 1 of the H-bridge low **left motor forward digitalWrite(motor2Pin2, HIGH); // set leg 2 of the H-bridge high delay(10); //slight delay to keep the program running smoothly } else { //WITHIN BORDERS if (read_gp2d12_range(rangepin) < rangethreshold) { //IT SEES AN OPPONENT --> CHARGE! digitalWrite(13, HIGH); //turn on a light to indicate it sees an opponent analogWrite(enablePin1, 255); analogWrite(enablePin2, 255); digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low **right motor forward digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high digitalWrite(motor1Pin2, LOW); // set leg 1 of the H-bridge low **left motor forward digitalWrite(motor2Pin2, HIGH); // set leg 2 of the H-bridge high delay(100); //a longer delay for the charge } else { //LOOKING FOR OPPONENT BY SPINNING IN PLACE digitalWrite(13, LOW); //turn off the light to indicate it doesn't see an opponent digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low **right motor forward digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high digitalWrite(motor1Pin2, HIGH); // set leg 1 of the H-bridge low **left motor reverse digitalWrite(motor2Pin2, LOW); // set leg 2 of the H-bridge high delay(10); //slight delay to keep the program running smoothly } } } float read_gp2d12_range(byte pin) { //method for reading the range sensor(s) //probably shouldn't mess with this stuff... I didn't do it int tmp; tmp = analogRead(pin); if (tmp < 3) return -1; // invalid value return (6787.0 /((float)tmp - 3.0)) - 4.0; }