撰寫程式

建立專案

  1. 在WPIlib Vscode裡,按下Ctrl+Shift+P,輸入Create a new project
  2. 填入專案需要的資訊([ ]為通常輸入內容)
    1. 輸入 Example (範例程式) 或 Template (只提供模板) [Template]
    2. 選擇程式語言 (Java或Cpp) [Java]
    3. 選擇專案控制方式 (Time Robot、 Command Robot等) [Command Robot]
    4. 選擇檔案存放目錄
    5. 專案名稱
    6. 是否以資料夾方式儲存? [勾選]
    7. 隊號 [8725]
    8. 確認第三方軟件是否全部支援 WPILib 的相關物件(由於可能有部分軟件無法支援,會造成崩潰,因此此區請勿勾選)
  3. 填寫完成後,點選Generate ProjectYes(New Window)

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

函式庫安裝

  1. 在WPIlib Vscode裡,按下Ctrl+Shift+P,輸入Manage Vendor Libraries
  2. 選擇Install new libraries(online)
  3. 輸入函式庫網址
  4. 點擊Yes

函式庫網址

https://dev.studica.com/releases/2024/NavX.json

REVLib(Neo)

https://software-metadata.revrobotics.com/REVLib-2024.json

Phoenix(CIM & TalonFX)

https://maven.ctr-electronics.com/release/com/ctre/phoenix6/latest/Phoenix6-frc2024-latest.json

Path Planner

https://3015rangerrobotics.github.io/pathplannerlib/PathplannerLib.json

PhotonVision

https://maven.photonvision.org/repository/internal/org/photonvision/photonlib-json/1.0/photonlib-json-1.0.json

WPIlib 3rd Party Libraries

https://docs.wpilib.org/en/stable/docs/software/vscode-overview/3rd-party-libraries.html#

Command robot

檔案之間關係

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

檔案樹狀圖

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

常數設置

  1. src\main\java\frc\robot\ 創建DeviceId.java,用於紀錄馬達ID(編號)
package frc.robot; public class DeviceId { public static final class CIM { public static final int motor = 1; } public static final class Neo { public static final int motor = 2; } public static final class Talon { public static final int motor = 3; } }
  1. src\main\java\frc\robot\ 創建GamepadJoystick.java,用於搖桿操作
package frc.robot; import edu.wpi.first.wpilibj.XboxController; public class GamepadJoystick extends XboxController{ public GamepadJoystick(int port) { super(port); } public static final int CONTROLLER_PORT = 0; }
  1. src\main\java\frc\robot\Constants.java 中寫入馬達輸出最大值
package frc.robot; public final class Constants { public static final double MAX_DRIVE_SPEED = 0.7; }

馬達控制(僅一顆)

CIM馬達

  1. src\main\java\frc\robot\subsystems 創建 DriveMotorModule.java 用於控制馬達
    1. 引入函式庫
    ​​​​package frc.robot.subsystems; ​​​​import com.ctre.phoenix.motorcontrol.NeutralMode; ​​​​import com.ctre.phoenix.motorcontrol.VictorSPXControlMode; ​​​​import com.ctre.phoenix.motorcontrol.can.VictorSPX; ​​​​import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; ​​​​import frc.robot.Constants;
    1. 創建 DriveMotorModule 類別,以VictorSPX宣告一顆CIM馬達
    ​​​​public class DriveMotorModule { ​​​​ private final VictorSPX motor; ​​​​ private double speedOutput; ​​​​ public DriveMotorModule(int motorPort, boolean reverse) { ​​​​ this.motor = new VictorSPX(motorPort); ​​​​ this.motor.enableVoltageCompensation(true); ​​​​ this.motor.configVoltageCompSaturation(30); ​​​​ this.motor.setInverted(reverse); ​​​​ this.motor.setNeutralMode(NeutralMode.Brake); ​​​​ } ​​​​}
    1. DriveMotorModule 類別內新增控制速度和停止轉動的方法(Method)
    ​​​​public void setDesiredState(double speed) { ​​​​ this.speedOutput = speed * Constants.MAX_DRIVE_SPEED; ​​​​ SmartDashboard.putNumber("Speed", this.speedOutput); ​​​​ this.motor.set(VictorSPXControlMode.PercentOutput, this.speedOutput); ​​​​} ​​​​public void stop() { ​​​​ this.motor.set(VictorSPXControlMode.PercentOutput, 0.0); ​​​​}
  2. src\main\java\frc\robot\subsystems 創建 DriveMotorSubsystem.java 用於宣告馬達
    1. 引入函式庫
    ​​​​package frc.robot.subsystems; ​​​​import edu.wpi.first.wpilibj2.command.SubsystemBase; ​​​​import frc.robot.DeviceId;
    1. 宣告馬達和撰寫控制系統
    ​​​​public class DriveMotorSubsystem extends SubsystemBase{ ​​​​ private final DriveMotorModule motor; ​​​​ public DriveMotorSubsystem() { ​​​​ this.motor = new DriveMotorModule(DeviceId.CIM.motor, false); ​​​​ } ​​​​ public void move(double speed) { ​​​​ this.motor.setDesiredState(speed); ​​​​ } ​​​​ public void stopModules() { ​​​​ this.motor.stop(); ​​​​ } ​​​​}

