JavaFX on Raspberry Pi: Some fun with stepper motor
Recently had some fun when controlling my stepper motor with my Raspberry Pi.
The motor: a 28BYJ-48 with ULN2003 driver unit:
Cool: Pi4J has a ready to use GpioStepperMotorComponent.
Let’s assume this architecture:
Thus we start with the StepperMotorAdapter using this component.
First some helpfull defines:
private final int oneRevolution = 2038; private final int quarterRevolution = oneRevolution / 4; private final int halfRevolution = oneRevolution / 2; private final int oneDegreeRevolution = oneRevolution / 360;
then we need to get the GpioController and provide 4 GPIO pins set to digital output mode
gpio = GpioFactory.getInstance();
final GpioPinDigitalOutput[] pins = {
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_00, PinState.LOW),
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_01, PinState.LOW),
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_02, PinState.LOW),
gpio.provisionDigitalOutputPin(RaspiPin.GPIO_03, PinState.LOW)};
and we need a byte array to define a step sequence e.g. a single motor step sequence (every coil is turned on once per step):
singleStepSequence = new byte[4];
singleStepSequence[0] = (byte) 0b0001;
singleStepSequence[1] = (byte) 0b0010;
singleStepSequence[2] = (byte) 0b0100;
singleStepSequence[3] = (byte) 0b1000;
Now we can create the motor:
motor = new GpioStepperMotorComponent(pins);
motor.setStepSequence(currentStepSequence);
motor.setStepsPerRevolution(oneRevolution);
and some methods to control the motor:
public void stop() {
motor.stop();
}
public void forward() {
motor.reverse();
}
public void backward() {
motor.forward();
}
public void oneStepBackward() {
motor.step(oneDegreeRevolution);
}
public void oneStepForward() {
motor.step(-oneDegreeRevolution);
}
public void halfRevolutionBackward() {
motor.step(halfRevolution);
}
public void halfRevolutionForward() {
motor.step(-halfRevolution);
}
public void quarterRevolutionBackward() {
motor.step(quarterRevolution);
}
public void quarterRevolutionForward() {
motor.step(-quarterRevolution);
}
This adapter is used by the StepperMotorControl which implements handlers like:
adjustBackwardButton.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
stepperMotorAdapter.backward();
}
});
adjustBackwardButton.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
stepperMotorAdapter.stop();
}
});
adjustForwardButton.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
stepperMotorAdapter.forward();
}
});
adjustForwardButton.setOnMouseReleased(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
stepperMotorAdapter.stop();
}
});
and provides FXML usable methods like:
@FXML
public void backward() {
Platform.runLater(new Runnable() {
@Override
public void run() {
stepperMotorAdapter.backward();
}
});
}
@FXML
public void forward() {
Platform.runLater(new Runnable() {
@Override
public void run() {
stepperMotorAdapter.forward();
}
});
}
@FXML
public void stop() {
Platform.runLater(new Runnable() {
@Override
public void run() {
stepperMotorAdapter.stop();
}
});
}
Finally this is the JavaFX UI running on the RasPi:

Get the complete code here:
https://bitbucket.org/Jerady/raspberry-cpio-control-fx
Icons on the buttons are provided by:
FontAwesomeFX


1 thought on “JavaFX on Raspberry Pi: Some fun with stepper motor”