0

我正在开发一个简单的应用程序,使用带有控制器类的 JavaFX 以及 FXML 和 Jssc 来控制 arduino。arduino 连接到 sg90 伺服电机和 LED。

我在使用滑块来控制伺服电机时遇到问题。我想使用滑块来控制伺服电机的角度,每当我拖动滑块拇指时,伺服将不断更新其角度。

这是代码工作的控制器类,但问题是我不知道如何实现滑块和伺服的控制。

公共类 ServoCtrl 实现 Initializable {

@FXML
private Button IncrBtn = new Button();
@FXML
private Button DecrBtn = new Button();
@FXML
private ToggleButton toggleConnectSerial = new ToggleButton();
@FXML
private ToggleButton lightSwitcH = new ToggleButton();
@FXML
private Slider AngleSlider = new Slider(0, 180, 90);
@FXML
private TextField tfAngle = new TextField();
@FXML
private TextField tfSteps = new TextField();

SerialPort ServoSerialPort;

private int tempstr = 0;

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub
    tfAngle.textProperty().bindBidirectional(AngleSlider.valueProperty(), NumberFormat.getIntegerInstance());

    //disable all port when starting the application
    AngleSlider.setDisable(true);
    lightSwitcH.setDisable(true);
    IncrBtn.setDisable(true);
    DecrBtn.setDisable(true);
    tfAngle.setDisable(true);
    tfSteps.setDisable(true);

}

/*--------- increase or decrease slider value using buttons---------------------------------*/

public void IncrBtnPress(ActionEvent btnIncr) {

    tempstr = Integer.parseInt(tfSteps.getText());
    AngleSlider.setValue(Integer.parseInt(tfAngle.getText()) + tempstr);
    tfAngle.setText(Integer.toString((int) AngleSlider.getValue()));
}

public void DecrBtnPress(ActionEvent btnDecr) {
    tempstr = Integer.parseInt(tfSteps.getText());
    AngleSlider.setValue(Integer.parseInt(tfAngle.getText()) - tempstr);
    tfAngle.setText(Integer.toString((int) AngleSlider.getValue()));

}

/*-----------toggle Switch on light-----------------------------------*/

public void lightSwitch(ActionEvent eve) {
    try {
        if (lightSwitcH.isSelected() == true) {
            lightSwitcH.setText("OFF");

            /*
             * send the following string commands 3 = led number 1 = On, 0 =
             * Off / = seperator - = wait for next command
             * 
             */
            // turn on led
            ServoSerialPort.writeString("3/1-");
        } else {
            // turn off led
            lightSwitcH.setText("ON");
            ServoSerialPort.writeString("3/0-");
        }
    }
     catch (SerialPortException e) {
        e.printStackTrace();
    }
}

/*-------------------- connect or disconnect port-------------------------*/
public void toggleConnect(ActionEvent tgle) {

    if (toggleConnectSerial.isSelected() == true) {

        // enable control when serial port is connected 
        AngleSlider.setDisable(false);
        lightSwitcH.setDisable(false);
        IncrBtn.setDisable(false);
        DecrBtn.setDisable(false);
        tfAngle.setDisable(false);
        tfSteps.setDisable(false);

        // set the port name
        ServoSerialPort = new SerialPort("COM8");
        try {
            // set the toggle button text to disconnect
            toggleConnectSerial.setText("Disconnect");
            // open the serial port
            ServoSerialPort.openPort();
            // set the port parameters
            ServoSerialPort.setParams(SerialPort.BAUDRATE_115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);


        } catch (SerialPortException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }

    } else {
        // disable all control when port is disconnected
        AngleSlider.setDisable(true);
        lightSwitcH.setDisable(true);
        IncrBtn.setDisable(true);
        DecrBtn.setDisable(true);
        tfAngle.setDisable(true);
        tfSteps.setDisable(true);
        toggleConnectSerial.setText("Connect");
        try {
            ServoSerialPort.closePort();
        } catch (SerialPortException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

}

}

4

1 回答 1

0

您正在双向绑定值:

tfAngle.textProperty().bindBidirectional(AngleSlider.valueProperty(), NumberFormat.getIntegerInstance());

textfield这意味着如果或更改,则属性已经更新slider- 其他组件会自动更新。因此,您的方法IncrBtnPress不应该更新这两个值,只更新一个:要么sliderOR textField.

如果您想将新的脚踝更新到您的 arduino:选择一个属性(例如textProperty(),您的文本字段的属性)并添加一个ChangeListener您可以在您的 arduino 中实现新的脚踝设置器的位置。

于 2016-01-11T10:08:24.263 回答