Creando tu programa de prueba (C++/Java)
Una vez que todo esté instalado, estamos listos para crear un programa para el robot. WPILib viene con varias plantillas para los programas. El uso de estas de estas plantillas está altamente recomendado para nuevos usuarios; sin embargo, los usuarios avanzados son libres para escribir su propio código para el robot desde cero. Este artículo es una guía paso a paso para crear un proyecto desde uno de los ejemplos dados, el cual tiene algo de código ya escrito para manejar un robot básico.
Creando un nuevo proyecto WPILib
Bring up the Visual Studio Code command palette with Ctrl+Shift+P. Then, type «WPILib» into the prompt. Since all WPILib commands start with «WPILib», this will bring up the list of WPILib-specific VS Code commands. Now, select the «Create a new project» command:

Esto abrirá la ventana “New Project Creator Window:”

Los elementos de la ventana New Project Creator se explican a continuación:
Project Type: El tipo de proyecto que deseamos crear. Para este ejemplo, seleccione Example
Language: Este es el lenguaje (C++ o Java) que se utilizará para este proyecto.
Project Base: Este recuadro se utiliza para generar el proyecto desde la clase base o ejemplo. Para este ejemplo, seleccione Getting Started
Base Folder: determina la carpeta en la que se ubicará el proyecto del robot.
Project Name: The name of the robot project. This also specifies the name that the project folder will be given if the Create New Folder box is checked.
Create a New Folder: Si está marcada, se creará una nueva carpeta para albergar el proyecto dentro de la carpeta previamente especificada. Si está marcado como no el proyecto se ubicará directamente en la carpeta previamente especificada. Se producirá un error si la carpeta no está vacía y esto no está marcado. La carpeta del proyecto se dará si la casilla Crear nueva carpeta está marcada.
Team Number: El número de equipo para el proyecto, el cual se utilizará para los nombres de paquetes dentro del proyecto y para localizar el robot al implementar el código.
Enable Desktop Support Habilita las pruebas unitarias y la simulación. Mientras que WPILib soporta esto, las bibliotecas de software de terceros pueden no hacerlo. Si las bibliotecas no soportan el escritorio, entonces su código puede no compilar o puede fallar. Debe dejarse sin marcar a menos que la prueba unitaria o la simulación sean necesarias y todas las bibliotecas lo soporten. Para este ejemplo, no marque esta casilla.
Una vez que se haya configurado todo lo anterior, haga clic en “Generate Project” y el proyecto del robot será generado.
Nota
Cualquier error en la generación del proyecto aparecerá en la esquina inferior derecha de la pantalla.
Abriendo el nuevo proyecto

After successfully creating your project, VS Code will give the option of opening the project as shown above. We can choose to do that now or later by typing Ctrl+K then Ctrl+O (or just Command+O on macOS) and select the folder where we saved our project.

Click Yes I trust the authors.
Una vez abierto, veremos la jerarquía del proyecto a la izquierda. Al hacer doble clic en el archivo se abre el archivo en el editor.

Configuraciones de C++ (solo C++)
Para proyectos C++, hay un paso más para configurar IntelliSense. Cada vez que abrimos un proyecto, debería aparecernos una ventana emergente en la esquina inferior derecha pidiendo actualizar las configuraciones de C++. Haga clic en «Yes» para configurar IntelliSense

