【 第25回 】ハードウェアPWMでもサーボモーターをフルスイング!

0
2630

Raspberry Piでサーボモーターを回すには、Scratch 1.4でも【第22回】の”ソフトウェアPWM”と【第23回】の”サーボドライバー”の2通りの方法がありましたが、Scratchに拘らなければ他にも色々な方法があります。

今回は”ソフトウェアPWM”より細かい制御が可能とされている、”ハードウェアPWM”でサーボモーターを回してみます。

今回使った部品

実体配線図

回路は【第24回】と同じで、サーボモーターSG-90の電源は、Raspberry Piの電源アダプターとは別の電源アダプターを用意し、microUSB用変換基板を介して供給します。

・モーター端子(茶色) → GND

・microUSB用変換基板(GND) → GND

・モーター端子(赤色) → microUSB用変換基板(VCC)

・モーター端子(橙色) → GPIO12

GPIO出力に影響する音声出力を無効にしておく

タスクバーの「スピーカー」アイコンを右クリックして、”No audio devices found”と表示されない場合は、念の為、GPIO出力に影響する音声出力を無効にしておきます。

LXTerminalを起動し、次のコマンドで設定ファイルを開きます。

sudo nano /boot/config.txt

“config.txt”の編集画面が開くので「↓」キーでカーソルを下に送り、「dtparam=audio=on」の行頭に”#”を入力して、コメントアウトします。

「Ctrl」+「o」キーで書き込みすると、下の方に「書き込むファイル:/boot/config.txt」と表示されるので、「Enter」キーを押して上書きします

下の方に「**行を書き込みました」と表示されるので、「Ctrl」+「x」キーを押して閉じます。

GPIO12の出力モードをハードウェアPWMに設定する

LXTerminalを起動し、次のコマンドでGPIO12の出力モードをハードウェアPWMに設定します。

gpio -g mode 12 pwm

下のコマンドで実行結果を確認します。

gpio readall

BCM列”12(GPIO12)”番の”Mode”列が、既定の”IN(入力)”から”ALT0”に変わっています。この”ALT0”は下のSoCのデータシート ↓ の拡張機能”ALT0″を示し、GPIO12の”ALT0”列を見ると”PWM0″と表示されていて、PWM出力の”0″チャンネルを表します。

GPIO12の出力モードをハードウェアPWMに設定する

ハードウェアPWMによるサーボモーターの制御方法については、

Adafruit’s Raspberry Pi Lesson 8. Using a Servo Motor

ここ ↑ の情報を参考にさせていただきました。但し、使用するツールの”WiringPi”は、最新のRaspbianには既にプリインストールされているので、あらためてインストールする必要はありません。

ハードウェアPWMの出力は、

・PWM Frequency in Hz = 19,200,000 Hz / pwmClock / pwmRange

の式で設定されますが、サーボモーター SG90のデータシート ↑ から

・PWM Frequency in Hz = 50 Hz

・pwmRangeを既定の10bit:1024とすると、

・pwmClock = 19,200,000 Hz / PWM Frequency in Hz / pwmRange
・・・・・・・= 192,00,000 / 50 / 1024
・・・・・・・= 375

となります。

LXTerminalに戻り、次のコマンドでPWMの出力モードを”mark:space“に設定します。

gpio pwm-ms

続けて、pwmRangeとpwmClockの値を設定します。

gpio pwmc 375
gpio pwmr 1024

指定した回転角でサーボモーターを回す

SG90のデータシートからフルスイングの中央は、1.45msec/20msecなので、

pwmRange = 1024の中で指定する場合は、1024 × 1.45 ÷ 20 ≒ 74

gpio -g pwm 12 74

LXTerminalをもう1つ起動し、次のコマンドでサーボモーターを回します。

フルスイングの中央から+90°は、2.4msec/20msecなので、

pwmRange = 1024の中で指定する場合は、1024 × 2.4 ÷ 20 ≒ 123

gpio -g pwm 12 123

LXTerminalをもう1つ起動し、フルスイングの中央まで回します。

gpio -g pwm 12 74

LXTerminalをもう1つ起動し、サーボモーターを回します。

フルスイングの中央から-90°は、0.5msec/20msecなので、

pwmRange = 1024の中で指定する場合は、1024 × 0.5 ÷ 20 ≒ 25

gpio -g pwm 12 25

LXTerminalをもう1つ起動し、フルスイングの中央まで回します。

gpio -g pwm 12 74

LXTerminalをもう1つ起動し、フルスイングの中央から+90°まで戻します。

gpio -g pwm 12 123

さすがはハードウェアPWMというべきか、フルスイングの中央から+90°、そこから-90°まで指定通りに180°回転します。こうじゃなきゃロボットでも飛行機でも制御はできません。

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

次のコマンドでGPIO12の設定を既定に戻しておきます。

gpio -g mode 12 in

下のコマンドで実行結果を表示します。

gpio readall

BCM列”12(GPIO12)”番の”Mode”列が、”ALT0”から既定の”IN(入力)”に戻っていることを確認します。