Android
Android Вещи
Поиск…
Управление сервомотором
В этом примере предполагается, что у вас есть сервопривод со следующими характеристиками, которые типичны:
- движение между 0 и 180 градусами
- период импульса 20 мс
- минимальная длительность импульса 0,5 мс
- максимальная длительность импульса 2,5 мс
Вам нужно проверить, соответствуют ли эти значения вашим аппаратным средствам, поскольку принуждение к выходу за пределы указанного рабочего диапазона может привести к повреждению сервопривода. Поврежденный сервопривод, в свою очередь, может повредить устройство 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 и сигналу.