Android Controllo di un servomotore

Esempio

Questo esempio presuppone che tu abbia un servo con le seguenti caratteristiche, che sono tipiche:

  • movimento tra 0 e 180 gradi
  • periodo di impulso di 20 ms
  • durata minima dell'impulso di 0,5 ms
  • durata massima dell'impulso di 2,5 ms

È necessario verificare se tali valori corrispondono al proprio hardware, poiché forzarlo ad andare al di fuori dell'intervallo operativo specificato può danneggiare il servo. Un servo danneggiato a sua volta ha il potenziale per danneggiare il dispositivo Android Things. La classe ServoController esempio è composta da due metodi, setup() e 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();
        }
    }
}

Puoi scoprire nomi di piedini che supportano PWM sul tuo dispositivo come segue:

PeripheralManagerService service = new PeripheralManagerService();

for (String pinName : service.getPwmList() ) {
    Log.i("ServoControlled","Pwm pin found: " + pinName);
}

Per rendere il tuo servo oscillante per sempre tra 80 gradi e 100 gradi, puoi semplicemente utilizzare il seguente codice:

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();

È possibile compilare e distribuire tutto il codice sopra senza effettivamente agganciare alcun servomotore al dispositivo di calcolo. Per il cablaggio, fare riferimento alla tabella di pinout del dispositivo di calcolo (ad esempio un grafico di pinout Raspberry Pi 3 è disponibile qui ).

Quindi devi agganciare il tuo servo a Vcc, Gnd e segnale.