これまで色々なGPIO制御ライブラリを使ってみましたが、一番使われている”RPi.GPIO”を未だ使っていませんでした。”RPi.GPIO”にもサーボモーターを制御する関数”RPi.GPIO.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
"RPi.GPIO"でサーボモーターをフルスイングさせる
Visual Studio Codeを起動し、【 第35回 】で作ったプログラム”gpiozero_servo_full.py”を開きます。
メニューバーから「ファイル」→「名前を付けて保存」をクリックします。
【 ワークスペースの設定 】で設定したワークスペース”/home/pi/Python”が開くので、「名前」の入力欄に新しいプログラム名を入力して「保存」ボタンをクリックします。
1行目を削除して、”i”と入力すると、入力候補が現れるので、「↓」キーを押して”import”を選択し、「Enter」キーを押します。
続けて、”rp”と入力すると、入力候補が現れるので、「↓」キーを押して”RPi”を選択し、「Enter」キーを押します。入力候補には他に”RPiGPIO_servo”も出てくるのですが、こんなライブラリーが本当にあるのでしょうか?
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”GPIO”を選択し、「Enter」キーを押します。
4行目を削除して、”rp”と入力すると、入力候補が現れるので、「↓」キーを押して”RPi”を選択し、「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”GPIO”を選択し、「Enter」キーを押します。
続けて、”.(ドット)s”と入力すると、入力候補が現れるので、「↓」キーを押して”setmode”を選択し、「Enter」キーを押します。
自動で入力される”()”内に”rp”と入力すると、入力候補が現れるので”RPi”を選択して「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”GPIO”を選択し、「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”BCM”を選択し、「Enter」キーを押します。”BCM”はRaspberryPiのSoC製造元”Broadcom”の略称で、Broadcom社が割り当てたピン番号(GPIO)で入出力端子を指定するものです。ここで”BOARD”を選択するとGPIO番号ではなくて、物理的な配置順に並んだ番号で入出力端子を指定することになります。
改行して5行目に”rp”と入力すると、入力候補が現れるので”RPi”を選択して「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”GPIO”を選択し、「Enter」キーを押します。
続けて、”.(ドット)s”と入力すると、入力候補が現れるので、「↓」キーを押して今度は”setup”を選択し、「Enter」キーを押します。
自動で入力される”()”内に”12,(半角スペース)r”と入力すると、入力候補が現れるので”RPi”を選択して「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”GPIO”を選択し、「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”OUT”を選択し、「Enter」キーを押します。これで、GPIO12端子を出力に設定します。
2回改行して”pig(半角スペース)=(半角スペース)r”と入力すると、入力候補が現れるので”RPi”を選択して「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”GPIO”を選択し、「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”PWM”を選択し、「Enter」キーを押します。
自動で入力される”()”内に”12,(半角スペース)50″と入力します。この”50″はサーボモーターを制御するPWMの周波数を指定しています。
もう一度、改行して”p”と入力すると、入力候補が現れるので”pig”を選択して「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”start”を選択し、「Enter」キーを押します。
自動で入力される”()”内に”7.25″と入力します。この”7.25″は、サーボモーターのデータシート ↑ からフルスイングの中央を設定するPWMのdutycycleを”1.45msec.÷20msec.=7.25(%)”でスタートさせるものです。
12行目を削除して”p”と入力すると、入力候補が現れるので”pig”を選択して「Enter」キーを押します。
続けて、”.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”ChangeDutyCycle”を選択し、「Enter」キーを押します。
自動で入力される”()”内に”2.5″と入力します。この”2.5″は、サーボモーターのデータシート ↑ からフルスイングを設定するPWMのdutycycleを”0.5msec.÷20msec.=2.5(%)”に変更するものです。
同様に14行目を削除して”pig.(ドット)”を入力すると、入力候補が現れるので、「↓」キーを押して”ChangeDutyCycle”を選択し、「Enter」キーを押します。
自動で入力される”()”内に”7.25″と入力します。この”7.25″は、サーボモーターのデータシート ↑ からフルスイングの中央を設定するPWMのdutycycleを”1.45msec.÷20msec.=7.25(%)”に変更させるものです。
同様に16行目を削除し、”pig.ChangeDutyCycle”から自動で入力される”()”内に”12″と入力します。この”12″は、サーボモーターのデータシート ↑ からフルスイングを設定するPWMのdutycycleを”2.4msec.÷20msec.=12(%)”に変更させるものです。
同様に18行目を削除し、”pig.ChangeDutyCycle”から自動で入力される”()”内に”7.25″と入力します。この”7.25″は、サーボモーターのデータシート ↑ からフルスイングの中央を設定するPWMのdutycycleを”1.45msec.÷20msec.=7.25(%)”に変更させるものです。
改行と「Backspace」キーで22行目の行頭に”pig.(ドット)”と入力すると、入力候補が現れるので”stop”を選択して「Enter」キーを押します。これでPWM出力を停止します。
更に改行して”RPi.GPIO.(ドット)”と入力すると、入力候補が現れるので”cleanup”を選択して「Enter」キーを押します。これでGPIOの設定を既定に戻します。
import RPi.GPIO from time import sleep RPi.GPIO.setmode(RPi.GPIO.BCM) RPi.GPIO.setup(12, RPi.GPIO.OUT) pig = RPi.GPIO.PWM(12, 50) pig.start(7.25) counter = 0 while (counter < 3): pig.ChangeDutyCycle(2.5) sleep(3) pig.ChangeDutyCycle(7.25) sleep(3) pig.ChangeDutyCycle(12) sleep(3) pig.ChangeDutyCycle(7.25) sleep(3) counter = counter + 1 pig.stop() RPi.GPIO.cleanup()
アクティビティーバーの「デバッグ」アイコンをクリックします。
サイドバーに現れたデバッグ右の「▶」ボタンをクリックします。
1行目でデバッグが中断するので、画面上部デバッグ用ツールバーの「▶」ボタンをクリックして続行します。
デバッグが終わったら、統合ターミナルのタブ「問題」をクリックします。
何故か”エラー”がたくさん出ましたが今回は無視して、エディター画面の何もないところで右クリック→「Run Python File in Terminal」をクリックします。
”エラー”は出ましたが、サーボモーターはちゃんと180°フルスイングしました。但し今回も、sleep時のジャダーが出てしまいました。
メニューバーから「ファイル」→「保存」をクリックして上書き保存しておきます。
ターミナル画面で次のコマンドを入力し、設定状態を確認します。
プログラム末尾の終了処理により、GPIO12の設定がちゃんと”IN”に戻っていました。
gpio readall