Android ThingsでPWM制御してサーボモータを動かしてみます。
今回はSG90を使います。
■公式
https://developer.android.com/things/sdk/pio/pwm.html
ほぼ公式ページのサンプル通りですぐに試せます。
■SG90の接続
秋月電子様のサイトに仕様書がありますので使わせて頂きます。
http://akizukidenshi.com/catalog/g/gM-08761/
ケーブルの色が手元にあるものと仕様書でどう見ても違う気がしたので何度も確認してしまいました。
黄色:制御信号
オレンジ:電源
茶色:GND
https://developer.android.com/things/hardware/raspberrypi-io.html
によるとPWMピンは PWM 0 (BCM 18) と PWM 1 (BCM 13) なので、
今回はPWM0につなげてみます。
仕様に合わせて定義など。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
String PWM_NAME = ""; private Pwm mPwm; private Handler mHandler = new Handler(); // Parameters of the servo PWM private static final double INITIAL_ACTIVE_PULSE_DURATION_MS = 1.45; private static final double MIN_ACTIVE_PULSE_DURATION_MS = 0.5; private static final double MAX_ACTIVE_PULSE_DURATION_MS = 2.4; private static final double PULSE_PERIOD_MS = 20; // Frequency of 50Hz (1000/20) // Parameters for the servo movement over time private static final double PULSE_CHANGE_PER_STEP_MS = 0.2; private static final int INTERVAL_BETWEEN_STEPS_MS = 1000; private boolean mIsPulseIncreasing = true; private double mActivePulseDuration; |
公式のPWM解説ページの例では 120Hz (8.33ms周期)で Duty = 25%になっている。
1 2 |
pwm.setPwmFrequencyHz(120); pwm.setPwmDutyCycle(25); |
SG90はデータシートによると
PWM Periodは 50Hz で、
DUTY=1.45msでポジション0(真ん中)
DUTY = 2.4で90度
DUTY = 0.5でー90度
となっている。
■PWMピンへのアクセス
PWMポートへの接続にポート名が必要。この辺はGPIOと同様。
ポート名のリストは
PeripheralManagerService.getPwmList() で取得できる。
1 2 3 4 5 6 7 |
PeripheralManagerService manager = new PeripheralManagerService(); List<String> portList = manager.getPwmList(); if (portList.isEmpty()) { Log.i(TAG, "No PWM port available on this device."); } else { Log.i(TAG, "List of available ports: " + portList); } |
PWM0, PWM1
という名前が取得できるので、これを使ってopenする。
PeripheralManagerServiceのopenPwm(ポート名)でオープンできる。
onDestroy()など不要になるタイミングでclose()すること。
1 2 3 4 5 6 7 8 9 10 11 |
PWM_NAME = "PWM0";// portList.get(0); try { mPwm = manager.openPwm(PWM_NAME); Log.d(TAG,"opened PWM port"); mPwm.setPwmFrequencyHz(1000 / PULSE_PERIOD_MS); mPwm.setPwmDutyCycle(100 * mActivePulseDuration / PULSE_PERIOD_MS); mPwm.setEnabled(true); mHandler.post(mChangePWMRunnable); } catch (IOException e) { Log.w(TAG, "Unable to access PWM", e); } |
■PWM信号の設定
最初にシグナルをアクティブにする前に設定しないといけない。
シグナルをアクティブにするには setEnable(true)をコール。非アクティブにするにはsetEnable(false)。
後は、公式サンプルのようにhandlerのpostDelayed()を使うなどして周期的に角度を変える設定を行うとモーターが動きます。
■実行例