Talon馬達

  1. src\main\java\frc\robot\subsystems 創建 DriveMotorModule.java 用於控制馬達
    1. 引入函式庫
    ​​​​package frc.robot.subsystems; ​​​​import com.ctre.phoenix.motorcontrol.NeutralMode; ​​​​import com.ctre.phoenix.motorcontrol.TalonFXControlMode; ​​​​import com.ctre.phoenix.motorcontrol.can.TalonFX; ​​​​import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; ​​​​import frc.robot.Constants;
    1. 創建 DriveMotorModule 類別,以TalonFX宣告一顆Talon馬達
    ​​​​public class DriveMotorModule { ​​​​ private final TalonFX motor; ​​​​ private double speedOutput; ​​​​ public DriveMotorModule(int motorPort, boolean reverse) { ​​​​ this.motor = new TalonFX(motorPort); ​​​​ this.motor.enableVoltageCompensation(true); ​​​​ this.motor.configVoltageCompSaturation(30); ​​​​ this.motor.setInverted(reverse); ​​​​ this.motor.setNeutralMode(NeutralMode.Brake); ​​​​ } ​​​​}
    1. DriveMotorModule 類別內新增控制速度和停止轉動的方法(Method)
    ​​​​public void setDesiredState(double speed) { ​​​​ this.speedOutput = speed * Constants.MAX_DRIVE_SPEED; ​​​​ SmartDashboard.putNumber("Speed", this.speedOutput); ​​​​ this.motor.set(TalonFXControlMode.PercentOutput, this.speedOutput); ​​​​} ​​​​ ​​​​public void stop() { ​​​​ this.motor.set(TalonFXControlMode.PercentOutput, 0.0); ​​​​}
  2. src\main\java\frc\robot\subsystems 創建 DriveMotorSubsystem.java 用於宣告馬達
    1. 引入函式庫
    ​​​​package frc.robot.subsystems; ​​​​import edu.wpi.first.wpilibj2.command.SubsystemBase; ​​​​import frc.robot.DeviceId;
    1. 宣告馬達和撰寫控制系統
    ​​​​public class DriveMotorSubsystem extends SubsystemBase{ ​​​​ private final DriveMotorModule motor; ​​​​ public DriveMotorSubsystem() { ​​​​ this.motor = new DriveMotorModule(DeviceId.Neo.motor, false); ​​​​ } ​​​​ public void move(double speed) { ​​​​ this.motor.setDesiredState(speed); ​​​​ } ​​​​ public void stopModules() { ​​​​ this.motor.stop(); ​​​​ } ​​​​}

Neo馬達

  1. src\main\java\frc\robot\subsystems 創建 DriveMotorModule.java 用於控制馬達
    1. 引入函式庫
    ​​​​package frc.robot.subsystems; ​​​​import com.revrobotics.CANSparkMax; ​​​​import com.revrobotics.CANSparkMax.IdleMode; ​​​​import com.revrobotics.CANSparkMaxLowLevel.MotorType; ​​​​import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard; ​​​​import frc.robot.Constants;
    1. 創建 DriveMotorModule 類別,CANSparkMax宣告一顆Neo馬達
    ​​​​public class DriveMotorModule { ​​​​ private final CANSparkMax motor; ​​​​ private double speedOutput; ​​​​ public DriveMotorModule(int motorPort, boolean reverse) { ​​​​ this.motor = new CANSparkMax(motorPort, MotorType.kBrushless); ​​​​ this.motor.setSmartCurrentLimit(30); ​​​​ this.motor.setInverted(reverse); ​​​​ this.motor.setIdleMode(IdleMode.kBrake); ​​​​ } ​​​​}
    1. DriveMotorModule 類別內新增控制速度和停止轉動的方法(Method)
    ​​​​public void setDesiredState(double speed) { ​​​​ this.speedOutput = speed * Constants.Drive.MAX_DRIVE_SPEED; ​​​​ SmartDashboard.putNumber("Speed", this.speedOutput); ​​​​ this.motor.set(this.speedOutput); ​​​​} ​​​​public void stop() { ​​​​ this.motor.set(0.0); ​​​​}
  2. src\main\java\frc\robot\subsystems 創建 DriveMotorSubsystem.java 用於宣告馬達
    1. 引入函式庫
    ​​​​package frc.robot.subsystems; ​​​​import edu.wpi.first.wpilibj2.command.SubsystemBase; ​​​​import frc.robot.DeviceId;
    1. 宣告馬達和撰寫控制系統
    ​​​​public class DriveMotorSubsystem extends SubsystemBase{ ​​​​ private final DriveMotorModule motor; ​​​​ public DriveMotorSubsystem() { ​​​​ this.motor = new DriveMotorModule(DeviceId.Drive.motor, false); ​​​​ } ​​​​ public void move(double speed) { ​​​​ this.motor.setDesiredState(speed); ​​​​ } ​​​​ public void stopModules() { ​​​​ this.motor.stop(); ​​​​ } ​​​​}

