Поиск…


Управление сервомотором

В этом примере предполагается, что у вас есть сервопривод со следующими характеристиками, которые типичны:

  • движение между 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 и сигналу.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow