控制伺服电机
这个例子假设你有一个具有以下特征的伺服,这恰好是典型的:
- 在 0 到 180 度之间移动
- 脉冲周期为 20 毫秒
- 最小脉冲长度为 0.5 ms
- 最大脉冲长度为 2.5 ms
你需要检查这些值是否与你的硬件匹配,因为强制它超出其指定的工作范围会损坏伺服。损坏的伺服器有可能损坏你的 Android Things 设备。示例 ServoController
类包含两个方法,setup()
和 setPosition()
:
public class ServoController {
private double periodMs, maxTimeMs, minTimeMs;
private Pwm pin;
public void setup(String pinName) throws IOException {
periodMs = 20;
maxTimeMs = 2.5;
minTimeMs = 0.5;
PeripheralManagerService service = new PeripheralManagerService();
pin = service.openPwm(pinName);
pin.setPwmFrequencyHz(1000.0d / periodMs);
setPosition(90);
pin.setEnabled(true);
}
public void setPosition(double degrees) {
double pulseLengthMs = (degrees / 180.0 * (maxTimeMs - minTimeMs)) + minTimeMs;
if (pulseLengthMs < minTimeMs) {
pulseLengthMs = minTimeMs;
} else if (pulseLengthMs > maxTimeMs) {
pulseLengthMs = maxTimeMs;
}
double dutyCycle = pulseLengthMs / periodMs * 100.0;
Log.i(TAG, "Duty cycle = " + dutyCycle + " pulse length = " + pulseLengthMs);
try {
pin.setPwmDutyCycle(dutyCycle);
} catch (IOException e) {
e.printStackTrace();
}
}
}
你可以在设备上发现支持 PWM 的引脚名称,如下所示:
PeripheralManagerService service = new PeripheralManagerService();
for (String pinName : service.getPwmList() ) {
Log.i("ServoControlled","Pwm pin found: " + pinName);
}
为了使伺服在 80 度和 100 度之间永久摆动,你只需使用以下代码:
final ServoController servoController = new ServoController(pinName);
Thread th = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
servoController.setPosition(80);
Thread.sleep(500);
servoController.setPosition(100);
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
th.start();
你可以编译和部署上述所有代码,而无需将任何伺服电机连接到计算设备。有关接线,请参阅你的计算设备引脚分布图(例如,此处提供了 Raspberry Pi 3 引脚分布图 )。
然后你需要将伺服器连接到 Vcc,Gnd 和信号。