用java和Pi4J在复盆子PI 2上控制伺服的问题



我想使用Pi4J通过复盆子PI的GPIO引脚控制MG90S伺服。

我创建了一个带有hz和占空比("High in ms:")键盘输入的Java应用程序。

import java.util.Scanner;
import com.pi4j.io.gpio.GpioController;
import com.pi4j.io.gpio.GpioFactory;
import com.pi4j.io.gpio.GpioPinDigitalOutput;
import com.pi4j.io.gpio.PinState;
import com.pi4j.io.gpio.RaspiPin;
public class Main {
    public static void main(String[] args) throws InterruptedException {
        GpioController gpioFactory = GpioFactory.getInstance();
        GpioPinDigitalOutput myServo =  gpioFactory.provisionDigitalOutputPin(
                    RaspiPin.GPIO_07, PinState.LOW);
        //Input of hz and duty cycle
        System.out.println("Hz:");
        Scanner scanner = new Scanner(System.in);
        float hz = scanner.nextFloat();
        System.out.println("High in ms:");
        float highTime = scanner.nextFloat();
        scanner.close();
        //Calculate GPIO low time: hz period time - duty time
        float lowTime = 1000 / hz - highTime;
        while (true) {
            myServo.high();
            long upMs = new Float(highTime).longValue(); // Up time miliseconds
            int upNanos = new Float(highTime * 1000000 % 1000000).intValue(); // Up time nanoseconds
            java.lang.Thread.sleep(upMs, upNanos);
            myServo.low();
            long lowMs = new Float(lowTime).longValue();
            int lowNanos = new Float(lowTime * 1000000 % 1000000).intValue();
            java.lang.Thread.sleep(lowMs, lowNanos);
        }
    }
}

示例1:通过以下输入,我预计伺服处于旋转

赫兹:50高(毫秒):1

结果:伺服按预期处于

示例2:通过以下输入,我预计伺服处于180°旋转。

赫兹:50高(毫秒):2

结果:伺服处于~80°旋转。

有人知道我做错了什么吗?

我在另一个伺服系统上也遇到了类似的问题(我认为这是arduino的东西)。

我只是校准了给定的值,这样结果是正确的。我不知道它是从哪里来的,但伺服做了我想做的。

问题与Pi4J无关。睡眠时间并不完全充足。

"睡眠的粒度通常受线程调度程序的中断周期的限制。在Linux中,这个中断周期在最近的内核中通常为1ms。在Windows中,调度程序的干扰周期通常在10或15毫秒左右。"-qwertyhttps://stackoverflow.com/a/11498647/5049836

最新更新