What's this?
https://developer.android.com/things/sdk/pio/pwm.html
の翻訳
PWM
パルス幅変調(PWM)は、デジタル出力ピンを使用して外部デバイスに比例制御信号を印加する方法の一つです。例えば、サーボモーターはパルス幅変調(PWM)信号を受け取って回転角度を決定します。また、LCDディスプレイはパルス幅変調(PWM)信号の平均値に基づいて輝度を調整します。
PWMは所定の周波数及びデューティサイクルで発振するデジタル信号(矩形波信号)です。
- 周波数(Hz)は、出力パルスが繰り返される頻度を表します
- ピリオドは各サイクルにかかる時間で、周波数の逆数です
- デューティサイクル(パーセンテージ)は、その周波数ウィンドウ内のパルスの幅を表します
例: PWM信号のデューティーを50%にセットすると各サイクルの半分がアクティブになります
デューティサイクルを調整して、信号の平均「オン」時間を増減させることができます。
次の図は、0%、25%、100%デューティのパルス列を示しています。
注: 多くのPWMハードはサイクル毎に少なくとも一度は値が変更される必要がある為、デューティ比が0%, 100%であったとしても各サイクルのはじめには値の変化があります。
接続管理
PWMポートとの接続にはポート名を知る必要があります。開発するにあたり、**PeripheralManagerService.getPwmList()**を呼び出すことで利用可能なポート名の一覧を取得することが出来ます
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);
}
接続すべきポート名が分かれば、PeripheralManagerServiceクラスを使用して接続することが出来ます。ポートの利用が完了したら接続を閉じてリソースを開放してください。また、接続済みのコネクションを閉じるまで同じポートで新たな接続を開始することは出来ません。接続を閉じるには**close()**メソッドを使用します。
public class HomeActivity extends Activity {
// PWM Name
private static final String PWM_NAME = ...;
private Pwm mPwm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Attempt to access the PWM port
try {
mPwm = mPeripheralManager.openPwm(PWM_NAME);
} catch (IOException e) {
Log.w(TAG, "Unable to access PWM", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPwm != null) {
try {
mPwm.close();
mPwm = null;
} catch (IOException e) {
Log.w(TAG, "Unable to close PWM", e);
}
}
}
}
パルス幅変調(PWM)の設定と制御
接続後、パルス幅変調(PWM)を最初に有効にする前にタイミングパラメーターの設定をする必要があります。パルス幅変調(PWM)を有効にするには**setEnabled(true)を実行します。もし一時的に無効にする必要がある場合はsetEnabled(false)**を実行することで無効化することが出来ます。
次のコードは、デューティ比25%(各サイクルで2.08msがOn)で120Hz(8.33ms周期のサイクル)のパルス幅変調(PWM)信号を発するように設定しています
public void initializePwm(Pwm pwm) throws IOException {
pwm.setPwmFrequencyHz(120);
pwm.setPwmDutyCycle(25);
// Enable the PWM signal
pwm.setEnabled(true);
}