【第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
実体配線図
回路は【第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