ラズパイ WiringPi 連続回転サーボ


20160505_raspi_servo

LED明暗 に続いて、ラズパイで WiringPi を使って、連続回転サーボを制御します。
LED明暗と同様に、ハードウェア PWM を使います。

設定
設定には、5つの関数を使用します。
それぞれ、ラズパイの BCM2835 / BCM2836 のレジスタと関連しています。

pinMode
pin のモードとして、PWM_OUTPUT を設定します。
これを最初に設定しないと、以降の関数が効かなかったです。

pwmSetMode
PWMのモードを設定します。
PWM には、2つのモードがあります。
バランスド (balanced) と マーク・スペース (mark:space) です。
スペースは周期で、マークはパルス幅です。
バランスドは、デューティ比 50% です。
20160530_wiringpi_pwm_mode

サーボに必要なのは、下記のような信号なので、マーク・スペースに設定します。
20160425_servo_control_2

pwmSetClock
クロックの分周比を設定します。
PWMのクロックは、19.2 MHz です。
サーボでは、パルス幅 ±0.5ms で制御します。
制御の刻みを 100 とすると、分周比は 96 です。
0.5ms / 100 = 5μs (200 KHz)
19.2 MHz / 200 KHz = 96

pwmSetRange
PWMの周期となるクロック数を設定します。
サーボのパルス周期は、20ms なので、クロック数は 400 です。
20ms / 5μs = 4000

pwmWrite
パルス幅となるクロック数を設定します。
1.5ms のときは、300 です。
1.5ms / 5μs = 300

動作確認
サーボには3本の線があります。
赤を Pin4 (+5v)、黒を Pin6 (GND)、白を Pin12 (GPIO18) に接続します。

wiringpi_servo_pulse.py (github)
パルス幅のクロック数 を 200、290、300、310、400 と変化させて、
時計周り(高速)、時計周り(低速)、停止、反時計周り(低速)、 反時計周り(高速) となることを確認します。

wiringpi_servo_speed.py (github)
パルス幅で指定するのは使い難いので、速度で指定するようにしました。
速度の範囲は、−100 から 100 です。

オシロでの測定
周期 20ms、パルス幅 1.5ms となっています。
RPi.GPIO では、ジッタ が見られましたが、今回は綺麗です。

周期 20ms
20160530_wiringpi_pwm_20ms

パルス幅 1.5ms
20160530_wiringpi_pwm_1_5ms

参考
Raspberry Pi Specifics – Wiring Pi
・void pinMode (int pin, int mode)
pin に対して、mode として、INPUT、 OUTPUT、 PWM_OUTPUT、または GPIO_CLOCK のいずれかを設定します。

・pwmSetMode (int mode)
PWMジェネレータは、 2つのモードで実行することができます。
バランスド (balanced) と マーク・スペース (mark:space) です。
マーク・スペースが伝統的な方式ですが、ラズパイのデフォルトのモードはバランスドです。
mode にパラメータを設定することで、モードを切り替えることができます。
PWM_MODE_BAL か PWM_MODE_MS です。

・pwmSetRange (unsigned int range)
PWMジェネレータ内のレンジ・レジスタを設定します。
デフォルトは1024です。

・pwmSetClock (int divisor)
PWMクロックの分周比を設定します。

・void pwmWrite (int pin, int value)
指定されたピンのPWMレジスタに値を書き込みます。

Control Hardware PWM frequency – Raspberry Pi
PWMクロックは19.2 MHz です。
pwmSetClock の値で分周されます。
分周された周波数で、PWMカウンタが増加します。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です