android_things_09_pwm 控制舵機旋轉
阿新 • • 發佈:2018-11-06
adb
連線樹莓派,執行程式控制舵機旋轉。
效果圖
連線舵機
- 樹莓派5V電源線連線舵機的中間的紅線(不同的舵機正負極連線線可能不一樣,需要正確連線,否則可能燒燬舵機)
- 樹莓派GND連線舵機棕色的負極
- 樹莓派 PWM輸出線 連線舵機橙色的線
核心程式碼
在子執行緒中動態改變脈衝
private Runnable mChangePWMRunnable = new Runnable() { @Override public void run() { // Exit Runnable if the port is already closed if (mPwm == null) { Log.w(TAG, "Stopping runnable since mPwm is null"); return; } // Change the duration of the active PWM pulse, but keep it between the minimum and // maximum limits. // The direction of the change depends on the mIsPulseIncreasing variable, so the pulse // will bounce from MIN to MAX. if (mIsPulseIncreasing) { mActivePulseDuration += PULSE_CHANGE_PER_STEP_MS; } else { mActivePulseDuration -= PULSE_CHANGE_PER_STEP_MS; } // Bounce mActivePulseDuration back from the limits if (mActivePulseDuration > MAX_ACTIVE_PULSE_DURATION_MS) { mActivePulseDuration = MAX_ACTIVE_PULSE_DURATION_MS; mIsPulseIncreasing = !mIsPulseIncreasing; } else if (mActivePulseDuration < MIN_ACTIVE_PULSE_DURATION_MS) { mActivePulseDuration = MIN_ACTIVE_PULSE_DURATION_MS; mIsPulseIncreasing = !mIsPulseIncreasing; } Log.d(TAG, "Changing PWM active pulse duration to " + mActivePulseDuration + " ms"); try { // Duty cycle is the percentage of active (on) pulse over the total duration of the // PWM pulse mPwm.setPwmDutyCycle(100 * mActivePulseDuration / PULSE_PERIOD_MS); // Reschedule the same runnable in {@link #INTERVAL_BETWEEN_STEPS_MS} milliseconds mHandler.postDelayed(this, INTERVAL_BETWEEN_STEPS_MS); } catch (IOException e) { Log.e(TAG, "Error on PeripheralIO API", e); } } };
獲取連線PWM的引腳埠,不同裝置對應的埠名稱不一樣注意區分
public class BoardDefaults { private static final String DEVICE_RPI3 = "rpi3"; private static final String DEVICE_IMX6UL_PICO = "imx6ul_pico"; private static final String DEVICE_IMX7D_PICO = "imx7d_pico"; /** * Return the preferred PWM port for each board. */ public static String getPWMPort() { switch (Build.DEVICE) { case DEVICE_RPI3: return "PWM0"; case DEVICE_IMX6UL_PICO: return "PWM7"; case DEVICE_IMX7D_PICO: return "PWM1"; default: throw new IllegalStateException("Unknown Build.DEVICE " + Build.DEVICE); } } }
初始化設定並開啟子執行緒
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i(TAG, "Starting PwmActivity"); try { String pinName = BoardDefaults.getPWMPort(); mActivePulseDuration = MIN_ACTIVE_PULSE_DURATION_MS; mPwm = PeripheralManager.getInstance().openPwm(pinName); // Always set frequency and initial duty cycle before enabling PWM mPwm.setPwmFrequencyHz(1000 / PULSE_PERIOD_MS); mPwm.setPwmDutyCycle(mActivePulseDuration); mPwm.setEnabled(true); // Post a Runnable that continuously change PWM pulse width, effectively changing the // servo position Log.d(TAG, "Start changing PWM pulse"); mHandler.post(mChangePWMRunnable); } catch (IOException e) { Log.e(TAG, "Error on PeripheralIO API", e); } }