Barney Fife: Difference between revisions

From LVL1
Jump to navigation Jump to search
Imrcly (talk | contribs)
No edit summary
Imrcly (talk | contribs)
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
2x Solarbotics GM8 Motor with wheels
 
[http://www.solarbotics.com/products/gmpw_deal/]
 
x Solarbotics GM8 Motor with wheels
 
[http://www.solarbotics.com/products/gmpw_deal/ http://www.solarbotics.com/products/gmpw_deal/]
 


1x SN754410 Quad Half H-Bridge
1x SN754410 Quad Half H-Bridge
[http://www.sparkfun.com/commerce/product_info.php?products_id=315]
 
[http://www.sparkfun.com/commerce/product_info.php?products_id=315 http://www.sparkfun.com/commerce/product_info.php?products_id=315]
 
 
2x QRE1113 Line Sensor Breakout - Analog
2x QRE1113 Line Sensor Breakout - Analog
[http://www.sparkfun.com/commerce/product_info.php?products_id=9453]
 
[http://www.sparkfun.com/commerce/product_info.php?products_id=9453 http://www.sparkfun.com/commerce/product_info.php?products_id=9453]
 
 
1x Infrared Proximity Sensor Short Range - Sharp GP2D120XJ00F
1x Infrared Proximity Sensor Short Range - Sharp GP2D120XJ00F
[http://www.sparkfun.com/commerce/product_info.php?products_id=8959]
 
[http://www.sparkfun.com/commerce/product_info.php?products_id=8959 http://www.sparkfun.com/commerce/product_info.php?products_id=8959]
 
 
1x cheap arduino clone (Diavolino)
1x cheap arduino clone (Diavolino)
[http://evilmadscience.com/tinykitlist/180]
 
 
[http://evilmadscience.com/tinykitlist/180 http://evilmadscience.com/tinykitlist/180]
 
 
1x small sheet of 1/8" lexan
1x small sheet of 1/8" lexan
9001x hot glue
 
1x 9v battery holder
 
1x 4xAA battery holder
 
20x Header pins (3,5,2)
 
hot glue
 
Solder
Solder
assorted bits of wire
assorted bits of wire
Header pins




Sources
[http://groups.google.com/group/tuftsroboticsclub/web/anatomy-of-a-sumobot http://groups.google.com/group/tuftsroboticsclub/web/anatomy-of-a-sumobot]
[http://groups.google.com/group/tuftsroboticsclub/web/how-to-program-your-sumobot http://groups.google.com/group/tuftsroboticsclub/web/how-to-program-your-sumobot]




Sources
My code as it ran at the competition
[http://groups.google.com/group/tuftsroboticsclub/web/anatomy-of-a-sumobot]
<code>
[http://groups.google.com/group/tuftsroboticsclub/web/how-to-program-your-sumobot]
 
<nowiki>#include <PololuQTRSensors.h> </nowiki>//we're using the pololuQTR sensor library so we must attach it.
 
 
<nowiki>PololuQTRSensorsRC qtr((unsigned char[]) {19,18}, 2, 2000, 255); //declares two line sensors on pins 18 and 19 this corresponds to analog pins 4 and 5</nowiki>
 
<nowiki>unsigned int sensors[2];</nowiki>
 
 
const int motor1APin = 10; // H-bridge leg 1 (pin 2) bundle black wire
 
const int motor2APin = 9; // H-bridge leg 2 (pin 7) bundle white wire
 
const int motor4APin = 11; // H-bridge leg 3 (pin 10) bundle red wire
 
const int motor3APin = 12; // H-bridge leg 4 (pin 15) bundle green wire
 
const int enmotorPin = 8; // H-bridge enable pin speed control (1 and 9) green wire
 
const int buzzerPin = 2; //buzzer pin
 
const int ledPin = 13; // LED (onboard)
 
const int irSensorPin = 3; // IR sensor on this pin distance sensor
 
 
const int linethreshold = 300;
 
 
/* This is notes on what my motors will do
 
PORTB = B00010011;//Forward
 
 
PORTB = B00001101; //backwards
 
 
PORTB = B00001011;//rotate left
 
 
PORTB = B00010101;//rotate right
 
 
PORTB = B00000001; //all stop
 
<nowiki>*/</nowiki>
 
 
void setup() {
 
 
//Serial.begin(9600); // set up Serial library at 9600 bps for debugging
 
// set all outputs:
 
// motors
 
pinMode(motor1APin, OUTPUT);
 
pinMode(motor2APin, OUTPUT);
 
pinMode(motor3APin, OUTPUT);
 
pinMode(motor4APin, OUTPUT);
 
pinMode(enmotorPin, OUTPUT);
 
// AV outputs
 
pinMode(ledPin, OUTPUT);
 
pinMode(buzzerPin, OUTPUT);
 
pinMode(irSensorPin, INPUT);
 
delay (3000);
 
 
/* blink the LED 3 times. This should happen only once.
 
if you see the LED blink three times, it means that
 
the module reset itself,. probably because the motor
 
caused a brownout or a short. */
 
blink(ledPin, 3, 100);
 
 
} //end setup
 
 
void loop() {
 
qtr.read(sensors);
 
 
//Don't forget to enable the serial port in setup
 
/*
 
Serial.print(analogRead(irSensorPin));
 
Serial.print(" r= ");
 
<nowiki>Serial.print(sensors[0]);//right</nowiki>
 
Serial.print(" l= ");
 
<nowiki>Serial.println(sensors[1]);//left </nowiki>
 
// <nowiki>*/</nowiki>
 
 
<nowiki>if (sensors[0] < linethreshold && sensors[1] < linethreshold) </nowiki>
 
{
 
// Serial.println("the edge backup and spin");
 
PORTB = B00001101; //backup
 
delay(500); //do this for half of a second
 
PORTB = B00001011;//rotate left
 
delay(500); //do this for half of a second
 
} //end found edge front
 
<nowiki>else if (sensors[1] < linethreshold) </nowiki>
 
{
 
// Serial.println("right sensor, turn left");
 
PORTB = B00001011;//rotate left
 
delay(1000); //do this for half of a second
 
} //end found edge right
 
<nowiki>else if (sensors[0] < linethreshold) </nowiki>
 
{
 
// Serial.println("left sensor, turn right");
 
PORTB = B00010101;//rotate right
 
delay(500); //do this for half of a second
 
} //end found edge Left
 
//WITHIN BORDERS
 
<nowiki>else if (irdistance(irSensorPin) < 450/*max distance */ )</nowiki>
 
{
 
// Serial.println("CHARGE");
 
PORTB = B00010011;
 
freqout(900,20,buzzerPin); //Battlecry to indicate it sees an opponent
 
delay(100); //a longer delay for the charge
 
}//end charge
 
else
 
{
 
Serial.println("scanning, where are you?");
 
PORTB = B00010101;//rotate right
 
delay(100);
 
}//end search
 
}//end Loop
 
 
//blinks an LED
 
void blink(int whatPin, int howManyTimes, int milliSecs) {
 
int i = 0;
 
<nowiki>for ( i = 0; i < howManyTimes; i++) {</nowiki>
 
digitalWrite(whatPin, HIGH);
 
delay(milliSecs/2);
 
digitalWrite(whatPin, LOW);
 
delay(milliSecs/2);
 
}
 
}// end blink
 
 
//this is for the piezo buzzer
 
void freqout(int freq, int t, int freqoutpin) // freq in hz, t in ms, pin to use
 
{
 
int hperiod; //calculate 1/2 period in us
 
long cycles, i;
 
hperiod = (500000 / freq) - 7; // subtract 7 us to make up for digitalWrite overhead
 
cycles = ((long)freq * (long)t) / 1000; // calculate cycles
 
<nowiki>for (i=0; i<= cycles; i++){ </nowiki>// play note for t ms
 
digitalWrite(freqoutpin, HIGH);
 
delayMicroseconds(hperiod);
 
digitalWrite(freqoutpin, LOW);
 
delayMicroseconds(hperiod);
 
}//end loopbu
 
}// end freqout
 
 
float irdistance(int pin){
 
//http://luckylarry.co.uk/arduino-projects/arduino-using-a-sharp-ir-sensor-for-distance-calculation/
 
float volts, distance;
 
<nowiki>for (int i=0; i< 5; i++){ </nowiki>
 
volts = analogRead(pin)*0.0048828125;
 
distance += 65* pow(volts, -1.10);
 
}
 
distance = distance/10;
 
// float volts = analogRead(pin)*0.0048828125; // (5/1024)
 
// float distance = 65* pow(volts, -1.10); // worked out from graph 65 = theretical distance / (1/Volts)S - luckylarry.co.uk
 
return (distance);
 
}//end irdistance
</code>

Latest revision as of 11:39, 30 October 2010


x Solarbotics GM8 Motor with wheels

http://www.solarbotics.com/products/gmpw_deal/


1x SN754410 Quad Half H-Bridge

http://www.sparkfun.com/commerce/product_info.php?products_id=315


2x QRE1113 Line Sensor Breakout - Analog

http://www.sparkfun.com/commerce/product_info.php?products_id=9453


1x Infrared Proximity Sensor Short Range - Sharp GP2D120XJ00F

http://www.sparkfun.com/commerce/product_info.php?products_id=8959


1x cheap arduino clone (Diavolino)


http://evilmadscience.com/tinykitlist/180


1x small sheet of 1/8" lexan

1x 9v battery holder

1x 4xAA battery holder

20x Header pins (3,5,2)

hot glue

Solder

assorted bits of wire


Sources

http://groups.google.com/group/tuftsroboticsclub/web/anatomy-of-a-sumobot

http://groups.google.com/group/tuftsroboticsclub/web/how-to-program-your-sumobot


My code as it ran at the competition

#include <PololuQTRSensors.h> //we're using the pololuQTR sensor library so we must attach it.


PololuQTRSensorsRC qtr((unsigned char[]) {19,18}, 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 motor1APin = 10; // H-bridge leg 1 (pin 2) bundle black wire

const int motor2APin = 9; // H-bridge leg 2 (pin 7) bundle white wire

const int motor4APin = 11; // H-bridge leg 3 (pin 10) bundle red wire

const int motor3APin = 12; // H-bridge leg 4 (pin 15) bundle green wire

const int enmotorPin = 8; // H-bridge enable pin speed control (1 and 9) green wire

const int buzzerPin = 2; //buzzer pin

const int ledPin = 13; // LED (onboard)

const int irSensorPin = 3; // IR sensor on this pin distance sensor


const int linethreshold = 300;


/* This is notes on what my motors will do

PORTB = B00010011;//Forward


PORTB = B00001101; //backwards


PORTB = B00001011;//rotate left


PORTB = B00010101;//rotate right


PORTB = B00000001; //all stop

*/


void setup() {


//Serial.begin(9600); // set up Serial library at 9600 bps for debugging

// set all outputs:

// motors

pinMode(motor1APin, OUTPUT);

pinMode(motor2APin, OUTPUT);

pinMode(motor3APin, OUTPUT);

pinMode(motor4APin, OUTPUT);

pinMode(enmotorPin, OUTPUT);

// AV outputs

pinMode(ledPin, OUTPUT);

pinMode(buzzerPin, OUTPUT);

pinMode(irSensorPin, INPUT);

delay (3000);


/* blink the LED 3 times. This should happen only once.

if you see the LED blink three times, it means that

the module reset itself,. probably because the motor

caused a brownout or a short. */

blink(ledPin, 3, 100);


} //end setup


void loop() {

qtr.read(sensors);


//Don't forget to enable the serial port in setup

/*

Serial.print(analogRead(irSensorPin));

Serial.print(" r= ");

Serial.print(sensors[0]);//right

Serial.print(" l= ");

Serial.println(sensors[1]);//left

// */


if (sensors[0] < linethreshold && sensors[1] < linethreshold)

{

// Serial.println("the edge backup and spin");

PORTB = B00001101; //backup

delay(500); //do this for half of a second

PORTB = B00001011;//rotate left

delay(500); //do this for half of a second

} //end found edge front

else if (sensors[1] < linethreshold)

{

// Serial.println("right sensor, turn left");

PORTB = B00001011;//rotate left

delay(1000); //do this for half of a second

} //end found edge right

else if (sensors[0] < linethreshold)

{

// Serial.println("left sensor, turn right");

PORTB = B00010101;//rotate right

delay(500); //do this for half of a second

} //end found edge Left

//WITHIN BORDERS

else if (irdistance(irSensorPin) < 450/*max distance */ )

{

// Serial.println("CHARGE");

PORTB = B00010011;

freqout(900,20,buzzerPin); //Battlecry to indicate it sees an opponent

delay(100); //a longer delay for the charge

}//end charge

else

{

Serial.println("scanning, where are you?");

PORTB = B00010101;//rotate right

delay(100);

}//end search

}//end Loop


//blinks an LED

void blink(int whatPin, int howManyTimes, int milliSecs) {

int i = 0;

for ( i = 0; i < howManyTimes; i++) {

digitalWrite(whatPin, HIGH);

delay(milliSecs/2);

digitalWrite(whatPin, LOW);

delay(milliSecs/2);

}

}// end blink


//this is for the piezo buzzer

void freqout(int freq, int t, int freqoutpin) // freq in hz, t in ms, pin to use

{

int hperiod; //calculate 1/2 period in us

long cycles, i;

hperiod = (500000 / freq) - 7; // subtract 7 us to make up for digitalWrite overhead

cycles = ((long)freq * (long)t) / 1000; // calculate cycles

for (i=0; i<= cycles; i++){ // play note for t ms

digitalWrite(freqoutpin, HIGH);

delayMicroseconds(hperiod);

digitalWrite(freqoutpin, LOW);

delayMicroseconds(hperiod);

}//end loopbu

}// end freqout


float irdistance(int pin){

//http://luckylarry.co.uk/arduino-projects/arduino-using-a-sharp-ir-sensor-for-distance-calculation/

float volts, distance;

for (int i=0; i< 5; i++){

volts = analogRead(pin)*0.0048828125;

distance += 65* pow(volts, -1.10);

}

distance = distance/10;

// float volts = analogRead(pin)*0.0048828125; // (5/1024)

// float distance = 65* pow(volts, -1.10); // worked out from graph 65 = theretical distance / (1/Volts)S - luckylarry.co.uk

return (distance);

}//end irdistance