搖桿控制

  1. src\main\java\frc\robot\commands 創建 DriveJoystickCmd.java
    1. 引入函式庫
    ​​​​package frc.robot.commands; ​​​​import edu.wpi.first.wpilibj.XboxController; ​​​​import edu.wpi.first.wpilibj2.command.CommandBase; ​​​​import frc.robot.subsystems.DriveMotorSubsystem;
    1. 宣告subsystem和搖桿函式庫
    ​​​​public class DriveJoystickCmd extends CommandBase {private final DriveMotorSubsystem driveMotorSubsystem;private final XboxController controller;public DriveJoystickCmd(DriveMotorSubsystem driveMotorSubsystem, XboxController controller) {this.driveMotorSubsystem = driveMotorSubsystem;this.controller = controller; ​ ​ addRequirements(this.driveMotorSubsystem);} ​​​​}
    1. 讀取搖桿值和寫入控制馬達的方法(Method)
    ​​​​@Overridepublic void initialize() {}@Overridepublic void execute() {double speed = this.controller.getLeftY();this.driveMotorSubsystem.move(speed);}@Overridepublic void end(boolean interrupted) {this.driveMotorSubsystem.stopModules();}@Overridepublic boolean isFinished() {return false;}
  2. 查看 RobotContainer.java 並先刪除全部程式
    1. 引入函式庫
    ​​​​package frc.robot; ​​​​import edu.wpi.first.wpilibj2.command.Command; ​​​​import frc.robot.commands.DriveJoystickCmd; ​​​​import frc.robot.subsystems.DriveMotorSubsystem;
    1. 創建搖桿、馬達系統的物件
    ​​​​public class RobotContainer {private final GamepadJoystick joystick = new GamepadJoystick(GamepadJoystick.CONTROLLER_PORT);private final DriveMotorSubsystem driveMotorSubsystem = new DriveMotorSubsystem();private final DriveJoystickCmd driveJoystickCmd = new DriveJoystickCmd(driveMotorSubsystem, joystick);public RobotContainer() {this.driveMotorSubsystem.setDefaultCommand(this.driveJoystickCmd);}public Command getAutonomousCommand() {return null;} ​​​​}

上傳程式

  1. 確定無報錯
  2. CAN接線無誤, Roborio 連接正常
  3. 關閉防火牆
  4. Shift + F5 上傳程式,出現 BUILD SUCCESSFUL 代表上傳完成
  5. 連接搖桿進行測試

關閉防火牆

使用Cmd

  1. 在隨意路徑下創建一個資料夾
  2. 創建並編輯兩個bat檔,負責開和關防火牆
    開啟防火牆:netsh advfirewall set allprofile state on
    關閉防火牆:netsh advfirewall set allprofile state off
    firewall
  3. 在桌面創建兩個捷徑並指向兩個bat檔
  4. 完成後右鍵捷徑,點擊內容
  5. 選擇 捷徑 標籤,點擊進階,勾選 以系統管理員身分執行 ,套用後完成設定

使用 Windows Defender 防火牆內容

  1. 點擊
    Image Not Showing Possible Reasons
    • The image file may be corrupted
    • The server hosting the image is unavailable
    • The image path is incorrect
    • The image format is not supported
    Learn More →
    搜尋 防火牆
    definer
  2. 點擊 Windows Defender 防火牆內容 ,將網域、私人、公用設定檔 防火牆狀態皆切換為關閉
    closefirewall

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →
為保護電腦安全,在結束活動或測試完後必須打開防火牆