WPILib Setup
Instala y configura correctamente WPILib antes de continuar.
En esta guía crearás un drivetrain diferencial moderno utilizando Java y WPILib.
El objetivo es aprender:
Un Differential Drivetrain utiliza lados izquierdo y derecho independientes para mover el robot.
La mayoría de robots FRC tipo tanque utilizan:
Asegúrate de tener:
WPILib Setup
Instala y configura correctamente WPILib antes de continuar.
Driver Station
Aprende a utilizar Driver Station y verificar comunicación.
Abre VS Code y presiona:
CTRL + SHIFT + PBusca el comando:
Selecciona las siguientes opciones:
Project Type
Template
Language
Java
Base
Timed Robot
Template
Timed Robot
Completa:
Después selecciona:
Generate ProjectCuando el proyecto termine de generarse:
La estructura principal se verá similar a esta:
src/└── main/ └── java/ └── frc/ └── robot/ ├── Main.java ├── Robot.java └── Constants.javaEl archivo principal será:
src/main/java/frc/robot/Robot.java
Crearemos un drivetrain con:
La estructura será similar a esta:
Left Side├── Left Leader└── Left Follower
Right Side├── Right Leader└── Right FollowerCada controlador de motor necesita un CAN ID único.
En este ejemplo utilizaremos:
| Motor | CAN ID |
|---|---|
| Left Leader | 10 |
| Left Follower | 11 |
| Right Leader | 12 |
| Right Follower | 13 |
Primero agregaremos las librerías necesarias.
package frc.robot;
import com.revrobotics.spark.SparkLowLevel.MotorType;import com.revrobotics.spark.SparkMax;import com.revrobotics.spark.SparkBase.PersistMode;import com.revrobotics.spark.SparkBase.ResetMode;import com.revrobotics.spark.config.SparkMaxConfig;
import edu.wpi.first.wpilibj.TimedRobot;import edu.wpi.first.wpilibj.XboxController;import edu.wpi.first.wpilibj.drive.DifferentialDrive;Ahora declararemos los motores del drivetrain.
// Left side motorsprivate final SparkMax leftLeader = new SparkMax(10, MotorType.kBrushless);
private final SparkMax leftFollower = new SparkMax(11, MotorType.kBrushless);
// Right side motorsprivate final SparkMax rightLeader = new SparkMax(12, MotorType.kBrushless);
private final SparkMax rightFollower = new SparkMax(13, MotorType.kBrushless);En un drivetrain FRC moderno normalmente existen:
El motor leader recibe comandos directamente desde el código.
El follower copia automáticamente el comportamiento del leader del mismo lado.
Esto permite:
Ahora agregaremos un control Xbox.
private final XboxController controller = new XboxController(0);Ahora crearemos el drivetrain principal.
private final DifferentialDrive drive = new DifferentialDrive(leftLeader, rightLeader);Dentro de robotInit() configuraremos followers usando SparkMaxConfig.
@Overridepublic void robotInit() {
SparkMaxConfig leftFollowerConfig = new SparkMaxConfig(); leftFollowerConfig.follow(leftLeader); leftFollower.configure(leftFollowerConfig, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
SparkMaxConfig rightFollowerConfig = new SparkMaxConfig(); rightFollowerConfig.follow(rightLeader); rightFollower.configure(rightFollowerConfig, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
}En la mayoría de drivetrains un lado debe invertirse.
@Overridepublic void robotInit() {
SparkMaxConfig leftFollowerConfig = new SparkMaxConfig(); leftFollowerConfig.follow(leftLeader); leftFollower.configure(leftFollowerConfig, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
SparkMaxConfig rightFollowerConfig = new SparkMaxConfig(); rightFollowerConfig.follow(rightLeader); rightFollower.configure(rightFollowerConfig, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
SparkMaxConfig rightLeaderConfig = new SparkMaxConfig(); rightLeaderConfig.inverted(true); rightLeader.configure(rightLeaderConfig, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
}Ahora agregaremos control manual dentro de:
teleopPeriodic()double speed = -controller.getLeftY();
double rotation = controller.getRightX();-controller.getLeftY();Lee el stick izquierdo para avanzar y retroceder.
controller.getRightX();Lee el stick derecho para girar.
drive.arcadeDrive(speed, rotation);Esto convierte velocidad y rotación en movimiento para el drivetrain.
Con este sistema:
Si avanzas y giras al mismo tiempo:
Este es uno de los métodos de control más utilizados en FRC.
package frc.robot;
import com.revrobotics.spark.SparkLowLevel.MotorType;import com.revrobotics.spark.SparkMax;import com.revrobotics.spark.SparkBase.PersistMode;import com.revrobotics.spark.SparkBase.ResetMode;import com.revrobotics.spark.config.SparkMaxConfig;
import edu.wpi.first.wpilibj.TimedRobot;import edu.wpi.first.wpilibj.XboxController;import edu.wpi.first.wpilibj.drive.DifferentialDrive;
public class Robot extends TimedRobot {
// Left side motors private final SparkMax leftLeader = new SparkMax(10, MotorType.kBrushless);
private final SparkMax leftFollower = new SparkMax(11, MotorType.kBrushless);
// Right side motors private final SparkMax rightLeader = new SparkMax(12, MotorType.kBrushless);
private final SparkMax rightFollower = new SparkMax(13, MotorType.kBrushless);
// Xbox controller private final XboxController controller = new XboxController(0);
// Differential drivetrain private final DifferentialDrive drive = new DifferentialDrive(leftLeader, rightLeader);
@Override public void robotInit() {
// Configure followers SparkMaxConfig leftFollowerConfig = new SparkMaxConfig(); leftFollowerConfig.follow(leftLeader); leftFollower.configure(leftFollowerConfig, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
SparkMaxConfig rightFollowerConfig = new SparkMaxConfig(); rightFollowerConfig.follow(rightLeader); rightFollower.configure(rightFollowerConfig, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters);
// Invert right side SparkMaxConfig rightLeaderConfig = new SparkMaxConfig(); rightLeaderConfig.inverted(true); rightLeader.configure(rightLeaderConfig, ResetMode.kResetSafeParameters, PersistMode.kPersistParameters); }
@Override public void teleopPeriodic() {
// Forward and backward double speed = -controller.getLeftY();
// Rotation double rotation = controller.getRightX();
// Drive robot drive.arcadeDrive(speed, rotation); }}Este método se ejecuta una sola vez cuando el programa del robot inicia. Se utiliza para preparar el robot antes de comenzar a operar, inicializando motores, sensores, controles y cualquier configuración necesaria para el resto del código.
Este método se ejecuta continuamente mientras el robot está en modo Teleoperated. Aquí normalmente se procesa la entrada de joysticks y controles para permitir que el driver maneje el robot manualmente durante el partido.
Este método se ejecuta repetidamente durante el modo Autonomous. Se utiliza para programar movimientos y acciones automáticas que el robot realiza sin intervención del conductor.
Este método se ejecuta cuando el robot entra en estado deshabilitado. Generalmente se utiliza para detener sistemas, reiniciar variables o asegurar que el robot permanezca en un estado seguro.
Conecta el roboRIO por Ethernet o USB.
Después:
WPILib: Deploy Robot CodeAbre Driver Station y verifica:
TeleoperatedEnableEl robot debería responder inmediatamente.
Ahora puedes continuar con:
FIRSTHub es un proyecto comunitario independiente. No está afiliado, patrocinado ni respaldado por FIRST. Las traducciones no sustituyen a la documentación oficial: ante cualquier diferencia, manda el documento original.