プロジェクト4 サーボ制御

概要

サーボモーターは位置制御型の回転アクチュエーターです。主にハウジング、回路基板、コアレスモーター、ギア、および位置センサーで構成されています。その動作原理は、サーボがマイコンや受信機から送られた信号を受け取り、周期20ms・パルス幅1.5msの基準信号を生成し、取得したDCバイアス電圧とポテンショメーターの電圧を比較して電圧差を出力するというものです。

モーターの速度が一定の場合、ポテンショメーターはカスケード減速ギアを介して回転駆動され、電圧差が0になるとモーターは回転を停止します。一般的に、サーボの回転角度範囲は0°〜180°です。

サーボモーターの回転角度は、PWM(パルス幅変調)信号のデューティサイクルを調整することで制御されます。PWM信号の標準周期は20ms(50Hz)です。理論上、パルス幅は1ms〜2msの間で分布しますが、実際には0.5ms〜2.5msの範囲となります。このパルス幅が0°〜180°の回転角度に対応しています。ただし、メーカーの異なるモーターでは、同じ信号でも異なる回転角度になる場合があります。

一般的に、サーボには茶色、赤色、オレンジ色の3本の線があります。茶色の線はGND(アース)、赤色の線は電源(プラス極)、オレンジ色の線は信号線です。

サーボの対応角度を以下に示します:

仕様

  • 動作電圧:DC 4.8V 〜 6V

  • 動作角度範囲:約180°(500 → 2500 μsec時)

  • パルス幅範囲:500 → 2500 μsec

  • 無負荷速度:0.12 ± 0.01 sec / 60(DC 4.8V) 0.1 ± 0.01 sec / 60(DC 6V)

  • 無負荷電流:200 ± 20mA(DC 4.8V) 220 ± 20mA(DC 6V)

  • 停止トルク:1.3 ± 0.01kg・cm(DC 4.8V) 1.5 ± 0.1kg・cm(DC 6V)

  • 停止電流:≦ 850mA(DC 4.8V) ≦ 1000mA(DC 6V)

  • 待機電流:3 ± 1mA(DC 4.8V) 4 ± 1mA(DC 6V)

使用部品

接続図:

配線上の注意: サーボの茶色の線をGnd(G)に、赤色の線を5v(V)に、オレンジ色の線をデジタルピン9に接続してください。

サーボは駆動電流の需要が高いため、外部電源に接続する必要があります。一般的に、開発ボードの電流では不足します。電源を接続しない場合、開発ボードが破損する恐れがあります。

テストコード1

/*
keyestudio Mini Tank Robot V2.1
lesson 4.1
Servo
http://www.keyestudio.com
*/
#define servoPin 9  //サーボのピン番号
int pos; //サーボの角度変数
int pulsewidth; // サーボのパルス幅変数

void setup() 
{
  pinMode(servoPin, OUTPUT);  //サーボピンを出力に設定
  procedure(0); //サーボの角度を0°に設定
}

void loop() 
{
  for (pos = 0; pos <= 180; pos += 1) // 0度から180度まで動かす
  { 
    // 1度ずつステップ
    procedure(pos);              // 変数'pos'の位置にサーボを移動させる
    delay(15);                   //サーボの回転速度を制御する
  }
  for (pos = 180; pos >= 0; pos -= 1) // 180度から0度まで動かす
  { 
    procedure(pos);              // 変数'pos'の位置にサーボを移動させる
    delay(15);                    
  }
}
// サーボを制御する関数
void procedure(int myangle) 
{
  pulsewidth = myangle * 11 + 500;  //パルス幅の値を計算する
  digitalWrite(servoPin,HIGH);
  delayMicroseconds(pulsewidth);   //ハイレベルの持続時間がパルス幅となる
  digitalWrite(servoPin,LOW);
  delay((20 - pulsewidth / 1000));  // 周期は20ms、残りの時間はローレベルが続く
}

コードのアップロードが完了すると、サーボは0°〜180°の範囲で往復動作します。

/*
 keyestudio Mini Tank Robot V2.1
 lesson 4.2
 servo
 http://www.keyestudio.com
*/
#include <Servo.h>
Servo myservo;  // サーボを制御するサーボオブジェクトを作成する
// ほとんどのボードで最大12個のサーボオブジェクトを作成できる
int pos = 0;    // サーボの位置を格納する変数

void setup() 
{
  myservo.attach(9);  // ピン9のサーボをサーボオブジェクトに割り当てる
}

void loop() 
{
  for (pos = 0; pos <= 180; pos += 1)  // 0度から180度まで動かす
  {
    // 1度ずつステップ
    myservo.write(pos);              // 変数'pos'の位置にサーボを移動させる
    delay(15);                       // サーボが位置に到達するまで15ms待機する
  }
  for (pos = 180; pos >= 0; pos -= 1) { // 180度から0度まで動かす
    myservo.write(pos);              // 変数'pos'の位置にサーボを移動させる
    delay(15);                       // サーボが位置に到達するまで15ms待機する
  }
}

テスト結果

コードのアップロードが完了し、電源を入れると、サーボは0°〜180°の範囲で往復動作します。

結果は同じです。通常はライブラリファイルを使用して制御します。

コードの説明

Arduinoには #include <Servo.h>(サーボ関数と命令文)が付属しています。

以下はサーボ関数のよく使われる命令文です:

  1. attach(インターフェース)——サーボのインターフェースを設定します。ポート9および10が使用可能です。

  2. write(角度)——サーボの回転角度を設定する命令文です。

  3. read()——サーボの角度を読み取る命令文で、「write()」のコマンド値を読み取ります。

  4. 注意: 上記の記述形式は「サーボ変数名.具体的な命令文()」となります。例:myservo.attach(9)