はじめに
Raspberry Pi に MG90S と言うサーボモータを繋げて動かしてみます。
モーターと一口に言っても世の中にはいっぱいあるようです。ミニ四駆で使われている電流を流すと単純にブン回るブラシ付きDCモータを回すのも楽しいですが、ステッピングモータや今回扱うサーボモータでは回転の速さや向きなどをプログラムからより細かく制御することができます。
サーボモータは工業用のロボットなどでも使われており、Raspberry Pi からモーターを操作するための装置 (ドライバー) が内蔵されているものも多く Raspberry Pi に繋げてすぐ使えるのも電子工作として魅力的です。制限としては回る角度が決まっており多くのものは 180 度まで となっています。ものによっては 270 度回る ものもあるようです。
サーボモータは安いものだと 2 つで 1000 円程度 程度で購入することができます。個数が多いほど単価が 劇的に安くなる ようなのでサーボモータなんていくらあっても困らないと言う人は色々と探してみると良いかもしれません。
動かしてみる
サーボモータから 3 本の線が出ていると思うが配線は以下のように行いました。
茶色: GND
赤色: 5V
オレンジ: [GPIO 13 (PMW1)](https://pinout.xyz/pinout/pin33_gpio13)
プログラムは以下の通りです。ここを参考にしました。動きは動画の通りモーターを 0 度に動かしてから次に 180 度、90 度と動かしています。
import RPi.GPIO as GPIO
import time
# GPIO 13
servoPin = 13
# GPIO and pwm setup
GPIO.setmode(GPIO.BCM)
GPIO.setup(servoPin, GPIO.OUT)
pwm = GPIO.PWM(servoPin, 50)
pwm.start(7.0)
sleep = 0.8
# move the servo to 0 dgrees
pwm.ChangeDutyCycle(2.0)
time.sleep(sleep)
# move the servo to 180 dgrees
pwm.ChangeDutyCycle(12.0)
time.sleep(sleep)
# move the servo to 90 dgrees
pwm.ChangeDutyCycle(7.0)
time.sleep(sleep)
# stop pwm and GPIO clean up
pwm.ChangeDutyCycle(0)
pwm.stop()
GPIO.cleanup()
PWM については ここ などが参考になりました。motor.py では pwm.ChangeDutyCycle(N) でサーボモータの角度を指定しています。この値は 2.0 - 12.0 となり 2.0 を指定した時サーボモータの向きは 0 度で 12.0 の場合は 180 度となります。このため N を 1 増やすと角度的には 18 度増える計算になり、例えば 90 度が 7.0 なので 8.0 は 108 度となります。
注意点としては pwm.ChangeDutyCycle(N) で角度を指定した後に time.sleep(sleep) で一定時間モータが動くのを待っていることです。より早く回転ができるサーボモータではこの時間を少なくすることもできますが遅いサーボモータでは逆に時間を増やしてあげる必要があるかもしれません。
time.sleep(sleep) で指定する時間が十分でないと指定した場所までモータが回る前に次の角度が指定され以下のビデオのような動きになります。
余談ですが wiringPi の gpio コマンドを使いサーボモーを動かすことができていたのですが残念ながら 非推奨 となってしまい最新の Bullseye ではパッケージに含まれなくなってしまったようです。[GPIOreadall(https://github.com/Milliways2/GPIOreadall/blob/main/README.md) が置き換えとしてありますが現時点では GPIO の一覧を表示させる機能のみとなっています。
猫じゃらしをつけてみる
サーボモータは Raspbery Pi の 5V で動かしても結構力があるので猫じゃらしなどをテープでぐるぐるまきにして取り付けると上下左右に動かすこともできます。上記のプログラムを単純に何度も動かしただけだがうちの猫は一応遊んでくれました。