1. ホビー用サーボモーターの制御¶
pybord には、ホピー用サーボモーター(Wikipedia を参照)を接続するための4つの専用接続点があります。このモーターは、グラウンド、電源、信号の3つのワイヤーを持っています。pyboard の右下隅に、信号ピンを右端にして接続します。ピン X1, X2, X3, X4 は4つの専用サーボ信号ピンです。
この写真では、サーボを pyboard のヘッダーピンに接続するためにオス-オスのダブルアダプターを使っています。
サーボのグラウンド線は、通常、黒または濃い茶色の最も暗い色になっています。電源線はおそらく赤色になります。
サーボの電源ピン(VINと表示)は、pyboard の入力電源に直接接続されています。USB から給電されると、VIN には 5V の USB 電源ラインによってダイオードを介して給電されます。USB に接続する場合、pyboard は少なくとも4つの電源を中小サイズのサーボモーターに供給できます。
バッテリーを使用して pyboard に給電してサーボモーターを動かす場合は、6V 以下であることを確認してください。これは、ほとんどのサーボモーターにかけられる最大電圧が 6V であるためです(モーターによっては最大 4.8V であることもあるため、使うモーターのタイプを確認してください)。
1.1. Servo オブジェクトの作成¶
サーボを位置 1 (ピン X1 を持つもの)に差し込み、次のようにして Servo オブジェクトを作成します。
>>> servo1 = pyb.Servo(1)
サーボの角度を変更するには、次のように angle
メソッドを使います:
>>> servo1.angle(45)
>>> servo1.angle(-60)
ここでの角度は度で測定され、モーターに依存して約 -90 〜 +90 の範囲です。 angle
をパラメータなしで呼び出すと、現在の角度が返ります:
>>> servo1.angle()
-60
角度によっては、パルス幅を設定する際の丸め誤差のため、返される角度が設定した角度とまったく同じではないことに注意してください。
angle
メソッドには2番目のパラメータを渡すことができます。このパラメータには、必要な角度に達するまでの時間(ミリ秒単位)を指定します。たとえば、現在の位置から50度に1秒(1000ミリ秒)かけるようにするには、次のように入力します:
>>> servo1.angle(50, 1000)
このコマンドからはすぐに戻り、サーボは希望の角度に移動し続け、そこに到達すると停止します。この機能を速度制御として使用することも、2つ以上のサーボモーターを同期させることもできます。別のサーボモーター(servo2 = pyb.Servo(2)
)があれば次のようにできます。
>>> servo1.angle(-45, 2000); servo2.angle(60, 2000)
これにより、サーボが一緒に移動し、最終角度に達するまでに2秒かかります。
注記: 上記の2つの式の間にセミコロンを使うと、REPL プロンプトで Enter キーを押した順番に実行されます。スクリプトでは、これを行う必要はありません。それそれ1行に書くだけで済みます。
1.2. 連続回転サーボ¶
これまでは、特定の角度に移動してその角度にとどまる標準的なサーボを使用してきました。これらのサーボモーターは、ロボットのジョイントやパンチルト機構などを作成するのに便利です。内部的には、モーターは現在の角度を測定し、所望の角度からの距離に比例してモーターに電力を供給する可変抵抗(ポテンショメータ)を有します。所望の角度は、サーボ信号線上のハイパルスの幅によって設定されます。1500 マイクロ秒のパルス幅は中心位置(0度)に対応します。パルスは 50Hz、すなわち毎秒50パルスで送られます。
時計回りまたは反時計回りに連続的に回転する連続回転サーボモーターを得ることもできます。回転の方向と速度は、信号線のパルス幅によって設定されます。1500マイクロ秒のパルス幅は停止したモーターに対応します。この手段よりも小さいまたは大きいパルス幅は、ある速度で一方向または他の方向に回転します。
pyboard では、連続回転モーターの Servo オブジェクトは以前と同じです。実際のところ angle
で速度を設定することができます。しかし、何が意図されているかを理解しやすくするために、スピードを設定する別のメソッド speed
を用意しています。
>>> servo1.speed(30)
speed
は angle
と同様の機能を持ちます。つまり、スピードの取得、スピードの設定、最終速度に達するまでの時間を設定できます:
>>> servo1.speed()
30
>>> servo1.speed(-20)
>>> servo1.speed(0, 2000)
上の最後のコマンドはモーターを止めるように設定しますが、それを行うのに2秒かかります。これは本質的に連続サーボの加速に対する制御です。
100 (または -100)のサーボ速度が最大速度と見なされますが、特定のモーターにおいては実際にはそれより少し速く進むことができます。
angle
と speed
メソッドの唯一の違いは、与えた数値(角度または速度)をパルス幅に変換する方法です。
1.3. キャリブレーション¶
角度または速度からパルス幅への変換は、そのキャリブレーション値を使って Servo オブジェクトによって行われます。現在のキャリブレーションを取得するには次のようにします:
>>> servo1.calibration()
(640, 2420, 1500, 2470, 2200)
取得した5つの数字は次の意味を持っています:
- 最小パルス幅; サーボが受け入れる最小のパルス幅。
- 最大パルス幅; サーボが受け入れる最大のパルス幅。
- 中心パルス幅; サーボを 0 度または 0 スピードにするパルス幅。
- 90度に対応するパルス幅。これは、メソッド
angle
での角度からパルス幅への変換に使います。 - 100 の 速度に対応するパルス幅。これは、メソッド
speed
でのスピードからパルス幅への変換に使います。
次のコマンドを使用して、サーボを再キャリブレーションできます(デフォルト値を変更します):
>>> servo1.calibration(700, 2400, 1510, 2500, 2000)
もちろん、上記の値を特定のサーボモーターに合わせて変更します。