Tuesday, December 15, 2015

Maze Solver Code

//this code is written for 5 line detecting sensors
#include <IRremote.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"
#include <Servo.h>
//this tells the arduino that it will be using a motor shield and two DC motors run through ports 1 and 2
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1); //left motor
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2); //right motor
#define leftoutsensor   A1 //left outside line sensor
#define leftinsensor   A2 //left inside line sensor
#define centersensor   A3 //center line sensor
#define rightinsensor   A4 //right inside line sensor
#define rightoutsensor  A5 //right outside line sensor
#define doublecheck   200
int leftoutReading;
int leftinReading;
int centerReading;
int rightinReading;
int rightoutReading;

void setup()
{
AFMS.begin(); //begins running through the motor shield
myMotor1->run(RELEASE); //begins running the motor in port 1
myMotor2->run(RELEASE); //begins running the motor in port 2
Serial.begin(9600); //starts monitoring the values from the analog input
}

void loop()
{

readSensors(); //reads sensors
//return;
if(leftoutReading < 200 && rightoutReading < 200 && centerReading > 200)
{
straight();
}
else
{
LeftHandRule();
}
}

void readSensors()
{
leftoutReading = analogRead(leftoutsensor);
leftinReading = analogRead(leftinsensor);
centerReading = analogRead(centersensor);
rightinReading = analogRead(rightinsensor);
rightoutReading = analogRead(rightoutsensor);
}

void LeftHandRule()
{
if(leftoutReading > 200 && rightoutReading > 200) //both sides detect line
{
inch();

if(leftoutReading > 200 || rightoutReading > 200) //either side detects line again
{
done();
}
if(leftoutReading < 200 && rightoutReading < 200) //neither side detects line
{
turnLeft();
}
}

if(leftoutReading > 200)    //left side detects line
{
inch();

if(leftoutReading < 200 && rightoutReading < 200) //
{
turnLeft();
}
else
{
done();
}
}

if(rightoutReading > 200)
{
inch();

if(leftoutReading > 200)
{
delay(doublecheck - 30);
readSensors();

if(rightoutReading > 200 && leftoutReading > 200)
{
done();
}
else
{
turnLeft();
return;
}
}
delay(doublecheck - 30);
readSensors();

if(leftoutReading < 200 && rightoutReading < 200 && centerReading < 200)
{
turnRight();
return;
}
readSensors();
if(leftoutReading < 200 && leftinReading < 200 && centerReading < 200
       && rightinReading < 200 && rightoutReading < 200)
{
turnAround();
}
}
}

void inch ()
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(doublecheck);
readSensors();
}

void done()
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(0);
myMotor2->setSpeed(0);
}

void turnLeft()
{
while (analogRead(centersensor) > 200)
{
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(2);
}
while(analogRead(centersensor) < 200)
{
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(2);
}
}

void turnRight()
{
while(analogRead(centersensor) > 200)
{
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(2);
}

while(analogRead(centersensor) < 200)
{
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(2);
}
}

void straight()
{
if (analogRead(leftinsensor) > 200)
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(0);
myMotor2->setSpeed(50);
delay(5);
}

if (analogRead(rightinsensor) > 200)
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(0);
delay(5);
}
else
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(5);
}

}

void turnAround()
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(150);

while(analogRead(centersensor) < 200)
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(5);
}
}
/*
Codes Written by
Peter Fickenwirth
*/

Infrared Remote Code

#include <IRremote.h>
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"
#include <Servo.h>
//this tells the arduino that it will be using a motor shield and two DC motors run through ports 1 and 2
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1); //left motor
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2); //right motor
int RECV_PIN = 7; //defines the pin that the IR Receiver is in
IRrecv irrecv(RECV_PIN); //tells the Arduino an IR Receiver is being used
decode_results results; //tells the Arduino to decode the IR Signals


void setup()
{
AFMS.begin(); //begins running through the motor shield
myMotor1->run(RELEASE); //begins running the motor in port 1
myMotor2->run(RELEASE); //begins running the motor in port 2
irrecv.enableIRIn(); //starts the infrared receiver
Serial.begin(9600); //starts monitoring the values from the analog input
}

void loop()
{
    //return;
if (irrecv.decode(&results))
{
Serial.println(results.value, HEX); //sends the IR signal code to the serial monitor
/*the switch/case statement tells the Arduino what it should do
 when it receives an IR signal. If the signal is unknown, it will
 stop the wheels until a known signal is received.*/
switch(results.value)
{
case 0xFD807F: //if "forward" is pressed, the motors run forward
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(50);
break;

case 0xFD20DF: //if left is pressed, the motors pivot counterclockwise
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(50);
break;

case 0xFD906F: //if right is pressed, the motors pivot clockwise
myMotor1->run(BACKWARD);
myMotor2->run(BACKWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(50);
break;

case 0xFD609F: //if back is pressed, the motors run backwards
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor1->setSpeed(50);
myMotor2->setSpeed(50);
delay(50);
break;

default: //if an undefined button is pressed, the motors stop
myMotor1->setSpeed(0);
myMotor2->setSpeed(0);
delay(50);;
break;
}
irrecv.resume(); // Receives the next signal
}
}
/*
Codes Written by
Peter Fickenwirth
*/

Edge Detection/Bumper Detection Code

/*this tells the program itself to start
referencing from the necessary libraries to
know what certain commands in the setup and loop mean*/
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"
#include <Servo.h>
//this tells the arduino that it will be using a motor shield and two DC motors run through ports 1 and 2
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1); //left motor
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2); //right motor
int left = A2;  //defines a pin for the left line sensor
int center = A1; //defines a pin for the center line sensor
int right = A0; //defines a pin for the right line sensor
int LeftSwitch = 6; //define a pin for the left Bumper
int RightSwitch = 10; //define a pin for the Right Bumper

