プロジェクト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>(サーボ関数と命令文)が付属しています。
以下はサーボ関数のよく使われる命令文です:
attach(インターフェース)——サーボのインターフェースを設定します。ポート9および10が使用可能です。
write(角度)——サーボの回転角度を設定する命令文です。
read()——サーボの角度を読み取る命令文で、「write()」のコマンド値を読み取ります。
注意: 上記の記述形式は「サーボ変数名.具体的な命令文()」となります。例:myservo.attach(9)