【 第32回 】pigpioにはサーボモーター制御用のPWM発生関数”servo_pulsewidth”があった!

0
2168

【第31回】では、GPIO制御ライブラリ”pigpio ( ぴぐぴお ? )”をインポートして「サーボモーターをフルスイング」させましたが、”pigpio”には通常のソフトウェアPWMの他にサーボモーター用のPWMを発生させる関数があることが分かりました。今回は、この”servo_pulsewidth”を使って「サーボモーターをフルスイング」させてみようと思います。

今回使った部品

  • 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"の"servo_pulsewidth"でサーボモーターをフルスイングさせる

Visual Studio Codeを起動し、【 第31回 】で作ったプログラム”pigpio_servo.py”を開きます。

メニューバーから「ファイル」→「名前を付けて保存」をクリックします。

【 ワークスペースの設定 】で設定したワークスペース”/home/pi/Python”が開くので、「名前」の入力欄に新しいプログラム名を入力して「保存」ボタンをクリックします。

エディター画面右上のアイコン「エディターの分割」をクリックします。

分割されたエディター画面の左ペインにカーソルを移動してから、サイドバーのプログラム”pigpio_servo.py”をクリックします。

アクティビティーバーのエクスプローラーアイコンをクリックして閉じます。

左ペインの”pigpio_servo.py”と見比べながら、右ペインの”pigpio_servo_servo.py”を上書きします。

“servo_pulsewidth”の場合は、PWMの周波数:50Hz、Range:20,000に固定されているので、右ペインの6,7行目の行頭に”#”を入力してコメントアウトします。

右ペインの12行目を削除して”pig.set”と入力すると入力候補が表示されるので、”set_servo_pulsewidth”を選択します。

“servo_pulsewidth”ではPWMのパルス幅を指定するので、【 第25回 】で紹介したサーボモーター SG90のデータシート通り、反時計方向のフルスイング時は”500(μsec.)”とします。

右ペインの14行目を削除して”pig.set”と入力すると入力候補が表示されるので、”set_servo_pulsewidth”を選択します。

時計方向のフルスイング時も【 第25回 】で紹介したサーボモーター SG90のデータシート通り、”2400(μsec.)”とします。

右ペインの18行目を削除して”pig.set”と入力すると入力候補が表示されるので、”set_servo_pulsewidth”を選択します。

PWM出力を止める為、パルス幅を”0″にします。

import pigpio
import time

pig = pigpio.pi()

#pig.set_PWM_frequency(12, 50)
#pig.set_PWM_range(12, 1024)

counter = 0
while (counter < 3):
    pig.set_servo_pulsewidth(12, 500)
    time.sleep(3)
    pig.set_servo_pulsewidth(12, 2400)
    time.sleep(12)
    counter = counter + 1

pig.set_servo_pulsewidth(12, 0)
pig = pigpio.pi()

アクティビティーバーの「デバッグ」アイコンをクリックします。

サイドバーに現れたデバッグ右の「▶」ボタンをクリックします。

1行目でデバッグが中断するので、画面上部デバッグ用ツールバーの「↓」ボタンをクリックして続行します。

デバッグが終わったら、統合ターミナルのタブ「問題」をクリックします。

いつもの”イチャモン”以外、特に問題もないようなので、メニューバーから「ファイル」→「保存」をクリックします。

右ペインのエディター画面の何もないところで右クリック→「Run Python File in Terminal」をクリックします。

サーボモーターの劣化が更に進んだのか待機時間を延長したのに、途中で引っ掛かってフルスイングできません。

念の為、左ペインでも何もないところで右クリック→「Run Python File in Terminal」をクリックしてみます。

やはり、途中で引っ掛かってフルスイングできませんでした。

サーボテスターに接続すると、ゆっくり回転させれば、どうにかフルスイングできるようです。

左ペインのタブ2箇所の「×」をクリックして閉じます。

8行目から4行目までをマウスで選択します。

カーソルをそのままで、右クリック→「切り取り」を選択します。

11行目から8行目までをマウスで選択します。

カーソルをそのままで、右クリック→「コピー」を選択します。

カーソルをそのままで、右クリック→「貼り付け」を選択します。

「フォーマッターがインストールされていない」とエラー表示がでますが「閉じる」ボタンをクリックして閉じます。

カーソルはそのままで、「Enter」キーを押します。

カーソルはそのままで、「Backspace」キーを押します。

8行目の”pulsewidth”を時計方向のフルスイング時のパルス幅:”2400(μsec.)”で上書きします。

フルスイングの両端をいきなり往復させるのが無理に見えたので、一旦、中間で停止させる為、10行目の”pulsewidth”を【 第25回 】で紹介したサーボモーター SG90のデータシートにあるPosition”0″のパルス幅:1450(μsec.)で上書きします。

14行目の”pulsewidth”もPosition”0″のパルス幅:1450(μsec.)で上書きします。

11行目と15行目の待機時間を”3″で上書きします。

import pigpio
import time

pig = pigpio.pi()

counter = 0
while (counter < 3):
    pig.set_servo_pulsewidth(12, 2400)
    time.sleep(3)
    pig.set_servo_pulsewidth(12, 1450)
    time.sleep(3)
    pig.set_servo_pulsewidth(12, 500)
    time.sleep(3)
    pig.set_servo_pulsewidth(12, 1450)
    time.sleep(3)
    counter = counter + 1

pig.set_servo_pulsewidth(12, 0)
pig = pigpio.pi()

メニューバーから「ファイル」→「保存」をクリックしておきます。

ターミナル画面で「↑」キーを押すと、直前のコマンドが入力されるので、もう一度、実行します。

ゆっくりですが、なんとかフルスイングさせることができました。

GPIO12の設定を既定に戻しておく

GPIOの設定状況を確認します。

gpio readall

Python上で初期化しても、GPIO12の設定は”OUT”のままでした。

GPIO12の設定を既定の”IN”に戻しておきます。

gpio -g mode 12 in

ホームディレクトリに戻ります。

cd

コマンド”systemctl”で”pigpiod”の起動状態を確認しておきます。

sudo systemctl status pigpiod

項目「Active」が”active(running)”で起動中だということが確認できました。

【 第31回 】で”pigpiod”を自動起動する設定にしたので、コマンド”systemctl killall”で強制終了しない限り、OS起動中はpigpiod”が常駐しています。

“q”キーで起動状態の表示モードを終了します。

q