【 第33回 】pigpioにはハードウェアPWM発生関数”hardware_PWM”もあった!

0
2632

【第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
デジタル・マイクロサーボ SG90
梅本合同会社
売り上げランキング: 11,230
サンハヤト USB用変換基板 CK-37
サンハヤト
売り上げランキング: 36,117

実体配線図

回路は【第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