//Beta 6, IR receiver, servo, Sharp IR, sonar 9/4/10 #include #include #define halt 410; #define straight 90; #define reverse 3482; #define forward 922; #define pause 2458; int IRpin = 1; //Sharp IR analog pin 1 int IRpinb = 7; //bottom Sharp IR on analog pin 7 int sonarpin = 5; //sonar input on analog pin 5 int servopin = 9; //servo is on PWM pin 9 int RECV_PIN = 11; //Radio Shack IR receiver PWM pin 11 int pos = 0; //variable to store the servo position int posold; //previous servo pos int motorspd1= 8; //motor1 speed on PWM pin 8 int motorspd2= 2; //motor2 speed on PWM pin 2 int motordir1a= 24; //motor1 direction digital pin 22 int motordir1b= 25; //motor1 direction digital pin 23 int motordir2a= 22; //motor2 direction digital pin 24 int motordir2b= 23; //motor2 direction digital pin 25 int dir = 1; //set direction of motors int i; //index for array int setPoint = 50; //initialize array with this int bypass = 0; //bypass main servo scan loog int oldpress = 0; //previous remote control key int mnsonar = 15; //min sonar reading before detection long randNumber; float mxvolts = 1.40; //max volts reading before detection float sensorReadings = 0.00; //store IR readings float sensorSum = 0.00; //used for summing ir readings float averageValue = 0.00; //used for average volts readings float volts = 0.00; //Sharp IR reading is stored in volts float voltsb = 0.00; //bottom Sharp IR reading float voltsold; //previous volts measurement float sonar = 1.0; //sonar voltage reading IRrecv irrecv(RECV_PIN); //tell IRremote what pin IR receiver is on decode_results results; //what does this do? Servo myservo; //create servo object to control a servo void setup() { Serial.begin(9600); //start the serial port myservo.attach(servopin); //attaches the servo on pin 9 to the servo object irrecv.enableIRIn(); //start the IR receiver analogWrite(motorspd1, 0); //set inital speed to 0 analogWrite(motorspd2, 0); pinMode(motordir1a, OUTPUT); pinMode(motordir1b, OUTPUT); pinMode(motordir2a, OUTPUT); pinMode(motordir2b, OUTPUT); digitalWrite(motordir1a, LOW); //initalize set direction forward digitalWrite(motordir1b, HIGH); //initalize set direction forward digitalWrite(motordir2a, LOW); //initalize set direction forward digitalWrite(motordir2b, HIGH); //initalize set direction forward randomSeed(analogRead(1)); //initalize random # for turns after backup, get from pin 1 delay(5000); //wait 5 seconds before doing anything } void loop() { remote(); //check to see if a remote button pressed delay(100); //Serial.println(oldpress); if (oldpress == 3898 && bypass == 0) { //if remote is activated (INOUT SELECT), set bypass = 1 bypass = 1; //used to bypass servo sweep code, keeping bypassing oldpress = 0; //until INOUT SELECT pressed again } if (oldpress == 3898 && bypass == 1) { //if remote was activated, set bypass = 0 bypass = 0; //so servo will start up again oldpress = 0; } //Serial.println(bypass); frward(); //assume no obstacles, go forward if (bypass == 0){ for(pos = 45; pos <= 135 && volts < mxvolts && voltsb < mxvolts && sonar > mnsonar; pos += 15) { //goes 45-135 degrees //in 15 degree steps as long as volts/sonar detect nothing close delay(45); //wait 45 ms before taking ir readings if (voltsold >= mxvolts) myservo.write(posold);//if coming back from direction change, go to last pos else myservo.write(pos); //tell servo to go to position in variable 'pos' for (i = 0; i < 50; i++) { //measure top IR 50 times and average sensorReadings= analogRead(IRpin)*0.0048828125; sensorSum = sensorSum + sensorReadings; } volts = sensorSum / 50; sensorSum = 0; for (i = 0; i < 50; i++) { //measure bottom IR 50 times and average sensorReadings= analogRead(IRpinb)*0.0048828125; sensorSum = sensorSum + sensorReadings; } voltsb = sensorSum / 50; sensorSum = 0; //Serial.println(volts); voltsold = volts; //remember previous volts posold = pos; //remember previous posistion sonar = analogRead(sonarpin); //read sonar voltage //Serial.println(sonar); } move(); for(pos = 135; pos >= 45 && volts < mxvolts && voltsb < mxvolts && sonar > mnsonar; pos -= 15) { delay(45); if (voltsold >= mxvolts) myservo.write(posold); else myservo.write(pos); for (i = 0; i < 50; i++) { sensorReadings= analogRead(IRpin)*0.0048828125; sensorSum = sensorSum + sensorReadings; } volts = sensorSum / 50; sensorSum = 0; for (i = 0; i < 50; i++) { //measure bottom IR 50 times and average sensorReadings= analogRead(IRpinb)*0.0048828125; sensorSum = sensorSum + sensorReadings; } voltsb = sensorSum / 50; sensorSum = 0; voltsold = volts; //remember previous volts posold = pos; //remember previous posistion sonar = analogRead(sonarpin); //read sonar voltage } move (); } } void remote (){ decode_results results; if (irrecv.decode(&results)) { //Serial.println(results.value); oldpress = (results.value); //save results in oldpress if (results.value == 410) { //halt analogWrite(motorspd1, 0); analogWrite(motorspd2, 0); } if (results.value == 922 || results.value == 90) { frward(); } if (results.value == 3482) { //backward backward(); } if (results.value == 346) { //LEFT left(); } if (results.value == 2394) { //RIGHT right(); } if (results.value == 26) { //1 pressed on remote analogWrite(motorspd1, 40); analogWrite(motorspd2, 40); } if (results.value == 2074) { //2 pressed on remote analogWrite(motorspd1, 65); analogWrite(motorspd2, 65); } if (results.value == 1050) { //3 pressed on remote analogWrite(motorspd1, 90); analogWrite(motorspd2, 90); } if (results.value == 3098) { //4 pressed on remote analogWrite(motorspd1, 115); analogWrite(motorspd2, 115); } if (results.value == 538) { //5 pressed on remote analogWrite(motorspd1, 140); analogWrite(motorspd2, 140); } if (results.value == 2586) { //6 pressed on remote analogWrite(motorspd1, 165); analogWrite(motorspd2, 165); } if (results.value == 1562) { //7 pressed on remote analogWrite(motorspd1, 190); analogWrite(motorspd2, 190); } if (results.value == 3610) { //8 pressed on remote analogWrite(motorspd1, 215); analogWrite(motorspd2, 215); } if (results.value == 282) { //9 pressed on remote analogWrite(motorspd1, 255); analogWrite(motorspd2, 255); } if (results.value == 2330) { //0 pressed on remote analogWrite(motorspd1, 0); analogWrite(motorspd2, 0); } irrecv.resume(); // Receive the next value } } void move () { if (pos < 65 && volts >= mxvolts) dir = 4; //object on left, turn right else if ((pos >= 65 && pos <= 115 && volts >= mxvolts) || sonar <= mnsonar || voltsb >= mxvolts) dir = 2; //in front, backup else if (pos > 115 && volts >= mxvolts) dir = 3; //object on right, turn left else dir = 1; //no object, go straight if ((volts >= mxvolts || sonar <= mnsonar) && dir == 2) { analogWrite(motorspd1, 0); //stop motors, detected something analogWrite(motorspd2, 0); digitalWrite(motordir1a, HIGH); //brake motors digitalWrite(motordir1b, HIGH); //brake motors digitalWrite(motordir2a, HIGH); //brake motors digitalWrite(motordir2b, HIGH); //brake motors delay(500); } if (dir == 1) { //move forward frward(); } if (dir == 2) { //move backawrd backward(); } if (dir == 3) { //move left backward(); left(); } if (dir == 4) { //move right backward(); right(); } if (dir != 1) { //for any direction but straight, delay (1000); //go for 1.5 second and then stop analogWrite(motorspd1, 0); analogWrite(motorspd2, 0); } volts = 0; //reset so it will enter main LOOP voltsb = 0; sonar = 100; //reset so it will enter main LOOP } void backward() { analogWrite(motorspd1, 0); //set speed to 0 analogWrite(motorspd2, 0); digitalWrite(motordir1a, HIGH); //set direction backward digitalWrite(motordir1b, LOW); //set direction backward digitalWrite(motordir2a, HIGH); //set direction backward digitalWrite(motordir2b, LOW); //set direction backward analogWrite(motorspd1, 125); analogWrite(motorspd2, 125); if (dir == 2) delay (1000); //backup for 1 sec randNumber = random(2); if (randNumber == 0) dir = 3; else dir = 4; } void left() { digitalWrite(motordir1a, HIGH); //set direction backward digitalWrite(motordir1b, LOW); //set direction backward digitalWrite(motordir2a, LOW); //set direction forward digitalWrite(motordir2b, HIGH); //set direction forward analogWrite(motorspd1, 125); analogWrite(motorspd2, 125); } void right() { digitalWrite(motordir1a, LOW); //set direction forward digitalWrite(motordir1b, HIGH); //set direction forward digitalWrite(motordir2a, HIGH); //set direction backward digitalWrite(motordir2b, LOW); //set direction backward analogWrite(motorspd1, 125); analogWrite(motorspd2, 125); } void frward() { digitalWrite(motordir1a, LOW); //set direction forward digitalWrite(motordir1b, HIGH); //set direction forward digitalWrite(motordir2a, LOW); //set direction forward digitalWrite(motordir2b, HIGH); //set direction forward analogWrite(motorspd1, 255); analogWrite(motorspd2, 255); }