Imports/Includes
7import edu.wpi.first.wpilibj.Joystick;
8import edu.wpi.first.wpilibj.TimedRobot;
9import edu.wpi.first.wpilibj.Timer;
10import edu.wpi.first.wpilibj.drive.DifferentialDrive;
11import edu.wpi.first.wpilibj.motorcontrol.PWMSparkMax;
5#include <frc/Joystick.h>
6#include <frc/TimedRobot.h>
7#include <frc/Timer.h>
8#include <frc/drive/DifferentialDrive.h>
9#include <frc/motorcontrol/PWMSparkMax.h>
Our code needs to reference the components of WPILib that are used. In C++ this is accomplished using #include
statements; in Java it is done with import
statements. The program references classes for Joystick
(for driving), PWMSparkMax
(for controlling motors), TimedRobot
(the base class used for the example), Timer
(used for autonomous), DifferentialDrive
(for connecting the joystick control to the motors), and LiveWindow
(C++ only).
Definiendo las variables para nuestro robot de muestra
19public class Robot extends TimedRobot {
20 private final PWMSparkMax m_leftDrive = new PWMSparkMax(0);
21 private final PWMSparkMax m_rightDrive = new PWMSparkMax(1);
22 private final DifferentialDrive m_robotDrive = new DifferentialDrive(m_leftDrive, m_rightDrive);
23 private final Joystick m_stick = new Joystick(0);
24 private final Timer m_timer = new Timer();
12 public:
13 Robot() {
14 m_right.SetInverted(true);
15 m_robotDrive.SetExpiration(100_ms);
16 // We need to invert one side of the drivetrain so that positive voltages
17 // result in both sides moving forward. Depending on how your robot's
18 // gearbox is constructed, you might have to invert the left side instead.
19 m_timer.Start();
20 }
49 private:
50 // Robot drive system
51 frc::PWMSparkMax m_left{0};
52 frc::PWMSparkMax m_right{1};
53 frc::DifferentialDrive m_robotDrive{m_left, m_right};
54
55 frc::Joystick m_stick{0};
56 frc::Timer m_timer;
57};
The sample robot in our examples will have a joystick on USB port 0 for arcade drive and two motors on PWM ports 0 and 1. Here we create objects of type DifferentialDrive (m_robotDrive), Joystick (m_stick) and Timer (m_timer). This section of the code does three things:
Define las variables como miembros de nuestra clase Robot.
Inicializa las variables.
Nota
La inicialización de variables para C++ está en la sección private
en la parte inferior del programa. Esto significa que son privados para la clase (Robot
). El código C++ también establece la expiración de la seguridad del motor de 0.1 segundos (la unidad se apagará si no le damos un comando cada .1 segundos) e inicia el Timer
utilizado para autónomo.
Inicialización del robot
@Override
public void robotInit() {}
void RobotInit() {}
El método RobotInit
se ejecuta cuando el programa del robot está arrancando, pero después del constructor. El RobotInit
de nuestro programa de muestra no hace nada. Si quisiéramos ejecutar algo aquí podríamos proporcionar el código anterior para anular el predeterminado).
Ejemplo de un autónomo simple
38 /** This function is run once each time the robot enters autonomous mode. */
39 @Override
40 public void autonomousInit() {
41 m_timer.reset();
42 m_timer.start();
43 }
44
45 /** This function is called periodically during autonomous. */
46 @Override
47 public void autonomousPeriodic() {
48 // Drive for 2 seconds
49 if (m_timer.get() < 2.0) {
50 // Drive forwards half speed, make sure to turn input squaring off
51 m_robotDrive.arcadeDrive(0.5, 0.0, false);
52 } else {
53 m_robotDrive.stopMotor(); // stop robot
54 }
55 }
22 void AutonomousInit() override {
23 m_timer.Reset();
24 m_timer.Start();
25 }
26
27 void AutonomousPeriodic() override {
28 // Drive for 2 seconds
29 if (m_timer.Get() < 2_s) {
30 // Drive forwards half speed, make sure to turn input squaring off
31 m_robotDrive.ArcadeDrive(0.5, 0.0, false);
32 } else {
33 // Stop robot
34 m_robotDrive.ArcadeDrive(0.0, 0.0, false);
35 }
36 }
El método AutonomousInit
se ejecuta una vez cada vez que el robot pasa a ser autónomo de otro modo En este programa, reiniciamos el Timer
y luego lo iniciamos en este método.
AutonomousPeriodic
se ejecuta una vez cada período mientras el robot está en modo autónomo. En la clase TimedRobot
el período es un tiempo fijo, que por defecto es de 20 ms. En este ejemplo, el código periódico verifica si el temporizador es inferior a 2 segundos y, de ser así, avanza a media velocidad utilizando el método ArcadeDrive
de la clase DifferentialDrive
. Si tiene más de 2 segundos transcurridos, el código detiene el accionamiento del robot.
Control del joystick para teleoperación
56 /** This function is called once each time the robot enters teleoperated mode. */
57 @Override
58 public void teleopInit() {}
59
60 /** This function is called periodically during teleoperated mode. */
61 @Override
62 public void teleopPeriodic() {
63 m_robotDrive.arcadeDrive(m_stick.getY(), m_stick.getX());
64 }
38 void TeleopInit() override {}
39
40 void TeleopPeriodic() override {
41 // Drive with arcade style (use right stick)
42 m_robotDrive.ArcadeDrive(-m_stick.GetY(), m_stick.GetX());
43 }
Como en Autónomo, el modo Teleop tiene una función TeleopInit
y TeleopPeriodic
. En este ejemplo, no tenemos nada que hacer en TeleopInit
, se proporciona con fines ilustrativos solamente. En TeleopPeriodic
, el código usa el método``ArcadeDrive`` para mapear el eje Y del Joystick
para avanzar / retroceder los motores de accionamiento y el eje X para girar.
Modo prueba
66 /** This function is called once each time the robot enters test mode. */
67 @Override
68 public void testInit() {}
69
70 /** This function is called periodically during test mode. */
71 @Override
72 public void testPeriodic() {}
73}
45 void TestInit() override {}
46
47 void TestPeriodic() override {}
El modo de prueba se utiliza para probar la funcionalidad del robot. Al igual que TeleopInit
, los métodos TestInit
y TestPeriodic
se proporcionan aquí sólo con fines ilustrativos.
Desplegando el proyecto a un robot
Consulte las instrucciones aquí para desplegar el programa en un robot.