- Raspberry Pi 3 Model B × 1
- 40Pinフラットリボンケーブル
- 40Pin T型GPIO拡張ボード
- ブレットボード × 1
- サーボモーター SG90 × 1
- 電源アダプター5V 2.5A × 1
- microUSB用変換基板 × 1
- ジャンプワイヤー(オス/オス) × 5
実体配線図
回路は【第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(入力)”に戻っていることを確認します。