今回使った部品
- 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
"pigpiod"を常駐させる
PythonでGPIO制御ライブラリ”pigpio”を実行できるようにするデーモン“pigpiod”自体は、Raspbianにプリインストールされているのですが、常駐している訳ではないので、インポートする前にあらかじめ起動しておかなくてはなりません。
そこで、Raspbianと同時に起動しておくように設定します。
タスクバー左端のメニューアイコンから「設定」→「Raspberry Piの設定」をクリックして、現れた画面のタブ「インターフェイス」を選択します。
1番下の項目「リモートGPIO:」のラジオボタン「有効」を選択して「OK」ボタンをクリックします。
LXTerminalを起動し、コマンド”systemctl“で”pigpiod”の自動起動を有効にします。
sudo systemctl enable pigpiod
念の為、再起動しておきます。
reboot
再起動したら、コマンド”systemctl“で”pigpiod”の起動状態を確認します。
項目「Active」が”active(running)”で起動中だということが確認できました。
sudo systemctl status pigpiod
Python 3を実行します。
sudo python3
“pigpio”をインポートしてみます。
【 第30回 】では、デーモン”pigpiod”を起動していなかったのでインポートできませんでしたが、今回はプロンプトが返ってきたのでインポートできたようです。
import pigpio
念の為、GPIOを初期化してみます。こちらもプロンプトが返ってきたので初期化できました。
pig = pigpio.pi()
“pigpiod”の常駐が確認できたので、Python 3を終了します。
exit()
"pigpio"でサーボモーターをフルスイングさせる
Visual Studio Codeを起動し、【 第29回 】で作ったプログラム”servo.py”を開きます。
メニューバーから「ファイル」→「名前を付けて保存」をクリックします。
【 ワークスペースの設定 】で設定したワークスペース”/home/pi/Python”が開くので、「名前」の入力欄に新しいプログラム名を入力して「保存」ボタンをクリックします。
エディター画面右上のアイコン「エディターの分割」をクリックします。
分割されたエディター画面の左ペインにカーソルを移動してから、サイドバーのプログラム”servo.py”をクリックします。
左ペインの”servo.py”が画面内で折り返されて見にくいので、アクティビティーバーのエクスプローラーアイコンをクリックして閉じます。
左ペインの”servo.py”と見比べながら、右ペインの”pigpio_servo.py”を上書きします。
右ペインの1行目の”wiringpi”を削除して”pi”と入力すると入力候補が表示されるので、”pigpio”を選択します。
右ペインの4行目を削除して”pigpio”の初期化コードを入力します。
右ペインの5,6行目を削除して”pig.set”と入力すると入力候補が表示されるので、”set_PWM_frequency”を選択します。
“pigpio”ではPWMの周波数を指定するので、【 第25回 】で紹介したサーボモーター SG90のデータシート通り50Hzとします。
右ペインの7行目を削除して”pig.set”と入力すると入力候補が表示されるので、”set_PWM_range”を選択します。
“range”も【 第25回 】と同じで既定の10bit”1024″とします。
右ペインの12行目を削除して”pig.set”と入力すると入力候補が表示されるので、”set_PWM_dutycycle”を選択します。
反時計方向のフルスイング時の”dutycycle”も【 第25回 】のデータシートから、1024 × 0.5 / 20 ≒ 25とします。
右ペインの14行目を削除し、時計方向のフルスイング時の”dutycycle”を【 第25回 】のデータシートから、1024 × 2.4 / 20 ≒ 123とします。
右ペインの18行目を削除し、PWM出力を止める為、”dutycycle”を”0″にします。
右ペインの19行目を削除し、GPIOを初期化して終わります。
import pigpio import time pig = pigpio.pi() pig.set_PWM_frequency(12, 50) pig.set_PWM_range(12, 1024) counter = 0 while (counter < 10): pig.set_PWM_dutycycle(12, 25) time.sleep(1) pig.set_PWM_dutycycle(12, 123) time.sleep(1) counter = counter + 1 pig.set_PWM_dutycycle(12, 0) pig = pigpio.pi()
左ペインのタブ”servo.py”の「×」をクリックして閉じます。
アクティビティーバーの「デバッグ」アイコンをクリックします。
サイドバーに現れたデバッグ右の「▶」ボタンをクリックします。
1行目でデバッグが中断するので、画面上部デバッグ用ツールバーの「↓」ボタンをクリックして続行します。
デバッグが終わったら、統合ターミナルのタブ「問題」をクリックします。
いつもの”イチャモン”以外、特に問題もないようなので、エディター画面の何もないところで右クリック→「Run Python File in Terminal」をクリックします。
20秒でプロントは返ってきましたが、その間、サーボモーターは「グググッ」と苦しそうな音は出しますが、いっこうにスイングする気配はありません。
さてはサーボモーターも酷使に耐えかねて、いよいよお釈迦か?とも思いましたが、【 番外編 】のサーボテスターに接続したところ、ちゃんとフルスイングするではありませんか。
但し、よく観察してみると回転速度が、それも反時計回りのときが特に遅くなっていることに気付きました。そこで待機時間を時計回り:3秒、反時計回り:12秒で、繰り返し回数も10回 → 3回に変更しました。
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_PWM_dutycycle(12, 25) time.sleep(3) pig.set_PWM_dutycycle(12, 123) time.sleep(12) counter = counter + 1 pig.set_PWM_dutycycle(12, 0) pig = pigpio.pi()
メニューバーから「ファイル」→「保存」をクリックしておきます。
ターミナル画面で「↑」キーを押すと、直前のコマンドが入力されるので、もう一度、実行します。
途中で何度か引っ掛かりながらも、どうにか3回フルスイングできました。
GPIO12の設定を既定に戻しておく
GPIOの設定状況を確認します。
gpio readall
Python上で初期化しても、GPIO12の設定は”OUT”のままでした。
GPIO12の設定を既定の”IN”に戻しておきます。
gpio -g mode 12 in
「↑」キーを押して、もう一度、設定を確認します。
gpio readall
GPIO12の設定が既定の”IN”に戻っていました。
ホームディレクトリに戻ります。
cd
このコマンドで”pigpiod”を停止します。
sudo killall pigpiod
コマンド”systemctl”で”pigpiod”の起動状態を確認しておきます。
sudo systemctl status pigpiod
項目「Active」が”inactive(dead)”で停止していることが確認できました。
“pigpiod”は自動起動の設定にしたので、OSを再起動すれば”pigpiod”も再び起動しますが、別のGPIO制御ライブラリを使う場合等の必要に応じて停止することも可能です。