Arduino でサーボを動かす
ここでは Arduino を用いて、サーボ (Servo) を動かす方法を示します。
サーボは模型の車や飛行機、あるいはロボット等の遠隔操作で用いられます。 サーボが信号を受けると、信号に応じた角度にスプライン軸が動きます。
通常、軸にはサーボホーンと呼ばれる部品が取り付けられます。
サーボ制御信号
サーボにはワイヤーが3本繋がれていて、そのうち2本は駆動用の電源、残りの一本が信号を受けとります。 通常 PWM 信号を受け取り、それに応じた切れ角に動作するようにできています。
基本となる周期は 20ms で約 1.5ms (=1500µs) のパルスを受けると軸は中立位置に動くことになっています。
2ms のパルスを受けると約90°時計回りに動きます。
1ms のパルスを受けると約90°反時計回りに動きます。
実際には周波数 (周期の逆数で求められる) は 50Hz から 200Hz ものがあり、中立となるパルス幅は 1520µs となるなど、 ものによって仕様の違いがあるようです。
Arduino でのサーボ制御
Arduino ではサーボ制御用のライブラリが利用可能です。そのため、自前で特定のパルス幅の信号を生成する必要はありません。
具体例でみてみましょう。
次のように可変抵抗を繋ぎ、ツマミの動作量とサーボの切れ角を同期させてみましょう。
可変抵抗からの電圧をアナログ信号の 1 番ピンで読み取ります。analogRead は 0 から 1023 までの値を返します。 0 を -90°、1023 を +90° に対応させます。
Servo の切れ角は Servo.write 関数に 0 から 180 で指定します。中立位置が 90 です。
次のスケッチでは 0 から 1023 までの値を 0 から 180 に対応させるために、map 関数を利用しています。
#include <Servo.h>
Servo servo;
const int PIN_SERVO = 10;
const int PIN_POT = 1;
void setup() {
servo.attach( PIN_SERVO );
}
void loop() {
int i = analogRead( PIN_POT );
int angle = map( i, 0, 1023, 0, 180 );
servo.write( angle );
delay(15);
}
実際にサーボと Arduino を接続すると次のようになりました。
動作の様子です。
念のためサーボへの出力をオシロスコープで確認すると、次のように 20.0ms 周期の PWM 信号が送られていました。
以上、ここでは Arduino を利用してサーボを動作させる方法について説明しました。