public Follow() { // TODO Auto-generated constructor stub ultrasonicSensor = new UltrasonicSensorEcho(49, SensorPort.S4); display = new FollowDisplay(); LCD.drawString("Left for", 0, 0); LCD.drawString("Task 1-2 'curve'", 0, 1); LCD.drawString("Right for", 0, 3); LCD.drawString("Task 3 'platoon'", 0, 4); IRArray = new IRSensorArray(SensorPort.S1, SensorPort.S2, SensorPort.S3); menuSelection = getTaskNumber(); taskSetUp(menuSelection); motors = new MotorController(MotorPort.A, MotorPort.B); SensorPort.S4.setSensorPinMode(SensorPort.SP_DIGI0, SensorPort.SP_MODE_INPUT); SensorPort.S4.setSensorPinMode(SensorPort.SP_DIGI1, SensorPort.SP_MODE_OUTPUT); display.follow = this; new Thread(this).start(); }
@Override public void run() { // TODO Auto-generated method stub while (!Button.ENTER.isDown()) ; LCD.clear(); if (menuSelection == 1) { LCD.drawString("Task 1-2 Selected", 0, 0); } else if (menuSelection == 2) { LCD.drawString("Task 3 Selected", 0, 0); } ultrasonicSensor.wakeUp(); display.wakeUp(); LCD.drawString("Threads Awake", 0, 1); leftTunedSpeed = leftSpeed; rightTunedSpeed = rightSpeed; // switchGains(); LCD.drawString("Running...", 0, 2); try { Thread.sleep(50); while (!Button.ESCAPE.isDown()) { Thread.sleep(timeStep); // if(menuSelection == 1) // { // if(Math.abs(lineError) > 200) // { // counter++; // if(counter > 10) // { // switchGains(); // counter = 0; // } // } // if(state == 0) // { // Sound.beep(); // } // } // else // { // counter++; // if(counter > 50) // { // state = 0; // switchGains(); // } // } // state = 0; // switchGains(); // state = 0; // else // { // counter = 0; // } rangeReading = ultrasonicSensor.getPulseLenght() / 1000; // LCD.drawString("" + echoValue, 0, 4); rangePower = (rangeFinderPID.pid(echoTarget, rangeReading, (double) timeStep / 1000)) / 40; // blah/40 position = IRArray.calculatePosition(); lineError = 10 * linePID.pid(0, position, (double) timeStep / 1000) / (3 * IR_MAX_ERROR); // 360 readings = IRArray.poleSensor(); if (menuSelection == 1) // Task 1-2: Line and Block Stop { if (rangeReading < 600) { leftTunedSpeed = (int) (setPower - lineError - rangePower); rightTunedSpeed = (int) (setPower + lineError - rangePower); } else { leftTunedSpeed = (int) (setPower - lineError); rightTunedSpeed = (int) (setPower + lineError); } // if(echoValue < 300) // { // leftTunedSpeed /= 5; // rightTunedSpeed /= 5; // } if (rangeReading < 400) { stop = true; } else { stop = false; } } else if (menuSelection == 2) // Task 3: Platooning and Redline Stop { rangeFinderPID.capI(100); // if(echoValue < echoTarget) // { // leftTunedSpeed = (int)(set - curveError - echoError)/5; // rightTunedSpeed = (int)(set + curveError - echoError)/5; // } // else // { leftTunedSpeed = (int) (setPower - lineError - rangePower); rightTunedSpeed = (int) (setPower + lineError - rangePower); // } if (readings[0] < 800 && readings[0] > 400 && readings[2] < 800 && readings[2] > 400 && readings[1] < 800 && readings[1] > 400) { stop = true; } } if (stop) { motors.stopMotors(); LCD.drawString("Stopped", 0, 3); } else { if (menuSelection == 1) motors.updateMotors(leftTunedSpeed, rightTunedSpeed); else { if (leftTunedSpeed < 0 && rightTunedSpeed < 0) { motors.leftMotor.motor.backward(); motors.rightMotor.motor.backward(); leftTunedSpeed = setPower - leftTunedSpeed; rightTunedSpeed = setPower - rightTunedSpeed; } else { motors.leftMotor.motor.forward(); motors.rightMotor.motor.forward(); } motors.updateMotors(leftTunedSpeed, rightTunedSpeed); } } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }