プロジェクト5: サーボ制御

(1)概要:

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

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

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

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

サーボの角度:

(2)パラメーター:

  • 動作電圧: 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)

(3)接続図:

注意: サーボの茶色、赤色、オレンジ色の線は、それぞれシールドのGnd(G)、5v(V)、10に接続します。サーボの電流が大きいため、外部電源を必ず接続してください。接続しない場合、開発ボードが焼損する可能性があります。

(4)テストコード1:

(注意: コードのアップロード前にBluetoothモジュールを接続しないでください。コードのアップロードにもシリアル通信を使用するため、Bluetoothのシリアル通信と競合し、アップロードが失敗する場合があります。)

/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 5.1
Servo
http://www.keyestudio.com
*/

#define servoPin 10 //サーボのピン

int pos; //サーボの角度の変数
int pulsewidth; //サーボのパルス幅の変数

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

void loop() 
{
    for (pos = 0; pos <= 180; pos += 1)  // 1°から180°へ
    {
    	// 1度ずつ増加	
        procedure(pos); // 'pos'の角度に回転
        delay(15); //回転速度を制御
    }
    for (pos = 180; pos >= 0; pos -= 1) // 180°から1°へ
    { 
        procedure(pos); // 'pos'の角度に回転
        delay(15);
    }
}
//サーボを制御する関数
void procedure(int myangle) 
{
    pulsewidth = myangle * 11 + 500; //パルス幅の値を計算
    digitalWrite(servoPin, HIGH);
    delayMicroseconds(pulsewidth); //Highレベルの時間がパルス幅を表す
    digitalWrite(servoPin, LOW);
    delay((20 - pulsewidth / 1000)); //周期が20msのため、残りの時間はLowレベル
}

コードをアップロードすると、サーボが0°から180°へ動くのが確認できます。以降の章では、サーボの駆動方法について説明します。また、ArduinoのServoライブラリを使用してサーボを制御することもできます。

注意: このServoライブラリファイルはタイマー1を使用しており、IOポート9および10のPWM出力もタイマー1を使用しています。そのため、後でD9およびD10のPWM出力を使用する場合は、このServoライブラリを使用できません。

(5)テストコード2:

(注意: コードのアップロード前にBluetoothモジュールを接続しないでください。コードのアップロードにもシリアル通信を使用するため、BluetoothのシリアL通信と競合し、コードのアップロードが失敗する場合があります。)

/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 5.2
Servo
<http://www.keyestudio.com>
*/

#include <Servo.h>

Servo myservo; // サーボを作成
int pos = 0; // 角度の変数を保存

void setup() 
{
	myservo.attach(10); //サーボをデジタルポート10に接続
}

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待機
    }
}

(6)テスト結果:

コードをアップロードし、電源を接続すると、サーボが0°から180°の範囲で動作します。

(7)コードの説明:

Arduinoには #include <Servo.h>(サーボ関数と命令)が標準搭載されています。

以下はサーボ関数の一般的な命令の一部です:

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

2. write(角度)——サーボの回転角度を設定する命令で、角度範囲は0°から180°です。

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

4. attached()——サーボのパラメーターがそのインターフェースに送信されているかどうかを判定します。

注意: 上記の書式は「サーボ変数名.具体的な命令()」です。例: myservo.attach(10)