サーボモーターをPan and Tilt マウンターに取り付け、Raspberry Pi WHでPan and Tilt マウンターを動かします。
Raspberry Piとサーボモーターの接続
使用するサーボモーターの仕様を次に示します。
- 重量: 55グラム
- 動作速度: 0.17sec/60度(4.8ボルト無負荷)
- 動作速度: 0.13sec/60度(6.0ボルト無負荷)
- ストールトルク: 4.8ボルトで13キログラム-センチメートル
- ストールトルク: 6ボルトで15キログラム-センチメートル
- 動作電圧: 4.8~7.2ボルト
- ギアタイプ:すべての金属歯車
- サイズ:40x20x43mm
- 動作範囲 : 約180度
Raspberry Piとサーボモーターは次のように接続します。
Raspberry Pi | サーボモーター |
---|---|
GPIO12 | オレンジ |
GND | ブラウン |
+5v | レッド |
Raspberry Piとサーボモーターの接続画像を次に示します。サーボモーターはPan and Tilt マウンターに取り付けています。
Pan and Tilt マウンターは、「Fusion 360のジョイント機能を使ってサーボモータにより3Dモデルを回す」でモデル化したマウンターを使用します。
サーボモーターアプリの作成
サーボモーターアプリ「jitter.py」を次のように作成します。ライブラリはgpiozeroの「14.1.8. Servo」を使用します。
- 「wiringpi」のソフトウェアPWMを使用すると、サーボモータがかなりガタガタ(ジッター)するので、「pigpio」のハードウェアPWMを使用して揺れ(ジッター)を無くします。
- 使用するサーボモーターの周期は20ms(50Hz)で、パルス幅を0.5〜2.4ms(500~2400μs)の範囲で変化させて、0〜180°までの角度で回転させます。
jitter.py
#!/usr/bin/python # -*- coding: utf-8 -*- from gpiozero import Servo from time import sleep from gpiozero.pins.pigpio import PiGPIOFactory factory = PiGPIOFactory() servo = Servo(12, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000, pin_factory=factory) servo.mid() sleep(5) servo.min() sleep(5) servo.max() sleep(5) servo.mid() sleep(5) servo.value = None
サーボモーターアプリの実行
次のコマンドでサーボモーターアプリ「jitter.py」を実行します。Pan and Tilt マウンターの角度が、90°、0°、180°、90°に変化します。
$ sudo pigpiod $ python3 jitter.py
「 pigpiod」が起動していないと次のエラーメッセージが表示されます。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Can't connect to pigpio at localhost(8888) Did you start the pigpio daemon? E.g. sudo pigpiod Did you specify the correct Pi host/port in the environment variables PIGPIO_ADDR/PIGPIO_PORT? E.g. export PIGPIO_ADDR=soft, export PIGPIO_PORT=8888 Did you specify the correct Pi host/port in the pigpio.pi() function? E.g. pigpio.pi('soft', 8888) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Traceback (most recent call last): File "jitter.py", line 8, infactory = PiGPIOFactory() File "/usr/lib/python3/dist-packages/gpiozero/pins/pigpio.py", line 126, in __init__ raise IOError('failed to connect to %s:%s' % (host, port)) OSError: failed to connect to localhost:8888
スイングアプリの作成
スイングアプリ「sinwave.py」はサイン関数を用いて、Pan and Tilt マウンターの角度をスムーズに変化させます。
sinwave.py
#!/usr/bin/python # -*- coding: utf-8 -*- from gpiozero import Servo import math from time import sleep from gpiozero.pins.pigpio import PiGPIOFactory factory = PiGPIOFactory() servo = Servo(12, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000, pin_factory=factory) while True: for i in range(0, 360): servo.value = math.sin(math.radians(i)) sleep(0.01)
スイングアプリの実行
次のコマンドでスイングアプリ「sinwave.py」を実行します。
$ sudo pigpiod $ python3 sinwave.py
Pan and Tilt マウンターの角度がサインカーブで変化します。
<参考>連続回転のサーボモータ
次のような連続回転するサーボモータを入手しました。サーボモーターの周期は20ms(50Hz)で、パルス幅を0.5〜2.4ms(500~2400μs)の範囲で変化させて、サーボモーターの回転する速度と方向が手動で変化できます。
次のPythonスクリプト「rotate.py」で動作を確認できます。servo.max()で最高速の右回転、servo.min()で最高速の左回転、servo.mid()で停止、servo.valueで「-1」から「1」までを変化すると回転する速度と方向が手動で変化できます。
rotate.py
#!/usr/bin/python # -*- coding: utf-8 -*- from gpiozero import Servo from time import sleep from gpiozero.pins.pigpio import PiGPIOFactory factory = PiGPIOFactory() servo = Servo(12, min_pulse_width=0.5/1000, max_pulse_width=2.5/1000, pin_factory=factory) #servo.mid() #sleep(5) #servo.min() #sleep(5) #servo.max() #sleep(5) #servo.mid() #sleep(5) servo.value = 0.5