[英]Problems with controlling a servo with java and Pi4J on a Raspberry PI 2
我想使用Pi4J通过我的Raspberry 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:通过以下输入,我希望伺服处于0°旋转。
hz:50 ms高:1
结果:伺服正如预期的那样处于0° 。
示例2:通过以下输入,我希望伺服处于180°旋转。
hz:50英里高:2
结果:伺服旋转~80° 。
有谁知道我做错了什么?
我有另一个伺服的类似问题(我认为这是arduino的东西)。
我只是按照结果正确的方式校准了给定的值。 我不知道它来自哪里,但伺服做了我想做的事。
这个问题与Pi4J无关。 睡眠期并不准确。
“睡眠的粒度通常受线程调度程序的中断周期的限制。在Linux中,这个中断周期在最近的内核中通常为1ms。在Windows中,调度程序的中断周期通常在10或15毫秒左右” - qwerty https:// stackoverflow的.com /一个/5049836分之11498647
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.