You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

284 lines
9.3 KiB
C

5 years ago
#pragma config(I2C_Usage, I2C1, i2cSensors)
5 years ago
#pragma config(Sensor, I2C_1, , sensorQuadEncoderOnI2CPort, , AutoAssign )
#pragma config(Sensor, I2C_2, , sensorQuadEncoderOnI2CPort, , AutoAssign )
#pragma config(Motor, port1, , tmotorVex393_HBridge, openLoop)
#pragma config(Motor, port2, shoot, tmotorVex393_MC29, openLoop, reversed)
5 years ago
#pragma config(Motor, port3, driveLB, tmotorVex393_MC29, openLoop, reversed, encoderPort, I2C_2)
5 years ago
#pragma config(Motor, port4, driveLF, tmotorVex393_MC29, openLoop, reversed)
5 years ago
#pragma config(Motor, port5, driveRB, tmotorVex393_MC29, openLoop, reversed, encoderPort, I2C_1)
5 years ago
#pragma config(Motor, port6, driveRF, tmotorVex393_MC29, openLoop)
#pragma config(Motor, port7, bintake, tmotorVex393_MC29, openLoop, reversed)
#pragma config(Motor, port8, , tmotorVex393_MC29, openLoop)
#pragma config(Motor, port9, , tmotorVex393_MC29, openLoop)
#pragma config(Motor, port10, , tmotorVex393_HBridge, openLoop)
//*!!Code automatically generated by 'ROBOTC' configuration wizard !!*//
#pragma platform(VEX2)
#pragma competitionControl(Competition)
#include "Vex_Competition_Includes.c"
5 years ago
// Definitions here!
#define MAX_SPEED 127
// Set motor maximum speed, this allows for tweaking the speed of the robot with one change.
#define MAX_AUTO_SPEED 100
/* During the development of the autonomous portion of our code, we found that the robot
would have issues turning and driving at MAX_SPEED causing it to turn too much, and
not driving straight. After limiting the driving speed to 100, we found that the robot
was able to drive more consistently.
*/
5 years ago
#define STOP 0
5 years ago
// Defines the value for when a motor is stopped.
5 years ago
#define DEADZONE 10
5 years ago
/* Defines the deadzone of the VEX controller. With our controllers, a value of 10 allowed
for the motors to completely lose power when the joystick is let go.
*/
5 years ago
#define DRIVE_OFFSET 10
5 years ago
/* Defines the offset used to correct and curves while the robot is driving straight during the
driveTiles(float numberOfTiles, bool direction) function.
5 years ago
*/
5 years ago
5 years ago
#define TILE 1206
5 years ago
/* Definition for Rotation points per tile.
Each tile is 23.4 inches wide.
The exact radius of 4" omni wheels, using dial calipers: 2.075 inches
2 * pi * r is circumference of the wheel - 13.0376 inches
There are 627.2 points in a revolution with the vex direct motor encoders - according to robotc
developers: The 2-wire 393 motor measures 627.2 counts per revolution of the output shaft in its
default high-torque configuration and 392 counts per revolution of the output shaft in its
modified high-speed configuration.
So if we do 1 revolution * distance / radius we get 627.2 * 23.4 / 13.0376 = 1206.
When the integrated motor encoder reports a movement of 1206, that means the robot has moved 1 tile.
*/
5 years ago
// How much the wheels should spin in a 90 degree turn
5 years ago
#define POINTS_PER_TURN 320
5 years ago
/* Using trial and error, we found that our robot will make a 90 degree turn when the integrated motor
encoders report a distance of 320 while spinning in place.
*/
5 years ago
// definitions for driveTiles()
#define FORWARD true
#define REVERSE false
5 years ago
/* When the function driveTiles(float numberOfTiles, bool direction) is called, one of the explicit
parameters is a boolean for direction, where true is forward, and false is reverse. Using these
definitions in our code, it is clearer to us and readers as to what that parameter is for.
*/
5 years ago
5 years ago
void stopDriving() {
5 years ago
motor[driveLB] = STOP;
motor[driveLF] = STOP;
motor[driveRB] = STOP;
motor[driveRF] = STOP;
}
5 years ago
// Explicit Parameters: None
// Output: All four driving motors will be stopped, stopping the robots movements immediately.
5 years ago
5 years ago
void clearEnc() { // Reset driving motor encoder values to 0
nMotorEncoder[driveRB] = 0;
5 years ago
nMotorEncoder[driveLB] = 0;
5 years ago
}
5 years ago
// Explicit Parameters: None
// Output: Resets the driving encoders to 0, for use in other autonomous functions.
5 years ago
5 years ago
void shootBall() {
motor[shoot] = MAX_SPEED;
5 years ago
wait(1.25); // Shooting takes 1.25 seconds
5 years ago
motor[shoot] = STOP;
5 years ago
}
5 years ago
// Explicit Parameters: None
// Output: The 2 motors connected to the shoot port will turn on for 1.25 seconds, which is
// precisely the amount of time needed for the motors to pull back and release the launcher.
5 years ago
void turntoRight(float turns) {
clearEnc();
while(turns * POINTS_PER_TURN > nMotorEncoder[driveLB]){
5 years ago
motor[driveLB] = MAX_AUTO_SPEED;
motor[driveLF] = MAX_AUTO_SPEED;
motor[driveRB] = -MAX_AUTO_SPEED;
motor[driveRF] = -MAX_AUTO_SPEED;
5 years ago
}
5 years ago
stopDriving();
5 years ago
}
5 years ago
// Explicit Parameters: None
// Output: These three functions manage the ball lift and, conveniently, the same motors in reverse
// will flip a cap. flipOn() will spin the motors in the direction needed to flip caps, ballIn()
// will spin the motors in the direction needed to collect and pick up balls, and ballOff() will turn off the motors.
5 years ago
void turntoLeft(float turns) {
clearEnc();
while(turns * POINTS_PER_TURN > nMotorEncoder[driveRB]){
5 years ago
motor[driveLB] = -MAX_AUTO_SPEED;
motor[driveLF] = -MAX_AUTO_SPEED;
motor[driveRB] = MAX_AUTO_SPEED;
motor[driveRF] = MAX_AUTO_SPEED;
5 years ago
}
5 years ago
stopDriving();
5 years ago
}
5 years ago
5 years ago
void flipOn() {
motor[bintake] = -MAX_SPEED;
}
void ballOff() {
5 years ago
motor[bintake] = STOP;
5 years ago
}
void ballIn() {
motor[bintake] = MAX_SPEED;
}
5 years ago
void joystickDrive() {
if(abs(vexRT[Ch3]) > DEADZONE) {
motor[driveLB] = vexRT[Ch3];
motor[driveLF] = vexRT[Ch3];
}
else {
motor[driveLB] = STOP;
motor[driveLF] = STOP;
}
if(abs(vexRT[Ch2]) > DEADZONE) {
motor[driveRB] = vexRT[Ch2];
motor[driveRF] = vexRT[Ch2];
5 years ago
}
5 years ago
else {
motor[driveRB] = STOP;
motor[driveRF] = STOP;
5 years ago
}
5 years ago
}
void buttonChecks() {
if (vexRT[Btn5U] == 1) {
5 years ago
ballIn();
5 years ago
}
else if (vexRT[Btn5D] == 1) {
5 years ago
flipOn();
5 years ago
}
else {
5 years ago
ballOff();
5 years ago
}
if (vexRT[Btn8D] == 1) {
shootBall();
5 years ago
} // No need for reverse on the ball launcher!
5 years ago
}
void pre_auton() {
/* Set bStopTasksBetweenModes to false if you want to keep user created tasks
running between Autonomous and Driver controlled modes. You will need to
manage all user created tasks if set to false. */
bStopTasksBetweenModes = true;
}
5 years ago
void driveTiles(float numberOfTiles, bool direction) {
5 years ago
// when direction is true, move forward, otherwise go in reverse
5 years ago
clearEnc();
5 years ago
while(direction == FORWARD && numberOfTiles * TILE - 200 > nMotorEncoder[driveRB]) {
5 years ago
if(abs(nMotorEncoder[driveRB]) - DRIVE_OFFSET > nMotorEncoder[driveLB]) {
motor[driveLB] = MAX_AUTO_SPEED;
motor[driveLF] = MAX_AUTO_SPEED;
motor[driveRB] = MAX_AUTO_SPEED - DRIVE_OFFSET;
motor[driveRF] = MAX_AUTO_SPEED - DRIVE_OFFSET;
5 years ago
}
5 years ago
if(abs(nMotorEncoder[driveLB]) - DRIVE_OFFSET > nMotorEncoder[driveRB]) {
motor[driveLB] = MAX_AUTO_SPEED - DRIVE_OFFSET;
motor[driveLF] = MAX_AUTO_SPEED - DRIVE_OFFSET;
motor[driveRB] = MAX_AUTO_SPEED;
motor[driveRF] = MAX_AUTO_SPEED;
5 years ago
} else {
5 years ago
motor[driveLB] = MAX_AUTO_SPEED;
motor[driveLF] = MAX_AUTO_SPEED;
motor[driveRB] = MAX_AUTO_SPEED;
motor[driveRF] = MAX_AUTO_SPEED;
5 years ago
}
}
5 years ago
while(direction == REVERSE && numberOfTiles * TILE - 200 > -nMotorEncoder[driveRB]) {
5 years ago
if(abs(nMotorEncoder[driveRB]) - DRIVE_OFFSET > nMotorEncoder[driveLB]) {
motor[driveLB] = -MAX_AUTO_SPEED;
motor[driveLF] = -MAX_AUTO_SPEED;
motor[driveRB] = -MAX_AUTO_SPEED + DRIVE_OFFSET;
motor[driveRF] = -MAX_AUTO_SPEED + DRIVE_OFFSET;
5 years ago
}
5 years ago
if(abs(nMotorEncoder[driveLB]) - DRIVE_OFFSET > nMotorEncoder[driveLB]) {
motor[driveLB] = -MAX_AUTO_SPEED + DRIVE_OFFSET;
motor[driveLF] = -MAX_AUTO_SPEED + DRIVE_OFFSET;
motor[driveRB] = -MAX_AUTO_SPEED;
motor[driveRF] = -MAX_AUTO_SPEED;
5 years ago
} else {
5 years ago
motor[driveLB] = -MAX_AUTO_SPEED;
motor[driveLF] = -MAX_AUTO_SPEED;
motor[driveRB] = -MAX_AUTO_SPEED;
motor[driveRF] = -MAX_AUTO_SPEED;
5 years ago
}
5 years ago
}
5 years ago
stopDriving();
5 years ago
}
5 years ago
5 years ago
task autonomous() {
5 years ago
turntoRight(0.03);
5 years ago
shootBall();
5 years ago
turntoLeft(0.03);
5 years ago
driveTiles(2, FORWARD); // Move 2 forward to hit bottom flag
driveTiles(1, REVERSE);
5 years ago
turntoRight(1);
driveTiles(0.5, REVERSE); // Drive 1/3 of a tile backwards to hit the wall and align ourselves!
5 years ago
flipOn(); // Turn on the ball intake in reverse, which is what we can use to flip the caps
5 years ago
driveTiles(1.6, FORWARD); // flip cap
5 years ago
ballOff();
5 years ago
driveTiles(1.35, REVERSE);
5 years ago
turntoLeft(1);
5 years ago
driveTiles(1, REVERSE);
5 years ago
turntoRight(1);
driveTiles(0.6, REVERSE);
5 years ago
driveTiles(2.1, FORWARD); // Flip the other cap without turning on the spinner
5 years ago
flipOn();
driveTiles(0.5, FORWARD);
5 years ago
ballIn();
driveTiles(0.1, REVERSE);
// So we can pick up the ball!
5 years ago
wait(3);
5 years ago
driveTiles(0.1, REVERSE);
5 years ago
turntoLeft(1);
5 years ago
driveTiles(0.2, REVERSE);
5 years ago
wait(3);
5 years ago
ballOff();
shootBall();
5 years ago
driveTiles(0.05, REVERSE);
5 years ago
driveTiles(0.33, FORWARD);
5 years ago
wait(2);
5 years ago
turntoRight(1);
5 years ago
driveTiles(2.2, REVERSE);
5 years ago
turntoLeft(1);
driveTiles(1, REVERSE);
turntoRight(1);
driveTiles(0.25, REVERSE);
driveTiles(3, FORWARD);
5 years ago
5 years ago
}
5 years ago
task usercontrol() { // In user control mode
5 years ago
while (true) {
5 years ago
joystickDrive(); // Joystick mapping function
buttonChecks(); // Button mapping, for lift, ball launcher, etc.
5 years ago
}
}