void setup()
{
AFMS.begin(); //begins running through the motor shield
myMotor1->run(RELEASE); //begins running the motor in port 1
myMotor2->run(RELEASE); //begins running the motor in port 2
Serial.begin(9600); //starts monitoring the values from the analog input
pinMode(RightSwitch, INPUT_PULLUP);
pinMode(LeftSwitch, INPUT_PULLUP);
}

void loop()
{
//return;

Serial.println(digitalRead(LeftSwitch)); //Write the value of the a sensor to the serial monitor.

/*
While the switches on the front of the robot are not active, it will be looking
for edges to tell if it is going to fall off a table or run over a boundary line.
*/

while (digitalRead(LeftSwitch) == 1 && digitalRead(RightSwitch) == 1)
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(80);
myMotor2->setSpeed(80);

if (analogRead(left) >= 900 || analogRead(center) >= 900)
{
myMotor1->run(BACKWARD);
myMotor2->run(BACKWARD);
myMotor1->setSpeed(80);
myMotor2->setSpeed(80);
delay(1000);
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor1->setSpeed(80);
myMotor2->setSpeed(80);
delay(2000);
}
if (analogRead(right) >= 900)
{
myMotor1->run(BACKWARD);
myMotor2->run(BACKWARD);
myMotor1->setSpeed(80);
myMotor2->setSpeed(80);
delay(1000);
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(80);
myMotor2->setSpeed(80);
delay(2000);
}
}
delay(50);
/*
  If one of the switches is pressed, the robot will back up and turn a different direction
  and then procede running forward until either it comes to another obstacle, or a bright
  light
*/

if (digitalRead(LeftSwitch) == 0)
{
myMotor1->run(BACKWARD);
myMotor2->run(BACKWARD);
delay(1000);
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
delay(2000);
}

if (analogRead(RightSwitch) == 0)
{
myMotor1->run(BACKWARD);
myMotor2->run(BACKWARD);
delay(1000);
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
delay(2000);
}
}
/*
Codes Written by
Peter Fickenwirth
*/

Line Follower Code

/*this tells the program itself to start
referencing from the necessary libraries to
know what certain commands in the setup and loop mean*/
#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"
#include <Servo.h>
//this tells the arduino that it will be using a motor shield and two DC motors run through ports 1 and 2
Adafruit_MotorShield AFMS = Adafruit_MotorShield();
Adafruit_DCMotor *myMotor1 = AFMS.getMotor(1); //left motor
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2); //right motor
int Speed = 80;


void setup()
{
AFMS.begin(); //begins running through the motor shield
myMotor1->run(RELEASE); //begins running the motor in port 1
myMotor2->run(RELEASE); //begins running the motor in port 2
Serial.begin(9600); //starts monitoring the values from the analog input
}

void loop()
{
//return;
int left = A0; //left line sensor
int center = A1; //middle line sensor
int right = A2; //right line sensor
Serial.println(analogRead(center)); //prints the analog readigns to the serial monitor

/*
 the following while loop tells the arduino to
 follow a line as long as it is on a table. It will
 adjust its path by stopping the motor opposite of the
 line sensor that has come off the line.
*/

if (analogRead(left) < 900 && analogRead(center) > 900 && analogRead(right) < 900)
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(Speed);
myMotor2->setSpeed(Speed);
}
if (analogRead(left) >= 900)
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(Speed);
myMotor2->setSpeed(0);
}
if (analogRead(right) >= 900)
{
myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(0);
myMotor2->setSpeed(Speed);
}
if(analogRead(left) >= 900 && analogRead(center) <= 900)
{
myMotor1->run(FORWARD);
myMotor2->run(BACKWARD);
myMotor1->setSpeed(Speed);
myMotor2->setSpeed(Speed);
}
if(analogRead(right) >= 900 && analogRead(center) <= 900)
{
myMotor1->run(BACKWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(Speed);
myMotor2->setSpeed(Speed);
}
    else{
    myMotor1->run(FORWARD);
myMotor2->run(FORWARD);
myMotor1->setSpeed(Speed);
myMotor2->setSpeed(Speed);
    }
}
/*
Codes Written by
Peter Fickenwirth
*/