最新のRaspbianにはGPIO制御ライブラリWiringPiがプリインストールされていて【第25回】でもLXTerminalで実行できたので、Pythonでもこのままで使えるのかと思っていました。ところが、元々、C言語で書かれたWiringPiをPythonで使うには、WiringPi2-Pythonという別のパッケージをインストールする必要があることが分かりました。
WiringPi2-Pythonのインストール
LXTerminalを起動し、次のコマンドでWiringPi2-Pythonのパッケージをダウンロードします。
git clone https://github.com/neuralassembly/WiringPi2-Python.git
次のコマンドで、WiringPi2-Pythonのディレクトリに移動します。
cd WiringPi2-Python
ディレクトリ内のセットアップを実行します。
sudo python3 setup.py install
今回使った部品
- 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
Python3でサーボモーターを回す
次のコマンドで、ホームディレクトリに戻ります。
cd
Python3を起動します。
sudo python3
WiringPi2をインポートします。
import wiringpi2
次のコマンドで、GPIOを初期化します。
wiringpi2.wiringPiSetupGpio()
“0”が返ってきたら、初期化の完了です。
GPIO12の出力をハードウェアPWMに設定します。
wiringpi2.pinMode(12, wiringpi2.GPIO.PWM_OUTPUT)
PWM出力モードをサーボモーター制御に向いたmark:spaceに設定します。
wiringpi2.pwmSetMode(wiringpi2.GPIO.PWM_MODE_MS)
pwmRangeを既定の10bit:1024とします。
wiringpi2.pwmSetRange(1024)
pwmClockは【第25回】での計算通り、375とします。
wiringpi2.pwmSetClock(375)
【第25回】での計算から、サーボモーターのフルスイングの中央を狙って、GPIO12のPWMをデューティー比:74/1024とします。
wiringpi2.pwmWrite(12, 74)
ジジジっという音と共にサーボモーターのアームがフルスイングの中央まで回転しました。
【第25回】での計算から、サーボモーターのフルスイングを目指して、GPIO12のPWMをデューティー比:25/1024とします。
wiringpi2.pwmWrite(12, 25)
サーボモーターのアームが時計方向に90°回転しました。
【第25回】での計算から、今度は逆方向にフルスイングを目指して、GPIO12のPWMをデューティー比:123/1024とします。
wiringpi2.pwmWrite(12, 123)
今度は、サーボモーターのアームが反時計方向に180°回転しました。
出力を止める為、GPIO12のPWMをデューティー比:0/1024とします。
wiringpi2.pwmWrite(12, 0)
サーボモーターからジジジっという音が消えました。
次のコマンドで、Python3から抜けます。
exit()
GPIO12の設定を既定に戻しておく
念の為、次のコマンドでGPIO12の出力設定を確認します。
gpio readall
BCM列”12(GPIO12)”番の”Mode”列が、”ALT0”のままでした。
次のコマンドでGPIO12の設定を既定に戻しておきます。
gpio -g mode 12 in
もう一度、GPIO12の出力設定を確認します。
gpio readall
BCM列”12(GPIO12)”番の”Mode”列が、”ALT0”から既定の”IN(入力)”に戻っていました。