Skip to content

Instantly share code, notes, and snippets.

@cwu159
Created June 1, 2018 14:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cwu159/fbb01dd6dc7eca8c6f2fedaee3b3798b to your computer and use it in GitHub Desktop.
Save cwu159/fbb01dd6dc7eca8c6f2fedaee3b3798b to your computer and use it in GitHub Desktop.
Charlie's Robot Code Unrevised
#include <NewPing.h>
#include <hcsr04.h>
#include <Servo.h>
Servo leftDrive, rightDrive, intakeServo;
//HCSR04 hcsr04(11, 12, 20, 2000);
//HCSR04 sideUltrasonic(8, 9, 20, 2000);
NewPing sideUltrasonic(8, 9, 60);
NewPing hcsr04(11, 12, 60);
void setup() {
leftDrive.attach(10);
rightDrive.attach(11);
intakeServo.attach(5);
pinMode(3, INPUT); //user input button
pinMode(13, OUTPUT); //status LED
pinMode(7, OUTPUT);
pinMode(6, OUTPUT);
digitalWrite(13, HIGH);
driveStop();
Serial.begin(9600); //debugging only!!!
}
//dead reckoning only
void loop() {
//driveForwardSideBreak(32, 55);
// while(1){
// Serial.println(sideUltrasonic.convert_cm(sideUltrasonic.ping_median(3)));
// delay(100);
// }
long functionStartTime = -1; //set local function start time
driveStop();
// functionStartTime = millis();
// do {
// //delay for three seconds at start
// } while (timeBreak(functionStartTime, 3000));
//
// driveForwardSideBreak(39, 43); //250 400
// functionStartTime = millis();
// do {
// driveStop();
// } while (timeBreak(functionStartTime, 1000));
// driveForwardSideBreak(2, 10);
// functionStartTime = millis();
// do {
// driveStop();
// } while (timeBreak(functionStartTime, 1000));
// driveForwardSideBreak(39, 43);
//
// functionStartTime = millis();
// do {
// driveStop();
// } while (timeBreak(functionStartTime, 1000));
//
// while(1){} //debug
// functionStartTime = millis();
// do {
// driveTurnCoeff(1.0, 0, 1); //turn right into corridor
// } while (timeBreak(functionStartTime, 1750));
// functionStartTime = millis();
// do{
// driveStop(); //back away briefly into wall
// }while(timeBreak(functionStartTime, 5000));
functionStartTime = millis();
do {
startCollection(0.8); //fire up collection at 80% power
} while (timeBreak(functionStartTime, 1000));
// functionStartTime = millis();
// do{
// driveStraight(-1.0); //drive back to get first power up
// }while(timeBreak(functionStartTime, 0)); //2000
//
// functionStartTime = millis();
// do{
// driveStop(); //stop at wall
// }while(timeBreak(functionStartTime, 2000));
functionStartTime = millis();
do {
driveStraight(1.0); //drive forward towards wall
} while (timeBreak(functionStartTime, 5000)); //12000 //10500
functionStartTime = millis();
do {
driveStop(); //stop at wall
} while (timeBreak(functionStartTime, 500));
//START FIRST TURN
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly from wall
} while (timeBreak(functionStartTime, 250)); //400
//2500 for 360 point turn right
//2400 for 270 -0.1, 1.0 turn right
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, -0.1, 1); //turn right into corridor
} while (timeBreak(functionStartTime, 850));
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly into wall
} while (timeBreak(functionStartTime, 1500));
wobbleBack();
functionStartTime = millis();
do {
driveStraight(1.0); //drive forward towards wall
} while (timeBreak(functionStartTime, 2000)); //2500
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
//START SECOND TURN
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly from wall
} while (timeBreak(functionStartTime, 300)); //400
//2500 for 360 point turn right
//2400 for 270 -0.1, 1.0 turn right
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, 1, -0.1); //turn left into corridor
} while (timeBreak(functionStartTime, 825)); //850 before but now more for offset 900! 850
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly into wall
} while (timeBreak(functionStartTime, 1500));
wobbleBack();
functionStartTime = millis();
do {
driveStraightOffset(1.0); //drive forward towards wall
} while (timeBreak(functionStartTime, 3250)); //2500
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
//START THIRD TURN
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly from wall
} while (timeBreak(functionStartTime, 200)); //250
//2500 for 360 point turn right
//2400 for 270 -0.1, 1.0 turn right
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, -1, 1); //turn right into corridor
} while (timeBreak(functionStartTime, 675)); //700
functionStartTime = millis();
do {
driveStraight(-1.0); //back away into second wall, get second power up
} while (timeBreak(functionStartTime, 2500));
wobbleBack();
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
//START MOVE FORWARD TO SECOND SIDE OF FIELD
//driveForwardDistance(120); //1905 1700 1550 1750 1650-1715 1685! 1400 new
driveForwardSideBreak(39, 43); //250 400 //32 55
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
driveForwardSideBreak(2, 10);
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
driveForwardSideBreak(39, 43);
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
//while(1){} //debug
//AFTER SENSOR STOP BEFORE 3RD POWER UP
//START FOURTH TURN
//EXTRA FORWARD BUFFER FOR ULTRASONIC
functionStartTime = millis();
do{
driveStraight(1.0); //go forward briefly to turn
}while(timeBreak(functionStartTime, 300)); //150 300
// //2500 for 360 point turn right
// //2400 for 270 -0.1, 1.0 turn right
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, -0.1, 1); //turn right into corridor
} while (timeBreak(functionStartTime, 850));
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly into wall
} while (timeBreak(functionStartTime, 1500));
wobbleBack();
functionStartTime = millis();
do {
driveStraightOffset(1.0); //drive forward towards wall
} while (timeBreak(functionStartTime, 3500)); //2500 USED TO BE REG STRAIGHT
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
//START FIFTH TURN
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly from wall
} while (timeBreak(functionStartTime, 300)); //400
//2500 for 360 point turn right
//2400 for 270 -0.1, 1.0 turn right
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, 1, -0.1); //turn left into corridor
} while (timeBreak(functionStartTime, 850));
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly into wall
} while (timeBreak(functionStartTime, 1500));
wobbleBack();
functionStartTime = millis();
do {
driveStraight(1.0); //drive forward towards wall
} while (timeBreak(functionStartTime, 2500));
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
//END OF FIRST DAY
//START TURN SECOND CORRIDOR
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly from wall
} while (timeBreak(functionStartTime, 250)); //400
//2500 for 360 point turn right
//2400 for 270 -0.1, 1.0 turn right
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, -0.1, 1); //turn right into corridor
} while (timeBreak(functionStartTime, 850));
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly into wall
} while (timeBreak(functionStartTime, 1500));
wobbleBack();
functionStartTime = millis();
do {
driveStraight(1.0); //drive forward towards wall
} while (timeBreak(functionStartTime, 1500)); //2500
driveForwardSideBreak(10, 1000);
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
driveForwardSideBreak(2, 10);
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
functionStartTime = millis();
do {
driveStraight(1.0); //drive forward towards wall
} while (timeBreak(functionStartTime, 1000)); //2500
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
driveBackSideBreak(10, 1000);
functionStartTime = millis();
do {
driveStop();
} while (timeBreak(functionStartTime, 1000));
//END OF PROGRAM
functionStartTime = millis();
do {
driveStop();
//reached end, stop program
} while (timeBreak(millis(), 10000000));
}
//special first level functions
void wobbleBack() {
long functionStartTime = millis();
functionStartTime = millis();
do {
driveTurnCoeff(1.0, 0.1, -1); //turn right into corridor
} while (timeBreak(functionStartTime, 300));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, -1, 0.1); //turn right into corridor
} while (timeBreak(functionStartTime, 300));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, 0.1, -1); //turn right into corridor
} while (timeBreak(functionStartTime, 300));
functionStartTime = millis();
do {
driveTurnCoeff(1.0, -1, 0.1); //turn right into corridor
} while (timeBreak(functionStartTime, 300));
functionStartTime = millis();
do {
driveStraight(-1.0); //back away briefly from wall
} while (timeBreak(functionStartTime, 600));
}
void driveForwardDistance(int mm) {
int last1 = -1;
int last2 = -1;
//int last3 = -1;
while (last1 < mm || last2 < mm) {
driveStraight(1.0);
last1 = hcsr04.convert_cm(hcsr04.ping_median(3));
last2 = last1;
//last3 = last2;
}
driveStop();
hcsr04.timer_stop();
}
void driveForwardSideBreak(int minThresh, int maxThresh) {
int last1 = -1;
int last2 = -1;
//int last3 = -1;
while ((last1 > maxThresh || last1 < minThresh) || (last2 > maxThresh || last2 < minThresh)) {
//leftDrive.write(180);
driveStraight(1.0);
last1 = sideUltrasonic.convert_cm(sideUltrasonic.ping_median(3));
last2 = last1;
//last3 = last2;
}
driveStop();
sideUltrasonic.timer_stop();
}
void driveBackSideBreak(int minThresh, int maxThresh) {
int last1 = -1;
int last2 = -1;
//int last3 = -1;
while ((last1 > maxThresh || last1 < minThresh) || (last2 > maxThresh || last2 < minThresh)) {
//leftDrive.write(180);
driveStraight(-1.0);
last1 = sideUltrasonic.convert_cm(sideUltrasonic.ping_median(3));
last2 = last1;
//last3 = last2;
}
driveStop();
sideUltrasonic.timer_stop();
}
//runner functions
boolean timeBreak(long start, long duration) {
if (millis() - start > duration) {
return false; //reached duration
}
return true; // not currently reached yet
}
boolean sensorBreak(int sensorID) {
return true; //TODO: code later!!!!
}
//intake actions
void startCollection(double speed) { //speed is a double 0.0 - 1.0
intakeServo.write(90 + (speed * 90));
}
void stopCollection() { //sets speed of collection to stop
intakeServo.write(90);
}
void reverseCollection(double speed) { //speed is a double 0.0 - 1.0
intakeServo.write(90 - (speed * 90));
}
//drive actions
void driveStraight(double power) { //simple dead reckoning
leftDrive.write(90 + (power * 90)); //85 start value
rightDrive.write(90 - (power * 90));
}
void driveStraightOffset(double power) { //simple dead reckoning
leftDrive.write(110); //85 start value //130
rightDrive.write(0);
digitalWrite(7, HIGH);
digitalWrite(6, LOW);
}
void driveTurnCoeff(double power, double leftCoeff, double rightCoeff) { //turn using coefficient - positive is right turn, negative is left turn
leftDrive.write(90 + (power * 90 * (0 + leftCoeff)));
rightDrive.write(90 - (power * 90 * (0 + rightCoeff)));
digitalWrite(6, HIGH);
digitalWrite(7, LOW);
}
void driveTurnOffset() {
}
void driveTurnPoint() {
}
void driveStop() {
leftDrive.write(90);
rightDrive.write(90);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment