【第32回】では、GPIO制御ライブラリ”pigpio”のサーボモーター制御用関数”servo_pulsewidth”を使ってフルスイングさせましたが、”pigpio”には、これとは別にハードウェアPWMを発生させる関数もあり、今回は、この関数”hardware_PWM”を使って「サーボモーターをフルスイング」させてみようと思います。
今回使った部品
- Raspberry Pi 3 Model B × 1
- 40Pinフラットリボンケーブル
- 40Pin T型GPIO拡張ボード
- ブレットボード × 1
- サーボモーター SG90 × 1
- 電源アダプター5V 2.5A × 1
- microUSB用変換基板 × 1
- ジャンプワイヤー(オス/オス) × 5
実体配線図
回路は【第25回】と同じで、サーボモーターSG-90の電源は、Raspberry Piの電源アダプターとは別の電源アダプターを用意し、microUSB用変換基板を介して供給します。
・モーター端子(茶色) → GND
・microUSB用変換基板(GND) → GND
・モーター端子(赤色) → microUSB用変換基板(VCC)
・モーター端子(橙色) → GPIO12
"pigpio"の"hardware_PWM"でサーボモーターをフルスイングさせる
Visual Studio Codeを起動し、【 第32回 】で作ったプログラム”pigpio_servo_servo.py”を開きます。
メニューバーから「ファイル」→「名前を付けて保存」をクリックします。
【 ワークスペースの設定 】で設定したワークスペース”/home/pi/Python”が開くので、「名前」の入力欄に新しいプログラム名を入力して「保存」ボタンをクリックします。
エディター画面右上のアイコン「エディターの分割」をクリックします。
分割されたエディター画面の左ペインにカーソルを移動してから、サイドバーのプログラム”pigpio_servo_servo.py”をクリックします。
アクティビティーバーのエクスプローラーアイコンをクリックして閉じます。
左ペインの”pigpio_servo_servo.py”と見比べながら、右ペインの”pigpio_h_ware_servo.py”を上書きします。
右ペインの4行目の行末で「Enter」キーを押して改行し、”pig.set”と入力すると、入力候補が現れるので、「↓」キーを押して”set_mode”を選択し、「Enter」キーを押します。
自動入力される”()”内で”12, pigpio.a”と入力すると入力候補が表示されるので、「↓」キーを押して”ALT0”を選択して「Enter」キーを押します。
ここで選択したGPIO12の出力モード:ALT0は、右のデータシートからGPIO拡張機能でPWMの”0″チャンネルに相当します。
右ペインの9行目を削除して”pig.h”と入力すると入力候補が表示されるので、「↓」キーを押して”hardware_PWM”を選択し、「Enter」キーを押します。
自動で入力される”()”内に”12, 50, 120000″と入力します。
サーボモーターに接続したGPIOの番号:12に続けて入力した”50″は、【 第25回 】で紹介したサーボモーター SG90のデータシートから制御信号の周波数;50Hz、最後の”120000″は、時計方向のフルスイング時のdutycycleを指定したものです。
関数”hardware_PWM”の場合、Range(分解能)が”1,000,000″に固定されているので、周波数:50Hzのパルス周期:1sec./50=0.02sec.=20msec.と時計方向のフルスイング時のパルス幅:2.4msec.の比(dutycycle):0.12を乗じると”120000″になります。
右ペインの11行目を削除して”pig.h”と入力すると入力候補が表示されるので、「↓」キーを押して”hardware_PWM”を選択し、「Enter」キーを押します。
自動で入力される”()”内に”12, 50, 72500″と入力します。
最後の”72500″は、周波数:50Hzのパルス周期:20msec.とPosition”0″のパルス幅:1.45msec.の比(dutycycle):0.0725に既定のRange:1,000,000を乗じたものです。
同様に、右ペインの13行目を削除して”hardware_PWM”を選択し、自動で入力される”()”内に”12, 50, 25000″と入力します。
最後の”25000″は、周波数:50Hzのパルス周期:20msec.と反時計方向のフルスイング時のパルス幅:0.5msec.の比(dutycycle):0.025に既定のRange:1,000,000を乗じたものです。
同様に、右ペインの15行目を削除して”hardware_PWM”を選択し、自動で入力される”()”内に”12, 50, 72500″と入力します。
最後の”72500″は、Position”0″のdutycycle:0.0725に既定のRange:1,000,000を乗じたものです。
同様に、右ペインの19行目を削除して”hardware_PWM”を選択し、自動で入力される”()”内に”12, 50, 0″と入力します。
最後の”0″でPWM出力を止めます。
右ペインの20行目を削除して”pig.s”と入力すると入力候補が表示されるので、「↓」キーを押して”set_mode”を選択し、「Enter」キーを押します。
自動入力される”()”内で”12, pigpio.i”と入力すると入力候補が表示されるので、「↓」キーを押して”INPUT”を選択して「Enter」キーを押します。これで、GPIO12の設定を既定の”IN”に戻します。
右ペインの21行目を削除して”pig.st”と入力すると入力候補が表示されるので、「↓」キーを押して”stop”を選択し、「Enter」キーを押します。これでGPIO制御ライブラリ”pigpio”を終了します。
import pigpio import time pig = pigpio.pi() pig.set_mode(12, pigpio.ALT0) counter = 0 while (counter < 3): pig.hardware_PWM(12, 50, 120000) time.sleep(3) pig.hardware_PWM(12, 50, 72500) time.sleep(3) pig.hardware_PWM(12, 50, 25000) time.sleep(3) pig.hardware_PWM(12, 50, 72500) time.sleep(3) counter = counter + 1 pig.hardware_PWM(12, 50, 0) pig.ser_mode(12, pigpio.INPUT) pig.stop()
メニューバーから「ファイル」→「保存」をクリックします。
アクティビティーバーの「デバッグ」アイコンをクリックします。
サイドバーに現れたデバッグ右の「▶」ボタンをクリックします。
1行目でデバッグが中断するので、画面上部デバッグ用ツールバーの「↓」ボタンをクリックして続行します。
デバッグが終わったら、統合ターミナルのタブ「問題」をクリックします。
いつもの”イチャモン”以外、特に問題もないようなので、右ペインのエディター画面の何もないところで右クリック→「Run Python File in Terminal」をクリックします。
しっかり、フルスイング(180°)させることができました。
GPIO12の設定を既定に戻しておく
GPIOの設定状況を確認します。
今回は、Python上で既定に戻しておいたので、GPIO12の設定が”IN”になっていました。
gpio readall
コマンド”pigs mg”でも、設定状態が確認できます。
返ってきた値”0″は、pigpio libraryによると”Input”を示しているので、既定通りであることが確認できます。
pigs mg 12