Skip to content
2 min read
In progress

Project 4 — Build a Fuel Launcher for REBUILT

Add a single-motor flywheel launcher subsystem that shoots the 2026 'Fuel' foam balls into the Hub on a button press.

Lesson
17 / 28
Reward
+10XP

Sign in to track progress, earn XP, and save lessons.

The 2026 game, REBUILT presented by Haas, is built around scoring foam balls called Fuel into a Hub goal, with a Tower to climb in endgame. The simplest scoring mechanism is a flywheel launcher — exactly the kind of mechanism the official KitBot and the AndyMark Everybot iterate toward. We will add one as a clean subsystem.

Hardware: one launcher wheel driven by a NEO on a SPARK MAX (CAN ID 5). A flywheel works by spinning fast, then transferring momentum to the ball on contact.

LauncherSubsystem.java:

package frc.robot.subsystems;

import com.revrobotics.spark.SparkMax;
import com.revrobotics.spark.SparkLowLevel.MotorType;
import com.revrobotics.spark.SparkBase.ResetMode;
import com.revrobotics.spark.SparkBase.PersistMode;
import com.revrobotics.spark.config.SparkMaxConfig;
import com.revrobotics.spark.config.SparkBaseConfig.IdleMode;
import edu.wpi.first.wpilibj2.command.Command;
import edu.wpi.first.wpilibj2.command.SubsystemBase;

public class LauncherSubsystem extends SubsystemBase {
  private final SparkMax m_launch = new SparkMax(5, MotorType.kBrushless);

  public LauncherSubsystem() {
    SparkMaxConfig cfg = new SparkMaxConfig();
    cfg.idleMode(IdleMode.kCoast)        // let the wheel spin down freely
       .smartCurrentLimit(40);            // protect the motor and battery
    m_launch.configure(cfg,
        ResetMode.kResetSafeParameters,
        PersistMode.kPersistParameters);
  }

  public Command shoot() {
    return startEnd(() -> m_launch.set(0.85),  // spin up to 85%
                    () -> m_launch.set(0.0));  // stop on release
  }
}

The configure(...) call with ResetMode.kResetSafeParameters and PersistMode.kPersistParameters is the REVLib 2025+ pattern for applying and saving a config. The startEnd factory returns a command that runs the first lambda when scheduled and the second when it ends — perfect for 'hold to shoot'. The smartCurrentLimit(40) call matters: a flywheel pulls a large inrush current when spinning up, and capping it helps keep you from tripping a breaker or browning out the roboRIO.

Bind it in RobotContainer:

private final LauncherSubsystem m_launcher = new LauncherSubsystem();
// inside configureBindings():
m_ctrl.rightTrigger().whileTrue(m_launcher.shoot());

Tuning the shot: start at 85% and adjust. Too slow and the Fuel arcs short of the Hub; too fast and it bounces out. Real teams later replace the open-loop set() with a velocity PID + feedforward so the wheel recovers to target RPM between shots — that consistency is what helps you reach the Energized (100 Fuel) and Supercharged (360 Fuel) ranking-point thresholds. For now, open-loop is a perfect first launcher. Give the wheel a moment to spin up before feeding a ball, and use coast idle so it does not jerk to a stop.

Spot an error or something out of date?Log in to suggest an edit

Key takeaways

  • A flywheel launcher transfers momentum to the Fuel ball; startEnd() gives you a clean hold-to-shoot command
  • smartCurrentLimit(40) on the launcher reduces the spin-up inrush that can brown out the robot
  • Open-loop set(0.85) is fine to start; velocity PID+feedforward later gives the consistent shots needed for the Energized/Supercharged ranking points

Lesson quiz

Required

Answer all 3 questions correctly to complete this lesson.

01.In the 2026 FRC game REBUILT, what are the game pieces that the flywheel launcher shoots into the Hub called?

02.Why does the LauncherSubsystem call smartCurrentLimit(40) on the SPARK MAX?

03.How does the startEnd() factory make shoot() a clean hold-to-shoot command?

Answer every question to submit.

All 28 lessons in Getting Started with FRC