IoT のための電子工作入門

ホーム > ArduinoArduino > Arduino でサーボを動かす

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 を利用してサーボを動作させる方法について説明しました。

ホーム > ArduinoArduino > Arduino でサーボを動かす